1 /*
2     This file is part of the KDE libraries
3     SPDX-FileCopyrightText: 1999 Reginald Stadlbauer <reggie@kde.org>
4     SPDX-FileCopyrightText: 1999 Simon Hausmann <hausmann@kde.org>
5     SPDX-FileCopyrightText: 2000 Nicolas Hadacek <haadcek@kde.org>
6     SPDX-FileCopyrightText: 2000 Kurt Granroth <granroth@kde.org>
7     SPDX-FileCopyrightText: 2000 Michael Koch <koch@kde.org>
8     SPDX-FileCopyrightText: 2001 Holger Freyther <freyther@kde.org>
9     SPDX-FileCopyrightText: 2002 Ellis Whitehead <ellis@kde.org>
10     SPDX-FileCopyrightText: 2002 Joseph Wenninger <jowenn@kde.org>
11     SPDX-FileCopyrightText: 2003 Andras Mantia <amantia@kde.org>
12     SPDX-FileCopyrightText: 2005-2006 Hamish Rodda <rodda@kde.org>
13 
14     SPDX-License-Identifier: LGPL-2.0-only
15 */
16 
17 #include "ktogglefullscreenaction.h"
18 
19 #include "ktoggleaction_p.h"
20 
21 #include <QEvent>
22 #include <QWidget>
23 
24 class KToggleFullScreenActionPrivate : public KToggleActionPrivate
25 {
26     Q_DECLARE_PUBLIC(KToggleFullScreenAction)
27 
28 public:
KToggleFullScreenActionPrivate(KToggleFullScreenAction * qq)29     KToggleFullScreenActionPrivate(KToggleFullScreenAction *qq)
30         : KToggleActionPrivate(qq)
31     {
32     }
33 
updateTextsAndIcon()34     void updateTextsAndIcon()
35     {
36         Q_Q(KToggleFullScreenAction);
37 
38         if (q->isChecked()) {
39             q->setText(KToggleFullScreenAction::tr("Exit F&ull Screen Mode", "@action:inmenu"));
40             q->setIconText(KToggleFullScreenAction::tr("Exit Full Screen", "@action:intoolbar"));
41             q->setToolTip(KToggleFullScreenAction::tr("Exit full screen mode", "@info:tooltip"));
42             q->setIcon(QIcon::fromTheme(QStringLiteral("view-restore")));
43         } else {
44             q->setText(KToggleFullScreenAction::tr("F&ull Screen Mode", "@action:inmenu"));
45             q->setIconText(KToggleFullScreenAction::tr("Full Screen", "@action:intoolbar"));
46             q->setToolTip(KToggleFullScreenAction::tr("Display the window in full screen", "@info:tooltip"));
47             q->setIcon(QIcon::fromTheme(QStringLiteral("view-fullscreen")));
48         }
49     }
50 
51     QWidget *window = nullptr;
52 };
53 
KToggleFullScreenAction(QObject * parent)54 KToggleFullScreenAction::KToggleFullScreenAction(QObject *parent)
55     : KToggleAction(*new KToggleFullScreenActionPrivate(this), parent)
56 {
57     Q_D(KToggleFullScreenAction);
58 
59     d->updateTextsAndIcon();
60 }
61 
KToggleFullScreenAction(QWidget * window,QObject * parent)62 KToggleFullScreenAction::KToggleFullScreenAction(QWidget *window, QObject *parent)
63     : KToggleAction(*new KToggleFullScreenActionPrivate(this), parent)
64 {
65     Q_D(KToggleFullScreenAction);
66 
67     d->updateTextsAndIcon();
68     setWindow(window);
69 }
70 
71 KToggleFullScreenAction::~KToggleFullScreenAction() = default;
72 
setWindow(QWidget * window)73 void KToggleFullScreenAction::setWindow(QWidget *window)
74 {
75     Q_D(KToggleFullScreenAction);
76 
77     if (d->window) {
78         d->window->removeEventFilter(this);
79     }
80 
81     d->window = window;
82 
83     if (d->window) {
84         d->window->installEventFilter(this);
85     }
86 }
87 
slotToggled(bool checked)88 void KToggleFullScreenAction::slotToggled(bool checked)
89 {
90     Q_D(KToggleFullScreenAction);
91 
92     KToggleAction::slotToggled(checked);
93     d->updateTextsAndIcon();
94 }
95 
eventFilter(QObject * object,QEvent * event)96 bool KToggleFullScreenAction::eventFilter(QObject *object, QEvent *event)
97 {
98     Q_D(KToggleFullScreenAction);
99 
100     if (object == d->window) {
101         if (event->type() == QEvent::WindowStateChange) {
102             if (d->window->isFullScreen() != isChecked()) {
103                 activate(QAction::Trigger);
104             }
105         }
106     }
107 
108     return false;
109 }
110 
setFullScreen(QWidget * window,bool set)111 void KToggleFullScreenAction::setFullScreen(QWidget *window, bool set)
112 {
113     if (set) {
114         window->setWindowState(window->windowState() | Qt::WindowFullScreen);
115     } else {
116         window->setWindowState(window->windowState() & ~Qt::WindowFullScreen);
117     }
118 }
119