File indexing completed on 2024-03-24 04:02:27

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 1999 Reginald Stadlbauer <reggie@kde.org>
0004     SPDX-FileCopyrightText: 1999 Simon Hausmann <hausmann@kde.org>
0005     SPDX-FileCopyrightText: 2000 Nicolas Hadacek <haadcek@kde.org>
0006     SPDX-FileCopyrightText: 2000 Kurt Granroth <granroth@kde.org>
0007     SPDX-FileCopyrightText: 2000 Michael Koch <koch@kde.org>
0008     SPDX-FileCopyrightText: 2001 Holger Freyther <freyther@kde.org>
0009     SPDX-FileCopyrightText: 2002 Ellis Whitehead <ellis@kde.org>
0010     SPDX-FileCopyrightText: 2002 Joseph Wenninger <jowenn@kde.org>
0011     SPDX-FileCopyrightText: 2003 Andras Mantia <amantia@kde.org>
0012     SPDX-FileCopyrightText: 2005-2006 Hamish Rodda <rodda@kde.org>
0013 
0014     SPDX-License-Identifier: LGPL-2.0-only
0015 */
0016 
0017 #include "ktoggletoolbaraction.h"
0018 
0019 #include <QByteArray>
0020 #include <QEvent>
0021 #include <QPointer>
0022 
0023 #include <KAuthorized>
0024 
0025 #include "kmainwindow.h"
0026 #include "ktoolbar.h"
0027 
0028 class KToggleToolBarActionPrivate
0029 {
0030 public:
0031     KToggleToolBarActionPrivate(KToggleToolBarAction *q)
0032         : toolBar(nullptr)
0033         , beingToggled(false)
0034     {
0035         const bool authorized = KAuthorized::authorizeAction(QStringLiteral("options_show_toolbar"));
0036         q->setEnabled(authorized);
0037         q->setVisible(authorized);
0038     }
0039 
0040     QPointer<KToolBar> toolBar;
0041     bool beingToggled;
0042 };
0043 
0044 KToggleToolBarAction::KToggleToolBarAction(KToolBar *toolBar, const QString &text, QObject *parent)
0045     : KToggleAction(text, parent)
0046     , d(new KToggleToolBarActionPrivate(this))
0047 {
0048     d->toolBar = toolBar;
0049     d->toolBar->installEventFilter(this);
0050 
0051     d->beingToggled = true;
0052     setChecked(d->toolBar->isVisible());
0053     d->beingToggled = false;
0054 }
0055 
0056 KToggleToolBarAction::~KToggleToolBarAction() = default;
0057 
0058 bool KToggleToolBarAction::eventFilter(QObject *watched, QEvent *event)
0059 {
0060     if (d->beingToggled) {
0061         return false;
0062     }
0063 
0064     d->beingToggled = true;
0065 
0066     if (watched == d->toolBar) {
0067         switch (event->type()) {
0068         case QEvent::Hide:
0069             if (isChecked()) {
0070                 setChecked(false);
0071             }
0072             break;
0073 
0074         case QEvent::Show:
0075             if (!isChecked()) {
0076                 setChecked(true);
0077             }
0078             break;
0079 
0080         default:
0081             break;
0082         }
0083     }
0084 
0085     d->beingToggled = false;
0086 
0087     return false;
0088 }
0089 
0090 KToolBar *KToggleToolBarAction::toolBar()
0091 {
0092     return d->toolBar;
0093 }
0094 
0095 void KToggleToolBarAction::slotToggled(bool checked)
0096 {
0097     if (!d->beingToggled && d->toolBar && checked != d->toolBar->isVisible()) {
0098         d->beingToggled = true;
0099         d->toolBar->setVisible(checked);
0100         d->beingToggled = false;
0101 
0102         QMainWindow *mw = d->toolBar->mainWindow();
0103         if (mw && qobject_cast<KMainWindow *>(mw)) {
0104             static_cast<KMainWindow *>(mw)->setSettingsDirty();
0105         }
0106     }
0107 
0108     KToggleAction::slotToggled(checked);
0109 }
0110 
0111 #include "moc_ktoggletoolbaraction.cpp"