fix: tristate toggle logic for tab visibilty (#5530)

Co-authored-by: Nerixyz <nerixdev@outlook.de>
This commit is contained in:
pajlada
2024-08-24 11:42:42 +02:00
committed by GitHub
parent f36c73019d
commit 5170085d7c
14 changed files with 326 additions and 199 deletions
+76 -101
View File
@@ -20,6 +20,7 @@
#include "widgets/Window.hpp"
#include <boost/foreach.hpp>
#include <QActionGroup>
#include <QDebug>
#include <QFile>
#include <QFormLayout>
@@ -54,11 +55,6 @@ Notebook::Notebook(QWidget *parent)
[this](bool value) {
this->setLockNotebookLayout(value);
});
this->showTabsAction_ = new QAction("Toggle visibility of tabs");
QObject::connect(this->showTabsAction_, &QAction::triggered, [this]() {
this->setShowTabs(!this->getShowTabs());
});
this->updateTabVisibilityMenuAction();
this->toggleTopMostAction_ = new QAction("Top most window", this);
this->toggleTopMostAction_->setCheckable(true);
@@ -597,7 +593,6 @@ void Notebook::setShowTabs(bool value)
this->performLayout();
this->updateTabVisibility();
this->updateTabVisibilityMenuAction();
// show a popup upon hiding tabs
if (!value && getSettings()->informOnTabVisibilityToggle.getValue())
@@ -668,35 +663,6 @@ void Notebook::updateTabVisibility()
}
}
void Notebook::updateTabVisibilityMenuAction()
{
const auto *hotkeys = getApp()->getHotkeys();
auto toggleSeq = hotkeys->getDisplaySequence(
HotkeyCategory::Window, "setTabVisibility", {std::vector<QString>()});
if (toggleSeq.isEmpty())
{
toggleSeq = hotkeys->getDisplaySequence(
HotkeyCategory::Window, "setTabVisibility", {{"toggle"}});
}
if (toggleSeq.isEmpty())
{
// show contextual shortcuts
if (this->getShowTabs())
{
toggleSeq = hotkeys->getDisplaySequence(
HotkeyCategory::Window, "setTabVisibility", {{"off"}});
}
else if (!this->getShowTabs())
{
toggleSeq = hotkeys->getDisplaySequence(
HotkeyCategory::Window, "setTabVisibility", {{"on"}});
}
}
this->showTabsAction_->setShortcut(toggleSeq);
}
bool Notebook::getShowAddButton() const
{
return this->showAddButton_;
@@ -1274,8 +1240,6 @@ void Notebook::setLockNotebookLayout(bool value)
void Notebook::addNotebookActionsToMenu(QMenu *menu)
{
menu->addAction(this->showTabsAction_);
menu->addAction(this->lockNotebookLayoutAction_);
menu->addAction(this->toggleTopMostAction_);
@@ -1368,9 +1332,64 @@ SplitNotebook::SplitNotebook(Window *parent)
this->addCustomButtons();
}
this->toggleOfflineTabsAction_ = new QAction({}, this);
QObject::connect(this->toggleOfflineTabsAction_, &QAction::triggered, this,
&SplitNotebook::toggleOfflineTabs);
auto *tabVisibilityActionGroup = new QActionGroup(this);
tabVisibilityActionGroup->setExclusionPolicy(
QActionGroup::ExclusionPolicy::Exclusive);
this->showAllTabsAction = new QAction("Show all tabs", this);
this->showAllTabsAction->setCheckable(true);
this->showAllTabsAction->setShortcut(
getApp()->getHotkeys()->getDisplaySequence(
HotkeyCategory::Window, "setTabVisibility", {{"on"}}));
QObject::connect(this->showAllTabsAction, &QAction::triggered, this,
[this] {
this->setShowTabs(true);
getSettings()->tabVisibility.setValue(
NotebookTabVisibility::AllTabs);
this->showAllTabsAction->setChecked(true);
});
tabVisibilityActionGroup->addAction(this->showAllTabsAction);
this->onlyShowLiveTabsAction = new QAction("Only show live tabs", this);
this->onlyShowLiveTabsAction->setCheckable(true);
this->onlyShowLiveTabsAction->setShortcut(
getApp()->getHotkeys()->getDisplaySequence(
HotkeyCategory::Window, "setTabVisibility", {{"liveOnly"}}));
QObject::connect(this->onlyShowLiveTabsAction, &QAction::triggered, this,
[this] {
this->setShowTabs(true);
getSettings()->tabVisibility.setValue(
NotebookTabVisibility::LiveOnly);
this->onlyShowLiveTabsAction->setChecked(true);
});
tabVisibilityActionGroup->addAction(this->onlyShowLiveTabsAction);
this->hideAllTabsAction = new QAction("Hide all tabs", this);
this->hideAllTabsAction->setCheckable(true);
this->hideAllTabsAction->setShortcut(
getApp()->getHotkeys()->getDisplaySequence(
HotkeyCategory::Window, "setTabVisibility", {{"off"}}));
QObject::connect(this->hideAllTabsAction, &QAction::triggered, this,
[this] {
this->setShowTabs(false);
getSettings()->tabVisibility.setValue(
NotebookTabVisibility::AllTabs);
this->hideAllTabsAction->setChecked(true);
});
tabVisibilityActionGroup->addAction(this->hideAllTabsAction);
switch (getSettings()->tabVisibility.getEnum())
{
case NotebookTabVisibility::AllTabs: {
this->showAllTabsAction->setChecked(true);
}
break;
case NotebookTabVisibility::LiveOnly: {
this->onlyShowLiveTabsAction->setChecked(true);
}
break;
}
getSettings()->tabVisibility.connect(
[this](int val, auto) {
@@ -1385,17 +1404,12 @@ SplitNotebook::SplitNotebook(Window *parent)
this->setTabVisibilityFilter([](const NotebookTab *tab) {
return tab->isLive();
});
this->toggleOfflineTabsAction_->setText("Show all tabs");
break;
case NotebookTabVisibility::AllTabs:
default:
this->setTabVisibilityFilter(nullptr);
this->toggleOfflineTabsAction_->setText(
"Show live tabs only");
break;
}
this->updateToggleOfflineTabsHotkey(visibility);
},
this->signalHolder_, true);
@@ -1448,29 +1462,26 @@ SplitNotebook::SplitNotebook(Window *parent)
});
}
void SplitNotebook::toggleOfflineTabs()
{
if (!this->getShowTabs())
{
// Tabs are currently hidden, so the intention is to show
// tabs again before enabling the live only setting
this->setShowTabs(true);
getSettings()->tabVisibility.setValue(NotebookTabVisibility::LiveOnly);
}
else
{
getSettings()->tabVisibility.setValue(
getSettings()->tabVisibility.getEnum() ==
NotebookTabVisibility::LiveOnly
? NotebookTabVisibility::AllTabs
: NotebookTabVisibility::LiveOnly);
}
}
void SplitNotebook::addNotebookActionsToMenu(QMenu *menu)
{
Notebook::addNotebookActionsToMenu(menu);
menu->addAction(this->toggleOfflineTabsAction_);
auto *submenu = menu->addMenu("Tab visibility");
submenu->addAction(this->showAllTabsAction);
submenu->addAction(this->onlyShowLiveTabsAction);
submenu->addAction(this->hideAllTabsAction);
}
void SplitNotebook::toggleTabVisibility()
{
if (this->getShowTabs())
{
this->hideAllTabsAction->trigger();
}
else
{
this->showAllTabsAction->trigger();
}
}
void SplitNotebook::showEvent(QShowEvent * /*event*/)
@@ -1550,42 +1561,6 @@ void SplitNotebook::addCustomButtons()
this->updateStreamerModeIcon();
}
void SplitNotebook::updateToggleOfflineTabsHotkey(
NotebookTabVisibility newTabVisibility)
{
auto *hotkeys = getApp()->getHotkeys();
auto getKeySequence = [&](auto argument) {
return hotkeys->getDisplaySequence(HotkeyCategory::Window,
"setTabVisibility", {{argument}});
};
auto toggleSeq = getKeySequence("toggleLiveOnly");
switch (newTabVisibility)
{
case NotebookTabVisibility::AllTabs:
if (toggleSeq.isEmpty())
{
toggleSeq = getKeySequence("liveOnly");
}
break;
case NotebookTabVisibility::LiveOnly:
if (toggleSeq.isEmpty())
{
toggleSeq = getKeySequence("toggle");
if (toggleSeq.isEmpty())
{
toggleSeq = getKeySequence("on");
}
}
break;
}
this->toggleOfflineTabsAction_->setShortcut(toggleSeq);
}
void SplitNotebook::updateStreamerModeIcon()
{
if (this->streamerModeIcon_ == nullptr)