diff --git a/src/vcart.h b/src/vcart.h index 4be62580..d9c4ad91 100644 --- a/src/vcart.h +++ b/src/vcart.h @@ -10,7 +10,6 @@ class QPushButton; class VListWidget; class QListWidgetItem; class QLabel; -class QAction; class VCart : public QWidget, public VNavigationMode { diff --git a/src/vfilelist.h b/src/vfilelist.h index dfb2a12e..c4cce227 100644 --- a/src/vfilelist.h +++ b/src/vfilelist.h @@ -15,7 +15,6 @@ #include "vnavigationmode.h" #include "vlistwidget.h" -class QAction; class VNote; class QListWidget; class QPushButton; diff --git a/src/vsnippetlist.cpp b/src/vsnippetlist.cpp index 5887f103..434ab557 100644 --- a/src/vsnippetlist.cpp +++ b/src/vsnippetlist.cpp @@ -19,33 +19,21 @@ extern VMainWindow *g_mainWin; const QString VSnippetList::c_infoShortcutSequence = "F2"; VSnippetList::VSnippetList(QWidget *p_parent) - : QWidget(p_parent) + : QWidget(p_parent), + m_initialized(false), + m_uiInitialized(false) { - setupUI(); - initShortcuts(); - - initActions(); - - if (!readSnippetsFromConfig()) { - VUtils::showMessage(QMessageBox::Warning, - tr("Warning"), - tr("Fail to read snippets from %2.") - .arg(g_config->c_dataTextStyle) - .arg(g_config->getSnippetConfigFolder()), - "", - QMessageBox::Ok, - QMessageBox::Ok, - this); - } - - updateContent(); - - updateNumberLabel(); } void VSnippetList::setupUI() { + if (m_uiInitialized) { + return; + } + + m_uiInitialized = true; + m_addBtn = new QPushButton(VIconUtils::buttonIcon(":/resources/icons/add_snippet.svg"), ""); m_addBtn->setToolTip(tr("New Snippet")); m_addBtn->setProperty("FlatBtn", true); @@ -88,40 +76,6 @@ void VSnippetList::setupUI() setLayout(mainLayout); } -void VSnippetList::initActions() -{ - m_applyAct = new QAction(VIconUtils::menuIcon(":/resources/icons/apply_snippet.svg"), - tr("&Apply"), - this); - m_applyAct->setToolTip(tr("Insert this snippet in editor")); - connect(m_applyAct, &QAction::triggered, - this, [this]() { - QListWidgetItem *item = m_snippetList->currentItem(); - handleItemActivated(item); - }); - - m_infoAct = new QAction(VIconUtils::menuIcon(":/resources/icons/snippet_info.svg"), - tr("&Info\t%1").arg(VUtils::getShortcutText(c_infoShortcutSequence)), - this); - m_infoAct->setToolTip(tr("View and edit snippet's information")); - connect(m_infoAct, &QAction::triggered, - this, &VSnippetList::snippetInfo); - - m_deleteAct = new QAction(VIconUtils::menuDangerIcon(":/resources/icons/delete_snippet.svg"), - tr("&Delete"), - this); - m_deleteAct->setToolTip(tr("Delete selected snippets")); - connect(m_deleteAct, &QAction::triggered, - this, &VSnippetList::deleteSelectedItems); - - m_sortAct = new QAction(VIconUtils::menuIcon(":/resources/icons/sort.svg"), - tr("&Sort"), - this); - m_sortAct->setToolTip(tr("Sort snippets manually")); - connect(m_sortAct, &QAction::triggered, - this, &VSnippetList::sortItems); -} - void VSnippetList::initShortcuts() { QShortcut *infoShortcut = new QShortcut(QKeySequence(c_infoShortcutSequence), this); @@ -178,11 +132,33 @@ void VSnippetList::handleContextMenuRequested(QPoint p_pos) if (item) { int itemCount = m_snippetList->selectedItems().size(); if (itemCount == 1) { - menu.addAction(m_applyAct); - menu.addAction(m_infoAct); + QAction *applyAct = new QAction(VIconUtils::menuIcon(":/resources/icons/apply_snippet.svg"), + tr("&Apply"), + &menu); + applyAct->setToolTip(tr("Insert this snippet in editor")); + connect(applyAct, &QAction::triggered, + this, [this]() { + QListWidgetItem *item = m_snippetList->currentItem(); + handleItemActivated(item); + }); + menu.addAction(applyAct); + + QAction *infoAct = new QAction(VIconUtils::menuIcon(":/resources/icons/snippet_info.svg"), + tr("&Info\t%1").arg(VUtils::getShortcutText(c_infoShortcutSequence)), + &menu); + infoAct->setToolTip(tr("View and edit snippet's information")); + connect(infoAct, &QAction::triggered, + this, &VSnippetList::snippetInfo); + menu.addAction(infoAct); } - menu.addAction(m_deleteAct); + QAction *deleteAct = new QAction(VIconUtils::menuDangerIcon(":/resources/icons/delete_snippet.svg"), + tr("&Delete"), + &menu); + deleteAct->setToolTip(tr("Delete selected snippets")); + connect(deleteAct, &QAction::triggered, + this, &VSnippetList::deleteSelectedItems); + menu.addAction(deleteAct); } m_snippetList->update(); @@ -192,7 +168,13 @@ void VSnippetList::handleContextMenuRequested(QPoint p_pos) menu.addSeparator(); } - menu.addAction(m_sortAct); + QAction *sortAct = new QAction(VIconUtils::menuIcon(":/resources/icons/sort.svg"), + tr("&Sort"), + &menu); + sortAct->setToolTip(tr("Sort snippets manually")); + connect(sortAct, &QAction::triggered, + this, &VSnippetList::sortItems); + menu.addAction(sortAct); } if (!menu.actions().isEmpty()) { @@ -492,12 +474,16 @@ void VSnippetList::keyPressEvent(QKeyEvent *p_event) void VSnippetList::showNavigation() { + setupUI(); + VNavigationMode::showNavigation(m_snippetList); } bool VSnippetList::handleKeyNavigation(int p_key, bool &p_succeed) { static bool secondKey = false; + setupUI(); + return VNavigationMode::handleKeyNavigation(m_snippetList, secondKey, p_key, @@ -617,6 +603,8 @@ bool VSnippetList::deleteSnippetFile(const VSnippet &p_snippet, QString *p_errMs void VSnippetList::focusInEvent(QFocusEvent *p_event) { + init(); + QWidget::focusInEvent(p_event); if (m_snippets.isEmpty()) { @@ -632,3 +620,36 @@ void VSnippetList::updateNumberLabel() const m_numLabel->setText(tr("%1 %2").arg(cnt) .arg(cnt > 1 ? tr("Items") : tr("Item"))); } + +void VSnippetList::init() +{ + if (m_initialized) { + return; + } + + m_initialized = true; + + setupUI(); + + if (!readSnippetsFromConfig()) { + VUtils::showMessage(QMessageBox::Warning, + tr("Warning"), + tr("Fail to read snippets from %2.") + .arg(g_config->c_dataTextStyle) + .arg(g_config->getSnippetConfigFolder()), + "", + QMessageBox::Ok, + QMessageBox::Ok, + this); + } + + updateContent(); +} + +void VSnippetList::showEvent(QShowEvent *p_event) +{ + init(); + + QWidget::showEvent(p_event); +} + diff --git a/src/vsnippetlist.h b/src/vsnippetlist.h index 979af7ae..a079bddd 100644 --- a/src/vsnippetlist.h +++ b/src/vsnippetlist.h @@ -12,7 +12,6 @@ class QPushButton; class VListWidget; class QListWidgetItem; class QLabel; -class QAction; class QKeyEvent; class QFocusEvent; @@ -32,6 +31,8 @@ public: bool handleKeyNavigation(int p_key, bool &p_succeed) Q_DECL_OVERRIDE; protected: + void showEvent(QShowEvent *p_event) Q_DECL_OVERRIDE; + void keyPressEvent(QKeyEvent *p_event) Q_DECL_OVERRIDE; void focusInEvent(QFocusEvent *p_event) Q_DECL_OVERRIDE; @@ -52,7 +53,7 @@ private slots: private: void setupUI(); - void initActions(); + void init(); void initShortcuts(); @@ -89,16 +90,15 @@ private: void updateNumberLabel() const; + bool m_initialized; + + bool m_uiInitialized; + QPushButton *m_addBtn; QPushButton *m_locateBtn; QLabel *m_numLabel; VListWidget *m_snippetList; - QAction *m_applyAct; - QAction *m_infoAct; - QAction *m_deleteAct; - QAction *m_sortAct; - QVector m_snippets; static const QString c_infoShortcutSequence; @@ -106,11 +106,15 @@ private: inline const QVector &VSnippetList::getSnippets() const { + const_cast(this)->init(); + return m_snippets; } inline const VSnippet *VSnippetList::getSnippet(const QString &p_name) const { + const_cast(this)->init(); + for (auto const & snip : m_snippets) { if (snip.getName() == p_name) { return &snip;