diff --git a/applets/systemtray/CMakeLists.txt b/applets/systemtray/CMakeLists.txt --- a/applets/systemtray/CMakeLists.txt +++ b/applets/systemtray/CMakeLists.txt @@ -18,8 +18,8 @@ target_link_libraries(org.kde.plasma.private.systemtray Qt5::Gui Qt5::Quick - KF5::Plasma Qt5::DBus + KF5::Plasma KF5::IconThemes KF5::XmlGui KF5::I18n) diff --git a/applets/systemtray/package/contents/applet/CompactApplet.qml b/applets/systemtray/package/contents/applet/CompactApplet.qml --- a/applets/systemtray/package/contents/applet/CompactApplet.qml +++ b/applets/systemtray/package/contents/applet/CompactApplet.qml @@ -1,5 +1,6 @@ /* * Copyright 2011 Marco Martin + * Copyright 2019 ivan tkachenko * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -31,11 +32,7 @@ icon: plasmoid.icon mainText: plasmoid.toolTipMainText subText: plasmoid.toolTipSubText - location: if (plasmoid.parent && plasmoid.parent.parent.objectName === "hiddenTasksColumn" && plasmoid.location !== PlasmaCore.Types.LeftEdge) { - return PlasmaCore.Types.RightEdge; - } else { - return plasmoid.location; - } + active: !plasmoid.expanded textFormat: plasmoid.toolTipTextFormat mainItem: plasmoid.toolTipItem ? plasmoid.toolTipItem : null diff --git a/applets/systemtray/package/contents/ui/ConfigEntries.qml b/applets/systemtray/package/contents/ui/ConfigEntries.qml --- a/applets/systemtray/package/contents/ui/ConfigEntries.qml +++ b/applets/systemtray/package/contents/ui/ConfigEntries.qml @@ -1,6 +1,7 @@ /* * Copyright 2013 Sebastian Kügler * Copyright 2014 Marco Martin + * Copyright 2019 ivan tkachenko * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -44,23 +45,8 @@ } } - PlasmaCore.DataSource { - id: statusNotifierSource - engine: "statusnotifieritem" - interval: 0 - onSourceAdded: { - connectSource(source) - } - Component.onCompleted: { - connectedSources = sources - } - } - - PlasmaCore.SortFilterModel { + StatusNotifierItemModel { id: statusNotifierModel - sourceModel: PlasmaCore.DataModel { - dataSource: statusNotifierSource - } } diff --git a/applets/systemtray/package/contents/ui/ExpandedRepresentation.qml b/applets/systemtray/package/contents/ui/ExpandedRepresentation.qml --- a/applets/systemtray/package/contents/ui/ExpandedRepresentation.qml +++ b/applets/systemtray/package/contents/ui/ExpandedRepresentation.qml @@ -1,5 +1,6 @@ /* * Copyright 2016 Marco Martin + * Copyright 2019 ivan tkachenko * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -26,9 +27,6 @@ Item { id: expandedRepresentation - //set width/height to avoid an useless Dialog resize - width: Layout.minimumWidth - height: Layout.minimumHeight Layout.minimumWidth: units.gridUnit * 24 Layout.minimumHeight: units.gridUnit * 21 Layout.preferredWidth: Layout.minimumWidth diff --git a/applets/systemtray/package/contents/ui/HiddenItemsView.qml b/applets/systemtray/package/contents/ui/HiddenItemsView.qml --- a/applets/systemtray/package/contents/ui/HiddenItemsView.qml +++ b/applets/systemtray/package/contents/ui/HiddenItemsView.qml @@ -1,5 +1,6 @@ /* * Copyright 2016 Marco Martin + * Copyright 2019 ivan tkachenko * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -27,27 +28,28 @@ PlasmaExtras.ScrollArea { id: hiddenTasksView - visible: !activeApplet || activeApplet.parent.parent == hiddenTasksColumn - width: activeApplet ? iconColumnWidth : parent.width + visible: !root.activeApplet || root.activeAppletContainer === hiddenTasksColumn + width: root.activeApplet ? iconColumnWidth : parent.width property alias layout: hiddenTasksColumn //Useful to align stuff to the column of icons, both in expanded and shrink modes property int iconColumnWidth: root.hiddenItemSize + highlight.marginHints.left + highlight.marginHints.right horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff - verticalScrollBarPolicy: activeApplet ? Qt.ScrollBarAlwaysOff : Qt.ScrollBarAsNeeded + verticalScrollBarPolicy: root.activeApplet ? Qt.ScrollBarAlwaysOff : Qt.ScrollBarAsNeeded Flickable { + anchors.fill: parent contentWidth: width contentHeight: hiddenTasksColumn.height MouseArea { - width: parent.width + width: hiddenTasksView.width height: hiddenTasksColumn.height drag.filterChildren: true hoverEnabled: true onExited: hiddenTasksColumn.hoveredItem = null; CurrentItemHighLight { - target: root.activeApplet && root.activeApplet.parent.parent == hiddenTasksColumn ? root.activeApplet.parent : null + target: root.activeAppletContainer === hiddenTasksColumn ? root.activeAppletItem : null location: PlasmaCore.Types.LeftEdge } PlasmaComponents.Highlight { @@ -58,11 +60,11 @@ height: hiddenTasksColumn.hoveredItem ? hiddenTasksColumn.hoveredItem.height : 0 } - Column { + ColumnLayout { id: hiddenTasksColumn spacing: units.smallSpacing - width: parent.width + width: hiddenTasksView.width property Item hoveredItem property alias marginHints: highlight.marginHints diff --git a/applets/systemtray/package/contents/ui/PlasmoidPopupsContainer.qml b/applets/systemtray/package/contents/ui/PlasmoidPopupsContainer.qml --- a/applets/systemtray/package/contents/ui/PlasmoidPopupsContainer.qml +++ b/applets/systemtray/package/contents/ui/PlasmoidPopupsContainer.qml @@ -1,5 +1,6 @@ /* * Copyright 2015 Marco Martin + * Copyright 2019 ivan tkachenko * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -34,25 +35,24 @@ property Item activeApplet onActiveAppletChanged: { - if (activeApplet != null) { + if (activeApplet) { //reset any potential anchor activeApplet.fullRepresentationItem.anchors.left = undefined; activeApplet.fullRepresentationItem.anchors.top = undefined; activeApplet.fullRepresentationItem.anchors.right = undefined; activeApplet.fullRepresentationItem.anchors.bottom = undefined; activeApplet.fullRepresentationItem.anchors.centerIn = undefined; activeApplet.fullRepresentationItem.anchors.fill = undefined; - mainStack.replace({item: activeApplet.fullRepresentationItem, immediate: !dialog.visible, properties: {focus: true}}); } else { mainStack.replace(emptyPage); } } Connections { target: plasmoid onAppletRemoved: { - if (applet == root.activeApplet) { + if (applet === root.activeApplet) { mainStack.clear() } } diff --git a/applets/systemtray/package/contents/ui/StatusNotifierItemModel.qml b/applets/systemtray/package/contents/ui/StatusNotifierItemModel.qml new file mode 100644 --- /dev/null +++ b/applets/systemtray/package/contents/ui/StatusNotifierItemModel.qml @@ -0,0 +1,39 @@ +/* + * Copyright 2019 ivan tkachenko + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. + */ + + +import QtQuick 2.0 + +import org.kde.plasma.core 2.0 as PlasmaCore + +PlasmaCore.SortFilterModel { + property alias source: statusNotifierSource + sourceModel: PlasmaCore.DataModel { + dataSource: PlasmaCore.DataSource { + id: statusNotifierSource + engine: "statusnotifieritem" + interval: 0 + onSourceAdded: { + connectSource(source) + } + Component.onCompleted: { + connectedSources = sources + } + } + } +} diff --git a/applets/systemtray/package/contents/ui/items/AbstractItem.qml b/applets/systemtray/package/contents/ui/items/AbstractItem.qml --- a/applets/systemtray/package/contents/ui/items/AbstractItem.qml +++ b/applets/systemtray/package/contents/ui/items/AbstractItem.qml @@ -1,5 +1,6 @@ /* * Copyright 2016 Marco Martin + * Copyright 2019 ivan tkachenko * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -18,25 +19,29 @@ */ import QtQuick 2.1 +import QtQuick.Layouts 1.12 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 2.0 as PlasmaComponents PlasmaCore.ToolTipArea { id: abstractItem + objectName: "abstractItem" - height: effectiveItemSize + marginHints.top + marginHints.bottom - width: labelVisible ? parent.width : effectiveItemSize + marginHints.left + marginHints.right + Layout.fillHeight: !(labelVisible || vertical) + Layout.fillWidth: labelVisible || vertical + Layout.preferredHeight: effectiveItemSize + marginHints.top + marginHints.bottom + Layout.preferredWidth: labelVisible ? -1 : effectiveItemSize + marginHints.left + marginHints.right property real effectiveItemSize: hidden ? root.hiddenItemSize : root.itemSize property string itemId property string category property alias text: label.text - property bool hidden: parent.objectName == "hiddenTasksColumn" + property bool hidden: parent.objectName === "hiddenTasksColumn" property QtObject marginHints: parent.marginHints - property bool labelVisible: abstractItem.hidden && !root.activeApplet + property alias labelVisible: label.visible + property Item iconItemContainer: iconItemContainer property Item iconItem - //PlasmaCore.Types.ItemStatus - property int status + property int /* PlasmaCore.Types.ItemStatus */ status property QtObject model signal clicked(var mouse) @@ -57,14 +62,43 @@ } } - /* subclasses need to assign to this tiiltip properties + RowLayout { + anchors.fill: parent + spacing: 0 + + Item { + id: iconItemContainer + property real size: Math.min(parent.width - marginHints.left - marginHints.right, + parent.height - marginHints.top - marginHints.bottom) + Layout.preferredWidth: abstractItem.effectiveItemSize + Layout.preferredHeight: abstractItem.effectiveItemSize + Layout.leftMargin: labelVisible ? marginHints.left : 0 + Layout.rightMargin: labelVisible ? marginHints.right : 0 + Layout.alignment: Qt.AlignVCenter | (labelVisible ? Qt.AlignLeft : Qt.AlignHCenter) + } + PlasmaComponents.Label { + id: label + Layout.fillWidth: true + + opacity: visible ? 1 : 0 + visible: abstractItem.hidden && !root.activeApplet + Behavior on opacity { + NumberAnimation { + duration: units.longDuration + easing.type: Easing.InOutQuad + } + } + } + } + + /* subclasses need to assign to this tooltip properties mainText: subText: - icon: + icon: */ location: { - if (abstractItem.parent && abstractItem.parent.objectName === "hiddenTasksColumn") { + if (hidden) { if (LayoutMirroring.enabled && plasmoid.location !== PlasmaCore.Types.RightEdge) { return PlasmaCore.Types.LeftEdge; } else if (plasmoid.location !== PlasmaCore.Types.LeftEdge) { @@ -90,6 +124,13 @@ //dangerous but needed due how repeater reparents onParentChanged: updateItemVisibility(abstractItem); + onIconItemChanged: { + if (iconItem) { + iconItem.parent = iconItemContainer; + iconItem.anchors.fill = iconItemContainer; + } + } + //END CONNECTIONS PulseAnimation { @@ -101,7 +142,7 @@ MouseArea { id: mouseArea - anchors.fill: abstractItem + anchors.fill: parent hoverEnabled: true drag.filterChildren: true acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton @@ -122,22 +163,5 @@ wheel.accepted = false; } } - - PlasmaComponents.Label { - id: label - anchors { - left: parent.left - leftMargin: iconItem ? iconItem.width + units.smallSpacing : 0 - verticalCenter: parent.verticalCenter - } - opacity: labelVisible ? 1 : 0 - visible: abstractItem.hidden - Behavior on opacity { - NumberAnimation { - duration: units.longDuration - easing.type: Easing.InOutQuad - } - } - } } diff --git a/applets/systemtray/package/contents/ui/items/PlasmoidItem.qml b/applets/systemtray/package/contents/ui/items/PlasmoidItem.qml --- a/applets/systemtray/package/contents/ui/items/PlasmoidItem.qml +++ b/applets/systemtray/package/contents/ui/items/PlasmoidItem.qml @@ -1,5 +1,6 @@ /* * Copyright 2015 Marco Martin + * Copyright 2019 ivan tkachenko * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -21,13 +22,14 @@ import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 2.0 as PlasmaComponents +// Container for Plasma applet with expandable section, like Bluetooth, Volume, Networks etc. AbstractItem { id: plasmoidContainer property Item applet - iconItem: applet - text: applet ? applet.title : "" + text: applet ? applet.title : "" + iconItem: applet itemId: applet ? applet.pluginName : "" category: applet ? plasmoid.nativeInterface.plasmoidCategory(applet) : "UnknownCategory" mainText: applet ? applet.toolTipMainText : "" @@ -40,7 +42,7 @@ onClicked: { if (applet && mouse.button === Qt.LeftButton) { - applet.expanded = true; + applet.expanded = !applet.expanded; } } onContextMenu: { @@ -72,7 +74,7 @@ dialog.visible = true; } else if (root.activeApplet === applet) { - if (!applet.parent.hidden) { + if (!hidden) { dialog.visible = false; } //if not expanded we don't have an active applet anymore diff --git a/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml b/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml --- a/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml +++ b/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml @@ -1,5 +1,6 @@ /* * Copyright 2016 Marco Martin + * Copyright 2019 ivan tkachenko * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -44,19 +45,9 @@ } } - iconItem: iconItem - - PlasmaCore.IconItem { - id: iconItem + iconItem: PlasmaCore.IconItem { source: Icon ? Icon : IconName - width: Math.min(parent.width, parent.height) - height: width active: taskIcon.containsMouse - - anchors { - left: parent.left - verticalCenter: parent.verticalCenter - } } onContextMenu: { @@ -68,7 +59,7 @@ switch (mouse.button) { case Qt.LeftButton: { - var service = statusNotifierSource.serviceForSource(DataEngineSource); + var service = statusNotifierModel.source.serviceForSource(DataEngineSource); var operation = service.operationDescription("Activate"); operation.x = pos.x; operation.y = pos.y; @@ -87,7 +78,7 @@ break; case Qt.MiddleButton: - var service = statusNotifierSource.serviceForSource(DataEngineSource); + var service = statusNotifierModel.source.serviceForSource(DataEngineSource); var operation = service.operationDescription("SecondaryActivate"); operation.x = pos.x; @@ -98,7 +89,7 @@ } function openContextMenu(pos) { - var service = statusNotifierSource.serviceForSource(DataEngineSource); + var service = statusNotifierModel.source.serviceForSource(DataEngineSource); var operation = service.operationDescription("ContextMenu"); operation.x = pos.x; operation.y = pos.y; @@ -112,14 +103,14 @@ onWheel: { //don't send activateVertScroll with a delta of 0, some clients seem to break (kmix) if (wheel.angleDelta.y !== 0) { - var service = statusNotifierSource.serviceForSource(DataEngineSource); + var service = statusNotifierModel.source.serviceForSource(DataEngineSource); var operation = service.operationDescription("Scroll"); operation.delta =wheel.angleDelta.y; operation.direction = "Vertical"; service.startOperationCall(operation); } if (wheel.angleDelta.x !== 0) { - var service = statusNotifierSource.serviceForSource(DataEngineSource); + var service = statusNotifierModel.source.serviceForSource(DataEngineSource); var operation = service.operationDescription("Scroll"); operation.delta =wheel.angleDelta.x; operation.direction = "Horizontal"; diff --git a/applets/systemtray/package/contents/ui/main.qml b/applets/systemtray/package/contents/ui/main.qml --- a/applets/systemtray/package/contents/ui/main.qml +++ b/applets/systemtray/package/contents/ui/main.qml @@ -1,5 +1,6 @@ /* * Copyright 2011 Marco Martin + * Copyright 2019 ivan tkachenko * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -29,11 +30,10 @@ MouseArea { id: root - Layout.minimumWidth: vertical ? units.iconSizes.small : tasksRow.implicitWidth + (expander.visible ? expander.implicitWidth : 0) + units.smallSpacing - - Layout.minimumHeight: vertical ? tasksRow.implicitHeight + (expander.visible ? expander.implicitHeight : 0) + units.smallSpacing : units.smallSpacing - - Layout.preferredHeight: Layout.minimumHeight + Layout.fillWidth: vertical + Layout.fillHeight: !vertical + Layout.minimumWidth: vertical ? 0 : mainLayout.implicitWidth + Layout.minimumHeight: !vertical ? 0 : mainLayout.implicitHeight LayoutMirroring.enabled: !vertical && Qt.application.layoutDirection === Qt.RightToLeft LayoutMirroring.childrenInherit: true @@ -45,9 +45,12 @@ property int hiddenItemSize: units.iconSizes.smallMedium property alias expanded: dialog.visible property Item activeApplet + property Item activeAppletItem: findParentNamed(activeApplet, "abstractItem") + property Item activeAppletContainer: activeAppletItem ? activeAppletItem.parent : null + property int status: dialog.visible ? PlasmaCore.Types.RequiresAttentionStatus : PlasmaCore.Types.PassiveStatus - property alias visibleLayout: tasksRow + property alias visibleLayout: tasksLayout property alias hiddenLayout: expandedRepresentation.hiddenLayout property alias statusNotifierModel: statusNotifierModel @@ -58,17 +61,28 @@ Plasmoid.onExpandedChanged: { if (!plasmoid.expanded) { dialog.visible = plasmoid.expanded; + root.activeApplet = null; } } + // Shouldn't it be part of Qt? + function findParentNamed(object, objectName) { + if (object) { + while (object = object.parent) { + if (object.objectName === objectName) { + return object; + } + } + } + return null; + } + function updateItemVisibility(item) { switch (item.effectiveStatus) { case PlasmaCore.Types.HiddenStatus: - if (item.parent === invisibleEntriesContainer) { - return; + if (item.parent !== invisibleEntriesContainer) { + item.parent = invisibleEntriesContainer; } - - item.parent = invisibleEntriesContainer; break; case PlasmaCore.Types.ActiveStatus: @@ -94,7 +108,6 @@ } else if (hiddenLayout.children[0] !== item) { plasmoid.nativeInterface.reorderItemBefore(item, hiddenLayout.children[0]); } - item.x = 0; break; } } @@ -106,16 +119,10 @@ Containment.onAppletAdded: { //Allow the plasmoid expander to know in what window it will be - var plasmoidContainer = plasmoidItemComponent.createObject(invisibleEntriesContainer, {"x": x, "y": y, "applet": applet}); - - applet.parent = plasmoidContainer - applet.anchors.left = plasmoidContainer.left - applet.anchors.top = plasmoidContainer.top - applet.anchors.bottom = plasmoidContainer.bottom - applet.width = plasmoidContainer.height + var plasmoidContainer = plasmoidItemComponent.createObject(invisibleEntriesContainer, {"applet": applet}); applet.visible = true plasmoidContainer.visible = true - + //This is to make preloading effective, minimizes the scene changes if (applet.fullRepresentationItem) { applet.fullRepresentationItem.width = expandedRepresentation.width @@ -148,7 +155,7 @@ } } - Connections { + Connections { target: plasmoid.configuration onExtraItemsChanged: plasmoid.nativeInterface.allowedPlasmoids = plasmoid.configuration.extraItems @@ -191,19 +198,6 @@ return plasmoid.configuration.extraItems; } - PlasmaCore.DataSource { - id: statusNotifierSource - engine: "statusnotifieritem" - interval: 0 - onSourceAdded: { - connectSource(source) - } - Component.onCompleted: { - connectedSources = sources - } - } - - //due to the magic of property bindings this function will be //re-executed all the times a setting changes property var shownCategories: { @@ -231,11 +225,8 @@ return array; } - PlasmaCore.SortFilterModel { - id: statusNotifierModel - sourceModel: PlasmaCore.DataModel { - dataSource: statusNotifierSource - } + StatusNotifierItemModel { + id: statusNotifierModel } //This is a dump for items we don't want to be seen or as an incubation, when they are @@ -259,8 +250,9 @@ } CurrentItemHighLight { - visualParent: tasksRow - target: root.activeApplet && root.activeApplet.parent.parent == tasksRow ? root.activeApplet.parent : root + visualParent: mainLayout + + target: root.activeAppletContainer === tasksLayout ? root.activeAppletItem : root location: plasmoid.location } @@ -304,56 +296,47 @@ } } - //Main Layout - Flow { - id: tasksRow - spacing: 0 - height: parent.height - (vertical && expander.visible ? expander.height : 0) - width: parent.width - (vertical || !expander.visible ? 0 : expander.width) - property string skipItems - flow: vertical ? Flow.LeftToRight : Flow.TopToBottom - //To make it look centered - y: Math.round(height/2 - childrenRect.height/2) - x: (expander.visible && LayoutMirroring.enabled ? expander.width : 0) + Math.round(width/2 - childrenRect.width/2) + // Main layout + GridLayout { + id: mainLayout + rowSpacing: 0 + columnSpacing: 0 + anchors.fill: parent - //Do spacing with margins, to correctly compute the number of lines - property QtObject marginHints: QtObject { - property int left: Math.round(units.smallSpacing / 2) - property int top: Math.round(units.smallSpacing / 2) - property int right: Math.round(units.smallSpacing / 2) - property int bottom: Math.round(units.smallSpacing / 2) - } + flow: vertical ? GridLayout.TopToBottom : GridLayout.LeftToRight + + GridLayout { + id: tasksLayout + + rowSpacing: 0 + columnSpacing: 0 + Layout.fillWidth: true + Layout.fillHeight: true - //add doesn't seem to work used in conjunction with stackBefore/stackAfter - /*add: Transition { - NumberAnimation { - property: "scale" - from: 0 - to: 1 - easing.type: Easing.InQuad - duration: units.longDuration + flow: vertical ? GridLayout.TopToBottom : GridLayout.LeftToRight + rows: vertical ? Math.round(children.length / columns) + : Math.max(1, Math.floor(root.height / (itemSize + marginHints.top + marginHints.bottom))) + columns: !vertical ? Math.round(children.length / rows) + : Math.max(1, Math.floor(root.width / (itemSize + marginHints.left + marginHints.right))) + + // Do spacing with margins, to correctly compute the number of lines + property QtObject marginHints: QtObject { + property int left: Math.round(units.smallSpacing / 2) + property int top: Math.round(units.smallSpacing / 2) + property int right: Math.round(units.smallSpacing / 2) + property int bottom: Math.round(units.smallSpacing / 2) } } - move: Transition { - NumberAnimation { - properties: "x,y" - easing.type: Easing.InQuad - duration: units.longDuration - } - }*/ - } - ExpanderArrow { - id: expander - anchors { - fill: parent - leftMargin: vertical ? 0 : parent.width - implicitWidth - topMargin: vertical ? parent.height - implicitHeight : 0 + ExpanderArrow { + id: expander + Layout.fillWidth: vertical + Layout.fillHeight: !vertical } } - //Main popup + // Main popup PlasmaCore.Dialog { id: dialog visualParent: root