@@ -426,6 +426,15 @@ MainWindow::MainWindow(IGUIApplication *app, const WindowState initialState, con
426426 m_ui->actionAutoShutdownDisabled ->setChecked (true );
427427
428428 // Load Window state and sizes
429+ // Snapshot all customizable toolbar actions before loadSettings may reorder them
430+ for (QAction *a : m_ui->toolBar ->actions ())
431+ {
432+ if (a->isSeparator () || a->text ().isEmpty ()
433+ || a == m_spacerAction || a == m_columnFilterAction
434+ || a->objectName () == u" actionLock" _s)
435+ continue ;
436+ m_allToolbarActions.append (a);
437+ }
429438 loadSettings ();
430439
431440 populateDesktopIntegrationMenu ();
@@ -698,13 +707,11 @@ void MainWindow::toolbarMenuRequested(const QPoint &pos)
698707 QMenu *visibilityMenu = buttonMenu.addMenu (tr (" Show/Hide Buttons" ));
699708 visibilityMenu->addAction (tr (" Reset to Default" ), this , [this ]()
700709 {
701- // Build action map BEFORE removing anything
710+ // Build action map from master list so hidden actions are included
702711 QHash<QString, QAction *> actionMap;
703- for (QAction *a : m_ui->toolBar ->actions ())
704- {
705- if (!a->isSeparator () && !a->objectName ().isEmpty ())
706- actionMap[a->objectName ()] = a;
707- }
712+ for (QAction *a : m_allToolbarActions)
713+ actionMap[a->objectName ()] = a;
714+ m_hiddenToolbarActions.clear ();
708715 // Remove all non-locked actions and separators
709716 const QList<QAction *> current = m_ui->toolBar ->actions ();
710717 for (QAction *a : current)
@@ -759,36 +766,65 @@ void MainWindow::toolbarMenuRequested(const QPoint &pos)
759766 visibilityMenu->addSeparator ();
760767 const QStringList queueActionNames = {u" actionTopQueuePos" _s, u" actionIncreaseQueuePos" _s,
761768 u" actionDecreaseQueuePos" _s, u" actionBottomQueuePos" _s};
762- for (QAction *a : m_ui-> toolBar -> actions () )
769+ for (QAction *a : m_allToolbarActions )
763770 {
764- if (a->isSeparator () || a->text ().isEmpty ()
765- || a == m_spacerAction || a == m_columnFilterAction
766- || a->objectName () == u" actionLock" _s
767- || queueActionNames.contains (a->objectName ()))
771+ if (queueActionNames.contains (a->objectName ()))
768772 continue ;
769773 QAction *checkAction = visibilityMenu->addAction (a->text ());
770774 checkAction->setCheckable (true );
771- checkAction->setChecked (a->isVisible ());
775+ const bool inToolbar = m_ui->toolBar ->actions ().contains (a);
776+ checkAction->setChecked (inToolbar);
772777 connect (checkAction, &QAction::toggled, this , [this , a](bool checked)
773778 {
774- a->setVisible (checked);
779+ if (!checked)
780+ {
781+ const QList<QAction *> acts = m_ui->toolBar ->actions ();
782+ m_hiddenToolbarActions[a->objectName ()] = acts.indexOf (a);
783+ m_ui->toolBar ->removeAction (a);
784+ }
785+ else
786+ {
787+ const int savedIdx = m_hiddenToolbarActions.value (a->objectName (), -1 );
788+ const QList<QAction *> acts = m_ui->toolBar ->actions ();
789+ if (savedIdx >= 0 && savedIdx < acts.size ())
790+ m_ui->toolBar ->insertAction (acts[savedIdx], a);
791+ else
792+ m_ui->toolBar ->insertAction (m_spacerAction, a);
793+ m_hiddenToolbarActions.remove (a->objectName ());
794+ }
775795 saveToolbarState ();
776796 });
777797 }
778798 visibilityMenu->addSeparator ();
779799 const bool queuingEnabled = BitTorrent::Session::instance ()->isQueueingSystemEnabled ();
780- for (QAction *a : m_ui-> toolBar -> actions () )
800+ for (QAction *a : m_allToolbarActions )
781801 {
782802 if (!queueActionNames.contains (a->objectName ()))
783803 continue ;
784804 QAction *checkAction = visibilityMenu->addAction (a->text ());
785805 if (queuingEnabled)
786806 {
787807 checkAction->setCheckable (true );
788- checkAction->setChecked (a->isVisible ());
808+ const bool inToolbar = m_ui->toolBar ->actions ().contains (a);
809+ checkAction->setChecked (inToolbar);
789810 connect (checkAction, &QAction::toggled, this , [this , a](bool checked)
790811 {
791- a->setVisible (checked);
812+ if (!checked)
813+ {
814+ const QList<QAction *> acts = m_ui->toolBar ->actions ();
815+ m_hiddenToolbarActions[a->objectName ()] = acts.indexOf (a);
816+ m_ui->toolBar ->removeAction (a);
817+ }
818+ else
819+ {
820+ const int savedIdx = m_hiddenToolbarActions.value (a->objectName (), -1 );
821+ const QList<QAction *> acts = m_ui->toolBar ->actions ();
822+ if (savedIdx >= 0 && savedIdx < acts.size ())
823+ m_ui->toolBar ->insertAction (acts[savedIdx], a);
824+ else
825+ m_ui->toolBar ->insertAction (m_spacerAction, a);
826+ m_hiddenToolbarActions.remove (a->objectName ());
827+ }
792828 saveToolbarState ();
793829 });
794830 }
0 commit comments