mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
EditArea: support maximize split or distribute splits evenly
MaximizeSplit: Ctrl+E Shift+| DistributeSplits: Ctrl+E =
This commit is contained in:
parent
feea50d888
commit
ecbed00467
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
@ -211,6 +211,8 @@ private:
|
||||
|
||||
// Actions
|
||||
QAction *m_removeSplitAct;
|
||||
QAction *m_maximizeSplitAct;
|
||||
QAction *m_distributeSplitsAct;
|
||||
};
|
||||
|
||||
inline QString VEditWindow::generateTooltip(const VFile *p_file) const
|
||||
|
Loading…
x
Reference in New Issue
Block a user