Browse Source

EditArea: support maximize split or distribute splits evenly

MaximizeSplit: Ctrl+E Shift+|
DistributeSplits: Ctrl+E =
Le Tan 7 years ago
parent
commit
ecbed00467
5 changed files with 125 additions and 3 deletions
  1. 4 0
      src/resources/vnote.ini
  2. 78 0
      src/veditarea.cpp
  3. 10 0
      src/veditarea.h
  4. 31 3
      src/veditwindow.cpp
  5. 2 0
      src/veditwindow.h

+ 4 - 0
src/resources/vnote.ini

@@ -406,6 +406,10 @@ MoveTabSplitRight=Shift+L
 VerticalSplit=V
 ; Remove current split
 RemoveSplit=R
+; Maximize current split
+MaximizeSplit=Shift+|
+; Distribute all the splits evenly
+DistributeSplits==
 ; Evaluate selected text or cursor word as magic words
 MagicWord=M
 ; Prompt for user to apply a snippet

+ 78 - 0
src/veditarea.cpp

@@ -443,6 +443,8 @@ void VEditArea::splitWindow(VEditWindow *p_window, bool p_right)
 
     insertSplitWindow(idx);
     setCurrentWindow(idx, true);
+
+    distributeSplits();
 }
 
 void VEditArea::splitCurrentWindow()
@@ -932,6 +934,14 @@ void VEditArea::registerCaptainTargets()
                                    g_config->getCaptainShortcutKeySequence("RemoveSplit"),
                                    this,
                                    removeSplitByCaptain);
+    captain->registerCaptainTarget(tr("MaximizeSplit"),
+                                   g_config->getCaptainShortcutKeySequence("MaximizeSplit"),
+                                   this,
+                                   maximizeSplitByCaptain);
+    captain->registerCaptainTarget(tr("DistributeSplits"),
+                                   g_config->getCaptainShortcutKeySequence("DistributeSplits"),
+                                   this,
+                                   distributeSplitsByCaptain);
     captain->registerCaptainTarget(tr("MagicWord"),
                                    g_config->getCaptainShortcutKeySequence("MagicWord"),
                                    this,
@@ -1076,6 +1086,24 @@ bool VEditArea::removeSplitByCaptain(void *p_target, void *p_data)
     return false;
 }
 
+bool VEditArea::maximizeSplitByCaptain(void *p_target, void *p_data)
+{
+    Q_UNUSED(p_data);
+    VEditArea *obj = static_cast<VEditArea *>(p_target);
+
+    obj->maximizeCurrentSplit();
+    return true;
+}
+
+bool VEditArea::distributeSplitsByCaptain(void *p_target, void *p_data)
+{
+    Q_UNUSED(p_data);
+    VEditArea *obj = static_cast<VEditArea *>(p_target);
+
+    obj->distributeSplits();
+    return true;
+}
+
 bool VEditArea::evaluateMagicWordsByCaptain(void *p_target, void *p_data)
 {
     VEditArea *obj = static_cast<VEditArea *>(p_target);
@@ -1158,3 +1186,53 @@ QRect VEditArea::editAreaRect() const
 
     return rt;
 }
+
+void VEditArea::maximizeCurrentSplit()
+{
+    if (splitter->count() <= 1 || curWindowIndex == -1) {
+        return;
+    }
+
+    const int MinSplitWidth = 20 * VUtils::calculateScaleFactor();
+
+    auto sizes = splitter->sizes();
+    int totalWidth = 0;
+    for (auto sz : sizes) {
+        totalWidth += sz;
+    }
+
+    int newWidth = totalWidth - MinSplitWidth * (sizes.size() - 1);
+    if (newWidth <= 0) {
+        return;
+    }
+
+    for (int i = 0; i < sizes.size(); ++i) {
+        sizes[i] = (i == curWindowIndex) ? newWidth : MinSplitWidth;
+    }
+
+    splitter->setSizes(sizes);
+}
+
+void VEditArea::distributeSplits()
+{
+    if (splitter->count() <= 1) {
+        return;
+    }
+
+    auto sizes = splitter->sizes();
+    int totalWidth = 0;
+    for (auto sz : sizes) {
+        totalWidth += sz;
+    }
+
+    int newWidth = totalWidth / sizes.size();
+    if (newWidth <= 0) {
+        return;
+    }
+
+    for (int i = 0; i < sizes.size(); ++i) {
+        sizes[i] = newWidth;
+    }
+
+    splitter->setSizes(sizes);
+}

+ 10 - 0
src/veditarea.h

@@ -89,6 +89,12 @@ public:
 
     VMathJaxPreviewHelper *getMathJaxPreviewHelper() const;
 
+    // Maximize the width of current vertical split.
+    void maximizeCurrentSplit();
+
+    // Distribute all the splits evenly.
+    void distributeSplits();
+
 signals:
     // Emit when current window's tab status updated.
     void tabStatusUpdated(const VEditTabInfo &p_info);
@@ -210,6 +216,10 @@ private:
 
     static bool removeSplitByCaptain(void *p_target, void *p_data);
 
+    static bool maximizeSplitByCaptain(void *p_target, void *p_data);
+
+    static bool distributeSplitsByCaptain(void *p_target, void *p_data);
+
     // Evaluate selected text or the word on cursor as magic words.
     static bool evaluateMagicWordsByCaptain(void *p_target, void *p_data);
 

+ 31 - 3
src/veditwindow.cpp

@@ -26,7 +26,9 @@ VEditWindow::VEditWindow(VEditArea *editArea, QWidget *parent)
       m_editArea(editArea),
       m_curTabWidget(NULL),
       m_lastTabWidget(NULL),
-      m_removeSplitAct(NULL)
+      m_removeSplitAct(NULL),
+      m_maximizeSplitAct(NULL),
+      m_distributeSplitsAct(NULL)
 {
     setAcceptDrops(true);
     setupCornerWidget();
@@ -463,7 +465,7 @@ QAction *VEditWindow::getRemoveSplitAction()
 {
     if (!m_removeSplitAct) {
         m_removeSplitAct = new QAction(VIconUtils::menuIcon(":/resources/icons/remove_split.svg"),
-                                       tr("Remove split"),
+                                       tr("Remove Split"),
                                        this);
         m_removeSplitAct->setToolTip(tr("Remove current split window"));
         VUtils::fixTextWithCaptainShortcut(m_removeSplitAct, "RemoveSplit");
@@ -796,12 +798,38 @@ void VEditWindow::updateSplitMenu(QMenu *p_menu)
                 this, [this](){
                     splitWindow(true);
                 });
-
         p_menu->addAction(splitAct);
 
+        Q_ASSERT(!m_maximizeSplitAct);
+        m_maximizeSplitAct = new QAction(tr("Maximize Split"), p_menu);
+        m_maximizeSplitAct->setToolTip(tr("Maximize current split window"));
+        VUtils::fixTextWithCaptainShortcut(m_maximizeSplitAct, "MaximizeSplit");
+        connect(m_maximizeSplitAct, &QAction::triggered,
+                this, [this]() {
+                    focusWindow();
+                    m_editArea->maximizeCurrentSplit();
+                });
+        p_menu->addAction(m_maximizeSplitAct);
+
+        Q_ASSERT(!m_distributeSplitsAct);
+        m_distributeSplitsAct = new QAction(tr("Distribute Splits"), p_menu);
+        m_distributeSplitsAct->setToolTip(tr("Distribute all the split windows evenly"));
+        VUtils::fixTextWithCaptainShortcut(m_distributeSplitsAct, "DistributeSplits");
+        connect(m_distributeSplitsAct, &QAction::triggered,
+                m_editArea, &VEditArea::distributeSplits);
+        p_menu->addAction(m_distributeSplitsAct);
+
         p_menu->addAction(getRemoveSplitAction());
     }
 
+    if (m_editArea->windowCount() > 1) {
+        m_maximizeSplitAct->setVisible(true);
+        m_distributeSplitsAct->setVisible(true);
+    } else {
+        m_maximizeSplitAct->setVisible(false);
+        m_distributeSplitsAct->setVisible(false);
+    }
+
     getRemoveSplitAction()->setVisible(canRemoveSplit());
 }
 

+ 2 - 0
src/veditwindow.h

@@ -211,6 +211,8 @@ private:
 
     // Actions
     QAction *m_removeSplitAct;
+    QAction *m_maximizeSplitAct;
+    QAction *m_distributeSplitsAct;
 };
 
 inline QString VEditWindow::generateTooltip(const VFile *p_file) const