45K_PLUGIN_FACTORY_WITH_JSON(KWinTabBoxConfigFactory,
"kcm_kwintabbox.json", registerPlugin<KWin::KWinTabBoxConfig>(); registerPlugin<KWin::TabBox::KWinTabboxData>();)
50using namespace TabBox;
52KWinTabBoxConfig::KWinTabBoxConfig(QObject *parent,
const KPluginMetaData &data)
53 : KCModule(parent, data)
54 , m_config(KSharedConfig::openConfig(
"kwinrc"))
55 , m_data(new KWinTabboxData(this))
57 QTabWidget *tabWidget =
new QTabWidget(widget());
58 m_primaryTabBoxUi =
new KWinTabBoxConfigForm(KWinTabBoxConfigForm::TabboxType::Main,
59 m_data->tabBoxConfig(),
60 m_data->shortcutConfig(),
62 m_alternativeTabBoxUi =
new KWinTabBoxConfigForm(KWinTabBoxConfigForm::TabboxType::Alternative,
63 m_data->tabBoxAlternativeConfig(),
64 m_data->shortcutConfig(),
66 tabWidget->addTab(m_primaryTabBoxUi, i18n(
"Main"));
67 tabWidget->addTab(m_alternativeTabBoxUi, i18n(
"Alternative"));
69 KNSWidgets::Button *ghnsButton =
new KNSWidgets::Button(i18n(
"Get New Task Switchers..."), QStringLiteral(
"kwinswitcher.knsrc"), widget());
70 connect(ghnsButton, &KNSWidgets::Button::dialogFinished,
this, [
this](
auto changedEntries) {
71 if (!changedEntries.isEmpty()) {
76 QHBoxLayout *buttonBar =
new QHBoxLayout();
77 QSpacerItem *buttonBarSpacer =
new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
78 buttonBar->addItem(buttonBarSpacer);
79 buttonBar->addWidget(ghnsButton);
81 QVBoxLayout *layout =
new QVBoxLayout(widget());
82 KTitleWidget *infoLabel =
new KTitleWidget(tabWidget);
83 infoLabel->setText(i18n(
"Focus policy settings limit the functionality of navigating through windows."),
84 KTitleWidget::InfoMessage);
85 infoLabel->setIcon(KTitleWidget::InfoMessage, KTitleWidget::ImageLeft);
86 layout->addWidget(infoLabel, 0);
87 layout->addWidget(tabWidget, 1);
88 layout->addLayout(buttonBar);
89 widget()->setLayout(layout);
91 addConfig(m_data->tabBoxConfig(), m_primaryTabBoxUi);
92 addConfig(m_data->tabBoxAlternativeConfig(), m_alternativeTabBoxUi);
96 createConnections(m_primaryTabBoxUi);
97 createConnections(m_alternativeTabBoxUi);
100 KConfigGroup config(m_config, QStringLiteral(
"Windows"));
101 QString policy = config.readEntry(
"FocusPolicy",
"ClickToFocus");
102 if ((policy ==
"FocusUnderMouse") || (policy ==
"FocusStrictlyUnderMouse")) {
103 tabWidget->setEnabled(
false);
110KWinTabBoxConfig::~KWinTabBoxConfig()
114static QList<KPackage::Package> availableLnFPackages()
116 QList<KPackage::Package> packages;
118 const QStringList dataPaths = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
120 for (
const QString &path : dataPaths) {
121 QDir dir(path + QLatin1String(
"/plasma/look-and-feel"));
122 paths << dir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
125 const auto &p = paths;
126 for (
const QString &path : p) {
127 KPackage::Package pkg = KPackage::PackageLoader::self()->loadPackage(QStringLiteral(
"Plasma/LookAndFeel"));
129 pkg.setFallbackPackage(KPackage::Package());
130 if (!pkg.filePath(
"defaults").isEmpty()) {
131 KSharedConfigPtr conf = KSharedConfig::openConfig(pkg.filePath(
"defaults"));
132 KConfigGroup cg = KConfigGroup(conf, QStringLiteral(
"kwinrc"));
133 cg = KConfigGroup(&cg, QStringLiteral(
"WindowSwitcher"));
134 if (!cg.readEntry(
"LayoutName", QString()).isEmpty()) {
143void KWinTabBoxConfig::initLayoutLists()
145 QList<KPluginMetaData> offers = KPackage::PackageLoader::self()->listPackages(
"KWin/WindowSwitcher");
146 QStandardItemModel *model =
new QStandardItemModel;
148 auto addToModel = [model](
const QString &name,
const QString &pluginId,
const QString &path) {
149 QStandardItem *item =
new QStandardItem(name);
150 item->setData(pluginId, Qt::UserRole);
151 item->setData(path, KWinTabBoxConfigForm::LayoutPath);
152 item->setData(
true, KWinTabBoxConfigForm::AddonEffect);
153 model->appendRow(item);
156 const auto lnfPackages = availableLnFPackages();
157 for (
const auto &package : lnfPackages) {
158 const auto &metaData = package.metadata();
159 const QString switcherFile = package.filePath(
"windowswitcher", QStringLiteral(
"WindowSwitcher.qml"));
160 if (switcherFile.isEmpty()) {
165 addToModel(metaData.name(), metaData.pluginId(), switcherFile);
168 for (
const auto &offer : offers) {
169 const QString pluginName = offer.pluginId();
170 const QString scriptFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation,
171 QLatin1String(
"kwin/tabbox/") + pluginName + QLatin1String(
"/contents/ui/main.qml"));
172 if (scriptFile.isEmpty()) {
173 qWarning() <<
"scriptfile is null" << pluginName;
177 addToModel(offer.name(), pluginName, scriptFile);
182 m_primaryTabBoxUi->setEffectComboModel(model);
183 m_alternativeTabBoxUi->setEffectComboModel(model);
186void KWinTabBoxConfig::createConnections(KWinTabBoxConfigForm *form)
188 connect(form, &KWinTabBoxConfigForm::effectConfigButtonClicked,
this, &KWinTabBoxConfig::configureEffectClicked);
189 connect(form, &KWinTabBoxConfigForm::configChanged,
this, &KWinTabBoxConfig::updateUnmanagedState);
191 connect(
this, &KWinTabBoxConfig::defaultsIndicatorsVisibleChanged, form, [form,
this]() {
192 form->setDefaultIndicatorVisible(defaultsIndicatorsVisible());
196void KWinTabBoxConfig::updateUnmanagedState()
198 const bool isNeedSave = m_data->tabBoxConfig()->isSaveNeeded()
199 || m_data->tabBoxAlternativeConfig()->isSaveNeeded()
200 || m_data->shortcutConfig()->isSaveNeeded();
202 unmanagedWidgetChangeState(isNeedSave);
204 const bool isDefault = m_data->tabBoxConfig()->isDefaults()
205 && m_data->tabBoxAlternativeConfig()->isDefaults()
206 && m_data->shortcutConfig()->isDefaults();
208 unmanagedWidgetDefaultState(isDefault);
211void KWinTabBoxConfig::load()
215 m_data->tabBoxConfig()->load();
216 m_data->tabBoxAlternativeConfig()->load();
217 m_data->shortcutConfig()->load();
219 m_data->pluginsConfig()->load();
221 m_primaryTabBoxUi->updateUiFromConfig();
222 m_alternativeTabBoxUi->updateUiFromConfig();
224 updateUnmanagedState();
227void KWinTabBoxConfig::save()
230 const bool highlightWindows = m_primaryTabBoxUi->highlightWindows() || m_alternativeTabBoxUi->highlightWindows();
233 m_data->pluginsConfig()->setHighlightwindowEnabled(highlightWindows);
234 m_data->pluginsConfig()->save();
236 m_data->tabBoxConfig()->save();
237 m_data->tabBoxAlternativeConfig()->save();
238 m_data->shortcutConfig()->save();
241 updateUnmanagedState();
244 QDBusMessage message = QDBusMessage::createSignal(
"/KWin",
"org.kde.KWin",
"reloadConfig");
245 QDBusConnection::sessionBus().send(message);
248void KWinTabBoxConfig::defaults()
250 m_data->tabBoxConfig()->setDefaults();
251 m_data->tabBoxAlternativeConfig()->setDefaults();
252 m_data->shortcutConfig()->setDefaults();
254 m_primaryTabBoxUi->updateUiFromConfig();
255 m_alternativeTabBoxUi->updateUiFromConfig();
257 KCModule::defaults();
258 updateUnmanagedState();
260void KWinTabBoxConfig::configureEffectClicked()
262 auto form = qobject_cast<KWinTabBoxConfigForm *>(sender());
265 if (form->effectComboCurrentData(KWinTabBoxConfigForm::AddonEffect).toBool()) {
267 new LayoutPreview(form->effectComboCurrentData(KWinTabBoxConfigForm::LayoutPath).toString(),
268 form->config()->showDesktopMode(),