diff --git a/src/kcmultidialog.cpp b/src/kcmultidialog.cpp --- a/src/kcmultidialog.cpp +++ b/src/kcmultidialog.cpp @@ -32,10 +32,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include @@ -83,18 +85,62 @@ void KCMultiDialogPrivate::_k_slotCurrentPageChanged(KPageWidgetItem *current, KPageWidgetItem *previous) { Q_Q(KCMultiDialog); - // qDebug(); - q->blockSignals(true); - q->setCurrentPage(previous); + KCModuleProxy *currentModule = nullptr; KCModuleProxy *previousModule = nullptr; for (int i = 0; i < modules.count(); ++i) { - if (modules[ i ].item == previous) { - previousModule = modules[ i ].kcm; - break; + if (modules[i].item == previous) { + previousModule = modules[i].kcm; + } + if (modules[i].item == current) { + currentModule = modules[i].kcm; } } + Q_ASSERT(currentModule); + + // For some reason the KCModuleQml modules handle their own margin internally + // to match that we need to adjust the spacing of our page widget + // by removing the spacing between the left pane and the edge, and the layout on the right + // when we reduce the layout on the right we need to pad the buttons back to match + + // TODO KF6 Fix this situation. + + if (currentModule->realModule() && currentModule->realModule()->inherits("KCModuleQml")) { + bool padHackLeft = false; + bool padHackRight = false; + if (q->pageWidget()->model()->rowCount() < 2) { + padHackLeft = true; + padHackRight = true; + } else if (qApp->isRightToLeft()) { + padHackLeft = true; + } else { + padHackRight = true; + } + + q->layout()->setContentsMargins(padHackLeft ? 0: q->style()->pixelMetric(QStyle::PM_LayoutLeftMargin), + q->style()->pixelMetric(QStyle::PM_LayoutTopMargin), + padHackRight ? 0 : q->style()->pixelMetric(QStyle::PM_LayoutRightMargin), + q->style()->pixelMetric(QStyle::PM_LayoutBottomMargin)); + q->pageWidget()->layout()->setSpacing(0); + q->buttonBox()->setContentsMargins(padHackLeft ? q->style()->pixelMetric(QStyle::PM_LayoutLeftMargin) : 0, + 0, + padHackRight ? q->style()->pixelMetric(QStyle::PM_LayoutRightMargin) : 0, + 0); + } else { + q->buttonBox()->setContentsMargins(0, 0, 0, 0); + q->pageWidget()->layout()->setSpacing(q->style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing)); + q->layout()->setContentsMargins( + q->style()->pixelMetric(QStyle::PM_LayoutLeftMargin), + q->style()->pixelMetric(QStyle::PM_LayoutTopMargin), + q->style()->pixelMetric(QStyle::PM_LayoutRightMargin), + q->style()->pixelMetric(QStyle::PM_LayoutBottomMargin)); + } + + q->blockSignals(true); + q->setCurrentPage(previous); + + if (resolveChanges(previousModule)) { q->setCurrentPage(current); @@ -426,6 +472,7 @@ KPageWidgetItem *KCMultiDialog::addModule(const KCModuleInfo &moduleInfo, KPageWidgetItem *parentItem, const QStringList &args) { + Q_D(KCMultiDialog); if (!moduleInfo.service()) { return nullptr; } @@ -449,6 +496,12 @@ // qDebug() << moduleInfo.moduleName(); KPageWidgetItem *item = new KPageWidgetItem(moduleScroll, moduleInfo.moduleName()); + KCMultiDialogPrivate::CreatedModule cm; + cm.kcm = kcm; + cm.item = item; + cm.componentNames = moduleInfo.service()->property(QStringLiteral("X-KDE-ParentComponents")).toStringList(); + d->modules.append(cm); + if (qobject_cast(kcm->realModule())) { item->setHeaderVisible(false); } @@ -513,13 +566,6 @@ connect(kcm, SIGNAL(changed(bool)), this, SLOT(_k_clientChanged())); connect(kcm->realModule(), SIGNAL(rootOnlyMessageChanged(bool,QString)), this, SLOT(_k_updateHeader(bool,QString))); - Q_D(KCMultiDialog); - KCMultiDialogPrivate::CreatedModule cm; - cm.kcm = kcm; - cm.item = item; - cm.componentNames = moduleInfo.service()->property(QStringLiteral("X-KDE-ParentComponents")).toStringList(); - d->modules.append(cm); - if (d->modules.count() == 1 || updateCurrentPage) { setCurrentPage(item); d->_k_clientChanged();