Skip to content

Commit 161cb48

Browse files
committed
Fix menu bar preservation and drag shuffle for hidden buttons
1 parent 5d1ec50 commit 161cb48

5 files changed

Lines changed: 57 additions & 19 deletions

File tree

pis_tmp_dei.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<?xml version="1.0"?><e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/"><e:Header><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /><Reference URI="#signedContent"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /><DigestValue>ztiOYhlJtot2gXrnpgM3Uq+42NEOqCJN3HMDAD7yb08=</DigestValue></Reference></SignedInfo><SignatureValue>Uy3PAYV1A7OfzNkj7DMdVG8aK5DSbENDW+puZTgTSiFNDNDqf0gk+Xxe5vsIdRwvIX15WzSdlxhHWrNhonKZR3V70e2HaSnPJ89qHEFvqyCq3+lpBBQmCIS8Llc0RJKrgWRs+zjKUm+NB8YuIqyk9D6XxdGPT12QZWNBE+C9FC/WRvKlfT4b2/z1IjJHaMWitJl+uKuug0aMjesrPIYLM79MD5Un9BlVuTrUrg5+4RgEw7ZdNVtt6AobJv36UDPAlIEf0B962+ZgR34gG6ripUXzk9TH71e87natDpSwfrj8kcS++P8cdw5Q9kuZYlxE7cMqKHEycLv0x+zMb+jx9w==</SignatureValue><KeyInfo><X509Data><X509Certificate>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</X509Certificate></X509Data></KeyInfo></Signature></e:Header><e:Body id="signedContent"><ns3:query xmlns:ns1="http://pis.technologica.com/views/" xmlns:ns3="http://pis.technologica.com/ws/"><ns3:user><ns3:egn>7610176305</ns3:egn></ns3:user><ns3:from_clause>INYEAR_DENTAL_ACTS</ns3:from_clause></ns3:query></e:Body></e:Envelope>

pis_tmp_zok.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<?xml version="1.0"?><e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/"><e:Header><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /><Reference URI="#signedContent"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /><DigestValue>k/gKFX/bXbaF5n0PFCW4Bartz9wm1Tk/4cLs6XODlRI=</DigestValue></Reference></SignedInfo><SignatureValue>hD03V409eJi5d4R3s46dLDa9OykEqpoGIdoWQv8wfXeL1LlE7tgOZTCkMIzyLBUxLOfrooqEDZ8f86h+S5zBu1ILJtVXJY4Z/4zpZ5jji+8PfI7puXfXPqgFEwG4Yuk74YgOCE9CYqbbChjhL2+kwovl7rlgCtIE/oYx9bPmSFiHd8WDyDH4CkKXbciezGwH/A3bXKmCPP2JzjesThLAkCASVx0olQkTv4nMYBIbEJ+WIY2ZHj+W/2cpFpfWSqFzXgGL+Nc5I4w5rab8gc5YGRsroGI6x7GzvdVqiHBcTk7iDJ/1/l73gO2ijofbz3X5xkEQYHQuiWs4X8f9ymF3Fg==</SignatureValue><KeyInfo><X509Data><X509Certificate>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</X509Certificate></X509Data></KeyInfo></Signature></e:Header><e:Body id="signedContent"><ns1:hbIn xmlns:ns1="http://pis.technologica.com/ws/"><ns1:egn>7610176305</ns1:egn></ns1:hbIn></e:Body></e:Envelope>

src/gui/customizabletoolbar.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ void CustomizableToolBar::updateDrag(const QPoint &globalPos)
191191
const QList<QAction *> acts = actions();
192192

193193
QAction *newInsertBefore = (bi >= 0) ? acts[bi] : nullptr;
194-
bool foundFirst = false;
195194
for (int i = 0; i < bi; ++i)
196195
{
197196
QAction *a = acts[i];
@@ -208,8 +207,7 @@ void CustomizableToolBar::updateDrag(const QPoint &globalPos)
208207
}
209208
else
210209
{
211-
threshold = !foundFirst ? w->x() + w->width() : w->x() + w->width() / 2;
212-
foundFirst = true;
210+
threshold = w->x() + w->width() / 2;
213211
}
214212

215213
// Use float left edge for separators when moving left, centre otherwise

src/gui/mainwindow.cpp

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/gui/mainwindow.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ private slots:
245245
QAction *m_queueSeparator = nullptr;
246246
QAction *m_queueSeparatorMenu = nullptr;
247247
bool m_queueActionsShown = false;
248+
QHash<QString, int> m_hiddenToolbarActions;
249+
QList<QAction *> m_allToolbarActions;
248250
QSplitter *m_splitter = nullptr;
249251
QPointer<SearchWidget> m_searchWidget;
250252
QPointer<RSSWidget> m_rssWidget;

0 commit comments

Comments
 (0)