EditArea: support maximize split or distribute splits evenly

MaximizeSplit: Ctrl+E Shift+|
DistributeSplits: Ctrl+E =
This commit is contained in:
Le Tan 2018-06-08 20:00:40 +08:00
parent feea50d888
commit ecbed00467
5 changed files with 125 additions and 3 deletions

View File

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

View File

@ -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);
}

View File

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

View File

@ -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());
}

View File

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