diff --git a/src/resources/vnote.ini b/src/resources/vnote.ini index e8a64c1b..95c5af9b 100644 --- a/src/resources/vnote.ini +++ b/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 diff --git a/src/veditarea.cpp b/src/veditarea.cpp index 11caab64..717a3363 100644 --- a/src/veditarea.cpp +++ b/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(p_target); + + obj->maximizeCurrentSplit(); + return true; +} + +bool VEditArea::distributeSplitsByCaptain(void *p_target, void *p_data) +{ + Q_UNUSED(p_data); + VEditArea *obj = static_cast(p_target); + + obj->distributeSplits(); + return true; +} + bool VEditArea::evaluateMagicWordsByCaptain(void *p_target, void *p_data) { VEditArea *obj = static_cast(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); +} diff --git a/src/veditarea.h b/src/veditarea.h index 1a880e23..19a93e7e 100644 --- a/src/veditarea.h +++ b/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); diff --git a/src/veditwindow.cpp b/src/veditwindow.cpp index 4c7a5ebf..f514c559 100644 --- a/src/veditwindow.cpp +++ b/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()); } diff --git a/src/veditwindow.h b/src/veditwindow.h index 0dd40a87..14f3062a 100644 --- a/src/veditwindow.h +++ b/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