Browse Source

MainWindow: add navigation box at the left

Le Tan 7 years ago
parent
commit
f3302d25e8

+ 0 - 10
src/resources/icons/compact_mode.svg

@@ -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>

+ 8 - 0
src/resources/icons/notebook.svg

@@ -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>

+ 0 - 10
src/resources/icons/one_panel.svg

@@ -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>

+ 0 - 11
src/resources/icons/two_panels.svg

@@ -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>

+ 0 - 1
src/resources/themes/v_moonlight/v_moonlight.qss

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

+ 0 - 1
src/resources/themes/v_pure/v_pure.qss

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

+ 0 - 5
src/resources/vnote.ini

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

+ 0 - 16
src/vconfigmanager.cpp

@@ -238,9 +238,6 @@ void VConfigManager::initialize()
     m_doubleClickCloseTab = getConfigFromSettings("global",
                                                   "double_click_close_tab").toBool();
 
-    m_enableCompactMode = getConfigFromSettings("global",
-                                                "enable_compact_mode").toBool();
-
     int tmpStartupPageMode = getConfigFromSettings("global",
                                                    "startup_page_type").toInt();
     if (tmpStartupPageMode < (int)StartupPageType::Invalid
@@ -337,18 +334,6 @@ void VConfigManager::initSettings()
 void VConfigManager::initFromSessionSettings()
 {
     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()
@@ -1478,7 +1463,6 @@ void VConfigManager::resetLayoutConfigurations()
     resetDefaultConfig("global", "tools_dock_checked");
     resetDefaultConfig("global", "search_dock_checked");
     resetDefaultConfig("global", "menu_bar_checked");
-    resetDefaultConfig("global", "enable_compact_mode");
 
     clearGroupOfSettings(m_sessionSettings, "geometry");
 

+ 23 - 49
src/vconfigmanager.h

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

+ 92 - 387
src/vmainwindow.cpp

@@ -85,18 +85,6 @@ VMainWindow::VMainWindow(VSingleInstanceGuard *p_guard, QWidget *p_parent)
     m_webUtils.init();
     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();
 
     setupUI();
@@ -109,8 +97,6 @@ VMainWindow::VMainWindow(VSingleInstanceGuard *p_guard, QWidget *p_parent)
 
     initDockWindows();
 
-    changePanelView(m_panelViewState);
-
     restoreStateAndGeometry();
 
     setContextMenuPolicy(Qt::NoContextMenu);
@@ -155,8 +141,9 @@ void VMainWindow::initCaptain()
 
 void VMainWindow::registerCaptainAndNavigationTargets()
 {
+    m_captain->registerNavigationTarget(m_naviBox);
     m_captain->registerNavigationTarget(m_notebookSelector);
-    m_captain->registerNavigationTarget(directoryTree);
+    m_captain->registerNavigationTarget(m_dirTree);
     m_captain->registerNavigationTarget(m_fileList);
     m_captain->registerNavigationTarget(m_editArea);
     m_captain->registerNavigationTarget(m_toolBox);
@@ -177,10 +164,6 @@ void VMainWindow::registerCaptainAndNavigationTargets()
                                      g_config->getCaptainShortcutKeySequence("ExpandMode"),
                                      this,
                                      toggleExpandModeByCaptain);
-    m_captain->registerCaptainTarget(tr("OnePanelView"),
-                                     g_config->getCaptainShortcutKeySequence("OnePanelView"),
-                                     this,
-                                     toggleOnePanelViewByCaptain);
     m_captain->registerCaptainTarget(tr("DiscardAndRead"),
                                      g_config->getCaptainShortcutKeySequence("DiscardAndRead"),
                                      this,
@@ -213,41 +196,39 @@ void VMainWindow::registerCaptainAndNavigationTargets()
 
 void VMainWindow::setupUI()
 {
-    QWidget *directoryPanel = setupDirectoryPanel();
+    m_naviBox = new VToolBox();
 
-    m_fileList = new VFileList();
-    m_fileList->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
+    setupNotebookPanel();
+
+    m_naviBox->addItem(m_nbSplitter,
+                       ":/resources/icons/notebook.svg",
+                       tr("Notebooks"),
+                       m_dirTree);
 
     m_editArea = new VEditArea();
     m_editArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     m_findReplaceDialog = m_editArea->getFindReplaceDialog();
     m_fileList->setEditArea(m_editArea);
-    directoryTree->setEditArea(m_editArea);
+    m_dirTree->setEditArea(m_editArea);
 
     // Main Splitter
     m_mainSplitter = new QSplitter();
     m_mainSplitter->setObjectName("MainSplitter");
-    m_mainSplitter->addWidget(directoryPanel);
-    m_mainSplitter->addWidget(m_fileList);
-    setTabOrder(directoryTree, m_fileList->getContentWidget());
+    m_mainSplitter->addWidget(m_naviBox);
     m_mainSplitter->addWidget(m_editArea);
     m_mainSplitter->setStretchFactor(0, 0);
     m_mainSplitter->setStretchFactor(1, 0);
-    m_mainSplitter->setStretchFactor(2, 1);
 
-    // Signals
-    connect(directoryTree, &VDirectoryTree::currentDirectoryChanged,
-            m_fileList, &VFileList::setDirectory);
-    connect(directoryTree, &VDirectoryTree::directoryUpdated,
+    connect(m_dirTree, &VDirectoryTree::directoryUpdated,
             m_editArea, &VEditArea::handleDirectoryUpdated);
 
     connect(m_notebookSelector, &VNotebookSelector::notebookUpdated,
             m_editArea, &VEditArea::handleNotebookUpdated);
     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);
                 if (!p_import) {
-                    directoryTree->newRootDirectory();
+                    m_dirTree->newRootDirectory();
                 }
             });
 
@@ -284,66 +265,53 @@ void VMainWindow::setupUI()
     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->setObjectName("NotebookSelector");
     m_notebookSelector->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon);
 
-    // Navigation panel.
+    // Folders.
     QLabel *directoryLabel = new QLabel(tr("Folders"));
     directoryLabel->setProperty("TitleLabel", true);
 
-    directoryTree = new VDirectoryTree;
+    m_dirTree = new VDirectoryTree;
 
     QVBoxLayout *naviLayout = new QVBoxLayout;
+    naviLayout->addWidget(m_notebookSelector);
     naviLayout->addWidget(directoryLabel);
-    naviLayout->addWidget(directoryTree);
+    naviLayout->addWidget(m_dirTree);
     naviLayout->setContentsMargins(0, 0, 0, 0);
     naviLayout->setSpacing(0);
     QWidget *naviWidget = new QWidget();
     naviWidget->setLayout(naviLayout);
 
-    QWidget *tmpWidget = new QWidget();
-
-    // Compact splitter.
-    m_naviSplitter = new QSplitter();
-    m_naviSplitter->setOrientation(Qt::Vertical);
-    m_naviSplitter->setObjectName("NaviSplitter");
-    m_naviSplitter->addWidget(naviWidget);
-    m_naviSplitter->addWidget(tmpWidget);
-    m_naviSplitter->setStretchFactor(0, 0);
-    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);
+    // Notes.
+    m_fileList = new VFileList();
+    m_fileList->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
+
+    m_nbSplitter = new QSplitter();
+    m_nbSplitter->setOrientation(Qt::Vertical);
+    m_nbSplitter->setObjectName("NotebookSplitter");
+    m_nbSplitter->addWidget(naviWidget);
+    m_nbSplitter->addWidget(m_fileList);
+    m_nbSplitter->setStretchFactor(0, 0);
+    m_nbSplitter->setStretchFactor(1, 1);
 
     connect(m_notebookSelector, &VNotebookSelector::curNotebookChanged,
             this, [this](VNotebook *p_notebook) {
-                directoryTree->setNotebook(p_notebook);
-                directoryTree->setFocus();
+                m_dirTree->setNotebook(p_notebook);
+                m_dirTree->setFocus();
             });
 
     connect(m_notebookSelector, &VNotebookSelector::curNotebookChanged,
             this, &VMainWindow::handleCurrentNotebookChanged);
 
-    connect(directoryTree, &VDirectoryTree::currentDirectoryChanged,
+    connect(m_dirTree, &VDirectoryTree::currentDirectoryChanged,
             this, &VMainWindow::handleCurrentDirectoryChanged);
 
-    return nbContainer;
+    connect(m_dirTree, &VDirectoryTree::currentDirectoryChanged,
+            m_fileList, &VFileList::setDirectory);
 }
 
 void VMainWindow::initToolBar()
@@ -366,92 +334,6 @@ void VMainWindow::initViewToolBar(QSize 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"),
                                          tr("Full Screen"),
                                          this);
@@ -463,7 +345,6 @@ void VMainWindow::initViewToolBar(QSize p_iconSize)
     }
 
     fullScreenAct->setStatusTip(tr("Toggle full screen"));
-    fullScreenAct->setMenu(screenMenu);
     connect(fullScreenAct, &QAction::triggered,
             this, [this]() {
                 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.
@@ -691,7 +602,7 @@ void VMainWindow::initFileToolBar(QSize p_iconSize)
                                 this);
     newRootDirAct->setStatusTip(tr("Create a root folder in current notebook"));
     connect(newRootDirAct, &QAction::triggered,
-            directoryTree, &VDirectoryTree::newRootDirectory);
+            m_dirTree, &VDirectoryTree::newRootDirectory);
 
     newNoteAct = new QAction(VIconUtils::toolButtonIcon(":/resources/icons/create_note_tb.svg"),
                              tr("New Note"), this);
@@ -2050,127 +1961,25 @@ void VMainWindow::handleAreaTabStatusUpdated(const VEditTabInfo &p_info)
     updateStatusInfo(p_info);
 }
 
-void VMainWindow::onePanelView()
-{
-    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)
+void VMainWindow::changePanelView(PanelViewState p_state)
 {
     switch (p_state) {
     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(1)->show();
-        m_mainSplitter->widget(2)->show();
         break;
 
-    case PanelViewState::TwoPanels:
-        enableCompactMode(false);
-
+    case PanelViewState::HorizontalMode:
+    case PanelViewState::VerticalMode:
         m_mainSplitter->widget(0)->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;
 
     default:
         break;
     }
 
-    // Change the action state.
-    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();
-    }
+    expandViewAct->setChecked(p_state == PanelViewState::ExpandMode);
 }
 
 void VMainWindow::updateWindowTitle(const QString &str)
@@ -2297,16 +2106,8 @@ void VMainWindow::saveStateAndGeometry()
     g_config->setMainWindowState(saveState());
     g_config->setToolsDockChecked(m_toolDock->isVisible());
     g_config->setSearchDockChecked(m_searchDock->isVisible());
-
-    if (m_panelViewState == PanelViewState::CompactMode) {
-        g_config->setNaviSplitterState(m_naviSplitter->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());
-    }
+    g_config->setNotebookSplitterState(m_nbSplitter->saveState());
+    g_config->setMainSplitterState(m_mainSplitter->saveState());
 }
 
 void VMainWindow::restoreStateAndGeometry()
@@ -2329,9 +2130,9 @@ void VMainWindow::restoreStateAndGeometry()
         m_mainSplitter->restoreState(splitterState);
     }
 
-    const QByteArray &naviSplitterState = g_config->getNaviSplitterState();
-    if (!naviSplitterState.isEmpty()) {
-        m_naviSplitter->restoreState(naviSplitterState);
+    const QByteArray &nbSplitterState = g_config->getNotebookSplitterState();
+    if (!nbSplitterState.isEmpty()) {
+        m_nbSplitter->restoreState(nbSplitterState);
     }
 }
 
@@ -2370,12 +2171,12 @@ bool VMainWindow::locateFile(VFile *p_file)
     VNoteFile *file = dynamic_cast<VNoteFile *>(p_file);
     VNotebook *notebook = file->getNotebook();
     if (m_notebookSelector->locateNotebook(notebook)) {
-        while (directoryTree->currentNotebook() != notebook) {
+        while (m_dirTree->currentNotebook() != notebook) {
             QCoreApplication::sendPostedEvents();
         }
 
         VDirectory *dir = file->getDirectory();
-        if (directoryTree->locateDirectory(dir)) {
+        if (m_dirTree->locateDirectory(dir)) {
             while (m_fileList->currentDirectory() != dir) {
                 QCoreApplication::sendPostedEvents();
             }
@@ -2389,11 +2190,7 @@ bool VMainWindow::locateFile(VFile *p_file)
 
     // Open the directory and file panels after location.
     if (ret) {
-        if (m_panelViewState == PanelViewState::CompactMode) {
-            compactModeView();
-        } else {
-            twoPanelView();
-        }
+        showNotebookPanel();
     }
 
     return ret;
@@ -2408,23 +2205,19 @@ bool VMainWindow::locateDirectory(VDirectory *p_directory)
 
     VNotebook *notebook = p_directory->getNotebook();
     if (m_notebookSelector->locateNotebook(notebook)) {
-        while (directoryTree->currentNotebook() != notebook) {
+        while (m_dirTree->currentNotebook() != notebook) {
             QCoreApplication::sendPostedEvents();
         }
 
-        if (directoryTree->locateDirectory(p_directory)) {
+        if (m_dirTree->locateDirectory(p_directory)) {
             ret = true;
-            directoryTree->setFocus();
+            m_dirTree->setFocus();
         }
     }
 
     // Open the directory and file panels after location.
     if (ret) {
-        if (m_panelViewState == PanelViewState::CompactMode) {
-            compactModeView();
-        } else {
-            twoPanelView();
-        }
+        showNotebookPanel();
     }
 
     return ret;
@@ -2439,16 +2232,12 @@ bool VMainWindow::locateNotebook(VNotebook *p_notebook)
 
     if (m_notebookSelector->locateNotebook(p_notebook)) {
         ret = true;
-        directoryTree->setFocus();
+        m_dirTree->setFocus();
     }
 
     // Open the directory and file panels after location.
     if (ret) {
-        if (m_panelViewState == PanelViewState::CompactMode) {
-            compactModeView();
-        } else {
-            twoPanelView();
-        }
+        showNotebookPanel();
     }
 
     return ret;
@@ -2826,19 +2615,6 @@ bool VMainWindow::toggleExpandModeByCaptain(void *p_target, void *p_data)
     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)
 {
     Q_UNUSED(p_data);
@@ -3235,7 +3011,7 @@ void VMainWindow::updateEditReadAct(const VEditTab *p_tab)
 void VMainWindow::handleExportAct()
 {
     VExportDialog dialog(m_notebookSelector->currentNotebook(),
-                         directoryTree->currentDirectory(),
+                         m_dirTree->currentDirectory(),
                          m_curFile,
                          m_cart,
                          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)
 {
     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);
     });
 }
+
+void VMainWindow::showNotebookPanel()
+{
+    changePanelView(PanelViewState::VerticalMode);
+    m_naviBox->setCurrentIndex(0, false);
+}

+ 15 - 31
src/vmainwindow.h

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

+ 1 - 3
src/vnote.qrc

@@ -20,8 +20,6 @@
         <file>resources/icons/dir_info.svg</file>
         <file>resources/icons/notebook_info.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/corner_menu.svg</file>
         <file>resources/icons/remove_split.svg</file>
@@ -92,7 +90,6 @@
         <file>resources/icons/delete_attachment.svg</file>
         <file>resources/icons/sort.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/link.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-imsize.min.js</file>
         <file>utils/markdown-it/markdown-it-emoji.min.js</file>
+        <file>resources/icons/notebook.svg</file>
     </qresource>
 </RCC>

+ 14 - 6
src/vtoolbox.cpp

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

+ 12 - 4
src/vtoolbox.h

@@ -18,11 +18,14 @@ class VToolBox : public QWidget, public VNavigationMode
 public:
     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.
     void showNavigation() Q_DECL_OVERRIDE;
@@ -32,16 +35,20 @@ private:
     struct ItemInfo
     {
         ItemInfo()
-            : m_widget(nullptr), m_btn(nullptr)
+            : m_widget(nullptr),
+              m_focusWidget(nullptr),
+              m_btn(nullptr)
         {
         }
 
         ItemInfo(QWidget *p_widget,
+                 QWidget *p_focusWidget,
                  const QString &p_text,
                  QPushButton *p_btn,
                  const QIcon &p_icon,
                  const QIcon &p_activeIcon)
             : m_widget(p_widget),
+              m_focusWidget(p_focusWidget),
               m_text(p_text),
               m_btn(p_btn),
               m_icon(p_icon),
@@ -50,6 +57,7 @@ private:
         }
 
         QWidget *m_widget;
+        QWidget *m_focusWidget;
         QString m_text;
 
         QPushButton *m_btn;