Geometrize  1.0
An application for geometrizing images into geometric primitives
Public Member Functions | Private Member Functions | Private Attributes | List of all members
geometrize::dialog::TemplateButton::TemplateButtonImpl Class Reference
Collaboration diagram for geometrize::dialog::TemplateButton::TemplateButtonImpl:
Collaboration graph
[legend]

Public Member Functions

 TemplateButtonImpl (TemplateButton *pQ, chaiscript::ChaiScript *const templateLoader, const QString &templateFolder)
 
 ~TemplateButtonImpl ()
 
TemplateButtonImpl operator= (const TemplateButtonImpl &)=delete
 
 TemplateButtonImpl (const TemplateButtonImpl &)=delete
 
void handleMousePressEvent (QMouseEvent *event)
 
void handleMouseReleaseEvent (QMouseEvent *event)
 
void handleMouseMoveEvent (QMouseEvent *event)
 
void handleDragLeaveEvent (QDragLeaveEvent *)
 
QImage setupTemplate ()
 
void openTemplate ()
 
void revealTemplateInExplorer ()
 
void showContextMenu (QContextMenuEvent *e)
 
TemplateManifest getTemplateManifest () const
 
void onLanguageChange ()
 

Private Member Functions

void populateUi ()
 
void setButtonToolTipText ()
 

Private Attributes

std::unique_ptr< Ui::TemplateButton > ui
 
QDrag * m_currentDragAction { nullptr }
 
TemplateButtonq
 
chaiscript::ChaiScript *const m_templateLoader
 
const QString m_templateFolder
 
TemplateManifest m_manifest
 
QFutureWatcher< QImage > m_templateLoaderWatcher
 
QFuture< QImage > m_templateFuture
 

Constructor & Destructor Documentation

◆ TemplateButtonImpl() [1/2]

geometrize::dialog::TemplateButton::TemplateButtonImpl::TemplateButtonImpl ( TemplateButton pQ,
chaiscript::ChaiScript *const  templateLoader,
const QString &  templateFolder 
)
inline
36  :
37  ui(std::make_unique<Ui::TemplateButton>()),
38  q{pQ},
39  m_templateLoader{templateLoader},
40  m_templateFolder{templateFolder},
41  m_manifest{} // Loaded asynchronously later
42  {
43  ui->setupUi(q);
44  populateUi();
45 
46  q->connect(q, &TemplateButton::clicked, [this]() {
47  openTemplate();
48  });
49 
50  q->connect(&m_templateLoaderWatcher, &QFutureWatcher<QImage>::finished, [this]() {
51  const QImage thumbnail{m_templateLoaderWatcher.future().result()};
52 
53  ui->imageLabel->setPixmap(QPixmap::fromImage(thumbnail));
54 
56 
58  });
59 
60  m_templateFuture = QtConcurrent::run([this]() {
61  return setupTemplate();
62  });
64  }

◆ ~TemplateButtonImpl()

geometrize::dialog::TemplateButton::TemplateButtonImpl::~TemplateButtonImpl ( )
inline
67  {
68  m_templateFuture.waitForFinished(); // Wait for template to finish loading
69  }

◆ TemplateButtonImpl() [2/2]

geometrize::dialog::TemplateButton::TemplateButtonImpl::TemplateButtonImpl ( const TemplateButtonImpl )
delete

Member Function Documentation

◆ getTemplateManifest()

TemplateManifest geometrize::dialog::TemplateButton::TemplateButtonImpl::getTemplateManifest ( ) const
inline
169  {
170  return m_manifest;
171  }

◆ handleDragLeaveEvent()

void geometrize::dialog::TemplateButton::TemplateButtonImpl::handleDragLeaveEvent ( QDragLeaveEvent *  )
inline
117  {
118 
119  }

◆ handleMouseMoveEvent()

void geometrize::dialog::TemplateButton::TemplateButtonImpl::handleMouseMoveEvent ( QMouseEvent *  event)
inline
104  {
105  if(event->buttons() != Qt::LeftButton) {
106  return;
107  }
108 
109  // Start the drag action after moving the mouse
110  if(m_currentDragAction) {
111  m_currentDragAction->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction);
112  m_currentDragAction = nullptr;
113  }
114  }

◆ handleMousePressEvent()

void geometrize::dialog::TemplateButton::TemplateButtonImpl::handleMousePressEvent ( QMouseEvent *  event)
inline
75  {
76  const QString imageFilepath{QString::fromStdString(util::getFirstFileWithExtensions(m_templateFolder.toStdString(), format::getReadableImageFileExtensions(false)))};
77  QImage thumbnail(imageFilepath);
78  if(thumbnail.isNull()) {
79  return; // Failed to load an image
80  }
81  const QSize size{180, 180};
82  thumbnail = thumbnail.scaled(size, Qt::KeepAspectRatioByExpanding, Qt::FastTransformation);
83 
84  QMimeData* mimeData = new QMimeData;
85  mimeData->setUrls({ QUrl::fromUserInput(imageFilepath) });
86  mimeData->setText(tr("Drag and drop template contents"));
87 
88  m_currentDragAction = new QDrag(q);
89  m_currentDragAction->setMimeData(mimeData);
90  m_currentDragAction->setPixmap(QPixmap::fromImage(thumbnail));
91  m_currentDragAction->setHotSpot(QPoint(m_currentDragAction->pixmap().width() / 2, m_currentDragAction->pixmap().height()));
92  }
Here is the call graph for this function:

◆ handleMouseReleaseEvent()

void geometrize::dialog::TemplateButton::TemplateButtonImpl::handleMouseReleaseEvent ( QMouseEvent *  event)
inline
95  {
97  QDrag::cancel();
98  m_currentDragAction->deleteLater();
99  m_currentDragAction = nullptr;
100  }
101  }

◆ onLanguageChange()

void geometrize::dialog::TemplateButton::TemplateButtonImpl::onLanguageChange ( )
inline
174  {
175  ui->retranslateUi(q);
176  populateUi();
177  }
Here is the call graph for this function:

◆ openTemplate()

void geometrize::dialog::TemplateButton::TemplateButtonImpl::openTemplate ( )
inline
138  {
140  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator=()

TemplateButtonImpl geometrize::dialog::TemplateButton::TemplateButtonImpl::operator= ( const TemplateButtonImpl )
delete

◆ populateUi()

void geometrize::dialog::TemplateButton::TemplateButtonImpl::populateUi ( )
inlineprivate
181  {
183  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ revealTemplateInExplorer()

void geometrize::dialog::TemplateButton::TemplateButtonImpl::revealTemplateInExplorer ( )
inline
143  {
145  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ setButtonToolTipText()

void geometrize::dialog::TemplateButton::TemplateButtonImpl::setButtonToolTipText ( )
inlineprivate
186  {
187  const QString name{tr("Name: %1", "Text on a label containing the name of an item, usually an image e.g. Name: The Mona Lisa").arg(QString::fromStdString(m_manifest.getName()))};
188  const QString license{tr("License: %2", "Text on a label containing the legal license a piece of media is under, usually an image e.g. License: Public Domain").arg(QString::fromStdString(m_manifest.getLicense()))};
189  q->setToolTip(name + "<br>" + license);
190  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ setupTemplate()

QImage geometrize::dialog::TemplateButton::TemplateButtonImpl::setupTemplate ( )
inline
122  {
123  // Note assuming this is threadsafe
125 
126  // Note assuming this is threadsafe
127  const QString imageFilepath{QString::fromStdString(util::getFirstFileWithExtensions(m_templateFolder.toStdString(), format::getReadableImageFileExtensions(false)))};
128 
129  const QImage thumbnail(imageFilepath);
130  if(!thumbnail.isNull()) {
131  const QSize size{180, 180};
132  return thumbnail.scaled(size, Qt::KeepAspectRatioByExpanding, Qt::FastTransformation);
133  }
134  return thumbnail;
135  }
Here is the call graph for this function:

◆ showContextMenu()

void geometrize::dialog::TemplateButton::TemplateButtonImpl::showContextMenu ( QContextMenuEvent *  e)
inline
148  {
149  QMenu itemContextMenu;
150 
151  QAction openAction(tr("Open", "Text on a menu item the user presses to open a file/image"));
152  itemContextMenu.addAction(&openAction);
153  connect(&openAction, &QAction::triggered, [this]() {
154  openTemplate();
155  });
156 
157  if(!m_templateFolder.startsWith(":")) { // Only if it's not an embedded resource
158  QAction openInDefaultViewer(tr("Reveal in file explorer", "Text on a menu item the user presses to open an image/piece of media in a file viewer/explorer"));
159  itemContextMenu.addAction(&openInDefaultViewer);
160  connect(&openInDefaultViewer, &QAction::triggered, [this]() {
162  });
163  }
164 
165  itemContextMenu.exec(e->globalPos());
166  }
Here is the call graph for this function:

Member Data Documentation

◆ m_currentDragAction

QDrag* geometrize::dialog::TemplateButton::TemplateButtonImpl::m_currentDragAction { nullptr }
private

◆ m_manifest

TemplateManifest geometrize::dialog::TemplateButton::TemplateButtonImpl::m_manifest
private

◆ m_templateFolder

const QString geometrize::dialog::TemplateButton::TemplateButtonImpl::m_templateFolder
private

◆ m_templateFuture

QFuture<QImage> geometrize::dialog::TemplateButton::TemplateButtonImpl::m_templateFuture
private

◆ m_templateLoader

chaiscript::ChaiScript* const geometrize::dialog::TemplateButton::TemplateButtonImpl::m_templateLoader
private

◆ m_templateLoaderWatcher

QFutureWatcher<QImage> geometrize::dialog::TemplateButton::TemplateButtonImpl::m_templateLoaderWatcher
private

◆ q

TemplateButton* geometrize::dialog::TemplateButton::TemplateButtonImpl::q
private

◆ ui

std::unique_ptr<Ui::TemplateButton> geometrize::dialog::TemplateButton::TemplateButtonImpl::ui
private

The documentation for this class was generated from the following file:
geometrize::util::openTemplate
bool openTemplate(chaiscript::ChaiScript &engine, const std::string &templateFolder)
Definition: taskutil.cpp:65
geometrize::dialog::TemplateButton::TemplateButtonImpl::setupTemplate
QImage setupTemplate()
Definition: templatebutton.cpp:121
geometrize::util::getTemplateManifest
TemplateManifest getTemplateManifest(const std::string &templateFolder)
Definition: taskutil.cpp:98
geometrize::util::getFirstFileWithExtensions
std::string getFirstFileWithExtensions(const std::string &dirPath, const std::vector< std::string > &extensions)
getFirstFileWithExtensions Gets the absolute file path to the first file with one of the given extens...
Definition: util.cpp:224
geometrize::dialog::TemplateButton::TemplateButtonImpl::ui
std::unique_ptr< Ui::TemplateButton > ui
Definition: templatebutton.cpp:192
geometrize::dialog::TemplateButton::TemplateButtonImpl::revealTemplateInExplorer
void revealTemplateInExplorer()
Definition: templatebutton.cpp:142
geometrize::dialog::TemplateButton::TemplateButtonImpl::setButtonToolTipText
void setButtonToolTipText()
Definition: templatebutton.cpp:185
geometrize::dialog::TemplateButton::TemplateButtonImpl::openTemplate
void openTemplate()
Definition: templatebutton.cpp:137
geometrize::dialog::TemplateButton::TemplateButtonImpl::m_templateLoaderWatcher
QFutureWatcher< QImage > m_templateLoaderWatcher
Definition: templatebutton.cpp:198
geometrize::format::getReadableImageFileExtensions
std::vector< std::string > getReadableImageFileExtensions(const bool includeDotPrefix)
getReadableImageFileExtensions Gets the lower-case image file extensions that have read support.
Definition: formatsupport.cpp:11
geometrize::dialog::TemplateButton::TemplateButtonImpl::m_manifest
TemplateManifest m_manifest
Definition: templatebutton.cpp:197
geometrize::TemplateManifest::getName
std::string getName() const
Definition: templatemanifest.cpp:53
geometrize::dialog::TemplateButton::signal_templateLoaded
void signal_templateLoaded(QString, bool)
geometrize::TemplateManifest::getLicense
std::string getLicense() const
Definition: templatemanifest.cpp:68
geometrize::dialog::TemplateButton::TemplateButtonImpl::q
TemplateButton * q
Definition: templatebutton.cpp:194
geometrize::dialog::TemplateButton::TemplateButtonImpl::m_templateFuture
QFuture< QImage > m_templateFuture
Definition: templatebutton.cpp:199
geometrize::dialog::TemplateButton::TemplateButtonImpl::m_currentDragAction
QDrag * m_currentDragAction
Definition: templatebutton.cpp:193
geometrize::dialog::TemplateButton::TemplateButtonImpl::m_templateLoader
chaiscript::ChaiScript *const m_templateLoader
Definition: templatebutton.cpp:195
geometrize::util::openInDefaultApplication
bool openInDefaultApplication(const std::string &path)
openInDefaultApplication Opens the given path in the default application.
Definition: util.cpp:278
geometrize::dialog::TemplateButton::TemplateButtonImpl::populateUi
void populateUi()
Definition: templatebutton.cpp:180
geometrize::dialog::TemplateButton::TemplateButtonImpl::m_templateFolder
const QString m_templateFolder
Definition: templatebutton.cpp:196