diff --git a/src/src.pro b/src/src.pro index c8eac51b..22128bd3 100644 --- a/src/src.pro +++ b/src/src.pro @@ -96,7 +96,8 @@ SOURCES += main.cpp\ vsnippetlist.cpp \ vsnippet.cpp \ dialog/veditsnippetdialog.cpp \ - utils/vimnavigationforwidget.cpp + utils/vimnavigationforwidget.cpp \ + vtoolbox.cpp HEADERS += vmainwindow.h \ vdirectorytree.h \ @@ -179,7 +180,8 @@ HEADERS += vmainwindow.h \ vsnippetlist.h \ vsnippet.h \ dialog/veditsnippetdialog.h \ - utils/vimnavigationforwidget.h + utils/vimnavigationforwidget.h \ + vtoolbox.h RESOURCES += \ vnote.qrc \ diff --git a/src/vmainwindow.cpp b/src/vmainwindow.cpp index b9aee1eb..b254ab7c 100644 --- a/src/vmainwindow.cpp +++ b/src/vmainwindow.cpp @@ -31,6 +31,7 @@ #include "vattachmentlist.h" #include "vfilesessioninfo.h" #include "vsnippetlist.h" +#include "vtoolbox.h" VMainWindow *g_mainWin; @@ -1200,7 +1201,7 @@ void VMainWindow::initDockWindows() // Snippets. m_snippetList = new VSnippetList(this); - m_toolBox = new QToolBox(this); + m_toolBox = new VToolBox(this); m_toolBox->addItem(outline, QIcon(":/resources/icons/outline.svg"), tr("Outline")); diff --git a/src/vmainwindow.h b/src/vmainwindow.h index e1428282..7cb88878 100644 --- a/src/vmainwindow.h +++ b/src/vmainwindow.h @@ -23,7 +23,7 @@ class VNotebook; class QActionGroup; class VFileList; class VEditArea; -class QToolBox; +class VToolBox; class VOutline; class VNotebookSelector; class VAvatar; @@ -299,7 +299,7 @@ private: QDockWidget *toolDock; // Tool box in the dock widget. - QToolBox *m_toolBox; + VToolBox *m_toolBox; VOutline *outline; diff --git a/src/vtoolbox.cpp b/src/vtoolbox.cpp new file mode 100644 index 00000000..6e424539 --- /dev/null +++ b/src/vtoolbox.cpp @@ -0,0 +1,96 @@ +#include "vtoolbox.h" + +#include +#include +#include +#include +#include + + +VToolBox::VToolBox(QWidget *p_parent) + : QWidget(p_parent), + m_currentIndex(-1) +{ + setupUI(); +} + +void VToolBox::setupUI() +{ + m_btnLayout = new QHBoxLayout(); + m_btnLayout->addStretch(); + + m_widgetLayout = new QStackedLayout(); + + QVBoxLayout *mainLayout = new QVBoxLayout(); + mainLayout->addLayout(m_btnLayout); + mainLayout->addLayout(m_widgetLayout); + mainLayout->setContentsMargins(0, 0, 0, 0); + + setLayout(mainLayout); +} + +int VToolBox::addItem(QWidget *p_widget, const QIcon &p_iconSet, const QString &p_text) +{ + int idx = m_items.size(); + + // New a button. + QPushButton *btn = new QPushButton(p_iconSet, ""); + btn->setToolTip(p_text); + btn->setProperty("FlatBtn", true); + connect(btn, &QPushButton::clicked, + this, [this]() { + QObject *btn = sender(); + for (int i = 0; i < m_items.size(); ++i) { + if (m_items[i].m_btn == btn) { + setCurrentIndex(i); + break; + } + } + }); + + m_btnLayout->insertWidget(idx, btn); + + // Insert widget to layout. + m_widgetLayout->insertWidget(idx, p_widget); + + m_items.push_back(ItemInfo(p_widget, p_text, btn)); + + if (m_items.size() == 1) { + setCurrentIndex(0); + } + + return idx; +} + +void VToolBox::setCurrentIndex(int p_idx) +{ + if (m_currentIndex == p_idx) { + return; + } + + if (p_idx < 0 || p_idx >= m_items.size()) { + m_currentIndex = -1; + } else { + m_currentIndex = p_idx; + } + + setCurrentButtonIndex(m_currentIndex); + + m_widgetLayout->setCurrentIndex(m_currentIndex); +} + +void VToolBox::setCurrentButtonIndex(int p_idx) +{ + // Remove the text of all button. + for (int i = 0; i < m_items.size(); ++i) { + QPushButton *btn = m_items[i].m_btn; + btn->setText(""); + btn->clearFocus(); + } + + if (p_idx < 0 || p_idx >= m_items.size()) { + return; + } + + m_items[p_idx].m_btn->setText(m_items[p_idx].m_text); +} diff --git a/src/vtoolbox.h b/src/vtoolbox.h new file mode 100644 index 00000000..0b23a499 --- /dev/null +++ b/src/vtoolbox.h @@ -0,0 +1,57 @@ +#ifndef VTOOLBOX_H +#define VTOOLBOX_H + +#include +#include +#include +#include + +class QPushButton; +class QStackedLayout; +class QBoxLayout; + +class VToolBox : public QWidget +{ + Q_OBJECT +public: + explicit VToolBox(QWidget *p_parent = nullptr); + + int addItem(QWidget *p_widget, const QIcon &p_iconSet, const QString &p_text); + + void setCurrentIndex(int p_idx); + +private: + struct ItemInfo + { + ItemInfo() + : m_widget(nullptr), m_btn(nullptr) + { + } + + ItemInfo(QWidget *p_widget, + const QString &p_text, + QPushButton *p_btn) + : m_widget(p_widget), m_text(p_text), m_btn(p_btn) + { + } + + QWidget *m_widget; + QString m_text; + + QPushButton *m_btn; + }; + + void setupUI(); + + void setCurrentButtonIndex(int p_idx); + + QBoxLayout *m_btnLayout; + + QStackedLayout *m_widgetLayout; + + int m_currentIndex; + + QVector m_items; +}; + +#endif // VTOOLBOX_H