diff --git a/src/declarativeimports/plasmaextracomponents/qml/PlasmoidHeading.qml b/src/declarativeimports/plasmaextracomponents/qml/PlasmoidHeading.qml index 2e9ae176f..75797fc9a 100644 --- a/src/declarativeimports/plasmaextracomponents/qml/PlasmoidHeading.qml +++ b/src/declarativeimports/plasmaextracomponents/qml/PlasmoidHeading.qml @@ -39,22 +39,25 @@ import QtQuick.Templates 2.12 as T property int location: PlasmoidHeading.Location.Header Layout.fillWidth: true - bottomPadding: location == PlasmoidHeading.Location.Footer ? 0 : headingSvg.fixedMargins.top - topPadding: location == PlasmoidHeading.Location.Footer ? headingSvg.fixedMargins.bottom : 0 + bottomPadding: !headingSvg.applicationFormFactor && location == PlasmoidHeading.Location.Footer ? 0 : headingSvg.fixedMargins.bottom + topPadding: headingSvg.applicationFormFactor || location == PlasmoidHeading.Location.Footer ? headingSvg.fixedMargins.bottom : 0 + leftPadding: headingSvg.applicationFormFactor ? headingSvg.fixedMargins.left : 0 + rightPadding: headingSvg.applicationFormFactor ? headingSvg.fixedMargins.right : 0 implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, implicitContentHeight + topPadding + bottomPadding) implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, implicitContentWidth + leftPadding + rightPadding) - leftInset: -headingSvg.fixedMargins.left - rightInset: -headingSvg.fixedMargins.right - topInset: location == PlasmoidHeading.Location.Footer ? 0 : -headingSvg.fixedMargins.top - bottomInset: location == PlasmoidHeading.Location.Footer ? -headingSvg.fixedMargins.bottom : 0 + leftInset: headingSvg.applicationFormFactor ? 0 : -headingSvg.fixedMargins.left + rightInset: headingSvg.applicationFormFactor ? 0 : -headingSvg.fixedMargins.right + topInset: headingSvg.applicationFormFactor || location == PlasmoidHeading.Location.Footer ? 0 : -headingSvg.fixedMargins.top + bottomInset: !headingSvg.applicationFormFactor && location == PlasmoidHeading.Location.Footer ? -headingSvg.fixedMargins.bottom : 0 PlasmaCore.ColorScope.colorGroup: location == PlasmoidHeading.Location.Header ? PlasmaCore.Theme.HeaderColorGroup : PlasmaCore.Theme.WindowColorGroup PlasmaCore.ColorScope.inherit: false background: PlasmaCore.FrameSvgItem { id: headingSvg + readonly property bool applicationFormFactor: typeof plasmoid !== "undefined" && plasmoid.formFactor === PlasmaCore.Types.Application visible: fromCurrentTheme imagePath: "widgets/plasmoidheading" prefix: location == PlasmoidHeading.Location.Header? 'header' : 'footer' diff --git a/src/declarativeimports/plasmaextracomponents/qml/Representation.qml b/src/declarativeimports/plasmaextracomponents/qml/Representation.qml new file mode 100644 index 000000000..a78645f73 --- /dev/null +++ b/src/declarativeimports/plasmaextracomponents/qml/Representation.qml @@ -0,0 +1,75 @@ +/* + SPDX-FileCopyrightText: 2020 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +import QtQuick 2.12 +import QtQuick.Layouts 1.12 +import QtQuick.Window 2.2 + +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.components 2.0 as PlasmaExtras + + /** + * Item to be used as root item for representations (full and compact) of plasmoids. + * It's a QtQuickControls2 Page, and like that one, has an header, a contentItem and a Footer + * It may go over the plasmoid edges (both on desktop and popups) with the properties applyHorizontalPadding and applyVerticalPadding. + * When the contentItem is a ScrollView or a Scrollarea, the plasmoid margins will be automatically removed. + * + * This code will create a full representation with a listview that will automatically + * full the whole area without margins from the plasmoid popup borders + * @code + * Plasmoid.Representation: PlasmaExtras.Representation { + * header: PlasmaExtras.BasicPlasmoidHeading{} + * contentItem: PlasmaComponent.ScrollView { + * ListView { + * .... + * } + * } + * } + * @endcode + * + * @since 5.77 + * @inherit QtQuick.Templates.Page + */ + + PlasmaComponents.Page { + id: control + + // TODO KF6: should become possible to set the paddings directly (which won't be negative anymore) + /** + * collapseMarginsHint: bool + * if true, the representation will remove any borders its container may have put and will be collapsed above its borders + */ + property bool collapseMarginsHint: (control.contentItem instanceof PlasmaComponents.ScrollView) || (control.contentItem instanceof ScrollArea) + + leftPadding: backgroundMetrics.getMargin("left") + rightPadding: backgroundMetrics.getMargin("right") + topPadding: header ? 0 : backgroundMetrics.getMargin("top") + bottomPadding: footer ? 0 : backgroundMetrics.getMargin("bottom") + + PlasmaCore.FrameSvgItem { + id: backgroundMetrics + visible: false + imagePath: { + if (control.Window.window && (control.Window.window instanceof PlasmaCore.Dialog)) { + return "dialogs/background"; + } else if (plasmoid.formFactor == PlasmaCore.Types.Planar) { + return "widgets/background"; + // panels and other formfactors are explicitly not supported + } else { + return ""; + } + } + readonly property bool hasInset: backgroundMetrics.inset.left >= 0 && backgroundMetrics.inset.right >= 0 && backgroundMetrics.inset.top >= 0 && backgroundMetrics.inset.bottom >= 0 + function getMargin(margin) { + if (!hasInset) { + return 0; + } else { + return control.collapseMarginsHint ? -backgroundMetrics.fixedMargins[margin] + backgroundMetrics.inset[margin] : 0 + } + } + } + } diff --git a/src/declarativeimports/plasmaextracomponents/qml/qmldir b/src/declarativeimports/plasmaextracomponents/qml/qmldir index 03974c003..b3b4f78fd 100644 --- a/src/declarativeimports/plasmaextracomponents/qml/qmldir +++ b/src/declarativeimports/plasmaextracomponents/qml/qmldir @@ -14,6 +14,7 @@ Title 2.0 Title.qml DescriptiveLabel 2.0 DescriptiveLabel.qml PlasmoidHeading 2.0 PlasmoidHeading.qml BasicPlasmoidHeading 2.0 BasicPlasmoidHeading.qml +Representation 2.0 Representation.qml ActivateAnimation 2.0 animations/ActivateAnimation.qml AppearAnimation 2.0 animations/AppearAnimation.qml diff --git a/src/plasmaquick/dialog.cpp b/src/plasmaquick/dialog.cpp index a129173eb..7b98f8e2e 100644 --- a/src/plasmaquick/dialog.cpp +++ b/src/plasmaquick/dialog.cpp @@ -1079,6 +1079,11 @@ QObject *Dialog::margins() const return d->frameSvgItem->fixedMargins(); } +QObject *Dialog::inset() const +{ + return d->frameSvgItem->inset(); +} + void Dialog::setFramelessFlags(Qt::WindowFlags flags) { if (d->type == Dialog::Normal) diff --git a/src/plasmaquick/dialog.h b/src/plasmaquick/dialog.h index d6d50b16a..3e3552fb2 100644 --- a/src/plasmaquick/dialog.h +++ b/src/plasmaquick/dialog.h @@ -89,6 +89,13 @@ class PLASMAQUICK_EXPORT Dialog : public QQuickWindow, public QQmlParserStatus */ Q_PROPERTY(QObject *margins READ margins CONSTANT) + /** + * Margins where the dialog background actually starts, excluiding things like shadows or borders + * @see DialogMargins + * @since 5.77 + */ + Q_PROPERTY(QObject *inset READ inset CONSTANT) + /** * Plasma Location of the dialog window. Useful if this dialog is a popup for a panel */ @@ -170,6 +177,7 @@ public: void setLocation(Plasma::Types::Location location); QObject *margins() const; + QObject *inset() const; void setFramelessFlags(Qt::WindowFlags flags);