Skip to content

Commit 5d1ec50

Browse files
committed
Handle queue actions in toolbar customization: dynamic show/hide, submenu placement, separator
1 parent 3076b78 commit 5d1ec50

2 files changed

Lines changed: 67 additions & 19 deletions

File tree

src/gui/mainwindow.cpp

Lines changed: 66 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,10 @@ void MainWindow::toolbarMenuRequested(const QPoint &pos)
717717
// Reinsert in default order, each action before spacer in sequence
718718
struct DefaultEntry { QString name; bool sepAfter; };
719719
const QList<DefaultEntry> defaultOrder = {
720+
{u"actionBottomQueuePos"_s, false},
721+
{u"actionDecreaseQueuePos"_s, false},
722+
{u"actionIncreaseQueuePos"_s, false},
723+
{u"actionTopQueuePos"_s, false},
720724
{u"actionOpen"_s, false},
721725
{u"actionDownloadFromURL"_s, false},
722726
{u"actionDelete"_s, true},
@@ -738,7 +742,7 @@ void MainWindow::toolbarMenuRequested(const QPoint &pos)
738742
insertAnchor = a;
739743
}
740744
}
741-
// Hide queue actions which are not in default
745+
// Hide queue actions and reset shown flag so loadPreferences re-evaluates
742746
const QStringList queueActions = {
743747
u"actionTopQueuePos"_s, u"actionIncreaseQueuePos"_s,
744748
u"actionDecreaseQueuePos"_s, u"actionBottomQueuePos"_s
@@ -748,14 +752,19 @@ void MainWindow::toolbarMenuRequested(const QPoint &pos)
748752
if (QAction *a = actionMap.value(name))
749753
a->setVisible(false);
750754
}
755+
m_queueActionsShown = false;
756+
loadPreferences();
751757
saveToolbarState();
752758
});
753759
visibilityMenu->addSeparator();
760+
const QStringList queueActionNames = {u"actionTopQueuePos"_s, u"actionIncreaseQueuePos"_s,
761+
u"actionDecreaseQueuePos"_s, u"actionBottomQueuePos"_s};
754762
for (QAction *a : m_ui->toolBar->actions())
755763
{
756764
if (a->isSeparator() || a->text().isEmpty()
757765
|| a == m_spacerAction || a == m_columnFilterAction
758-
|| a->objectName() == u"actionLock"_s)
766+
|| a->objectName() == u"actionLock"_s
767+
|| queueActionNames.contains(a->objectName()))
759768
continue;
760769
QAction *checkAction = visibilityMenu->addAction(a->text());
761770
checkAction->setCheckable(true);
@@ -766,6 +775,28 @@ void MainWindow::toolbarMenuRequested(const QPoint &pos)
766775
saveToolbarState();
767776
});
768777
}
778+
visibilityMenu->addSeparator();
779+
const bool queuingEnabled = BitTorrent::Session::instance()->isQueueingSystemEnabled();
780+
for (QAction *a : m_ui->toolBar->actions())
781+
{
782+
if (!queueActionNames.contains(a->objectName()))
783+
continue;
784+
QAction *checkAction = visibilityMenu->addAction(a->text());
785+
if (queuingEnabled)
786+
{
787+
checkAction->setCheckable(true);
788+
checkAction->setChecked(a->isVisible());
789+
connect(checkAction, &QAction::toggled, this, [this, a](bool checked)
790+
{
791+
a->setVisible(checked);
792+
saveToolbarState();
793+
});
794+
}
795+
else
796+
{
797+
checkAction->setEnabled(false);
798+
}
799+
}
769800

770801
buttonMenu.addSeparator();
771802

@@ -1631,29 +1662,45 @@ void MainWindow::loadPreferences()
16311662
// Queueing System
16321663
if (BitTorrent::Session::instance()->isQueueingSystemEnabled())
16331664
{
1634-
if (!m_ui->actionDecreaseQueuePos->isVisible())
1665+
m_transferListWidget->hideQueuePosColumn(false);
1666+
m_queueSeparator->setVisible(true);
1667+
m_queueSeparatorMenu->setVisible(true);
1668+
if (!m_queueActionsShown)
16351669
{
1636-
m_transferListWidget->hideQueuePosColumn(false);
1637-
m_ui->actionDecreaseQueuePos->setVisible(true);
1638-
m_ui->actionIncreaseQueuePos->setVisible(true);
1639-
m_ui->actionTopQueuePos->setVisible(true);
1640-
m_ui->actionBottomQueuePos->setVisible(true);
1670+
// Move queue actions to end of toolbar in correct order before spacer
1671+
const QList<QAction *> queueOrder = {
1672+
m_ui->actionTopQueuePos,
1673+
m_ui->actionIncreaseQueuePos,
1674+
m_ui->actionDecreaseQueuePos,
1675+
m_ui->actionBottomQueuePos
1676+
};
1677+
for (QAction *a : queueOrder)
1678+
{
1679+
m_ui->toolBar->removeAction(a);
1680+
m_ui->toolBar->insertAction(m_spacerAction, a);
1681+
a->setVisible(true);
1682+
}
1683+
// Move queue separator to just before the group, unless one is already there
1684+
m_ui->toolBar->removeAction(m_queueSeparator);
1685+
const QList<QAction *> acts = m_ui->toolBar->actions();
1686+
const int topIdx = acts.indexOf(m_ui->actionTopQueuePos);
1687+
const bool hasSepBefore = (topIdx > 0) && acts[topIdx - 1]->isSeparator();
1688+
if (!hasSepBefore)
1689+
m_ui->toolBar->insertAction(m_ui->actionTopQueuePos, m_queueSeparator);
16411690
m_queueSeparator->setVisible(true);
1642-
m_queueSeparatorMenu->setVisible(true);
1691+
m_queueActionsShown = true;
16431692
}
16441693
}
16451694
else
16461695
{
1647-
if (m_ui->actionDecreaseQueuePos->isVisible())
1648-
{
1649-
m_transferListWidget->hideQueuePosColumn(true);
1650-
m_ui->actionDecreaseQueuePos->setVisible(false);
1651-
m_ui->actionIncreaseQueuePos->setVisible(false);
1652-
m_ui->actionTopQueuePos->setVisible(false);
1653-
m_ui->actionBottomQueuePos->setVisible(false);
1654-
m_queueSeparator->setVisible(false);
1655-
m_queueSeparatorMenu->setVisible(false);
1656-
}
1696+
m_transferListWidget->hideQueuePosColumn(true);
1697+
m_ui->actionDecreaseQueuePos->setVisible(false);
1698+
m_ui->actionIncreaseQueuePos->setVisible(false);
1699+
m_ui->actionTopQueuePos->setVisible(false);
1700+
m_ui->actionBottomQueuePos->setVisible(false);
1701+
m_queueSeparator->setVisible(false);
1702+
m_queueSeparatorMenu->setVisible(false);
1703+
m_queueActionsShown = false;
16571704
}
16581705

16591706
// Torrent properties

src/gui/mainwindow.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ private slots:
244244
// Widgets
245245
QAction *m_queueSeparator = nullptr;
246246
QAction *m_queueSeparatorMenu = nullptr;
247+
bool m_queueActionsShown = false;
247248
QSplitter *m_splitter = nullptr;
248249
QPointer<SearchWidget> m_searchWidget;
249250
QPointer<RSSWidget> m_rssWidget;

0 commit comments

Comments
 (0)