@@ -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
0 commit comments