MainWindow: add navigation box at the left

This commit is contained in:
Le Tan 2018-05-14 20:41:30 +08:00
parent f8717465c3
commit f3302d25e8
14 changed files with 164 additions and 533 deletions

View File

@ -1,10 +0,0 @@
<svg width="512" height="512" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
<!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
<title>one_panel</title>
<g>
<title>Layer 1</title>
<rect fill="none" stroke="#000000" stroke-width="40" x="58" y="57" width="395" height="395" id="svg_1"/>
<line fill="none" stroke="#000000" stroke-width="40" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x1="193" y1="61" x2="193" y2="455" id="svg_4"/>
<line stroke="#000000" transform="rotate(-90 125.49999237060548,220.1999969482422) " id="svg_2" fill="none" stroke-width="40" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x1="125.49999" y1="169.7" x2="125.49999" y2="270.7"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 780 B

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<path style="fill:#000000" d="M464,64v416H80c-17.672,0-32-14.313-32-32s14.328-32,32-32h352V0H80C44.656,0,16,28.656,16,64v384c0,35.344,28.656,64,64,64
h416V64H464z M80,128V96V32h320v352H80V128z M336,96H144V64h192V96z M272,160H144v-32h128V160z M208,224h-64v-32h64V224z"/>
</svg>

After

Width:  |  Height:  |  Size: 748 B

View File

@ -1,10 +0,0 @@
<?xml version="1.0"?>
<svg width="512" height="512" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
<!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
<title>one_panel</title>
<g>
<title>Layer 1</title>
<rect id="svg_1" height="395" width="395" y="57" x="58" stroke-width="40" stroke="#000000" fill="none"/>
<line id="svg_4" y2="455" x2="193" y1="61" x1="193" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="40" stroke="#000000" fill="none"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 540 B

View File

@ -1,11 +0,0 @@
<?xml version="1.0"?>
<svg width="512" height="512" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
<!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
<title>one_panel</title>
<g>
<title>Layer 1</title>
<rect id="svg_1" height="395" width="395" y="57" x="58" stroke-width="40" stroke="#000000" fill="none"/>
<line id="svg_4" y2="454" x2="153" y1="60" x1="153" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="40" stroke="#000000" fill="none"/>
<line id="svg_5" y2="451.005195" x2="246" y1="66" x1="246" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="40" stroke="#000000" fill="none"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 719 B

View File

@ -402,7 +402,6 @@ VButtonMenuItem:disabled {
/* QComboBox */ /* QComboBox */
QComboBox#NotebookSelector { QComboBox#NotebookSelector {
border: none; border: none;
border-bottom: $2px solid @combobox_notebookselector_border;
font-size: 13pt; font-size: 13pt;
padding-top: 3px; padding-top: 3px;
padding-bottom: 3px; padding-bottom: 3px;

View File

@ -402,7 +402,6 @@ VButtonMenuItem:disabled {
/* QComboBox */ /* QComboBox */
QComboBox#NotebookSelector { QComboBox#NotebookSelector {
border: none; border: none;
border-bottom: $2px solid @combobox_notebookselector_border;
font-size: 13pt; font-size: 13pt;
padding-top: 3px; padding-top: 3px;
padding-bottom: 3px; padding-bottom: 3px;

View File

@ -147,9 +147,6 @@ confirm_reload_folder=true
; Whether double click on a tab to close it ; Whether double click on a tab to close it
double_click_close_tab=true double_click_close_tab=true
; Whether put folder and note panel in one vertical column
enable_compact_mode=true
; Whether enable tools dock widget ; Whether enable tools dock widget
tools_dock_checked=true tools_dock_checked=true
@ -350,8 +347,6 @@ AttachmentList=A
LocateCurrentFile=D LocateCurrentFile=D
; Toggle Expand mode ; Toggle Expand mode
ExpandMode=E ExpandMode=E
; Alternate one/two panels view
OnePanelView=P
; Discard changes and enter read mode ; Discard changes and enter read mode
DiscardAndRead=Q DiscardAndRead=Q
; Toggle Tools dock widget ; Toggle Tools dock widget

View File

@ -238,9 +238,6 @@ void VConfigManager::initialize()
m_doubleClickCloseTab = getConfigFromSettings("global", m_doubleClickCloseTab = getConfigFromSettings("global",
"double_click_close_tab").toBool(); "double_click_close_tab").toBool();
m_enableCompactMode = getConfigFromSettings("global",
"enable_compact_mode").toBool();
int tmpStartupPageMode = getConfigFromSettings("global", int tmpStartupPageMode = getConfigFromSettings("global",
"startup_page_type").toInt(); "startup_page_type").toInt();
if (tmpStartupPageMode < (int)StartupPageType::Invalid if (tmpStartupPageMode < (int)StartupPageType::Invalid
@ -337,18 +334,6 @@ void VConfigManager::initSettings()
void VConfigManager::initFromSessionSettings() void VConfigManager::initFromSessionSettings()
{ {
curNotebookIndex = getConfigFromSessionSettings("global", "current_notebook").toInt(); curNotebookIndex = getConfigFromSessionSettings("global", "current_notebook").toInt();
m_mainWindowGeometry = getConfigFromSessionSettings("geometry",
"main_window_geometry").toByteArray();
m_mainWindowState = getConfigFromSessionSettings("geometry",
"main_window_state").toByteArray();
m_mainSplitterState = getConfigFromSessionSettings("geometry",
"main_splitter_state").toByteArray();
m_naviSplitterState = getConfigFromSessionSettings("geometry",
"navi_splitter_state").toByteArray();
} }
void VConfigManager::readCustomColors() void VConfigManager::readCustomColors()
@ -1478,7 +1463,6 @@ void VConfigManager::resetLayoutConfigurations()
resetDefaultConfig("global", "tools_dock_checked"); resetDefaultConfig("global", "tools_dock_checked");
resetDefaultConfig("global", "search_dock_checked"); resetDefaultConfig("global", "search_dock_checked");
resetDefaultConfig("global", "menu_bar_checked"); resetDefaultConfig("global", "menu_bar_checked");
resetDefaultConfig("global", "enable_compact_mode");
clearGroupOfSettings(m_sessionSettings, "geometry"); clearGroupOfSettings(m_sessionSettings, "geometry");

View File

@ -176,17 +176,17 @@ public:
bool getSearchDockChecked() const; bool getSearchDockChecked() const;
void setSearchDockChecked(bool p_checked); void setSearchDockChecked(bool p_checked);
const QByteArray &getMainWindowGeometry() const; const QByteArray getMainWindowGeometry() const;
void setMainWindowGeometry(const QByteArray &p_geometry); void setMainWindowGeometry(const QByteArray &p_geometry);
const QByteArray &getMainWindowState() const; const QByteArray getMainWindowState() const;
void setMainWindowState(const QByteArray &p_state); void setMainWindowState(const QByteArray &p_state);
const QByteArray &getMainSplitterState() const; const QByteArray getMainSplitterState() const;
void setMainSplitterState(const QByteArray &p_state); void setMainSplitterState(const QByteArray &p_state);
const QByteArray &getNaviSplitterState() const; const QByteArray getNotebookSplitterState() const;
void setNaviSplitterState(const QByteArray &p_state); void setNotebookSplitterState(const QByteArray &p_state);
bool getFindCaseSensitive() const; bool getFindCaseSensitive() const;
void setFindCaseSensitive(bool p_enabled); void setFindCaseSensitive(bool p_enabled);
@ -344,9 +344,6 @@ public:
bool getDoubleClickCloseTab() const; bool getDoubleClickCloseTab() const;
bool getEnableCompactMode() const;
void setEnableCompactMode(bool p_enabled);
StartupPageType getStartupPageType() const; StartupPageType getStartupPageType() const;
void setStartupPageType(StartupPageType p_type); void setStartupPageType(StartupPageType p_type);
@ -623,11 +620,6 @@ private:
QString curRenderBackgroundColor; QString curRenderBackgroundColor;
QByteArray m_mainWindowGeometry;
QByteArray m_mainWindowState;
QByteArray m_mainSplitterState;
QByteArray m_naviSplitterState;
// Find/Replace dialog options // Find/Replace dialog options
bool m_findCaseSensitive; bool m_findCaseSensitive;
bool m_findWholeWordOnly; bool m_findWholeWordOnly;
@ -815,9 +807,6 @@ private:
// Whether double click on a tab to close it. // Whether double click on a tab to close it.
bool m_doubleClickCloseTab; bool m_doubleClickCloseTab;
// Whether put folder and note panel in one single column.
bool m_enableCompactMode;
// Type of the pages to open on startup. // Type of the pages to open on startup.
StartupPageType m_startupPageType; StartupPageType m_startupPageType;
@ -1204,56 +1193,56 @@ inline void VConfigManager::setSearchDockChecked(bool p_checked)
p_checked); p_checked);
} }
inline const QByteArray& VConfigManager::getMainWindowGeometry() const inline const QByteArray VConfigManager::getMainWindowGeometry() const
{ {
return m_mainWindowGeometry; return getConfigFromSessionSettings("geometry",
"main_window_geometry").toByteArray();
} }
inline void VConfigManager::setMainWindowGeometry(const QByteArray &p_geometry) inline void VConfigManager::setMainWindowGeometry(const QByteArray &p_geometry)
{ {
m_mainWindowGeometry = p_geometry;
setConfigToSessionSettings("geometry", setConfigToSessionSettings("geometry",
"main_window_geometry", "main_window_geometry",
m_mainWindowGeometry); p_geometry);
} }
inline const QByteArray& VConfigManager::getMainWindowState() const inline const QByteArray VConfigManager::getMainWindowState() const
{ {
return m_mainWindowState; return getConfigFromSessionSettings("geometry",
"main_window_state").toByteArray();
} }
inline void VConfigManager::setMainWindowState(const QByteArray &p_state) inline void VConfigManager::setMainWindowState(const QByteArray &p_state)
{ {
m_mainWindowState = p_state;
setConfigToSessionSettings("geometry", setConfigToSessionSettings("geometry",
"main_window_state", "main_window_state",
m_mainWindowState); p_state);
} }
inline const QByteArray& VConfigManager::getMainSplitterState() const inline const QByteArray VConfigManager::getMainSplitterState() const
{ {
return m_mainSplitterState; return getConfigFromSessionSettings("geometry",
"main_splitter_state").toByteArray();
} }
inline void VConfigManager::setMainSplitterState(const QByteArray &p_state) inline void VConfigManager::setMainSplitterState(const QByteArray &p_state)
{ {
m_mainSplitterState = p_state;
setConfigToSessionSettings("geometry", setConfigToSessionSettings("geometry",
"main_splitter_state", "main_splitter_state",
m_mainSplitterState); p_state);
} }
inline const QByteArray& VConfigManager::getNaviSplitterState() const inline const QByteArray VConfigManager::getNotebookSplitterState() const
{ {
return m_naviSplitterState; return getConfigFromSessionSettings("geometry",
"notebook_splitter_state").toByteArray();
} }
inline void VConfigManager::setNaviSplitterState(const QByteArray &p_state) inline void VConfigManager::setNotebookSplitterState(const QByteArray &p_state)
{ {
m_naviSplitterState = p_state;
setConfigToSessionSettings("geometry", setConfigToSessionSettings("geometry",
"navi_splitter_state", "notebook_splitter_state",
m_naviSplitterState); p_state);
} }
inline bool VConfigManager::getFindCaseSensitive() const inline bool VConfigManager::getFindCaseSensitive() const
@ -1965,21 +1954,6 @@ inline bool VConfigManager::getDoubleClickCloseTab() const
return m_doubleClickCloseTab; return m_doubleClickCloseTab;
} }
inline bool VConfigManager::getEnableCompactMode() const
{
return m_enableCompactMode;
}
inline void VConfigManager::setEnableCompactMode(bool p_enabled)
{
if (m_enableCompactMode == p_enabled) {
return;
}
m_enableCompactMode = p_enabled;
setConfigToSettings("global", "enable_compact_mode", m_enableCompactMode);
}
inline StartupPageType VConfigManager::getStartupPageType() const inline StartupPageType VConfigManager::getStartupPageType() const
{ {
return m_startupPageType; return m_startupPageType;

View File

@ -85,18 +85,6 @@ VMainWindow::VMainWindow(VSingleInstanceGuard *p_guard, QWidget *p_parent)
m_webUtils.init(); m_webUtils.init();
g_webUtils = &m_webUtils; g_webUtils = &m_webUtils;
if (g_config->getEnableCompactMode()) {
m_panelViewState = PanelViewState::CompactMode;
} else {
m_panelViewState = PanelViewState::TwoPanels;
}
m_panelViewTimer = new QTimer(this);
m_panelViewTimer->setSingleShot(true);
m_panelViewTimer->setInterval(500);
connect(m_panelViewTimer, &QTimer::timeout,
this, &VMainWindow::postChangePanelView);
initCaptain(); initCaptain();
setupUI(); setupUI();
@ -109,8 +97,6 @@ VMainWindow::VMainWindow(VSingleInstanceGuard *p_guard, QWidget *p_parent)
initDockWindows(); initDockWindows();
changePanelView(m_panelViewState);
restoreStateAndGeometry(); restoreStateAndGeometry();
setContextMenuPolicy(Qt::NoContextMenu); setContextMenuPolicy(Qt::NoContextMenu);
@ -155,8 +141,9 @@ void VMainWindow::initCaptain()
void VMainWindow::registerCaptainAndNavigationTargets() void VMainWindow::registerCaptainAndNavigationTargets()
{ {
m_captain->registerNavigationTarget(m_naviBox);
m_captain->registerNavigationTarget(m_notebookSelector); m_captain->registerNavigationTarget(m_notebookSelector);
m_captain->registerNavigationTarget(directoryTree); m_captain->registerNavigationTarget(m_dirTree);
m_captain->registerNavigationTarget(m_fileList); m_captain->registerNavigationTarget(m_fileList);
m_captain->registerNavigationTarget(m_editArea); m_captain->registerNavigationTarget(m_editArea);
m_captain->registerNavigationTarget(m_toolBox); m_captain->registerNavigationTarget(m_toolBox);
@ -177,10 +164,6 @@ void VMainWindow::registerCaptainAndNavigationTargets()
g_config->getCaptainShortcutKeySequence("ExpandMode"), g_config->getCaptainShortcutKeySequence("ExpandMode"),
this, this,
toggleExpandModeByCaptain); toggleExpandModeByCaptain);
m_captain->registerCaptainTarget(tr("OnePanelView"),
g_config->getCaptainShortcutKeySequence("OnePanelView"),
this,
toggleOnePanelViewByCaptain);
m_captain->registerCaptainTarget(tr("DiscardAndRead"), m_captain->registerCaptainTarget(tr("DiscardAndRead"),
g_config->getCaptainShortcutKeySequence("DiscardAndRead"), g_config->getCaptainShortcutKeySequence("DiscardAndRead"),
this, this,
@ -213,41 +196,39 @@ void VMainWindow::registerCaptainAndNavigationTargets()
void VMainWindow::setupUI() void VMainWindow::setupUI()
{ {
QWidget *directoryPanel = setupDirectoryPanel(); m_naviBox = new VToolBox();
m_fileList = new VFileList(); setupNotebookPanel();
m_fileList->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
m_naviBox->addItem(m_nbSplitter,
":/resources/icons/notebook.svg",
tr("Notebooks"),
m_dirTree);
m_editArea = new VEditArea(); m_editArea = new VEditArea();
m_editArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_editArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_findReplaceDialog = m_editArea->getFindReplaceDialog(); m_findReplaceDialog = m_editArea->getFindReplaceDialog();
m_fileList->setEditArea(m_editArea); m_fileList->setEditArea(m_editArea);
directoryTree->setEditArea(m_editArea); m_dirTree->setEditArea(m_editArea);
// Main Splitter // Main Splitter
m_mainSplitter = new QSplitter(); m_mainSplitter = new QSplitter();
m_mainSplitter->setObjectName("MainSplitter"); m_mainSplitter->setObjectName("MainSplitter");
m_mainSplitter->addWidget(directoryPanel); m_mainSplitter->addWidget(m_naviBox);
m_mainSplitter->addWidget(m_fileList);
setTabOrder(directoryTree, m_fileList->getContentWidget());
m_mainSplitter->addWidget(m_editArea); m_mainSplitter->addWidget(m_editArea);
m_mainSplitter->setStretchFactor(0, 0); m_mainSplitter->setStretchFactor(0, 0);
m_mainSplitter->setStretchFactor(1, 0); m_mainSplitter->setStretchFactor(1, 0);
m_mainSplitter->setStretchFactor(2, 1);
// Signals connect(m_dirTree, &VDirectoryTree::directoryUpdated,
connect(directoryTree, &VDirectoryTree::currentDirectoryChanged,
m_fileList, &VFileList::setDirectory);
connect(directoryTree, &VDirectoryTree::directoryUpdated,
m_editArea, &VEditArea::handleDirectoryUpdated); m_editArea, &VEditArea::handleDirectoryUpdated);
connect(m_notebookSelector, &VNotebookSelector::notebookUpdated, connect(m_notebookSelector, &VNotebookSelector::notebookUpdated,
m_editArea, &VEditArea::handleNotebookUpdated); m_editArea, &VEditArea::handleNotebookUpdated);
connect(m_notebookSelector, &VNotebookSelector::notebookCreated, connect(m_notebookSelector, &VNotebookSelector::notebookCreated,
directoryTree, [this](const QString &p_name, bool p_import) { m_dirTree, [this](const QString &p_name, bool p_import) {
Q_UNUSED(p_name); Q_UNUSED(p_name);
if (!p_import) { if (!p_import) {
directoryTree->newRootDirectory(); m_dirTree->newRootDirectory();
} }
}); });
@ -284,66 +265,53 @@ void VMainWindow::setupUI()
initTrayIcon(); initTrayIcon();
} }
QWidget *VMainWindow::setupDirectoryPanel() void VMainWindow::setupNotebookPanel()
{ {
// Notebook selector.
QLabel *notebookLabel = new QLabel(tr("Notebooks"));
notebookLabel->setProperty("TitleLabel", true);
m_notebookSelector = new VNotebookSelector(); m_notebookSelector = new VNotebookSelector();
m_notebookSelector->setObjectName("NotebookSelector"); m_notebookSelector->setObjectName("NotebookSelector");
m_notebookSelector->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); m_notebookSelector->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon);
// Navigation panel. // Folders.
QLabel *directoryLabel = new QLabel(tr("Folders")); QLabel *directoryLabel = new QLabel(tr("Folders"));
directoryLabel->setProperty("TitleLabel", true); directoryLabel->setProperty("TitleLabel", true);
directoryTree = new VDirectoryTree; m_dirTree = new VDirectoryTree;
QVBoxLayout *naviLayout = new QVBoxLayout; QVBoxLayout *naviLayout = new QVBoxLayout;
naviLayout->addWidget(m_notebookSelector);
naviLayout->addWidget(directoryLabel); naviLayout->addWidget(directoryLabel);
naviLayout->addWidget(directoryTree); naviLayout->addWidget(m_dirTree);
naviLayout->setContentsMargins(0, 0, 0, 0); naviLayout->setContentsMargins(0, 0, 0, 0);
naviLayout->setSpacing(0); naviLayout->setSpacing(0);
QWidget *naviWidget = new QWidget(); QWidget *naviWidget = new QWidget();
naviWidget->setLayout(naviLayout); naviWidget->setLayout(naviLayout);
QWidget *tmpWidget = new QWidget(); // Notes.
m_fileList = new VFileList();
m_fileList->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
// Compact splitter. m_nbSplitter = new QSplitter();
m_naviSplitter = new QSplitter(); m_nbSplitter->setOrientation(Qt::Vertical);
m_naviSplitter->setOrientation(Qt::Vertical); m_nbSplitter->setObjectName("NotebookSplitter");
m_naviSplitter->setObjectName("NaviSplitter"); m_nbSplitter->addWidget(naviWidget);
m_naviSplitter->addWidget(naviWidget); m_nbSplitter->addWidget(m_fileList);
m_naviSplitter->addWidget(tmpWidget); m_nbSplitter->setStretchFactor(0, 0);
m_naviSplitter->setStretchFactor(0, 0); m_nbSplitter->setStretchFactor(1, 1);
m_naviSplitter->setStretchFactor(1, 1);
tmpWidget->hide();
QVBoxLayout *nbLayout = new QVBoxLayout;
nbLayout->addWidget(notebookLabel);
nbLayout->addWidget(m_notebookSelector);
nbLayout->addWidget(m_naviSplitter);
nbLayout->setContentsMargins(3, 0, 0, 0);
nbLayout->setSpacing(0);
QWidget *nbContainer = new QWidget();
nbContainer->setLayout(nbLayout);
nbContainer->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
connect(m_notebookSelector, &VNotebookSelector::curNotebookChanged, connect(m_notebookSelector, &VNotebookSelector::curNotebookChanged,
this, [this](VNotebook *p_notebook) { this, [this](VNotebook *p_notebook) {
directoryTree->setNotebook(p_notebook); m_dirTree->setNotebook(p_notebook);
directoryTree->setFocus(); m_dirTree->setFocus();
}); });
connect(m_notebookSelector, &VNotebookSelector::curNotebookChanged, connect(m_notebookSelector, &VNotebookSelector::curNotebookChanged,
this, &VMainWindow::handleCurrentNotebookChanged); this, &VMainWindow::handleCurrentNotebookChanged);
connect(directoryTree, &VDirectoryTree::currentDirectoryChanged, connect(m_dirTree, &VDirectoryTree::currentDirectoryChanged,
this, &VMainWindow::handleCurrentDirectoryChanged); this, &VMainWindow::handleCurrentDirectoryChanged);
return nbContainer; connect(m_dirTree, &VDirectoryTree::currentDirectoryChanged,
m_fileList, &VFileList::setDirectory);
} }
void VMainWindow::initToolBar() void VMainWindow::initToolBar()
@ -366,92 +334,6 @@ void VMainWindow::initViewToolBar(QSize p_iconSize)
viewToolBar->setIconSize(p_iconSize); viewToolBar->setIconSize(p_iconSize);
} }
m_viewActGroup = new QActionGroup(this);
QAction *onePanelViewAct = new QAction(VIconUtils::menuIcon(":/resources/icons/one_panel.svg"),
tr("Single Panel"),
m_viewActGroup);
VUtils::fixTextWithCaptainShortcut(onePanelViewAct, "OnePanelView");
onePanelViewAct->setStatusTip(tr("Display only the notes list panel"));
onePanelViewAct->setCheckable(true);
onePanelViewAct->setData((int)PanelViewState::SinglePanel);
QAction *twoPanelViewAct = new QAction(VIconUtils::menuIcon(":/resources/icons/two_panels.svg"),
tr("Two Panels"),
m_viewActGroup);
VUtils::fixTextWithCaptainShortcut(twoPanelViewAct, "OnePanelView");
twoPanelViewAct->setStatusTip(tr("Display both the folders and notes list panel"));
twoPanelViewAct->setCheckable(true);
twoPanelViewAct->setData((int)PanelViewState::TwoPanels);
QAction *compactViewAct = new QAction(VIconUtils::menuIcon(":/resources/icons/compact_mode.svg"),
tr("Compact Mode"),
m_viewActGroup);
compactViewAct->setStatusTip(tr("Integrate the folders and notes list panel in one column"));
compactViewAct->setCheckable(true);
compactViewAct->setData((int)PanelViewState::CompactMode);
connect(m_viewActGroup, &QActionGroup::triggered,
this, [this](QAction *p_action) {
if (!p_action) {
return;
}
int act = p_action->data().toInt();
switch (act) {
case (int)PanelViewState::SinglePanel:
onePanelView();
break;
case (int)PanelViewState::TwoPanels:
twoPanelView();
break;
case (int)PanelViewState::CompactMode:
compactModeView();
break;
default:
break;
}
});
QMenu *panelMenu = new QMenu(this);
panelMenu->setToolTipsVisible(true);
panelMenu->addAction(onePanelViewAct);
panelMenu->addAction(twoPanelViewAct);
panelMenu->addAction(compactViewAct);
expandViewAct = new QAction(VIconUtils::toolButtonIcon(":/resources/icons/expand.svg"),
tr("Expand"), this);
VUtils::fixTextWithCaptainShortcut(expandViewAct, "ExpandMode");
expandViewAct->setStatusTip(tr("Expand the edit area"));
expandViewAct->setCheckable(true);
expandViewAct->setMenu(panelMenu);
connect(expandViewAct, &QAction::triggered,
this, [this](bool p_checked) {
// Recover m_panelViewState or change to expand mode.
changePanelView(p_checked ? PanelViewState::ExpandMode
: m_panelViewState);
});
viewToolBar->addAction(expandViewAct);
QAction *menuBarAct = new QAction(VIconUtils::toolButtonIcon(":/resources/icons/menubar.svg"),
tr("Menu Bar"),
this);
menuBarAct->setStatusTip(tr("Toggle menu bar"));
menuBarAct->setCheckable(true);
menuBarAct->setChecked(g_config->getMenuBarChecked());
connect(menuBarAct, &QAction::triggered,
this, [this](bool p_checked) {
setMenuBarVisible(p_checked);
g_config->setMenuBarChecked(p_checked);
});
QMenu *screenMenu = new QMenu(this);
screenMenu->setToolTipsVisible(true);
screenMenu->addAction(menuBarAct);
QAction *fullScreenAct = new QAction(VIconUtils::toolButtonIcon(":/resources/icons/fullscreen.svg"), QAction *fullScreenAct = new QAction(VIconUtils::toolButtonIcon(":/resources/icons/fullscreen.svg"),
tr("Full Screen"), tr("Full Screen"),
this); this);
@ -463,7 +345,6 @@ void VMainWindow::initViewToolBar(QSize p_iconSize)
} }
fullScreenAct->setStatusTip(tr("Toggle full screen")); fullScreenAct->setStatusTip(tr("Toggle full screen"));
fullScreenAct->setMenu(screenMenu);
connect(fullScreenAct, &QAction::triggered, connect(fullScreenAct, &QAction::triggered,
this, [this]() { this, [this]() {
if (windowState() & Qt::WindowFullScreen) { if (windowState() & Qt::WindowFullScreen) {
@ -477,7 +358,37 @@ void VMainWindow::initViewToolBar(QSize p_iconSize)
} }
}); });
viewToolBar->addAction(fullScreenAct); QAction *menuBarAct = new QAction(VIconUtils::toolButtonIcon(":/resources/icons/menubar.svg"),
tr("Menu Bar"),
this);
menuBarAct->setStatusTip(tr("Toggle menu bar"));
menuBarAct->setCheckable(true);
menuBarAct->setChecked(g_config->getMenuBarChecked());
connect(menuBarAct, &QAction::triggered,
this, [this](bool p_checked) {
setMenuBarVisible(p_checked);
g_config->setMenuBarChecked(p_checked);
});
QMenu *viewMenu = new QMenu(this);
viewMenu->setToolTipsVisible(true);
viewMenu->addAction(fullScreenAct);
viewMenu->addAction(menuBarAct);
expandViewAct = new QAction(VIconUtils::toolButtonIcon(":/resources/icons/expand.svg"),
tr("Expand"),
this);
VUtils::fixTextWithCaptainShortcut(expandViewAct, "ExpandMode");
expandViewAct->setStatusTip(tr("Expand the edit area"));
expandViewAct->setCheckable(true);
expandViewAct->setMenu(viewMenu);
connect(expandViewAct, &QAction::triggered,
this, [this](bool p_checked) {
changePanelView(p_checked ? PanelViewState::ExpandMode
: PanelViewState::VerticalMode);
});
viewToolBar->addAction(expandViewAct);
} }
// Enable/disable all actions of @p_widget. // Enable/disable all actions of @p_widget.
@ -691,7 +602,7 @@ void VMainWindow::initFileToolBar(QSize p_iconSize)
this); this);
newRootDirAct->setStatusTip(tr("Create a root folder in current notebook")); newRootDirAct->setStatusTip(tr("Create a root folder in current notebook"));
connect(newRootDirAct, &QAction::triggered, connect(newRootDirAct, &QAction::triggered,
directoryTree, &VDirectoryTree::newRootDirectory); m_dirTree, &VDirectoryTree::newRootDirectory);
newNoteAct = new QAction(VIconUtils::toolButtonIcon(":/resources/icons/create_note_tb.svg"), newNoteAct = new QAction(VIconUtils::toolButtonIcon(":/resources/icons/create_note_tb.svg"),
tr("New Note"), this); tr("New Note"), this);
@ -2050,127 +1961,25 @@ void VMainWindow::handleAreaTabStatusUpdated(const VEditTabInfo &p_info)
updateStatusInfo(p_info); updateStatusInfo(p_info);
} }
void VMainWindow::onePanelView() void VMainWindow::changePanelView(PanelViewState p_state)
{
m_panelViewState = PanelViewState::SinglePanel;
g_config->setEnableCompactMode(false);
changePanelView(m_panelViewState, true);
}
void VMainWindow::twoPanelView()
{
m_panelViewState = PanelViewState::TwoPanels;
g_config->setEnableCompactMode(false);
changePanelView(m_panelViewState, true);
}
void VMainWindow::compactModeView()
{
m_panelViewState = PanelViewState::CompactMode;
g_config->setEnableCompactMode(true);
changePanelView(m_panelViewState, true);
}
void VMainWindow::enableCompactMode(bool p_enabled)
{
const int fileListIdx = 1;
bool isCompactMode = m_naviSplitter->indexOf(m_fileList) != -1;
if (p_enabled) {
// Change to compact mode.
if (isCompactMode) {
return;
}
// Take m_fileList out of m_mainSplitter.
QWidget *tmpWidget = new QWidget(this);
Q_ASSERT(fileListIdx == m_mainSplitter->indexOf(m_fileList));
m_fileList->hide();
m_mainSplitter->replaceWidget(fileListIdx, tmpWidget);
tmpWidget->hide();
// Insert m_fileList into m_naviSplitter.
QWidget *wid = m_naviSplitter->replaceWidget(fileListIdx, m_fileList);
delete wid;
m_fileList->show();
} else {
// Disable compact mode and go back to two panels view.
if (!isCompactMode) {
return;
}
// Take m_fileList out of m_naviSplitter.
Q_ASSERT(fileListIdx == m_naviSplitter->indexOf(m_fileList));
QWidget *tmpWidget = new QWidget(this);
m_fileList->hide();
m_naviSplitter->replaceWidget(fileListIdx, tmpWidget);
tmpWidget->hide();
// Insert m_fileList into m_mainSplitter.
QWidget *wid = m_mainSplitter->replaceWidget(fileListIdx, m_fileList);
delete wid;
m_fileList->show();
}
// Set Tab order.
setTabOrder(directoryTree, m_fileList->getContentWidget());
}
void VMainWindow::changePanelView(PanelViewState p_state, bool p_postCheck)
{ {
switch (p_state) { switch (p_state) {
case PanelViewState::ExpandMode: case PanelViewState::ExpandMode:
m_mainSplitter->widget(0)->hide();
m_mainSplitter->widget(1)->hide();
m_mainSplitter->widget(2)->show();
break;
case PanelViewState::SinglePanel:
enableCompactMode(false);
m_mainSplitter->widget(0)->hide(); m_mainSplitter->widget(0)->hide();
m_mainSplitter->widget(1)->show(); m_mainSplitter->widget(1)->show();
m_mainSplitter->widget(2)->show();
break; break;
case PanelViewState::TwoPanels: case PanelViewState::HorizontalMode:
enableCompactMode(false); case PanelViewState::VerticalMode:
m_mainSplitter->widget(0)->show(); m_mainSplitter->widget(0)->show();
m_mainSplitter->widget(1)->show(); m_mainSplitter->widget(1)->show();
m_mainSplitter->widget(2)->show();
break;
case PanelViewState::CompactMode:
m_mainSplitter->widget(0)->show();
m_mainSplitter->widget(1)->hide();
m_mainSplitter->widget(2)->show();
enableCompactMode(true);
break; break;
default: default:
break; break;
} }
// Change the action state. expandViewAct->setChecked(p_state == PanelViewState::ExpandMode);
QList<QAction *> acts = m_viewActGroup->actions();
for (auto & act : acts) {
if (act->data().toInt() == (int)p_state) {
act->setChecked(true);
} else {
act->setChecked(false);
}
}
if (p_state != PanelViewState::ExpandMode) {
expandViewAct->setChecked(false);
}
if (p_postCheck) {
m_panelViewTimer->start();
}
} }
void VMainWindow::updateWindowTitle(const QString &str) void VMainWindow::updateWindowTitle(const QString &str)
@ -2297,16 +2106,8 @@ void VMainWindow::saveStateAndGeometry()
g_config->setMainWindowState(saveState()); g_config->setMainWindowState(saveState());
g_config->setToolsDockChecked(m_toolDock->isVisible()); g_config->setToolsDockChecked(m_toolDock->isVisible());
g_config->setSearchDockChecked(m_searchDock->isVisible()); g_config->setSearchDockChecked(m_searchDock->isVisible());
g_config->setNotebookSplitterState(m_nbSplitter->saveState());
if (m_panelViewState == PanelViewState::CompactMode) {
g_config->setNaviSplitterState(m_naviSplitter->saveState());
g_config->setMainSplitterState(m_mainSplitter->saveState()); g_config->setMainSplitterState(m_mainSplitter->saveState());
} else {
// In one panel view, it will save the wrong state that the directory tree
// panel has a width of zero.
changePanelView(PanelViewState::TwoPanels);
g_config->setMainSplitterState(m_mainSplitter->saveState());
}
} }
void VMainWindow::restoreStateAndGeometry() void VMainWindow::restoreStateAndGeometry()
@ -2329,9 +2130,9 @@ void VMainWindow::restoreStateAndGeometry()
m_mainSplitter->restoreState(splitterState); m_mainSplitter->restoreState(splitterState);
} }
const QByteArray &naviSplitterState = g_config->getNaviSplitterState(); const QByteArray &nbSplitterState = g_config->getNotebookSplitterState();
if (!naviSplitterState.isEmpty()) { if (!nbSplitterState.isEmpty()) {
m_naviSplitter->restoreState(naviSplitterState); m_nbSplitter->restoreState(nbSplitterState);
} }
} }
@ -2370,12 +2171,12 @@ bool VMainWindow::locateFile(VFile *p_file)
VNoteFile *file = dynamic_cast<VNoteFile *>(p_file); VNoteFile *file = dynamic_cast<VNoteFile *>(p_file);
VNotebook *notebook = file->getNotebook(); VNotebook *notebook = file->getNotebook();
if (m_notebookSelector->locateNotebook(notebook)) { if (m_notebookSelector->locateNotebook(notebook)) {
while (directoryTree->currentNotebook() != notebook) { while (m_dirTree->currentNotebook() != notebook) {
QCoreApplication::sendPostedEvents(); QCoreApplication::sendPostedEvents();
} }
VDirectory *dir = file->getDirectory(); VDirectory *dir = file->getDirectory();
if (directoryTree->locateDirectory(dir)) { if (m_dirTree->locateDirectory(dir)) {
while (m_fileList->currentDirectory() != dir) { while (m_fileList->currentDirectory() != dir) {
QCoreApplication::sendPostedEvents(); QCoreApplication::sendPostedEvents();
} }
@ -2389,11 +2190,7 @@ bool VMainWindow::locateFile(VFile *p_file)
// Open the directory and file panels after location. // Open the directory and file panels after location.
if (ret) { if (ret) {
if (m_panelViewState == PanelViewState::CompactMode) { showNotebookPanel();
compactModeView();
} else {
twoPanelView();
}
} }
return ret; return ret;
@ -2408,23 +2205,19 @@ bool VMainWindow::locateDirectory(VDirectory *p_directory)
VNotebook *notebook = p_directory->getNotebook(); VNotebook *notebook = p_directory->getNotebook();
if (m_notebookSelector->locateNotebook(notebook)) { if (m_notebookSelector->locateNotebook(notebook)) {
while (directoryTree->currentNotebook() != notebook) { while (m_dirTree->currentNotebook() != notebook) {
QCoreApplication::sendPostedEvents(); QCoreApplication::sendPostedEvents();
} }
if (directoryTree->locateDirectory(p_directory)) { if (m_dirTree->locateDirectory(p_directory)) {
ret = true; ret = true;
directoryTree->setFocus(); m_dirTree->setFocus();
} }
} }
// Open the directory and file panels after location. // Open the directory and file panels after location.
if (ret) { if (ret) {
if (m_panelViewState == PanelViewState::CompactMode) { showNotebookPanel();
compactModeView();
} else {
twoPanelView();
}
} }
return ret; return ret;
@ -2439,16 +2232,12 @@ bool VMainWindow::locateNotebook(VNotebook *p_notebook)
if (m_notebookSelector->locateNotebook(p_notebook)) { if (m_notebookSelector->locateNotebook(p_notebook)) {
ret = true; ret = true;
directoryTree->setFocus(); m_dirTree->setFocus();
} }
// Open the directory and file panels after location. // Open the directory and file panels after location.
if (ret) { if (ret) {
if (m_panelViewState == PanelViewState::CompactMode) { showNotebookPanel();
compactModeView();
} else {
twoPanelView();
}
} }
return ret; return ret;
@ -2826,19 +2615,6 @@ bool VMainWindow::toggleExpandModeByCaptain(void *p_target, void *p_data)
return true; return true;
} }
bool VMainWindow::toggleOnePanelViewByCaptain(void *p_target, void *p_data)
{
Q_UNUSED(p_data);
VMainWindow *obj = static_cast<VMainWindow *>(p_target);
if (obj->m_panelViewState == PanelViewState::TwoPanels) {
obj->onePanelView();
} else {
obj->twoPanelView();
}
return true;
}
bool VMainWindow::discardAndReadByCaptain(void *p_target, void *p_data) bool VMainWindow::discardAndReadByCaptain(void *p_target, void *p_data)
{ {
Q_UNUSED(p_data); Q_UNUSED(p_data);
@ -3235,7 +3011,7 @@ void VMainWindow::updateEditReadAct(const VEditTab *p_tab)
void VMainWindow::handleExportAct() void VMainWindow::handleExportAct()
{ {
VExportDialog dialog(m_notebookSelector->currentNotebook(), VExportDialog dialog(m_notebookSelector->currentNotebook(),
directoryTree->currentDirectory(), m_dirTree->currentDirectory(),
m_curFile, m_curFile,
m_cart, m_cart,
g_config->getMdConverterType(), g_config->getMdConverterType(),
@ -3343,83 +3119,6 @@ void VMainWindow::setMenuBarVisible(bool p_visible)
} }
} }
void VMainWindow::postChangePanelView()
{
const int minVal = 10;
bool needUpdate = false;
QList<int> sizes = m_mainSplitter->sizes();
switch (m_panelViewState) {
case PanelViewState::SinglePanel:
if (sizes[1] == 0) {
sizes[1] = minVal;
needUpdate = true;
}
if (sizes[2] == 0) {
sizes[2] = minVal;
needUpdate = true;
}
break;
case PanelViewState::TwoPanels:
if (sizes[0] == 0) {
sizes[0] = minVal;
needUpdate = true;
}
if (sizes[1] == 0) {
sizes[1] = minVal;
needUpdate = true;
}
if (sizes[2] == 0) {
sizes[2] = minVal;
needUpdate = true;
}
break;
case PanelViewState::CompactMode:
{
if (sizes[0] == 0) {
sizes[0] = minVal;
needUpdate = true;
}
if (sizes[2] == 0) {
sizes[2] = minVal;
needUpdate = true;
}
bool naviUpdate = false;
QList<int> naviSizes = m_naviSplitter->sizes();
if (naviSizes[0] == 0) {
naviSizes[0] = minVal;
naviUpdate = true;
}
if (naviSizes[1] == 0) {
naviSizes[1] = minVal;
naviUpdate = true;
}
if (naviUpdate) {
m_naviSplitter->setSizes(naviSizes);
}
break;
}
default:
break;
}
if (needUpdate) {
m_mainSplitter->setSizes(sizes);
}
}
void VMainWindow::kickOffStartUpTimer(const QStringList &p_files) void VMainWindow::kickOffStartUpTimer(const QStringList &p_files)
{ {
QTimer::singleShot(300, [this, p_files]() { QTimer::singleShot(300, [this, p_files]() {
@ -3431,3 +3130,9 @@ void VMainWindow::kickOffStartUpTimer(const QStringList &p_files)
openFiles(p_files, false, OpenFileMode::Read, false, true); openFiles(p_files, false, OpenFileMode::Read, false, true);
}); });
} }
void VMainWindow::showNotebookPanel()
{
changePanelView(PanelViewState::VerticalMode);
m_naviBox->setCurrentIndex(0, false);
}

View File

@ -46,9 +46,8 @@ class VUniversalEntry;
enum class PanelViewState enum class PanelViewState
{ {
ExpandMode, ExpandMode,
SinglePanel, HorizontalMode,
TwoPanels, VerticalMode,
CompactMode,
Invalid Invalid
}; };
@ -140,9 +139,6 @@ private slots:
void changeHighlightSelectedWord(bool p_checked); void changeHighlightSelectedWord(bool p_checked);
void changeHighlightSearchedWord(bool p_checked); void changeHighlightSearchedWord(bool p_checked);
void changeHighlightTrailingSapce(bool p_checked); void changeHighlightTrailingSapce(bool p_checked);
void onePanelView();
void twoPanelView();
void compactModeView();
void curEditFileInfo(); void curEditFileInfo();
void deleteCurNote(); void deleteCurNote();
void handleCurrentDirectoryChanged(const VDirectory *p_dir); void handleCurrentDirectoryChanged(const VDirectory *p_dir);
@ -164,9 +160,6 @@ private slots:
// Open export dialog. // Open export dialog.
void handleExportAct(); void handleExportAct();
// Set the panel view properly.
void enableCompactMode(bool p_enabled);
// Handle Vim status updated. // Handle Vim status updated.
void handleVimStatusUpdated(const VVim *p_vim); void handleVimStatusUpdated(const VVim *p_vim);
@ -196,9 +189,6 @@ private slots:
// Activate Universal Entry. // Activate Universal Entry.
void activateUniversalEntry(); void activateUniversalEntry();
// Make sure width of the panel is not zero after changePanelView().
void postChangePanelView();
protected: protected:
void closeEvent(QCloseEvent *event) Q_DECL_OVERRIDE; void closeEvent(QCloseEvent *event) Q_DECL_OVERRIDE;
@ -208,7 +198,8 @@ protected:
private: private:
void setupUI(); void setupUI();
QWidget *setupDirectoryPanel();
void setupNotebookPanel();
void initToolBar(); void initToolBar();
@ -280,8 +271,7 @@ private:
void initTrayIcon(); void initTrayIcon();
// Change the panel view according to @p_state. // Change the panel view according to @p_state.
// Will not change m_panelViewState. void changePanelView(PanelViewState p_state);
void changePanelView(PanelViewState p_state, bool p_postCheck = false);
// Whether heading sequence is applicable to current tab. // Whether heading sequence is applicable to current tab.
// Only available for writable Markdown file. // Only available for writable Markdown file.
@ -299,6 +289,8 @@ private:
void setMenuBarVisible(bool p_visible); void setMenuBarVisible(bool p_visible);
void showNotebookPanel();
// Captain mode functions. // Captain mode functions.
// Popup the attachment list if it is enabled. // Popup the attachment list if it is enabled.
@ -308,8 +300,6 @@ private:
static bool toggleExpandModeByCaptain(void *p_target, void *p_data); static bool toggleExpandModeByCaptain(void *p_target, void *p_data);
static bool toggleOnePanelViewByCaptain(void *p_target, void *p_data);
static bool discardAndReadByCaptain(void *p_target, void *p_data); static bool discardAndReadByCaptain(void *p_target, void *p_data);
static bool toggleToolsDockByCaptain(void *p_target, void *p_data); static bool toggleToolsDockByCaptain(void *p_target, void *p_data);
@ -333,15 +323,18 @@ private:
VCaptain *m_captain; VCaptain *m_captain;
VNotebookSelector *m_notebookSelector; VNotebookSelector *m_notebookSelector;
VFileList *m_fileList; VFileList *m_fileList;
VDirectoryTree *directoryTree;
VDirectoryTree *m_dirTree;
VToolBox *m_naviBox;
// Splitter for directory | files | edit. // Splitter for directory | files | edit.
QSplitter *m_mainSplitter; QSplitter *m_mainSplitter;
// Splitter for directory | files. // Splitter for folders/notes.
// Move directory and file panel in one compact vertical split. QSplitter *m_nbSplitter;
QSplitter *m_naviSplitter;
VEditArea *m_editArea; VEditArea *m_editArea;
@ -371,9 +364,6 @@ private:
VTabIndicator *m_tabIndicator; VTabIndicator *m_tabIndicator;
// SinglePanel, TwoPanels, CompactMode.
PanelViewState m_panelViewState;
// Actions // Actions
QAction *newRootDirAct; QAction *newRootDirAct;
QAction *newNoteAct; QAction *newNoteAct;
@ -415,9 +405,6 @@ private:
// Act group for code block render styles. // Act group for code block render styles.
QActionGroup *m_codeBlockStyleActs; QActionGroup *m_codeBlockStyleActs;
// Act group for panel view actions.
QActionGroup *m_viewActGroup;
// Menus // Menus
QMenu *m_viewMenu; QMenu *m_viewMenu;
@ -440,9 +427,6 @@ private:
// Timer to check the shared memory between instances of VNote. // Timer to check the shared memory between instances of VNote.
QTimer *m_sharedMemTimer; QTimer *m_sharedMemTimer;
// Timer to check the panel size.
QTimer *m_panelViewTimer;
// Tray icon. // Tray icon.
QSystemTrayIcon *m_trayIcon; QSystemTrayIcon *m_trayIcon;
@ -499,7 +483,7 @@ inline VCart *VMainWindow::getCart() const
inline VDirectoryTree *VMainWindow::getDirectoryTree() const inline VDirectoryTree *VMainWindow::getDirectoryTree() const
{ {
return directoryTree; return m_dirTree;
} }
inline VNotebookSelector *VMainWindow::getNotebookSelector() const inline VNotebookSelector *VMainWindow::getNotebookSelector() const

View File

@ -20,8 +20,6 @@
<file>resources/icons/dir_info.svg</file> <file>resources/icons/dir_info.svg</file>
<file>resources/icons/notebook_info.svg</file> <file>resources/icons/notebook_info.svg</file>
<file>resources/icons/expand.svg</file> <file>resources/icons/expand.svg</file>
<file>resources/icons/two_panels.svg</file>
<file>resources/icons/one_panel.svg</file>
<file>resources/icons/split_window.svg</file> <file>resources/icons/split_window.svg</file>
<file>resources/icons/corner_menu.svg</file> <file>resources/icons/corner_menu.svg</file>
<file>resources/icons/remove_split.svg</file> <file>resources/icons/remove_split.svg</file>
@ -92,7 +90,6 @@
<file>resources/icons/delete_attachment.svg</file> <file>resources/icons/delete_attachment.svg</file>
<file>resources/icons/sort.svg</file> <file>resources/icons/sort.svg</file>
<file>resources/icons/create_subdir.svg</file> <file>resources/icons/create_subdir.svg</file>
<file>resources/icons/compact_mode.svg</file>
<file>resources/icons/heading_sequence.svg</file> <file>resources/icons/heading_sequence.svg</file>
<file>resources/icons/link.svg</file> <file>resources/icons/link.svg</file>
<file>resources/icons/code_block.svg</file> <file>resources/icons/code_block.svg</file>
@ -216,5 +213,6 @@
<file>utils/markdown-it/markdown-it-front-matter.js</file> <file>utils/markdown-it/markdown-it-front-matter.js</file>
<file>utils/markdown-it/markdown-it-imsize.min.js</file> <file>utils/markdown-it/markdown-it-imsize.min.js</file>
<file>utils/markdown-it/markdown-it-emoji.min.js</file> <file>utils/markdown-it/markdown-it-emoji.min.js</file>
<file>resources/icons/notebook.svg</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -40,7 +40,10 @@ void VToolBox::setupUI()
setLayout(mainLayout); setLayout(mainLayout);
} }
int VToolBox::addItem(QWidget *p_widget, const QString &p_iconFile, const QString &p_text) int VToolBox::addItem(QWidget *p_widget,
const QString &p_iconFile,
const QString &p_text,
QWidget *p_focusWidget)
{ {
int idx = m_items.size(); int idx = m_items.size();
@ -66,6 +69,7 @@ int VToolBox::addItem(QWidget *p_widget, const QString &p_iconFile, const QStrin
m_widgetLayout->insertWidget(idx, p_widget); m_widgetLayout->insertWidget(idx, p_widget);
m_items.push_back(ItemInfo(p_widget, m_items.push_back(ItemInfo(p_widget,
p_focusWidget,
p_text, p_text,
btn, btn,
icon, icon,
@ -78,7 +82,7 @@ int VToolBox::addItem(QWidget *p_widget, const QString &p_iconFile, const QStrin
return idx; return idx;
} }
void VToolBox::setCurrentIndex(int p_idx) void VToolBox::setCurrentIndex(int p_idx, bool p_focus)
{ {
if (p_idx < 0 || p_idx >= m_items.size()) { if (p_idx < 0 || p_idx >= m_items.size()) {
m_currentIndex = -1; m_currentIndex = -1;
@ -91,12 +95,16 @@ void VToolBox::setCurrentIndex(int p_idx)
m_widgetLayout->setCurrentIndex(m_currentIndex); m_widgetLayout->setCurrentIndex(m_currentIndex);
QWidget *widget = m_widgetLayout->widget(m_currentIndex); QWidget *widget = m_widgetLayout->widget(m_currentIndex);
if (widget) { if (widget && p_focus) {
if (m_items[m_currentIndex].m_focusWidget) {
m_items[m_currentIndex].m_focusWidget->setFocus();
} else {
widget->setFocus(); widget->setFocus();
} }
} }
}
void VToolBox::setCurrentWidget(QWidget *p_widget) void VToolBox::setCurrentWidget(QWidget *p_widget, bool p_focus)
{ {
int idx = -1; int idx = -1;
for (int i = 0; i < m_items.size(); ++i) { for (int i = 0; i < m_items.size(); ++i) {
@ -106,7 +114,7 @@ void VToolBox::setCurrentWidget(QWidget *p_widget)
} }
} }
setCurrentIndex(idx); setCurrentIndex(idx, p_focus);
} }
void VToolBox::setCurrentButtonIndex(int p_idx) void VToolBox::setCurrentButtonIndex(int p_idx)

View File

@ -18,11 +18,14 @@ class VToolBox : public QWidget, public VNavigationMode
public: public:
explicit VToolBox(QWidget *p_parent = nullptr); explicit VToolBox(QWidget *p_parent = nullptr);
int addItem(QWidget *p_widget, const QString &p_iconFile, const QString &p_text); int addItem(QWidget *p_widget,
const QString &p_iconFile,
const QString &p_text,
QWidget *p_focusWidget = nullptr);
void setCurrentIndex(int p_idx); void setCurrentIndex(int p_idx, bool p_focus = true);
void setCurrentWidget(QWidget *p_widget); void setCurrentWidget(QWidget *p_widget, bool p_focus = true);
// Implementations for VNavigationMode. // Implementations for VNavigationMode.
void showNavigation() Q_DECL_OVERRIDE; void showNavigation() Q_DECL_OVERRIDE;
@ -32,16 +35,20 @@ private:
struct ItemInfo struct ItemInfo
{ {
ItemInfo() ItemInfo()
: m_widget(nullptr), m_btn(nullptr) : m_widget(nullptr),
m_focusWidget(nullptr),
m_btn(nullptr)
{ {
} }
ItemInfo(QWidget *p_widget, ItemInfo(QWidget *p_widget,
QWidget *p_focusWidget,
const QString &p_text, const QString &p_text,
QPushButton *p_btn, QPushButton *p_btn,
const QIcon &p_icon, const QIcon &p_icon,
const QIcon &p_activeIcon) const QIcon &p_activeIcon)
: m_widget(p_widget), : m_widget(p_widget),
m_focusWidget(p_focusWidget),
m_text(p_text), m_text(p_text),
m_btn(p_btn), m_btn(p_btn),
m_icon(p_icon), m_icon(p_icon),
@ -50,6 +57,7 @@ private:
} }
QWidget *m_widget; QWidget *m_widget;
QWidget *m_focusWidget;
QString m_text; QString m_text;
QPushButton *m_btn; QPushButton *m_btn;