KWin
Loading...
Searching...
No Matches
kwintabboxconfigform.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2009 Martin Gräßlin <mgraesslin@kde.org>
6 SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
7 SPDX-FileCopyrightText: 2023 Ismael Asensio <isma.af@gmail.com>
8
9 SPDX-License-Identifier: GPL-2.0-or-later
10*/
11
13#include "kwintabboxsettings.h"
14#include "shortcutsettings.h"
15#include "ui_main.h"
16
17namespace KWin
18{
19
20using namespace TabBox;
21
22KWinTabBoxConfigForm::KWinTabBoxConfigForm(TabboxType type, TabBoxSettings *config, ShortcutSettings *shortcutsConfig, QWidget *parent)
23 : QWidget(parent)
24 , m_config(config)
25 , m_shortcuts(shortcutsConfig)
26 , ui(new Ui::KWinTabBoxConfigForm)
27{
28 ui->setupUi(this);
29
30 ui->effectConfigButton->setIcon(QIcon::fromTheme(QStringLiteral("view-preview")));
31
32 if (QApplication::screens().count() < 2) {
33 ui->filterScreens->hide();
34 ui->screenFilter->hide();
35 }
36
37 connect(this, &KWinTabBoxConfigForm::configChanged, this, &KWinTabBoxConfigForm::updateDefaultIndicators);
38
39 connect(ui->effectConfigButton, &QPushButton::clicked, this, &KWinTabBoxConfigForm::effectConfigButtonClicked);
40
41 connect(ui->kcfg_ShowTabBox, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::tabBoxToggled);
42
43 connect(ui->filterScreens, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterScreen);
44 connect(ui->currentScreen, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterScreen);
45 connect(ui->otherScreens, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterScreen);
46
47 connect(ui->filterDesktops, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterDesktop);
48 connect(ui->currentDesktop, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterDesktop);
49 connect(ui->otherDesktops, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterDesktop);
50
51 connect(ui->filterActivities, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterActivites);
52 connect(ui->currentActivity, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterActivites);
53 connect(ui->otherActivities, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterActivites);
54
55 connect(ui->filterMinimization, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterMinimization);
56 connect(ui->visibleWindows, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterMinimization);
57 connect(ui->hiddenWindows, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onFilterMinimization);
58
59 connect(ui->oneAppWindow, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onApplicationMode);
60 connect(ui->orderMinimized, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onOrderMinimizedMode);
61 connect(ui->showDesktop, &QAbstractButton::clicked, this, &KWinTabBoxConfigForm::onShowDesktopMode);
62
63 connect(ui->switchingModeCombo, &QComboBox::activated, this, &KWinTabBoxConfigForm::onSwitchingMode);
64 connect(ui->effectCombo, &QComboBox::activated, this, &KWinTabBoxConfigForm::onEffectCombo);
65
66 auto initShortcutWidget = [this](KKeySequenceWidget *widget, const char *name) {
67 widget->setCheckActionCollections({m_shortcuts->actionCollection()});
68 widget->setProperty("shortcutAction", name);
69 connect(widget, &KKeySequenceWidget::keySequenceChanged, this, &KWinTabBoxConfigForm::onShortcutChanged);
70 };
71
72 if (TabboxType::Main == type) {
73 initShortcutWidget(ui->scAll, "Walk Through Windows");
74 initShortcutWidget(ui->scAllReverse, "Walk Through Windows (Reverse)");
75 initShortcutWidget(ui->scCurrent, "Walk Through Windows of Current Application");
76 initShortcutWidget(ui->scCurrentReverse, "Walk Through Windows of Current Application (Reverse)");
77 } else if (TabboxType::Alternative == type) {
78 initShortcutWidget(ui->scAll, "Walk Through Windows Alternative");
79 initShortcutWidget(ui->scAllReverse, "Walk Through Windows Alternative (Reverse)");
80 initShortcutWidget(ui->scCurrent, "Walk Through Windows of Current Application Alternative");
81 initShortcutWidget(ui->scCurrentReverse, "Walk Through Windows of Current Application Alternative (Reverse)");
82 }
83
85}
86
91
92TabBoxSettings *KWinTabBoxConfigForm::config() const
93{
94 return m_config;
95}
96
98{
99 return ui->kcfg_HighlightWindows->isChecked();
100}
101
102bool KWinTabBoxConfigForm::showTabBox() const
103{
104 return ui->kcfg_ShowTabBox->isChecked();
105}
106
107int KWinTabBoxConfigForm::filterScreen() const
108{
109 if (ui->filterScreens->isChecked()) {
111 } else {
113 }
114}
115
116int KWinTabBoxConfigForm::filterDesktop() const
117{
118 if (ui->filterDesktops->isChecked()) {
120 } else {
122 }
123}
124
125int KWinTabBoxConfigForm::filterActivities() const
126{
127 if (ui->filterActivities->isChecked()) {
129 } else {
131 }
132}
133
134int KWinTabBoxConfigForm::filterMinimization() const
135{
136 if (ui->filterMinimization->isChecked()) {
137 return ui->visibleWindows->isChecked() ? TabBoxConfig::ExcludeMinimizedClients : TabBoxConfig::OnlyMinimizedClients;
138 } else {
140 }
141}
142
143int KWinTabBoxConfigForm::applicationMode() const
144{
146}
147
148int KWinTabBoxConfigForm::orderMinimizedMode() const
149{
150 return ui->orderMinimized->isChecked() ? TabBoxConfig::GroupByMinimized : TabBoxConfig::NoGroupByMinimized;
151}
152
153int KWinTabBoxConfigForm::showDesktopMode() const
154{
155 return ui->showDesktop->isChecked() ? TabBoxConfig::ShowDesktopClient : TabBoxConfig::DoNotShowDesktopClient;
156}
157
158int KWinTabBoxConfigForm::switchingMode() const
159{
160 return ui->switchingModeCombo->currentIndex();
161}
162
163QString KWinTabBoxConfigForm::layoutName() const
164{
165 return ui->effectCombo->currentData().toString();
166}
167
168void KWinTabBoxConfigForm::setFilterScreen(TabBox::TabBoxConfig::ClientMultiScreenMode mode)
169{
170 ui->filterScreens->setChecked(mode != TabBoxConfig::IgnoreMultiScreen);
171 ui->currentScreen->setChecked(mode == TabBoxConfig::OnlyCurrentScreenClients);
172 ui->otherScreens->setChecked(mode == TabBoxConfig::ExcludeCurrentScreenClients);
173}
174
175void KWinTabBoxConfigForm::setFilterDesktop(TabBox::TabBoxConfig::ClientDesktopMode mode)
176{
177 ui->filterDesktops->setChecked(mode != TabBoxConfig::AllDesktopsClients);
178 ui->currentDesktop->setChecked(mode == TabBoxConfig::OnlyCurrentDesktopClients);
179 ui->otherDesktops->setChecked(mode == TabBoxConfig::ExcludeCurrentDesktopClients);
180}
181
182void KWinTabBoxConfigForm::setFilterActivities(TabBox::TabBoxConfig::ClientActivitiesMode mode)
183{
184 ui->filterActivities->setChecked(mode != TabBoxConfig::AllActivitiesClients);
185 ui->currentActivity->setChecked(mode == TabBoxConfig::OnlyCurrentActivityClients);
186 ui->otherActivities->setChecked(mode == TabBoxConfig::ExcludeCurrentActivityClients);
187}
188
189void KWinTabBoxConfigForm::setFilterMinimization(TabBox::TabBoxConfig::ClientMinimizedMode mode)
190{
191 ui->filterMinimization->setChecked(mode != TabBoxConfig::IgnoreMinimizedStatus);
192 ui->visibleWindows->setChecked(mode == TabBoxConfig::ExcludeMinimizedClients);
193 ui->hiddenWindows->setChecked(mode == TabBoxConfig::OnlyMinimizedClients);
194}
195
196void KWinTabBoxConfigForm::setApplicationMode(TabBox::TabBoxConfig::ClientApplicationsMode mode)
197{
198 ui->oneAppWindow->setChecked(mode == TabBoxConfig::OneWindowPerApplication);
199}
200
201void KWinTabBoxConfigForm::setOrderMinimizedMode(TabBox::TabBoxConfig::OrderMinimizedMode mode)
202{
203 ui->orderMinimized->setChecked(mode == TabBoxConfig::GroupByMinimized);
204}
205
206void KWinTabBoxConfigForm::setShowDesktopMode(TabBox::TabBoxConfig::ShowDesktopMode mode)
207{
208 ui->showDesktop->setChecked(mode == TabBoxConfig::ShowDesktopClient);
209}
210
211void KWinTabBoxConfigForm::setSwitchingModeChanged(TabBox::TabBoxConfig::ClientSwitchingMode mode)
212{
213 ui->switchingModeCombo->setCurrentIndex(mode);
214}
215
216void KWinTabBoxConfigForm::setLayoutName(const QString &layoutName)
217{
218 const int index = ui->effectCombo->findData(layoutName);
219 if (index >= 0) {
220 ui->effectCombo->setCurrentIndex(index);
221 }
222}
223
224void KWinTabBoxConfigForm::setEffectComboModel(QStandardItemModel *model)
225{
226 // We don't want to lose the config layout when resetting the combo model
227 const QString layout = m_config->layoutName();
228 ui->effectCombo->setModel(model);
229 setLayoutName(layout);
230}
231
233{
234 return ui->effectCombo->currentData(role);
235}
236
237void KWinTabBoxConfigForm::tabBoxToggled(bool on)
238{
239 // Highlight Windows options is availabled if no TabBox effect is selected
240 // or if Tabbox is not builtin effet.
241 on = !on || ui->effectCombo->currentData(AddonEffect).toBool();
242 ui->kcfg_HighlightWindows->setEnabled(on && m_isHighlightWindowsEnabled);
243}
244
245void KWinTabBoxConfigForm::onFilterScreen()
246{
247 m_config->setMultiScreenMode(filterScreen());
248 Q_EMIT configChanged();
249}
250
251void KWinTabBoxConfigForm::onFilterDesktop()
252{
253 m_config->setDesktopMode(filterDesktop());
254 Q_EMIT configChanged();
255}
256
257void KWinTabBoxConfigForm::onFilterActivites()
258{
259 m_config->setActivitiesMode(filterActivities());
260 Q_EMIT configChanged();
261}
262
263void KWinTabBoxConfigForm::onFilterMinimization()
264{
265 m_config->setMinimizedMode(filterMinimization());
266 Q_EMIT configChanged();
267}
268
269void KWin::KWinTabBoxConfigForm::onApplicationMode()
270{
271 m_config->setApplicationsMode(applicationMode());
272 Q_EMIT configChanged();
273}
274
275void KWinTabBoxConfigForm::onOrderMinimizedMode()
276{
277 m_config->setOrderMinimizedMode(orderMinimizedMode());
278 Q_EMIT configChanged();
279}
280
281void KWinTabBoxConfigForm::onShowDesktopMode()
282{
283 m_config->setShowDesktopMode(showDesktopMode());
284 Q_EMIT configChanged();
285}
286
287void KWinTabBoxConfigForm::onSwitchingMode()
288{
289 m_config->setSwitchingMode(switchingMode());
290 Q_EMIT configChanged();
291}
292
293void KWinTabBoxConfigForm::onEffectCombo()
294{
295 const bool isAddonEffect = ui->effectCombo->currentData(AddonEffect).toBool();
296 ui->effectConfigButton->setIcon(QIcon::fromTheme(isAddonEffect ? "view-preview" : "configure"));
297 if (!ui->kcfg_ShowTabBox->isChecked()) {
298 return;
299 }
300 ui->kcfg_HighlightWindows->setEnabled(isAddonEffect && m_isHighlightWindowsEnabled);
301
302 m_config->setLayoutName(layoutName());
303 Q_EMIT configChanged();
304}
305
306void KWinTabBoxConfigForm::onShortcutChanged(const QKeySequence &seq)
307{
308 const QString actionName = sender()->property("shortcutAction").toString();
309 m_shortcuts->setShortcut(actionName, seq);
310
311 Q_EMIT configChanged();
312}
313
315{
316 setFilterScreen(static_cast<TabBoxConfig::ClientMultiScreenMode>(m_config->multiScreenMode()));
317 setFilterDesktop(static_cast<TabBoxConfig::ClientDesktopMode>(m_config->desktopMode()));
318 setFilterActivities(static_cast<TabBoxConfig::ClientActivitiesMode>(m_config->activitiesMode()));
319 setFilterMinimization(static_cast<TabBoxConfig::ClientMinimizedMode>(m_config->minimizedMode()));
320 setApplicationMode(static_cast<TabBoxConfig::ClientApplicationsMode>(m_config->applicationsMode()));
321 setOrderMinimizedMode(static_cast<TabBoxConfig::OrderMinimizedMode>(m_config->orderMinimizedMode()));
322 setShowDesktopMode(static_cast<TabBoxConfig::ShowDesktopMode>(m_config->showDesktopMode()));
323 setSwitchingModeChanged(static_cast<TabBoxConfig::ClientSwitchingMode>(m_config->switchingMode()));
324 setLayoutName(m_config->layoutName());
325
326 for (const auto &widget : {ui->scAll, ui->scAllReverse, ui->scCurrent, ui->scCurrentReverse}) {
327 const QString actionName = widget->property("shortcutAction").toString();
328 widget->setKeySequence(m_shortcuts->shortcut(actionName));
329 }
330
331 updateDefaultIndicators();
332}
333
334void KWinTabBoxConfigForm::setEnabledUi()
335{
336 m_isHighlightWindowsEnabled = !m_config->isHighlightWindowsImmutable();
337 ui->kcfg_HighlightWindows->setEnabled(!m_config->isHighlightWindowsImmutable());
338
339 ui->filterScreens->setEnabled(!m_config->isMultiScreenModeImmutable());
340 ui->currentScreen->setEnabled(!m_config->isMultiScreenModeImmutable());
341 ui->otherScreens->setEnabled(!m_config->isMultiScreenModeImmutable());
342
343 ui->filterDesktops->setEnabled(!m_config->isDesktopModeImmutable());
344 ui->currentDesktop->setEnabled(!m_config->isDesktopModeImmutable());
345 ui->otherDesktops->setEnabled(!m_config->isDesktopModeImmutable());
346
347 ui->filterActivities->setEnabled(!m_config->isActivitiesModeImmutable());
348 ui->currentActivity->setEnabled(!m_config->isActivitiesModeImmutable());
349 ui->otherActivities->setEnabled(!m_config->isActivitiesModeImmutable());
350
351 ui->filterMinimization->setEnabled(!m_config->isMinimizedModeImmutable());
352 ui->visibleWindows->setEnabled(!m_config->isMinimizedModeImmutable());
353 ui->hiddenWindows->setEnabled(!m_config->isMinimizedModeImmutable());
354
355 ui->oneAppWindow->setEnabled(!m_config->isApplicationsModeImmutable());
356 ui->orderMinimized->setEnabled(!m_config->isOrderMinimizedModeImmutable());
357 ui->showDesktop->setEnabled(!m_config->isShowDesktopModeImmutable());
358 ui->switchingModeCombo->setEnabled(!m_config->isSwitchingModeImmutable());
359 ui->effectCombo->setEnabled(!m_config->isLayoutNameImmutable());
360}
361
363{
364 m_showDefaultIndicator = show;
365 updateDefaultIndicators();
366}
367
368void KWinTabBoxConfigForm::updateDefaultIndicators()
369{
370 applyDefaultIndicator({ui->filterScreens, ui->currentScreen, ui->otherScreens},
371 m_config->multiScreenMode() == m_config->defaultMultiScreenModeValue());
372 applyDefaultIndicator({ui->filterDesktops, ui->currentDesktop, ui->otherDesktops},
373 m_config->desktopMode() == m_config->defaultDesktopModeValue());
374 applyDefaultIndicator({ui->filterActivities, ui->currentActivity, ui->otherActivities},
375 m_config->activitiesMode() == m_config->defaultActivitiesModeValue());
376 applyDefaultIndicator({ui->filterMinimization, ui->visibleWindows, ui->hiddenWindows},
377 m_config->minimizedMode() == m_config->defaultMinimizedModeValue());
378 applyDefaultIndicator({ui->oneAppWindow}, m_config->applicationsMode() == m_config->defaultApplicationsModeValue());
379 applyDefaultIndicator({ui->orderMinimized}, m_config->orderMinimizedMode() == m_config->defaultOrderMinimizedModeValue());
380 applyDefaultIndicator({ui->showDesktop}, m_config->showDesktopMode() == m_config->defaultShowDesktopModeValue());
381 applyDefaultIndicator({ui->switchingModeCombo}, m_config->switchingMode() == m_config->defaultSwitchingModeValue());
382 applyDefaultIndicator({ui->effectCombo}, m_config->layoutName() == m_config->defaultLayoutNameValue());
383
384 for (const auto &widget : {ui->scAll, ui->scAllReverse, ui->scCurrent, ui->scCurrentReverse}) {
385 const QString actionName = widget->property("shortcutAction").toString();
386 applyDefaultIndicator({widget}, m_shortcuts->isDefault(actionName));
387 }
388}
389
390void KWinTabBoxConfigForm::applyDefaultIndicator(QList<QWidget *> widgets, bool isDefault)
391{
392 for (auto widget : widgets) {
393 widget->setProperty("_kde_highlight_neutral", m_showDefaultIndicator && !isDefault);
394 widget->update();
395 }
396}
397
398} // namespace
399
400#include "moc_kwintabboxconfigform.cpp"
void setDefaultIndicatorVisible(bool visible)
QVariant effectComboCurrentData(int role=Qt::UserRole) const
void setEffectComboModel(QStandardItemModel *model)
TabBox::TabBoxSettings * config() const
KWinTabBoxConfigForm(TabboxType type, TabBox::TabBoxSettings *config, TabBox::ShortcutSettings *shortcutsConfig, QWidget *parent=nullptr)
QKeySequence shortcut(const QString &name) const
void setShortcut(const QString &name, const QKeySequence &seq)
bool isDefault(const QString &name) const
KActionCollection * actionCollection() const
@ AllActivitiesClients
Windows from all Activities are included.
@ OnlyCurrentActivityClients
Only Windows on current activity are included.
@ ExcludeCurrentActivityClients
Exclude Windows on current activity.
@ OnlyMinimizedClients
Only minimized Windows are included.
@ IgnoreMinimizedStatus
Windows are included no matter they are minimized or not.
@ ExcludeMinimizedClients
Exclude minimized Windows.
@ OneWindowPerApplication
Only one Window for each application is included.
@ AllWindowsAllApplications
Windows from all applications are included.
@ AllDesktopsClients
Windows from all desktops are included.
@ OnlyCurrentDesktopClients
Only Windows on current desktop are included.
@ ExcludeCurrentDesktopClients
Exclude Windows on current desktop.
@ GroupByMinimized
Windows are grouped by whether they are minimized or not.
@ NoGroupByMinimized
Windows are not grouped by whether they are minimized.
@ ShowDesktopClient
A Window representing the desktop is included.
@ DoNotShowDesktopClient
A Window representing the desktop is not included.
@ OnlyCurrentScreenClients
Only Windows on current screen are included.
@ ExcludeCurrentScreenClients
Exclude Windows from the current screen.
@ IgnoreMultiScreen
Windows are included independently of the screen they are on.
Session::Type type
Definition session.cpp:17