mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 22:09: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
|
VerticalSplit=V
|
||||||
; Remove current split
|
; Remove current split
|
||||||
RemoveSplit=R
|
RemoveSplit=R
|
||||||
|
; Maximize current split
|
||||||
|
MaximizeSplit=Shift+|
|
||||||
|
; Distribute all the splits evenly
|
||||||
|
DistributeSplits==
|
||||||
; Evaluate selected text or cursor word as magic words
|
; Evaluate selected text or cursor word as magic words
|
||||||
MagicWord=M
|
MagicWord=M
|
||||||
; Prompt for user to apply a snippet
|
; Prompt for user to apply a snippet
|
||||||
|
@ -443,6 +443,8 @@ void VEditArea::splitWindow(VEditWindow *p_window, bool p_right)
|
|||||||
|
|
||||||
insertSplitWindow(idx);
|
insertSplitWindow(idx);
|
||||||
setCurrentWindow(idx, true);
|
setCurrentWindow(idx, true);
|
||||||
|
|
||||||
|
distributeSplits();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VEditArea::splitCurrentWindow()
|
void VEditArea::splitCurrentWindow()
|
||||||
@ -932,6 +934,14 @@ void VEditArea::registerCaptainTargets()
|
|||||||
g_config->getCaptainShortcutKeySequence("RemoveSplit"),
|
g_config->getCaptainShortcutKeySequence("RemoveSplit"),
|
||||||
this,
|
this,
|
||||||
removeSplitByCaptain);
|
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"),
|
captain->registerCaptainTarget(tr("MagicWord"),
|
||||||
g_config->getCaptainShortcutKeySequence("MagicWord"),
|
g_config->getCaptainShortcutKeySequence("MagicWord"),
|
||||||
this,
|
this,
|
||||||
@ -1076,6 +1086,24 @@ bool VEditArea::removeSplitByCaptain(void *p_target, void *p_data)
|
|||||||
return false;
|
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)
|
bool VEditArea::evaluateMagicWordsByCaptain(void *p_target, void *p_data)
|
||||||
{
|
{
|
||||||
VEditArea *obj = static_cast<VEditArea *>(p_target);
|
VEditArea *obj = static_cast<VEditArea *>(p_target);
|
||||||
@ -1158,3 +1186,53 @@ QRect VEditArea::editAreaRect() const
|
|||||||
|
|
||||||
return rt;
|
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;
|
VMathJaxPreviewHelper *getMathJaxPreviewHelper() const;
|
||||||
|
|
||||||
|
// Maximize the width of current vertical split.
|
||||||
|
void maximizeCurrentSplit();
|
||||||
|
|
||||||
|
// Distribute all the splits evenly.
|
||||||
|
void distributeSplits();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
// Emit when current window's tab status updated.
|
// Emit when current window's tab status updated.
|
||||||
void tabStatusUpdated(const VEditTabInfo &p_info);
|
void tabStatusUpdated(const VEditTabInfo &p_info);
|
||||||
@ -210,6 +216,10 @@ private:
|
|||||||
|
|
||||||
static bool removeSplitByCaptain(void *p_target, void *p_data);
|
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.
|
// Evaluate selected text or the word on cursor as magic words.
|
||||||
static bool evaluateMagicWordsByCaptain(void *p_target, void *p_data);
|
static bool evaluateMagicWordsByCaptain(void *p_target, void *p_data);
|
||||||
|
|
||||||
|
@ -26,7 +26,9 @@ VEditWindow::VEditWindow(VEditArea *editArea, QWidget *parent)
|
|||||||
m_editArea(editArea),
|
m_editArea(editArea),
|
||||||
m_curTabWidget(NULL),
|
m_curTabWidget(NULL),
|
||||||
m_lastTabWidget(NULL),
|
m_lastTabWidget(NULL),
|
||||||
m_removeSplitAct(NULL)
|
m_removeSplitAct(NULL),
|
||||||
|
m_maximizeSplitAct(NULL),
|
||||||
|
m_distributeSplitsAct(NULL)
|
||||||
{
|
{
|
||||||
setAcceptDrops(true);
|
setAcceptDrops(true);
|
||||||
setupCornerWidget();
|
setupCornerWidget();
|
||||||
@ -463,7 +465,7 @@ QAction *VEditWindow::getRemoveSplitAction()
|
|||||||
{
|
{
|
||||||
if (!m_removeSplitAct) {
|
if (!m_removeSplitAct) {
|
||||||
m_removeSplitAct = new QAction(VIconUtils::menuIcon(":/resources/icons/remove_split.svg"),
|
m_removeSplitAct = new QAction(VIconUtils::menuIcon(":/resources/icons/remove_split.svg"),
|
||||||
tr("Remove split"),
|
tr("Remove Split"),
|
||||||
this);
|
this);
|
||||||
m_removeSplitAct->setToolTip(tr("Remove current split window"));
|
m_removeSplitAct->setToolTip(tr("Remove current split window"));
|
||||||
VUtils::fixTextWithCaptainShortcut(m_removeSplitAct, "RemoveSplit");
|
VUtils::fixTextWithCaptainShortcut(m_removeSplitAct, "RemoveSplit");
|
||||||
@ -796,12 +798,38 @@ void VEditWindow::updateSplitMenu(QMenu *p_menu)
|
|||||||
this, [this](){
|
this, [this](){
|
||||||
splitWindow(true);
|
splitWindow(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
p_menu->addAction(splitAct);
|
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());
|
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());
|
getRemoveSplitAction()->setVisible(canRemoveSplit());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,6 +211,8 @@ private:
|
|||||||
|
|
||||||
// Actions
|
// Actions
|
||||||
QAction *m_removeSplitAct;
|
QAction *m_removeSplitAct;
|
||||||
|
QAction *m_maximizeSplitAct;
|
||||||
|
QAction *m_distributeSplitsAct;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline QString VEditWindow::generateTooltip(const VFile *p_file) const
|
inline QString VEditWindow::generateTooltip(const VFile *p_file) const
|
||||||
|
Loading…
x
Reference in New Issue
Block a user