diff --git a/package/contents/config/config.qml b/package/contents/config/config.qml index 1966dd9..52f1d4f 100644 --- a/package/contents/config/config.qml +++ b/package/contents/config/config.qml @@ -1,35 +1,35 @@ import QtQuick 2.2 import org.kde.plasma.configuration 2.0 ConfigModel { ConfigCategory { name: i18n("Layout") icon: "preferences-desktop-color" source: "config/ConfigLayout.qml" } - ConfigCategory { - name: i18n("Appearance") - icon: "preferences-desktop-color" - source: "config/ConfigAppearance.qml" - } ConfigCategory { name: i18n("Behaviour") icon: "preferences-desktop" source: "config/ConfigBehaviour.qml" } + ConfigCategory { + name: i18n("Title and Icon") + icon: "preferences-desktop-color" + source: "config/ConfigTitleAndIcon.qml" + } ConfigCategory { name: i18n("Buttons") icon: "preferences-activities" source: "config/ConfigButtons.qml" } - ConfigCategory { - name: i18n("Mouse Control") - icon: "preferences-desktop-mouse" - source: "config/ConfigMouseControl.qml" - } ConfigCategory { name: i18n("Application Menu") icon: "application-menu" source: "config/ConfigAppMenu.qml" } + ConfigCategory { + name: i18n("Mouse Control") + icon: "preferences-desktop-mouse" + source: "config/ConfigMouseControl.qml" + } } diff --git a/package/contents/config/main.xml b/package/contents/config/main.xml index da8b9f1..4fbc298 100644 --- a/package/contents/config/main.xml +++ b/package/contents/config/main.xml @@ -1,278 +1,231 @@ buttons|icon|title|menu 5.0 0 true true 0 0 true true 0 0 true true 0 0 true true 0 false - - true - - - false - - - false - - - false - - - close|maximize|minimize|pin - - - true - - - - - - false - - - false - - - false - - - false - - - false - - - false - - - - - - - - - 0 - - - false - - - 0.5 - - - 10 - - false 0.2 0.0 true 0 0 0 false ^(.*)\s*[—–\-:]\s*(Mozilla )?([^—–\-:]+)$ $3 — $1 Plasma Desktop :: %activity% false 1000 - - true - - - false - - - false + + 0 - - 5 - 1 false - - + + false - + false - + false - - false + + close|maximize|minimize|pin - + false - - false + + 10 - - false + + 0.5 - + + + + + + + 0 + + true - + + + + + + + + false + + false - - 0 + + 1 + + + true 0.1 1.0 true 0 0 false 0 diff --git a/package/contents/ui/AppMenu.qml b/package/contents/ui/AppMenu.qml index 208172e..6f672b4 100644 --- a/package/contents/ui/AppMenu.qml +++ b/package/contents/ui/AppMenu.qml @@ -1,156 +1,159 @@ import QtQuick 2.2 import QtQuick.Layouts 1.1 import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.components 2.0 as PlasmaComponents MouseArea { id: appmenu property bool mouseInWidget: appmenuOpened || appmenu.containsMouse - property bool appmenuEnabled: plasmoid.configuration.appmenuEnabled + property bool appmenuEnabled: plasmoid.configuration.controlPartMenuShowOnMouseIn || plasmoid.configuration.controlPartMenuShowOnMouseOut property bool appmenuFillHeight: plasmoid.configuration.appmenuFillHeight property bool appmenuFontBold: plasmoid.configuration.appmenuFontBold property bool appmenuEnabledAndNonEmpty: appmenuEnabled && appMenuModel !== null && appMenuModel.menuAvailable property bool appmenuOpened: appmenuEnabled && plasmoid.nativeInterface.currentIndex > -1 property var appMenuModel: null visible: appmenuEnabledAndNonEmpty && !main.noWindowActive property bool showItem + property double recommendedWidth opacity: showItem ? 1 : 0 + width: recommendedWidth + hoverEnabled: true GridLayout { id: buttonGrid Layout.minimumWidth: implicitWidth Layout.minimumHeight: implicitHeight flow: GridLayout.LeftToRight rowSpacing: 0 columnSpacing: 0 anchors.top: parent.top anchors.left: parent.left Component.onCompleted: { plasmoid.nativeInterface.buttonGrid = buttonGrid plasmoid.nativeInterface.enabled = appmenuEnabled } Connections { target: plasmoid.nativeInterface onRequestActivateIndex: { var idx = Math.max(0, Math.min(buttonRepeater.count - 1, index)) var button = buttonRepeater.itemAt(index) if (button) { button.clicked(null) } } } Repeater { id: buttonRepeater model: null MouseArea { id: appmenuButton hoverEnabled: true readonly property int buttonIndex: index property bool menuOpened: plasmoid.nativeInterface.currentIndex === index Layout.preferredWidth: appmenuButtonBackground.width Layout.preferredHeight: appmenuButtonBackground.height Rectangle { id: appmenuButtonBackground border.color: 'transparent' width: appmenuButtonTitle.implicitWidth + units.smallSpacing * 3 height: appmenuFillHeight ? appmenu.height : appmenuButtonTitle.implicitHeight + units.smallSpacing color: menuOpened ? theme.highlightColor : 'transparent' radius: units.smallSpacing / 2 } PlasmaComponents.Label { id: appmenuButtonTitle anchors.top: appmenuButtonBackground.top anchors.bottom: appmenuButtonBackground.bottom verticalAlignment: Text.AlignVCenter anchors.horizontalCenter: appmenuButtonBackground.horizontalCenter - font.pixelSize: fontPixelSize * plasmoid.configuration.appmenuButtonTextSizeScale + font.pixelSize: main.fontPixelSize * plasmoid.configuration.appmenuButtonTextSizeScale text: activeMenu.replace('&', '') font.weight: appmenuFontBold ? Font.Bold : theme.defaultFont.weight } onClicked: { plasmoid.nativeInterface.trigger(this, index) } onEntered: { appmenuButtonBackground.border.color = theme.highlightColor } onExited: { appmenuButtonBackground.border.color = 'transparent' } } } } function initializeAppModel() { if (appMenuModel !== null) { return } print('initializing appMenuModel...') try { appMenuModel = Qt.createQmlObject( 'import QtQuick 2.2;\ import org.kde.plasma.plasmoid 2.0;\ import org.kde.private.activeWindowControl 1.0 as ActiveWindowControlPrivate;\ ActiveWindowControlPrivate.AppMenuModel {\ id: appMenuModel;\ Component.onCompleted: {\ plasmoid.nativeInterface.model = appMenuModel\ }\ }', main) } catch (e) { print('appMenuModel failed to initialize: ' + e) } print('initializing appmenu...DONE ' + appMenuModel) if (appMenuModel !== null) { resetAppmenuModel() } } function resetAppmenuModel() { if (appmenuEnabled) { initializeAppModel() if (appMenuModel === null) { return } print('setting model in QML: ' + appMenuModel) for (var key in appMenuModel) { print(' ' + key + ' -> ' + appMenuModel[key]) } plasmoid.nativeInterface.model = appMenuModel buttonRepeater.model = appMenuModel } else { plasmoid.nativeInterface.model = null buttonRepeater.model = null } } onAppmenuEnabledChanged: { appmenu.resetAppmenuModel() if (appMenuModel !== null) { plasmoid.nativeInterface.enabled = appmenuEnabled } } } \ No newline at end of file diff --git a/package/contents/ui/ControlButton.qml b/package/contents/ui/ControlButton.qml index 9458eaa..ab07426 100644 --- a/package/contents/ui/ControlButton.qml +++ b/package/contents/ui/ControlButton.qml @@ -1,74 +1,74 @@ /* * Copyright 2015 Martin Kotelnik * * 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, see . */ import QtQuick 2.2 import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.core 2.0 as PlasmaCore MouseArea { id: controlButton height: controlButtons.height width: controlButtons.controlButtonsHeight property bool mouseInside: false property bool iconActive: (iconName !== 'alldesktops' && iconName !== 'maximize') || (iconName === 'alldesktops' && main.isActiveWindowPinned) || (iconName === 'maximize' && main.currentWindowMaximized) property string themeName: textColorLight ? 'breeze-dark' : 'default' - property string customAuroraeThemePath: main.automaticButtonThemeEnabled ? plasmoid.nativeInterface.auroraeThemePath : manualAuroraeThemePathResolved - property string customAuroraeImageExt: main.automaticButtonThemeEnabled ? plasmoid.nativeInterface.auroraeThemeType : manualAuroraeThemeExtension + property string customAuroraeThemePath: controlButtons.automaticButtonThemeEnabled ? plasmoid.nativeInterface.auroraeThemePath : controlButtons.manualAuroraeThemePathResolved + property string customAuroraeImageExt: controlButtons.automaticButtonThemeEnabled ? plasmoid.nativeInterface.auroraeThemeType : controlButtons.manualAuroraeThemeExtension property bool usingAuroraeTheme: customAuroraeThemePath ? true : false property string buttonImagePath: customAuroraeThemePath ? customAuroraeThemePath + '/' + iconName + '.' + customAuroraeImageExt : Qt.resolvedUrl('../icons/' + themeName + '/' + iconName + '.svg') property string svgElementId: usingAuroraeTheme ? (iconActive && iconName === 'alldesktops') ? (mouseInside ? 'pressed-center' : 'pressed-center') : (mouseInside ? 'hover-center' : 'active-center') : iconActive ? (mouseInside ? 'active-hover' : 'active-idle') : (mouseInside ? 'inactive-hover' : 'inactive-idle') PlasmaCore.Svg { id: buttonSvg imagePath: buttonImagePath } // icon PlasmaCore.SvgItem { id: svgItem width: parent.width height: width svg: buttonSvg elementId: svgElementId anchors.verticalCenter: parent.verticalCenter } hoverEnabled: true onEntered: { mouseInside = true controlButtons.mouseInWidget = true } onExited: { mouseInside = false controlButtons.mouseInWidget = false } // trigger active window action onClicked: { if (!controlButtons.showItem) { return; } controlButtons.mouseInWidget = true - main.performActiveWindowAction(windowOperation) + controlButtons.performActiveWindowAction(windowOperation) } } diff --git a/package/contents/ui/ControlButtons.qml b/package/contents/ui/ControlButtons.qml index 74a9e9b..c1b78e3 100644 --- a/package/contents/ui/ControlButtons.qml +++ b/package/contents/ui/ControlButtons.qml @@ -1,37 +1,141 @@ import QtQuick 2.2 import QtGraphicalEffects 1.0 import QtQuick.Layouts 1.1 import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.core 2.0 as PlasmaCore Item { id: controlButtons property bool mouseInWidget: false - property var controlButtonsModel property double controlButtonsHeight: parent.height * plasmoid.configuration.buttonSize property bool showItem - opacity: showItem ? 1 : 0 + property bool automaticButtonThemeEnabled: plasmoid.configuration.automaticButtonThemeEnabled + property string manualAuroraeThemePath: plasmoid.configuration.customAuroraeThemePath + property string manualAuroraeThemePathResolved: '' + property string manualAuroraeThemeExtension: 'svg' - height: main.buttonsVerticalCenter ? parent.height : controlButtonsHeight - width: controlButtonsHeight + ((controlButtonsModel.count - 1) * (controlButtonsHeight + main.controlButtonsSpacing)) + property bool showMinimize: plasmoid.configuration.showMinimize + property bool showMaximize: plasmoid.configuration.showMaximize + property bool showPinToAllDesktops: plasmoid.configuration.showPinToAllDesktops + + property string buttonOrder: plasmoid.configuration.buttonOrder + + property bool canShowButtonsAccordingMaximized: plasmoid.configuration.showButtonOnlyWhenMaximized ? main.currentWindowMaximized : true + + property int buttonsVerticalPosition: plasmoid.configuration.buttonsVerticalPosition; + property double controlButtonsSpacing: plasmoid.configuration.controlButtonsSpacing; + + opacity: (showItem && canShowButtonsAccordingMaximized) ? 1 : 0 + + // we want to trigger a button even if mouse is in the plasmoid area edge + height: buttonsVerticalPosition === 1 ? parent.height : controlButtonsHeight + width: controlButtonsHeight + ((controlButtonsModel.count - 1) * (controlButtonsHeight + controlButtonsSpacing)) + + onButtonsVerticalPositionChanged: { + anchors.top = undefined + anchors.verticalCenter = undefined + anchors.bottom = undefined + if (buttonsVerticalPosition === 0) { + anchors.top = parent.top + } else if (buttonsVerticalPosition === 1) { + anchors.verticalCenter = parent.verticalCenter + } else if (buttonsVerticalPosition === 2) { + anchors.bottom = parent.bottom + } + } + + onManualAuroraeThemePathChanged: { + manualAuroraeThemeExtension = plasmoid.nativeInterface.extensionForTheme(manualAuroraeThemePath); + manualAuroraeThemePathResolved = plasmoid.nativeInterface.translateThemePath(manualAuroraeThemePath); + print('manualAuroraeThemePath=' + manualAuroraeThemePath) + print('manualAuroraeThemePathResolved=' + manualAuroraeThemePathResolved) + print('manualAuroraeThemeExtension=' + manualAuroraeThemeExtension) + } + + onShowMaximizeChanged: initializeControlButtonsModel() + onShowMinimizeChanged: initializeControlButtonsModel() + onShowPinToAllDesktopsChanged: initializeControlButtonsModel() + onButtonOrderChanged: initializeControlButtonsModel() + + function addButton(preparedArray, buttonName) { + if (buttonName === 'close') { + preparedArray.push({ + iconName: 'close', + windowOperation: 'close' + }); + } else if (buttonName === 'maximize' && showMaximize) { + preparedArray.push({ + iconName: 'maximize', + windowOperation: 'toggleMaximized' + }); + } else if (buttonName === 'minimize' && showMinimize) { + preparedArray.push({ + iconName: 'minimize', + windowOperation: 'toggleMinimized' + }); + } else if ((buttonName === 'pin' || buttonName === 'alldesktops') && showPinToAllDesktops) { + preparedArray.push({ + iconName: 'alldesktops', + windowOperation: 'togglePinToAllDesktops' + }); + } + } + + function initializeControlButtonsModel() { + + var preparedArray = [] + buttonOrder.split('|').forEach(function (buttonName) { + addButton(preparedArray, buttonName); + }); + + controlButtonsModel.clear() + + preparedArray.forEach(function (item) { + print('adding item to buttons: ' + item.iconName); + controlButtonsModel.append(item); + }); + } + + function performActiveWindowAction(windowOperation) { + if (!mouseInWidget) { + return; + } + if (windowOperation === 'close') { + main.toggleClose() + } else if (windowOperation === 'toggleMaximized') { + main.toggleMaximized() + } else if (windowOperation === 'toggleMinimized') { + main.toggleMinimized() + } else if (windowOperation === 'togglePinToAllDesktops') { + main.togglePinToAllDesktops() + } + } + + ListModel { + id: controlButtonsModel + } ListView { orientation: ListView.Horizontal - spacing: main.controlButtonsSpacing + spacing: controlButtonsSpacing visible: true model: controlButtonsModel anchors.fill: parent delegate: ControlButton { } } + + Component.onCompleted: { + initializeControlButtonsModel() + } } diff --git a/package/contents/ui/WindowIcon.qml b/package/contents/ui/WindowIcon.qml index 554fcae..7d5d994 100644 --- a/package/contents/ui/WindowIcon.qml +++ b/package/contents/ui/WindowIcon.qml @@ -1,15 +1,16 @@ import QtQuick 2.2 import QtGraphicalEffects 1.0 import QtQuick.Layouts 1.1 import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.core 2.0 as PlasmaCore PlasmaCore.IconItem { id: iconItem width: parent.height height: parent.height source: plasmoid.configuration.noWindowIcon - visible: plasmoid.configuration.showWindowIcon + + opacity: menuItem.showItem ? plasmoid.configuration.appmenuIconAndTextOpacity : 1 } diff --git a/package/contents/ui/WindowTitle.qml b/package/contents/ui/WindowTitle.qml index 742673d..d5db510 100644 --- a/package/contents/ui/WindowTitle.qml +++ b/package/contents/ui/WindowTitle.qml @@ -1,50 +1,67 @@ import QtQuick 2.2 import QtGraphicalEffects 1.0 import QtQuick.Layouts 1.1 import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 2.0 as PlasmaComponents PlasmaComponents.Label { id: titleItem -// property double iconMargin: (plasmoid.configuration.showWindowIcon ? iconItem.width : 0) -// property double properWidth: parent.width - iconMargin - iconAndTextSpacing property double properHeight: parent.height - property bool noElide: fitText === 2 || (fitText === 1 && mouseHover) + property int fontBold: plasmoid.configuration.textFontBold + property string fontFamily: plasmoid.configuration.fontFamily + property int fitText: plasmoid.configuration.fitText + property bool noElide: fitText === 2 || (fitText === 1 && mainMouseArea.containsMouse) property int allowFontSizeChange: 3 property int minimumPixelSize: 8 -// property bool limitTextWidth: plasmoid.configuration.limitTextWidth -// property int textWidthLimit: plasmoid.configuration.textWidthLimit -// property double computedWidth: (limitTextWidth ? (implicitWidth > textWidthLimit ? textWidthLimit : implicitWidth) : properWidth)// - activeWindowListView.buttonsBetweenAddition + property bool limitTextWidth: plasmoid.configuration.limitTextWidth + property int textWidthLimit: plasmoid.configuration.textWidthLimit + + property double recommendedWidth + + onRecommendedWidthChanged: { + if (limitTextWidth) { + width = undefined + if (implicitWidth > textWidthLimit) { + width = textWidthLimit + } else { + width = recommendedWidth + } + } else { + width = recommendedWidth + } + } verticalAlignment: Text.AlignVCenter text: plasmoid.configuration.noWindowText wrapMode: Text.Wrap -// width: computedWidth + width: recommendedWidth height: properHeight elide: noElide ? Text.ElideNone : Text.ElideRight - visible: plasmoid.configuration.showWindowTitle font.pixelSize: fontPixelSize font.pointSize: -1 - font.weight: fontBold || (appmenuBoldTitleWhenMenuDisplayed && appmenu.visible) ? Font.Bold : theme.defaultFont.weight + font.weight: fontBold === 1 || (fontBold === 2 && menuItem.showItem) ? Font.Bold : theme.defaultFont.weight font.family: fontFamily || theme.defaultFont.family + opacity: menuItem.showItem ? plasmoid.configuration.appmenuIconAndTextOpacity : 1 + onTextChanged: { font.pixelSize = fontPixelSize allowFontSizeChange = 3 + recommendedWidthChanged() } onNoElideChanged: { font.pixelSize = fontPixelSize allowFontSizeChange = 3 } onPaintedHeightChanged: { if (allowFontSizeChange > 0 && noElide && paintedHeight > properHeight) { var newPixelSize = (properHeight / paintedHeight) * fontPixelSize font.pixelSize = newPixelSize < minimumPixelSize ? minimumPixelSize : newPixelSize } allowFontSizeChange-- } } \ No newline at end of file diff --git a/package/contents/ui/config/ConfigAppMenu.qml b/package/contents/ui/config/ConfigAppMenu.qml index ebdd6b7..6b77f71 100644 --- a/package/contents/ui/config/ConfigAppMenu.qml +++ b/package/contents/ui/config/ConfigAppMenu.qml @@ -1,124 +1,76 @@ import QtQuick 2.2 import QtQuick.Controls 1.3 import QtQuick.Layouts 1.1 Item { - id: main - property alias cfg_appmenuEnabled: appmenuEnabled.checked - property alias cfg_appmenuNextToButtons: appmenuNextToButtons.checked - property alias cfg_appmenuFillHeight: appmenuFillHeight.checked property alias cfg_appmenuFontBold: appmenuFontBold.checked - property alias cfg_appmenuDoNotHide: appmenuDoNotHide.checked - property alias cfg_appmenuNextToIconAndText: appmenuNextToIconAndText.checked - property alias cfg_appmenuSwitchSidesWithIconAndText: appmenuSwitchSidesWithIconAndText.checked + property alias cfg_appmenuFillHeight: appmenuFillHeight.checked + property alias cfg_appmenuVerticalPosition: appmenuVerticalPosition.currentIndex property alias cfg_appmenuSeparatorEnabled: appmenuSeparatorEnabled.checked - property alias cfg_appmenuBoldTitleWhenMenuDisplayed: appmenuBoldTitleWhenMenuDisplayed.checked - property alias cfg_appmenuOuterSideMargin: appmenuOuterSideMargin.value property alias cfg_appmenuIconAndTextOpacity: appmenuIconAndTextOpacity.value property alias cfg_appmenuButtonTextSizeScale: appmenuButtonTextSizeScale.value - GroupBox { - id: appmenuEnabled - title: i18n("Enable application menu") - checkable: true - flat: true - - GridLayout { - columns: 2 - - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } - - CheckBox { - id: appmenuFillHeight - text: i18n("Fill height") - Layout.columnSpan: 2 - } + GridLayout { + columns: 2 - CheckBox { - id: appmenuFontBold - text: i18n("Bold font") - Layout.columnSpan: 2 - } - - CheckBox { - id: appmenuDoNotHide - text: i18n("Do not hide on mouse out") - } - - CheckBox { - id: appmenuNextToButtons - text: i18n("Show next to buttons") - Layout.columnSpan: 2 - } - - CheckBox { - id: appmenuNextToIconAndText - text: i18n("Show next to icon and text") - Layout.columnSpan: 2 - } + Item { + width: 2 + height: 10 + Layout.columnSpan: 2 + } - CheckBox { - id: appmenuSwitchSidesWithIconAndText - text: i18n("Switch sides with icon and text") - Layout.columnSpan: 2 - enabled: appmenuNextToIconAndText.checked - } + CheckBox { + id: appmenuFontBold + text: i18n("Bold font") + Layout.columnSpan: 2 + } - CheckBox { - id: appmenuSeparatorEnabled - text: i18n("Show separator") - Layout.columnSpan: 2 - enabled: appmenuNextToIconAndText.checked - } + CheckBox { + id: appmenuFillHeight + text: i18n("Fill height") + Layout.columnSpan: 2 + } - CheckBox { - id: appmenuBoldTitleWhenMenuDisplayed - text: i18n("Make window title bold when menu is displayed") - Layout.columnSpan: 2 - } + Label { + text: i18n('Vertical position:') + Layout.alignment: Qt.AlignRight + } + ComboBox { + id: appmenuVerticalPosition + model: [i18n('Top'), i18n('Bottom')] + enabled: !appmenuFillHeight.checked + } - Label { - text: i18n('Side margin:') - Layout.alignment: Qt.AlignRight - } - SpinBox { - id: appmenuOuterSideMargin - decimals: 0 - stepSize: 1 - minimumValue: 0 - maximumValue: 100 - suffix: i18nc('Abbreviation for pixels', 'px') - } + CheckBox { + id: appmenuSeparatorEnabled + text: i18n("Show separator") + Layout.columnSpan: 2 + } - Label { - text: i18n('Icon and text opacity:') - Layout.alignment: Qt.AlignRight - } - SpinBox { - id: appmenuIconAndTextOpacity - decimals: 2 - stepSize: 0.1 - minimumValue: 0 - maximumValue: 1 - } + Label { + text: i18n('Icon and text opacity:') + Layout.alignment: Qt.AlignRight + } + SpinBox { + id: appmenuIconAndTextOpacity + decimals: 2 + stepSize: 0.1 + minimumValue: 0 + maximumValue: 1 + } - Label { - text: i18n('Menu button text size scale:') - Layout.alignment: Qt.AlignRight - } - SpinBox { - id: appmenuButtonTextSizeScale - decimals: 2 - stepSize: 0.1 - minimumValue: 0.5 - maximumValue: 5 - } + Label { + text: i18n('Menu button text size scale:') + Layout.alignment: Qt.AlignRight + } + SpinBox { + id: appmenuButtonTextSizeScale + decimals: 2 + stepSize: 0.1 + minimumValue: 0.5 + maximumValue: 5 } } } diff --git a/package/contents/ui/config/ConfigAppearance.qml b/package/contents/ui/config/ConfigAppearance.qml deleted file mode 100644 index 98a8091..0000000 --- a/package/contents/ui/config/ConfigAppearance.qml +++ /dev/null @@ -1,367 +0,0 @@ -import QtQuick 2.2 -import QtQuick.Controls 1.3 -import QtQuick.Layouts 1.1 -import org.kde.plasma.core 2.0 as PlasmaCore - -Item { - id: appearancePage - - signal configurationChanged - - property alias cfg_autoFillWidth: autoFillWidth.checked - property alias cfg_horizontalScreenWidthPercent: horizontalScreenWidthPercent.value - property alias cfg_widthFineTuning: widthFineTuning.value - - property alias cfg_showWindowTitle: showWindowTitle.checked - property alias cfg_textType: textTypeCombo.currentIndex - property alias cfg_fitText: fitTextCombo.currentIndex - property alias cfg_tooltipTextType: tooltipTextTypeCombo.currentIndex - property alias cfg_showWindowIcon: showWindowIcon.checked - property alias cfg_windowIconOnTheRight: windowIconOnTheRight.checked - property alias cfg_useWindowTitleReplace: useWindowTitleReplace.checked - property alias cfg_replaceTextRegex: replaceTextRegex.text - property alias cfg_replaceTextReplacement: replaceTextReplacement.text - property alias cfg_noWindowText: noWindowText.text - property string cfg_noWindowIcon: plasmoid.configuration.noWindowIcon - property alias cfg_limitTextWidth: limitTextWidth.checked - property alias cfg_textWidthLimit: textWidthLimit.value - - property alias cfg_boldFontWeight: boldFontWeight.checked - property string cfg_fontFamily - property alias cfg_iconAndTextSpacing: iconAndTextSpacing.value - property alias cfg_fontSizeScale: fontSizeScale.value - - PlasmaCore.DataSource { - id: executableDS - engine: 'executable' - - property string cmdBorderlessRead: 'kreadconfig5 --file kwinrc --group Windows --key BorderlessMaximizedWindows' - property string cmdBorderlessWrite: 'kwriteconfig5 --file kwinrc --group Windows --key BorderlessMaximizedWindows --type bool {borderless}' - property string cmdReconfigure: 'qdbus org.kde.KWin /KWin reconfigure' - - connectedSources: [] - - onNewData: { - connectedSources.length = 0 - print('sourceName: ' + sourceName) - if (sourceName === cmdBorderlessRead) { - var trimmedStdout = data.stdout.trim() - print('current value: ' + trimmedStdout) - toggleBorderlessMaximizedWindows.checked = trimmedStdout === 'true' - } else if (sourceName.indexOf('kwriteconfig5') === 0) { - connectedSources.push(cmdReconfigure) - } - } - } - - /* copied from /usr/share/plasma/plasmoids/org.kde.plasma.digitalclock/contents/ui/configAppearance.qml */ - onCfg_fontFamilyChanged: { - // HACK by the time we populate our model and/or the ComboBox is finished the value is still undefined - if (cfg_fontFamily) { - for (var i = 0, j = fontsModel.count; i < j; ++i) { - if (fontsModel.get(i).value == cfg_fontFamily) { - fontFamilyComboBox.currentIndex = i - break - } - } - } - } - - ListModel { - id: fontsModel - Component.onCompleted: { - var arr = [ {text: i18nc("Use default font", "Default"), value: ""} ] - Qt.fontFamilies().forEach(function (font) { - arr.push({text: font, value: font}) - }) - append(arr) - cfg_fontFamilyChanged(); - } - } - - Component.onCompleted: { - executableDS.connectedSources.push(executableDS.cmdBorderlessRead) - } - - GridLayout { - columns: 2 - - Label { - text: i18n('Plasmoid version: ') + '1.7.4' - Layout.alignment: Qt.AlignRight - Layout.columnSpan: 2 - } - - Label { - text: i18n("Width in horizontal panel:") - Layout.alignment: Qt.AlignVCenter|Qt.AlignLeft - Layout.columnSpan: 2 - } - - CheckBox { - id: autoFillWidth - text: i18n("Fill width") - Layout.columnSpan: 2 - } - - GridLayout { - columns: 2 - Layout.columnSpan: 2 - enabled: !autoFillWidth.checked - - Slider { - id: horizontalScreenWidthPercent - stepSize: 0.001 - minimumValue: 0.001 - maximumValue: 1 - Layout.preferredWidth: appearancePage.width - Layout.columnSpan: 2 - } - - Label { - text: i18n("Fine tuning:") - Layout.alignment: Qt.AlignVCenter|Qt.AlignRight - } - SpinBox { - id: widthFineTuning - decimals: 1 - stepSize: 0.5 - minimumValue: -100 - maximumValue: 100 - } - } - - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } - - CheckBox { - id: toggleBorderlessMaximizedWindows - text: i18n("Hide titlebar for maximized windows (takes effect immediately)") - Layout.columnSpan: 2 - onCheckedChanged: { - var preparedCmd = executableDS.cmdBorderlessWrite.replace('{borderless}', String(checked)) - executableDS.connectedSources.push(preparedCmd) - } - } - - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } - - GroupBox { - id: showWindowTitle - title: i18n("Show window title") - checkable: true - flat: true - Layout.columnSpan: 2 - - GridLayout { - columns: 2 - - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } - - Label { - text: i18n('Text type:') - Layout.alignment: Qt.AlignRight - } - ComboBox { - id: textTypeCombo - model: [i18n('Window title'), i18n('Application name')] - } - - Label { - text: i18n('Fit text:') - Layout.alignment: Qt.AlignRight - } - ComboBox { - id: fitTextCombo - model: [i18n('Just elide'), i18n('Fit on hover'), i18n('Always fit')] - } - - Label { - text: i18n('Tooltip text:') - Layout.alignment: Qt.AlignRight - } - ComboBox { - id: tooltipTextTypeCombo - model: [i18n('No tooltip'), i18n('Window title'), i18n('Application name')] - } - - CheckBox { - id: useWindowTitleReplace - text: '"' + i18n('Window title') + '".replace(/' - Layout.alignment: Qt.AlignRight - } - GridLayout { - columns: 4 - - TextField { - id: replaceTextRegex - placeholderText: '^(.*)\\s+[—–\\-:]\\s+([^—–\\-:]+)$' - Layout.preferredWidth: 300 - onTextChanged: cfg_replaceTextRegex = text - enabled: useWindowTitleReplace.checked - } - - Label { - text: '/, "' - } - - TextField { - id: replaceTextReplacement - placeholderText: '$2 — $1' - Layout.preferredWidth: 100 - onTextChanged: cfg_replaceTextReplacement = text - enabled: useWindowTitleReplace.checked - } - - Label { - text: '");' - } - } - - Label { - text: i18n('No window text:') - Layout.alignment: Qt.AlignRight - } - GridLayout { - columns: 2 - - TextField { - id: noWindowText - placeholderText: 'Plasma Desktop :: %activity%' - onTextChanged: cfg_noWindowText = text - Layout.preferredWidth: 300 - } - - Label { - text: i18n('Use %activity% placeholder to show current activity name.') - Layout.preferredWidth: 200 - wrapMode: Text.Wrap - } - } - - Label { - text: i18n("No window icon:") - Layout.alignment: Qt.AlignRight - } - IconPicker { - currentIcon: cfg_noWindowIcon - defaultIcon: '' - onIconChanged: cfg_noWindowIcon = iconName - } - - CheckBox { - id: limitTextWidth - text: i18n('Limit text width') - Layout.alignment: Qt.AlignRight - } - SpinBox { - id: textWidthLimit - decimals: 0 - stepSize: 10 - minimumValue: 0 - maximumValue: 10000 - enabled: limitTextWidth.checked - suffix: i18nc('Abbreviation for pixels', 'px') - } - } - } - - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } - - CheckBox { - id: showWindowIcon - text: i18n("Show window icon") - Layout.columnSpan: 2 - } - - CheckBox { - id: windowIconOnTheRight - text: i18n("Window icon on the right") - Layout.columnSpan: 2 - } - - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } - - GridLayout { - columns: 2 - - Layout.columnSpan: 2 - - Item { - width: 2 - height: 10 - } - CheckBox { - id: boldFontWeight - text: i18n("Bold text") - } - - Label { - text: i18n('Text font:') - Layout.alignment: Qt.AlignRight - } - ComboBox { - id: fontFamilyComboBox - // ComboBox's sizing is just utterly broken - Layout.minimumWidth: units.gridUnit * 10 - model: fontsModel - // doesn't autodeduce from model because we manually populate it - textRole: "text" - onCurrentIndexChanged: { - var current = model.get(currentIndex) - if (current) { - cfg_fontFamily = current.value - appearancePage.configurationChanged() - console.log('change: ' + cfg_fontFamily) - } - } - } - - Label { - text: i18n("Icon and text spacing:") - Layout.alignment: Qt.AlignVCenter|Qt.AlignRight - } - SpinBox { - id: iconAndTextSpacing - decimals: 1 - stepSize: 0.5 - minimumValue: 0.5 - maximumValue: 300 - } - - Label { - text: i18n("Font size scale:") - Layout.alignment: Qt.AlignVCenter|Qt.AlignRight - } - SpinBox { - id: fontSizeScale - decimals: 2 - stepSize: 0.05 - minimumValue: 0 - maximumValue: 3 - } - - } - - } - -} diff --git a/package/contents/ui/config/ConfigBehaviour.qml b/package/contents/ui/config/ConfigBehaviour.qml index bed177e..7440415 100644 --- a/package/contents/ui/config/ConfigBehaviour.qml +++ b/package/contents/ui/config/ConfigBehaviour.qml @@ -1,20 +1,57 @@ import QtQuick 2.2 import QtQuick.Controls 1.3 import QtQuick.Layouts 1.1 +import org.kde.plasma.core 2.0 as PlasmaCore Item { property alias cfg_showForCurrentScreenOnly: showForCurrentScreenOnly.checked GridLayout { columns: 2 + CheckBox { + id: toggleBorderlessMaximizedWindows + text: i18n("Hide titlebar for maximized windows (takes effect immediately)") + Layout.columnSpan: 2 + onCheckedChanged: { + var preparedCmd = executableDS.cmdBorderlessWrite.replace('{borderless}', String(checked)) + executableDS.connectedSources.push(preparedCmd) + } + } + CheckBox { id: showForCurrentScreenOnly text: i18n("Show active window only for plasmoid's screen") Layout.columnSpan: 2 } + } + + PlasmaCore.DataSource { + id: executableDS + engine: 'executable' + + property string cmdBorderlessRead: 'kreadconfig5 --file kwinrc --group Windows --key BorderlessMaximizedWindows' + property string cmdBorderlessWrite: 'kwriteconfig5 --file kwinrc --group Windows --key BorderlessMaximizedWindows --type bool {borderless}' + property string cmdReconfigure: 'qdbus org.kde.KWin /KWin reconfigure' + + connectedSources: [] + + onNewData: { + connectedSources.length = 0 + print('sourceName: ' + sourceName) + if (sourceName === cmdBorderlessRead) { + var trimmedStdout = data.stdout.trim() + print('current value: ' + trimmedStdout) + toggleBorderlessMaximizedWindows.checked = trimmedStdout === 'true' + } else if (sourceName.indexOf('kwriteconfig5') === 0) { + connectedSources.push(cmdReconfigure) + } + } + } + Component.onCompleted: { + executableDS.connectedSources.push(executableDS.cmdBorderlessRead) } } diff --git a/package/contents/ui/config/ConfigButtons.qml b/package/contents/ui/config/ConfigButtons.qml index 787bc47..b48e3c9 100644 --- a/package/contents/ui/config/ConfigButtons.qml +++ b/package/contents/ui/config/ConfigButtons.qml @@ -1,317 +1,250 @@ import QtQuick 2.2 import QtQuick.Controls 1.3 import QtQuick.Layouts 1.1 import QtQml.Models 2.1 Item { - property alias cfg_showControlButtons: showControlButtons.checked - property alias cfg_doNotHideControlButtons: doNotHideControlButtons.checked - property int cfg_buttonsPosition - property alias cfg_buttonsVerticalCenter: buttonsVerticalCenter.checked - property alias cfg_buttonsStandalone: buttonsStandalone.checked - property alias cfg_buttonsBetweenIconAndText: buttonsBetweenIconAndText.checked - property alias cfg_buttonsDynamicWidth: buttonsDynamicWidth.checked - property alias cfg_slidingIconAndText: slidingIconAndText.checked - property alias cfg_showButtonOnlyWhenMaximized: showButtonOnlyWhenMaximized.checked + property string cfg_buttonOrder + property alias cfg_showMinimize: showMinimize.checked property alias cfg_showMaximize: showMaximize.checked property alias cfg_showPinToAllDesktops: showPinToAllDesktops.checked + + property alias cfg_showButtonOnlyWhenMaximized: showButtonOnlyWhenMaximized.checked + property alias cfg_buttonSize: buttonSize.value + property int cfg_buttonsVerticalPosition property alias cfg_controlButtonsSpacing: controlButtonsSpacing.value - property string cfg_buttonOrder + property alias cfg_automaticButtonThemeEnabled: automaticButtonThemeEnabled.checked property alias cfg_customAuroraeThemePath: customAuroraeThemePath.text - onCfg_buttonsPositionChanged: { - switch (cfg_buttonsPosition) { + onCfg_buttonsVerticalPositionChanged: { + switch (cfg_buttonsVerticalPosition) { case 0: - buttonsPositionGroup.current = upperLeftRadio; + buttonsVertialPositionGroup.current = topRadio; break; case 1: - buttonsPositionGroup.current = upperRightRadio; + buttonsVertialPositionGroup.current = middleRadio; break; case 2: - buttonsPositionGroup.current = bottomLeftRadio; - break; - case 3: - buttonsPositionGroup.current = bottomRightRadio; + buttonsVertialPositionGroup.current = bottomRadio; break; default: - buttonsPositionGroup.current = upperLeftRadio; + buttonsVertialPositionGroup.current = topRadio; } } Component.onCompleted: { - cfg_buttonsPositionChanged() + cfg_buttonsVerticalPositionChanged() + print('intially calling sortButtonOrder()') sortButtonOrder() } ListModel { id: buttonsToSpend ListElement { name: 'close' iconName: 'close' } ListElement { name: 'minimize' iconName: 'minimize' } ListElement { name: 'maximize' iconName: 'maximize' } ListElement { name: 'alldesktops' iconName: 'alldesktops' } } function sortButtonOrder() { cfg_buttonOrder.split('|').forEach(function (itemId, index) { if (itemId === 'close') { print('adding ' + itemId); buttonOrder.model.insert(index, buttonsToSpend.get(0)); } else if (itemId === 'minimize') { buttonOrder.model.insert(index, buttonsToSpend.get(1)); print('adding ' + itemId); } else if (itemId === 'maximize') { buttonOrder.model.insert(index, buttonsToSpend.get(2)); print('adding ' + itemId); } else if (itemId === 'pin' || itemId === 'alldesktops') { buttonOrder.model.insert(index, buttonsToSpend.get(3)); print('adding ' + itemId); } }); } ExclusiveGroup { - id: buttonsPositionGroup + id: buttonsVertialPositionGroup } - GroupBox { - id: showControlButtons - title: i18n("Enable Control Buttons") - checkable: true - flat: true - - GridLayout { - columns: 2 - - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } - - Item { - width: 2 - height: 2 - Layout.rowSpan: 3 - } - - CheckBox { - id: showMinimize - text: i18n("Show minimize button") - } - - CheckBox { - id: showMaximize - text: i18n("Show maximize button") - } - - CheckBox { - id: showPinToAllDesktops - text: i18n("Show pin to all desktops") - } - - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } - - Label { - text: i18n("Button order:") - Layout.alignment: Qt.AlignVCenter|Qt.AlignRight - } + GridLayout { + columns: 2 - OrderableListView { - id: buttonOrder - height: units.gridUnit * 2 - width: height * 4 - model: ListModel { - // will be filled initially by sortButtonOrder() method - } - orientation: ListView.Horizontal - itemWidth: width / 4 - itemHeight: itemWidth + Label { + text: i18n("Button order:") + Layout.alignment: Qt.AlignVCenter|Qt.AlignRight + } - onModelOrderChanged: { - var orderStr = ''; - for (var i = 0; i < model.count; i++) { - var item = model.get(i) - if (orderStr.length > 0) { - orderStr += '|'; - } - orderStr += item.name; + OrderableListView { + id: buttonOrder + height: units.gridUnit * 2 + width: height * 4 + model: ListModel { + // will be filled initially by sortButtonOrder() method + } + orientation: ListView.Horizontal + itemWidth: width / 4 + itemHeight: itemWidth + + onModelOrderChanged: { + var orderStr = ''; + for (var i = 0; i < model.count; i++) { + var item = model.get(i) + if (orderStr.length > 0) { + orderStr += '|'; } - cfg_buttonOrder = orderStr; - print('written: ' + cfg_buttonOrder); + orderStr += item.name; } + cfg_buttonOrder = orderStr; + print('written: ' + cfg_buttonOrder); } + } - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } - - Label { - text: i18n("Behaviour:") - Layout.alignment: Qt.AlignVCenter|Qt.AlignRight - } - - CheckBox { - id: doNotHideControlButtons - text: i18n("Do not hide on mouse out") - } - - Item { - width: 2 - height: 2 - Layout.rowSpan: 5 - } - - CheckBox { - id: showButtonOnlyWhenMaximized - text: i18n("Show only when maximized") - } - - CheckBox { - id: buttonsStandalone - text: i18n("Buttons next to icon and text") - } - - CheckBox { - id: buttonsBetweenIconAndText - text: i18n("Buttons between icon and text") - enabled: buttonsStandalone.checked - } - - CheckBox { - id: buttonsDynamicWidth - text: i18n("Dynamic width") - enabled: buttonsStandalone.checked - } + Item { + width: 2 + height: 10 + Layout.columnSpan: 2 + } - CheckBox { - id: slidingIconAndText - text: i18n("Sliding icon and text") - enabled: buttonsStandalone.checked - } + Label { + text: i18n("Show:") + Layout.alignment: Qt.AlignRight + } + CheckBox { + id: showMinimize + text: i18n("Minimize button") + } + Item { + width: 2 + height: 2 + Layout.rowSpan: 2 + } + CheckBox { + id: showMaximize + text: i18n("Maximize button") + } + CheckBox { + id: showPinToAllDesktops + text: i18n("Pin to all desktops") + } + Item { + width: 2 + height: 10 + Layout.columnSpan: 2 + } - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } + Label { + text: i18n("Behaviour:") + Layout.alignment: Qt.AlignVCenter|Qt.AlignRight + } - Label { - text: i18n("Position:") - Layout.alignment: Qt.AlignVCenter|Qt.AlignRight - } - RadioButton { - id: upperLeftRadio - exclusiveGroup: buttonsPositionGroup - text: i18n("Upper left") - onCheckedChanged: if (checked) cfg_buttonsPosition = 0; - } - Item { - width: 2 - height: 2 - Layout.rowSpan: 4 - } - RadioButton { - id: upperRightRadio - exclusiveGroup: buttonsPositionGroup - text: i18n("Upper right") - onCheckedChanged: if (checked) cfg_buttonsPosition = 1; - } - RadioButton { - id: bottomLeftRadio - exclusiveGroup: buttonsPositionGroup - text: i18n("Bottom left") - onCheckedChanged: if (checked) cfg_buttonsPosition = 2; - } - RadioButton { - id: bottomRightRadio - exclusiveGroup: buttonsPositionGroup - text: i18n("Bottom right") - onCheckedChanged: if (checked) cfg_buttonsPosition = 3; - } + CheckBox { + id: showButtonOnlyWhenMaximized + text: i18n("Show only when maximized") + } - CheckBox { - id: buttonsVerticalCenter - text: i18n("Vertical center") - } + Item { + width: 2 + height: 10 + Layout.columnSpan: 2 + } - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } + Label { + text: i18n("Buttons spacing:") + Layout.alignment: Qt.AlignVCenter|Qt.AlignRight + } + Slider { + id: controlButtonsSpacing + stepSize: 1 + minimumValue: 0 + maximumValue: 20 + tickmarksEnabled: true + width: parent.width + } - Label { - text: i18n("Button size:") - Layout.alignment: Qt.AlignVCenter|Qt.AlignRight - } - Slider { - id: buttonSize - stepSize: 0.1 - minimumValue: 0.1 - tickmarksEnabled: true - width: parent.width - } + Label { + text: i18n("Button size:") + Layout.alignment: Qt.AlignVCenter|Qt.AlignRight + } + Slider { + id: buttonSize + stepSize: 0.1 + minimumValue: 0.1 + tickmarksEnabled: true + width: parent.width + } - Label { - text: i18n("Buttons spacing:") - Layout.alignment: Qt.AlignVCenter|Qt.AlignRight - } - Slider { - id: controlButtonsSpacing - stepSize: 1 - minimumValue: 0 - maximumValue: 20 - tickmarksEnabled: true - width: parent.width - } + Label { + text: i18n("Position:") + Layout.alignment: Qt.AlignVCenter|Qt.AlignRight + } + RadioButton { + id: topRadio + exclusiveGroup: buttonsVertialPositionGroup + text: i18n("Top") + onCheckedChanged: if (checked) cfg_buttonsVerticalPosition = 0; + enabled: buttonSize.value < 1 + } + Item { + width: 2 + height: 2 + Layout.rowSpan: 4 + } + RadioButton { + id: middleRadio + exclusiveGroup: buttonsVertialPositionGroup + text: i18n("Middle") + onCheckedChanged: if (checked) cfg_buttonsVerticalPosition = 1; + enabled: buttonSize.value < 1 + } + RadioButton { + id: bottomRadio + exclusiveGroup: buttonsVertialPositionGroup + text: i18n("Bottom") + onCheckedChanged: if (checked) cfg_buttonsVerticalPosition = 2; + enabled: buttonSize.value < 1 + } - Item { - width: 2 - height: 10 - Layout.columnSpan: 2 - } + Item { + width: 2 + height: 10 + Layout.columnSpan: 2 + } - Label { - text: i18n("Theme") - Layout.columnSpan: parent.columns - font.bold: true - } - CheckBox { - id: automaticButtonThemeEnabled - text: i18n("Automatic") - } - TextField { - id: customAuroraeThemePath - placeholderText: i18n("Absolute path to aurorae button theme folder") - Layout.preferredWidth: 350 - onTextChanged: cfg_customAuroraeThemePath = text - enabled: !automaticButtonThemeEnabled.checked - } + Label { + text: i18n("Theme") + Layout.columnSpan: parent.columns + font.bold: true + } + CheckBox { + id: automaticButtonThemeEnabled + text: i18n("Automatic") + } + TextField { + id: customAuroraeThemePath + placeholderText: i18n("Absolute path to aurorae button theme folder") + Layout.preferredWidth: 350 + onTextChanged: cfg_customAuroraeThemePath = text + enabled: !automaticButtonThemeEnabled.checked } } - } diff --git a/package/contents/ui/config/ConfigLayout.qml b/package/contents/ui/config/ConfigLayout.qml index 1619a34..1e6903c 100644 --- a/package/contents/ui/config/ConfigLayout.qml +++ b/package/contents/ui/config/ConfigLayout.qml @@ -1,332 +1,395 @@ import QtQuick 2.2 import QtQuick.Controls 1.3 import QtQuick.Layouts 1.1 import QtQml.Models 2.1 Item { + id: configLayout property string cfg_controlPartOrder property alias cfg_controlPartSpacing: controlPartSpacing.value // GENERATED config (start) - property alias cfg_controlPartButtonsPosition: controlPartButtonsPosition.currentIndex - property alias cfg_controlPartButtonsShowOnMouseIn: controlPartButtonsShowOnMouseIn.checked - property alias cfg_controlPartButtonsShowOnMouseOut: controlPartButtonsShowOnMouseOut.checked - property alias cfg_controlPartButtonsHorizontalAlignment: controlPartButtonsHorizontalAlignment.currentIndex - property alias cfg_controlPartIconPosition: controlPartIconPosition.currentIndex property alias cfg_controlPartIconShowOnMouseIn: controlPartIconShowOnMouseIn.checked property alias cfg_controlPartIconShowOnMouseOut: controlPartIconShowOnMouseOut.checked property alias cfg_controlPartIconHorizontalAlignment: controlPartIconHorizontalAlignment.currentIndex property alias cfg_controlPartTitlePosition: controlPartTitlePosition.currentIndex property alias cfg_controlPartTitleShowOnMouseIn: controlPartTitleShowOnMouseIn.checked property alias cfg_controlPartTitleShowOnMouseOut: controlPartTitleShowOnMouseOut.checked property alias cfg_controlPartTitleHorizontalAlignment: controlPartTitleHorizontalAlignment.currentIndex + property alias cfg_controlPartButtonsPosition: controlPartButtonsPosition.currentIndex + property alias cfg_controlPartButtonsShowOnMouseIn: controlPartButtonsShowOnMouseIn.checked + property alias cfg_controlPartButtonsShowOnMouseOut: controlPartButtonsShowOnMouseOut.checked + property alias cfg_controlPartButtonsHorizontalAlignment: controlPartButtonsHorizontalAlignment.currentIndex + property alias cfg_controlPartMenuPosition: controlPartMenuPosition.currentIndex property alias cfg_controlPartMenuShowOnMouseIn: controlPartMenuShowOnMouseIn.checked property alias cfg_controlPartMenuShowOnMouseOut: controlPartMenuShowOnMouseOut.checked property alias cfg_controlPartMenuHorizontalAlignment: controlPartMenuHorizontalAlignment.currentIndex // GENERATED config (end) property alias cfg_controlPartMouseAreaRestrictedToWidget: controlPartMouseAreaRestrictedToWidget.checked + property alias cfg_autoFillWidth: autoFillWidth.checked + property alias cfg_horizontalScreenWidthPercent: horizontalScreenWidthPercent.value + property alias cfg_widthFineTuning: widthFineTuning.value + ListModel { id: partsToSpend ListElement { name: 'icon' text: 'Icon' } ListElement { name: 'title' text: 'Title' } ListElement { name: 'buttons' text: 'Buttons' } ListElement { name: 'menu' text: 'Menu' } } function sortPartOrder() { buttonOrder.model.clear() cfg_controlPartOrder.split('|').forEach(function (itemId, index) { var partIndex = -1 print('adding ' + itemId); if (itemId === 'icon') { partIndex = 0 } else if (itemId === 'title') { partIndex = 1 } else if (itemId === 'buttons') { partIndex = 2 } else if (itemId === 'menu') { partIndex = 3 } if (partIndex >= 0) { buttonOrder.model.append(partsToSpend.get(partIndex)); } }); print('model count: ' + buttonOrder.model.count) } GridLayout { columns: 3 + Label { + text: i18n('Plasmoid version: ') + '1.8.0-git' + Layout.alignment: Qt.AlignRight + Layout.columnSpan: 3 + } + + Item { + width: 2 + height: units.largeSpacing + Layout.columnSpan: 3 + } + Label { text: i18n("Item order:") } OrderableListView { id: buttonOrder Layout.columnSpan: 2 itemHeight: units.gridUnit * 2 itemWidth: units.gridUnit * 4 height: itemHeight width: itemWidth * 4 model: ListModel { // will be filled initially by sortButtonOrder() method } orientation: ListView.Horizontal onModelOrderChanged: { var orderStr = ''; for (var i = 0; i < model.count; i++) { var item = model.get(i) if (orderStr.length > 0) { orderStr += '|'; } orderStr += item.name; } cfg_controlPartOrder = orderStr; print('written: ' + cfg_controlPartOrder); } } Label { text: i18n("Item spacing:") } SpinBox { id: controlPartSpacing decimals: 1 stepSize: 0.5 minimumValue: 0.5 maximumValue: 300 Layout.columnSpan: 2 } // GENERATED controls (start) GridLayout { columns: 2 Item { width: 2 height: units.largeSpacing Layout.columnSpan: 2 } Label { - text: i18n('Buttons') + text: i18n('Icon') font.bold: true Layout.columnSpan: 2 } Label { text: i18n('Position:') Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } ComboBox { - id: controlPartButtonsPosition + id: controlPartIconPosition model: [i18n('Occupy'), i18n('Floating layer'), i18n('Absolute')] } CheckBox { - id: controlPartButtonsShowOnMouseIn + id: controlPartIconShowOnMouseIn text: i18n('Show on mouse in') Layout.columnSpan: 2 } CheckBox { - id: controlPartButtonsShowOnMouseOut + id: controlPartIconShowOnMouseOut text: i18n('Show on mouse out') Layout.columnSpan: 2 } Label { text: i18n('Horizontal alignment:') Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } ComboBox { - id: controlPartButtonsHorizontalAlignment + id: controlPartIconHorizontalAlignment model: [i18n('Left'), i18n('Right')] } Item { width: 2 height: units.largeSpacing Layout.columnSpan: 2 } Label { - text: i18n('Icon') + text: i18n('Buttons') font.bold: true Layout.columnSpan: 2 } Label { text: i18n('Position:') Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } ComboBox { - id: controlPartIconPosition + id: controlPartButtonsPosition model: [i18n('Occupy'), i18n('Floating layer'), i18n('Absolute')] } CheckBox { - id: controlPartIconShowOnMouseIn + id: controlPartButtonsShowOnMouseIn text: i18n('Show on mouse in') Layout.columnSpan: 2 } CheckBox { - id: controlPartIconShowOnMouseOut + id: controlPartButtonsShowOnMouseOut text: i18n('Show on mouse out') Layout.columnSpan: 2 } Label { text: i18n('Horizontal alignment:') Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } ComboBox { - id: controlPartIconHorizontalAlignment + id: controlPartButtonsHorizontalAlignment model: [i18n('Left'), i18n('Right')] } } Item { width: units.largeSpacing height: units.largeSpacing } GridLayout { columns: 2 Item { width: 2 height: units.largeSpacing Layout.columnSpan: 2 } Label { text: i18n('Title') font.bold: true Layout.columnSpan: 2 } Label { text: i18n('Position:') Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } ComboBox { id: controlPartTitlePosition model: [i18n('Occupy'), i18n('Floating layer'), i18n('Absolute')] } CheckBox { id: controlPartTitleShowOnMouseIn text: i18n('Show on mouse in') Layout.columnSpan: 2 } CheckBox { id: controlPartTitleShowOnMouseOut text: i18n('Show on mouse out') Layout.columnSpan: 2 } Label { text: i18n('Horizontal alignment:') Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } ComboBox { id: controlPartTitleHorizontalAlignment model: [i18n('Left'), i18n('Right')] } Item { width: 2 height: units.largeSpacing Layout.columnSpan: 2 } Label { text: i18n('Menu') font.bold: true Layout.columnSpan: 2 } Label { text: i18n('Position:') Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } ComboBox { id: controlPartMenuPosition model: [i18n('Occupy'), i18n('Floating layer'), i18n('Absolute')] } CheckBox { id: controlPartMenuShowOnMouseIn text: i18n('Show on mouse in') Layout.columnSpan: 2 } CheckBox { id: controlPartMenuShowOnMouseOut text: i18n('Show on mouse out') Layout.columnSpan: 2 } Label { text: i18n('Horizontal alignment:') Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } ComboBox { id: controlPartMenuHorizontalAlignment model: [i18n('Left'), i18n('Right')] } } // GENERATED controls (end) Item { width: units.largeSpacing height: units.largeSpacing Layout.columnSpan: 3 } CheckBox { id: controlPartMouseAreaRestrictedToWidget text: i18n('Restrict mouse area to widget') - Layout.columnSpan: 2 + Layout.columnSpan: 3 + } + + Item { + width: units.largeSpacing + height: units.largeSpacing + Layout.columnSpan: 3 + } + + Label { + text: i18n("Width in horizontal panel:") + font.bold: true + Layout.alignment: Qt.AlignLeft + Layout.columnSpan: 3 + } + + CheckBox { + id: autoFillWidth + text: i18n("Fill width") + Layout.columnSpan: 3 + } + + GridLayout { + columns: 2 + Layout.columnSpan: 3 + enabled: !autoFillWidth.checked + + Slider { + id: horizontalScreenWidthPercent + stepSize: 0.001 + minimumValue: 0.001 + maximumValue: 1 + Layout.preferredWidth: configLayout.width + Layout.columnSpan: 2 + } + + Label { + text: i18n("Fine tuning:") + Layout.alignment: Qt.AlignRight + } + SpinBox { + id: widthFineTuning + decimals: 1 + stepSize: 0.5 + minimumValue: -100 + maximumValue: 100 + } } } Component.onCompleted: { sortPartOrder() } } diff --git a/package/contents/ui/config/ConfigMouseControl.qml b/package/contents/ui/config/ConfigMouseControl.qml index a2b5441..f461a04 100644 --- a/package/contents/ui/config/ConfigMouseControl.qml +++ b/package/contents/ui/config/ConfigMouseControl.qml @@ -1,195 +1,194 @@ import QtQuick 2.2 import QtQuick.Controls 1.3 import QtQuick.Layouts 1.1 Item { - id: appearancePage property alias cfg_doubleClickMaximizes: doubleClickMaximizes.checked property int cfg_leftClickAction property int cfg_middleClickAction property alias cfg_wheelUpMaximizes: wheelUpMaximizes.checked property int cfg_wheelDownAction onCfg_leftClickActionChanged: { switch (cfg_leftClickAction) { case 1: leftClickActionGroup.current = leftClickExposeRadio; break; case 2: leftClickActionGroup.current = leftClickExposeAllRadio; break; case 3: leftClickActionGroup.current = leftClickExposeClassRadio; break; case 0: default: leftClickActionGroup.current = leftClickDisabledRadio; } } onCfg_middleClickActionChanged: { switch (cfg_middleClickAction) { case 1: middleClickActionGroup.current = middleClickCloseRadio; break; case 2: middleClickActionGroup.current = middleClickFullscreenRadio; break; case 0: default: middleClickActionGroup.current = middleClickDisabledRadio; } } onCfg_wheelDownActionChanged: { switch (cfg_wheelDownAction) { case 1: wheelDownActionGroup.current = wheelDownMinimizesRadio; break; case 2: wheelDownActionGroup.current = wheelDownUnmaximizesRadio; break; case 0: default: wheelDownActionGroup.current = wheelDownDisabledRadio; } } Component.onCompleted: { cfg_leftClickActionChanged() cfg_middleClickActionChanged() cfg_wheelDownActionChanged() } ExclusiveGroup { id: leftClickActionGroup } ExclusiveGroup { id: middleClickActionGroup } ExclusiveGroup { id: wheelDownActionGroup } GridLayout { id: displayPosition columns: 2 Label { text: i18n("Mouse Buttons:") Layout.alignment: Qt.AlignVCenter|Qt.AlignRight } CheckBox { id: doubleClickMaximizes text: i18n("Doubleclick to toggle maximizing") onCheckedChanged: if (checked) leftClickDisabledRadio.checked = true } Item { width: 2 height: 10 Layout.rowSpan: 4 } RadioButton { id: leftClickDisabledRadio exclusiveGroup: leftClickActionGroup text: i18n("Left click disabled") onCheckedChanged: if (checked) cfg_leftClickAction = 0; enabled: !doubleClickMaximizes.checked } RadioButton { id: leftClickExposeRadio exclusiveGroup: leftClickActionGroup text: i18n("Left click to present windows (Current Desktop)") onCheckedChanged: if (checked) cfg_leftClickAction = 1; enabled: !doubleClickMaximizes.checked } RadioButton { id: leftClickExposeAllRadio exclusiveGroup: leftClickActionGroup text: i18n("Left click to present windows (All Desktops)") onCheckedChanged: if (checked) cfg_leftClickAction = 2; enabled: !doubleClickMaximizes.checked } RadioButton { id: leftClickExposeClassRadio exclusiveGroup: leftClickActionGroup text: i18n("Left click to present windows (Window Class)") onCheckedChanged: if (checked) cfg_leftClickAction = 3; enabled: !doubleClickMaximizes.checked } Item { width: 2 height: 10 Layout.columnSpan: 2 } Item { width: 2 height: 2 Layout.rowSpan: 3 } RadioButton { id: middleClickDisabledRadio exclusiveGroup: middleClickActionGroup text: i18n("Middle click disabled") onCheckedChanged: if (checked) cfg_middleClickAction = 0; } RadioButton { id: middleClickCloseRadio exclusiveGroup: middleClickActionGroup text: i18n("Middle click to close active window") onCheckedChanged: if (checked) cfg_middleClickAction = 1; } RadioButton { id: middleClickFullscreenRadio exclusiveGroup: middleClickActionGroup text: i18n("Middle click to toggle fullscreen") onCheckedChanged: if (checked) cfg_middleClickAction = 2; } Item { width: 2 height: 10 Layout.columnSpan: 2 } Label { text: i18n("Mouse Wheel:") Layout.alignment: Qt.AlignVCenter|Qt.AlignRight } CheckBox { id: wheelUpMaximizes text: i18n("Mouse wheel up to maximize") } Item { width: 2 height: 2 Layout.rowSpan: 3 } RadioButton { id: wheelDownDisabledRadio exclusiveGroup: wheelDownActionGroup text: i18n("Mouse wheel down disabled") onCheckedChanged: if (checked) cfg_wheelDownAction = 0; } RadioButton { id: wheelDownMinimizesRadio exclusiveGroup: wheelDownActionGroup text: i18n("Mouse wheel down to minimize") onCheckedChanged: if (checked) cfg_wheelDownAction = 1; } RadioButton { id: wheelDownUnmaximizesRadio exclusiveGroup: wheelDownActionGroup text: i18n("Mouse wheel down to unmaximize") onCheckedChanged: if (checked) cfg_wheelDownAction = 2; } } } diff --git a/package/contents/ui/config/ConfigTitleAndIcon.qml b/package/contents/ui/config/ConfigTitleAndIcon.qml new file mode 100644 index 0000000..0cb9dc0 --- /dev/null +++ b/package/contents/ui/config/ConfigTitleAndIcon.qml @@ -0,0 +1,233 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.3 +import QtQuick.Layouts 1.1 +import org.kde.plasma.core 2.0 as PlasmaCore + +Item { + + property alias cfg_textType: textTypeCombo.currentIndex + property alias cfg_fitText: fitTextCombo.currentIndex + property alias cfg_tooltipTextType: tooltipTextTypeCombo.currentIndex + property alias cfg_useWindowTitleReplace: useWindowTitleReplace.checked + property alias cfg_replaceTextRegex: replaceTextRegex.text + property alias cfg_replaceTextReplacement: replaceTextReplacement.text + property alias cfg_noWindowText: noWindowText.text + property string cfg_noWindowIcon: plasmoid.configuration.noWindowIcon + property alias cfg_limitTextWidth: limitTextWidth.checked + property alias cfg_textWidthLimit: textWidthLimit.value + + property alias cfg_textFontBold: textFontBoldCombo.currentIndex + property string cfg_fontFamily + property alias cfg_fontSizeScale: fontSizeScale.value + + /* copied from /usr/share/plasma/plasmoids/org.kde.plasma.digitalclock/contents/ui/configAppearance.qml */ + onCfg_fontFamilyChanged: { + // HACK by the time we populate our model and/or the ComboBox is finished the value is still undefined + if (cfg_fontFamily) { + for (var i = 0, j = fontsModel.count; i < j; ++i) { + if (fontsModel.get(i).value == cfg_fontFamily) { + fontFamilyComboBox.currentIndex = i + break + } + } + } + } + + ListModel { + id: fontsModel + Component.onCompleted: { + var arr = [ {text: i18nc("Use default font", "Default"), value: ""} ] + Qt.fontFamilies().forEach(function (font) { + arr.push({text: font, value: font}) + }) + append(arr) + cfg_fontFamilyChanged(); + } + } + + GridLayout { + columns: 2 + + Label { + text: i18n('Text') + Layout.alignment: Qt.AlignLeft + font.bold: true + Layout.columnSpan: 2 + } + + Label { + text: i18n('Text type:') + Layout.alignment: Qt.AlignRight + } + ComboBox { + id: textTypeCombo + model: [i18n('Window title'), i18n('Application name')] + } + + Label { + text: i18n('Fit text:') + Layout.alignment: Qt.AlignRight + } + ComboBox { + id: fitTextCombo + model: [i18n('Just elide'), i18n('Fit on hover'), i18n('Always fit')] + } + + Label { + text: i18n('Tooltip text:') + Layout.alignment: Qt.AlignRight + } + ComboBox { + id: tooltipTextTypeCombo + model: [i18n('No tooltip'), i18n('Window title'), i18n('Application name')] + } + + Item { + width: 2 + height: units.largeSpacing + Layout.columnSpan: 2 + } + + Label { + text: i18n('Bold text:') + Layout.alignment: Qt.AlignRight + } + ComboBox { + id: textFontBoldCombo + // ComboBox's sizing is just utterly broken + Layout.minimumWidth: units.gridUnit * 10 + model: [i18n('Never'), i18n('Always'), i18n('When appmenu is displayed')] + } + + Label { + text: i18n('Text font:') + Layout.alignment: Qt.AlignRight + } + ComboBox { + id: fontFamilyComboBox + // ComboBox's sizing is just utterly broken + Layout.minimumWidth: units.gridUnit * 10 + model: fontsModel + // doesn't autodeduce from model because we manually populate it + textRole: "text" + onCurrentIndexChanged: { + var current = model.get(currentIndex) + if (current) { + cfg_fontFamily = current.value + //appearancePage.configurationChanged() + console.log('change: ' + cfg_fontFamily) + } + } + } + + Label { + text: i18n("Font size scale:") + Layout.alignment: Qt.AlignVCenter|Qt.AlignRight + } + SpinBox { + id: fontSizeScale + decimals: 2 + stepSize: 0.05 + minimumValue: 0 + maximumValue: 3 + } + + CheckBox { + id: limitTextWidth + text: i18n('Limit text width') + Layout.alignment: Qt.AlignRight + } + SpinBox { + id: textWidthLimit + decimals: 0 + stepSize: 10 + minimumValue: 0 + maximumValue: 10000 + enabled: limitTextWidth.checked + suffix: i18nc('Abbreviation for pixels', 'px') + } + + Item { + width: 2 + height: units.largeSpacing + Layout.columnSpan: 2 + } + + CheckBox { + id: useWindowTitleReplace + text: '"' + i18n('Window title') + '".replace(/' + Layout.alignment: Qt.AlignRight + } + GridLayout { + columns: 4 + + TextField { + id: replaceTextRegex + placeholderText: '^(.*)\\s+[—–\\-:]\\s+([^—–\\-:]+)$' + Layout.preferredWidth: 300 + onTextChanged: cfg_replaceTextRegex = text + enabled: useWindowTitleReplace.checked + } + + Label { + text: '/, "' + } + + TextField { + id: replaceTextReplacement + placeholderText: '$2 — $1' + Layout.preferredWidth: 100 + onTextChanged: cfg_replaceTextReplacement = text + enabled: useWindowTitleReplace.checked + } + + Label { + text: '");' + } + } + + Label { + text: i18n('No window text:') + Layout.alignment: Qt.AlignRight + } + GridLayout { + columns: 2 + + TextField { + id: noWindowText + placeholderText: 'Plasma Desktop :: %activity%' + onTextChanged: cfg_noWindowText = text + Layout.preferredWidth: 300 + } + + Label { + text: i18n('Use %activity% placeholder to show current activity name.') + Layout.preferredWidth: 200 + wrapMode: Text.Wrap + } + } + + Item { + width: 2 + height: units.largeSpacing + Layout.columnSpan: 2 + } + + Label { + text: i18n('Icon') + Layout.alignment: Qt.AlignLeft + font.bold: true + Layout.columnSpan: 2 + } + + Label { + text: i18n("No window icon:") + Layout.alignment: Qt.AlignRight + } + IconPicker { + currentIcon: cfg_noWindowIcon + defaultIcon: '' + onIconChanged: cfg_noWindowIcon = iconName + } + } +} diff --git a/package/contents/ui/config/OrderableListView.qml b/package/contents/ui/config/OrderableListView.qml index 01b44d7..46493c7 100644 --- a/package/contents/ui/config/OrderableListView.qml +++ b/package/contents/ui/config/OrderableListView.qml @@ -1,87 +1,87 @@ import QtQuick 2.6 import QtQuick.Controls 1.3 import QtQuick.Layouts 1.1 import org.kde.plasma.core 2.0 as PlasmaCore Item { id: mainContent property var model property int orientation property double itemWidth property double itemHeight property bool interactive width: itemWidth * (orientation == ListView.Vertical ? 1 : model.count) height: itemHeight * (orientation == ListView.Horizontal ? 1 : model.count) SystemPalette { id: palette } // theme + svg property bool textColorLight: ((palette.text.r + palette.text.g + palette.text.b) / 3) > 0.5 property string themeName: textColorLight ? 'breeze-dark' : 'default' signal modelOrderChanged() ListView { id: listView anchors.fill: parent model: mainContent.model orientation: mainContent.orientation delegate: OrderableItem { listViewParent: listView.parent Item { height: itemHeight width: itemWidth PlasmaCore.Svg { id: buttonSvg imagePath: Qt.resolvedUrl('../../icons/' + themeName + '/' + model.iconName + '.svg') } // item border Rectangle { border.width: 1 border.color: theme.textColor radius: units.gridUnit / 4 color: 'transparent' opacity: 0.5 anchors.fill: parent } // icon PlasmaCore.SvgItem { id: svgItem anchors.left: parent.left anchors.top: parent.top anchors.bottom: parent.bottom width: parent.width height: width svg: buttonSvg elementId: 'active-idle' visible: !!model.iconName } // text Label { - text: model.text + text: model.text || '' anchors.fill: parent anchors.leftMargin: svgItem.visible ? svgItem.width + units.smallSpacing : 0 visible: !!model.text horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } } onMoveItemRequested: { mainContent.model.move(from, to, 1); mainContent.modelOrderChanged() } } } } diff --git a/package/contents/ui/main.qml b/package/contents/ui/main.qml index 64a7e23..42b228c 100644 --- a/package/contents/ui/main.qml +++ b/package/contents/ui/main.qml @@ -1,676 +1,561 @@ /* * Copyright 2015 Martin Kotelnik * * 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, see . */ import QtQuick 2.2 import QtGraphicalEffects 1.0 import QtQuick.Layouts 1.1 import QtQuick.Window 2.2 import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 2.0 as PlasmaComponents import org.kde.taskmanager 0.1 as TaskManager import org.kde.activities 0.1 as Activities Item { id: main property bool vertical: (plasmoid.formFactor == PlasmaCore.Types.Vertical) property double horizontalScreenWidthPercent: plasmoid.configuration.horizontalScreenWidthPercent -// property double buttonSize: plasmoid.configuration.buttonSize property bool autoFillWidth: plasmoid.configuration.autoFillWidth - property double widthForHorizontalPanel: (Screen.width * horizontalScreenWidthPercent + plasmoid.configuration.widthFineTuning) - ((!buttonsItem.visible && buttonsStandalone && plasmoid.configuration.buttonsDynamicWidth) ? buttonsItem.width : 0) - anchors.fill: parent - Layout.fillWidth: plasmoid.configuration.autoFillWidth - Layout.preferredWidth: autoFillWidth ? -1 : (vertical ? parent.width : (widthForHorizontalPanel > 0 ? widthForHorizontalPanel : 0.0001)) - Layout.minimumWidth: Layout.preferredWidth - Layout.maximumWidth: Layout.preferredWidth - Layout.preferredHeight: parent === null ? 0 : vertical ? Math.min(theme.defaultFont.pointSize * 4, parent.width) : parent.height - Layout.minimumHeight: Layout.preferredHeight - Layout.maximumHeight: Layout.preferredHeight + property double widthForHorizontalPanel: (Screen.width * horizontalScreenWidthPercent + plasmoid.configuration.widthFineTuning) property int textType: plasmoid.configuration.textType - property int fitText: plasmoid.configuration.fitText property int tooltipTextType: plasmoid.configuration.tooltipTextType property string tooltipText: '' - property bool windowIconOnTheRight: plasmoid.configuration.windowIconOnTheRight - property double iconAndTextSpacing: plasmoid.configuration.iconAndTextSpacing - property bool slidingIconAndText: plasmoid.configuration.slidingIconAndText property double fontPixelSize: theme.defaultFont.pixelSize * plasmoid.configuration.fontSizeScale - property bool fontBold: plasmoid.configuration.boldFontWeight - property string fontFamily: plasmoid.configuration.fontFamily property bool noWindowActive: true property bool currentWindowMaximized: false - property bool canShowButtonsAccordingMaximized: showButtonOnlyWhenMaximized ? currentWindowMaximized : true - - property int controlButtonsSpacing: plasmoid.configuration.controlButtonsSpacing - - property int bp: plasmoid.configuration.buttonsPosition; - property bool buttonsVerticalCenter: plasmoid.configuration.buttonsVerticalCenter - property bool showControlButtons: plasmoid.configuration.showControlButtons - property bool showButtonOnlyWhenMaximized: plasmoid.configuration.showButtonOnlyWhenMaximized - property bool showMinimize: showControlButtons && plasmoid.configuration.showMinimize - property bool showMaximize: showControlButtons && plasmoid.configuration.showMaximize - property bool showPinToAllDesktops: showControlButtons && plasmoid.configuration.showPinToAllDesktops - property string buttonOrder: plasmoid.configuration.buttonOrder + property bool doubleClickMaximizes: plasmoid.configuration.doubleClickMaximizes property int leftClickAction: plasmoid.configuration.leftClickAction property string chosenLeftClickSource: leftClickAction === 1 ? shortcutDS.presentWindows : leftClickAction === 2 ? shortcutDS.presentWindowsAll : leftClickAction === 3 ? shortcutDS.presentWindowsClass : '' property bool middleClickClose: plasmoid.configuration.middleClickAction === 1 property bool middleClickFullscreen: plasmoid.configuration.middleClickAction === 2 property bool wheelUpMaximizes: plasmoid.configuration.wheelUpMaximizes property bool wheelDownMinimizes: plasmoid.configuration.wheelDownAction === 1 property bool wheelDownUnmaximizes: plasmoid.configuration.wheelDownAction === 2 - property bool buttonsStandalone: showControlButtons && plasmoid.configuration.buttonsStandalone - property bool buttonsBetweenIconAndText: buttonsStandalone && plasmoid.configuration.buttonsBetweenIconAndText - property bool doNotHideControlButtons: showControlButtons && plasmoid.configuration.doNotHideControlButtons - property bool textColorLight: ((theme.textColor.r + theme.textColor.g + theme.textColor.b) / 3) > 0.5 - property bool mouseHover: false property bool isActiveWindowPinned: false property bool isActiveWindowMaximized: false -// property bool appmenuNextToIconAndText: plasmoid.configuration.appmenuNextToIconAndText -// property double appmenuSideMargin: plasmoid.configuration.appmenuOuterSideMargin -// property bool appmenuSwitchSidesWithIconAndText: plasmoid.configuration.appmenuSwitchSidesWithIconAndText -// property bool appmenuBoldTitleWhenMenuDisplayed: plasmoid.configuration.appmenuBoldTitleWhenMenuDisplayed - property bool controlPartMouseAreaRestrictedToWidget: plasmoid.configuration.controlPartMouseAreaRestrictedToWidget property var activeTaskLocal: null property int activityActionCount: 0 - property bool automaticButtonThemeEnabled: plasmoid.configuration.automaticButtonThemeEnabled - property string manualAuroraeThemePath: plasmoid.configuration.customAuroraeThemePath - property string manualAuroraeThemePathResolved: '' - property string manualAuroraeThemeExtension: 'svg' - property var itemPartOrder: [] + property bool mouseInWidget: mainMouseArea.containsMouse || buttonsItem.mouseInWidget || menuItem.mouseInWidget + + anchors.fill: parent + + Layout.fillWidth: plasmoid.configuration.autoFillWidth + Layout.preferredWidth: autoFillWidth ? -1 : (vertical ? parent.width : (widthForHorizontalPanel > 0 ? widthForHorizontalPanel : 0.0001)) + Layout.minimumWidth: Layout.preferredWidth + Layout.maximumWidth: Layout.preferredWidth + Layout.preferredHeight: parent === null ? 0 : vertical ? Math.min(theme.defaultFont.pointSize * 4, parent.width) : parent.height + Layout.minimumHeight: Layout.preferredHeight + Layout.maximumHeight: Layout.preferredHeight + Plasmoid.preferredRepresentation: Plasmoid.fullRepresentation Plasmoid.status: { if (menuItem.appmenuOpened) { return PlasmaCore.Types.NeedsAttentionStatus; } else if (!menuItem.appmenuOpened && menuItem.appmenuEnabledAndNonEmpty){ return PlasmaCore.Types.ActiveStatus; } else { return PlasmaCore.Types.PassiveStatus; } } // // MODEL // TaskManager.TasksModel { id: tasksModel sortMode: TaskManager.TasksModel.SortVirtualDesktop groupMode: TaskManager.TasksModel.GroupDisabled screenGeometry: plasmoid.screenGeometry filterByScreen: plasmoid.configuration.showForCurrentScreenOnly onActiveTaskChanged: { updateActiveWindowInfo() } onDataChanged: { updateActiveWindowInfo() } onCountChanged: { updateActiveWindowInfo() } } TaskManager.ActivityInfo { id: activityInfo onCurrentActivityChanged: { if (noWindowActive) { updateActiveWindowInfo(); } reAddActivityActions() } onNumberOfRunningActivitiesChanged: { reAddActivityActions() } } Activities.ActivityModel { id: activityModel } function activeTask() { return activeTaskLocal } function activeTaskExists() { return activeTaskLocal.display !== undefined } - onTooltipTextTypeChanged: updateTooltip() - function updateTooltip() { if (tooltipTextType === 1) { tooltipText = replaceTitle(activeTask().display || '') } else if (tooltipTextType === 2) { tooltipText = activeTask().AppName || '' } else { tooltipText = '' } } + onTooltipTextTypeChanged: updateTooltip() + function composeNoWindowText() { return plasmoid.configuration.noWindowText.replace('%activity%', activityInfo.activityName(activityInfo.currentActivity)) } function updateActiveWindowInfo() { var activeTaskIndex = tasksModel.activeTask // fallback for Plasma 5.8 var abstractTasksModel = TaskManager.AbstractTasksModel || {} var isActive = abstractTasksModel.IsActive || 271 var appName = abstractTasksModel.AppName || 258 var isMaximized = abstractTasksModel.IsMaximized || 276 var virtualDesktop = abstractTasksModel.VirtualDesktop || 286 activeTaskLocal = {} if (tasksModel.data(activeTaskIndex, isActive)) { activeTaskLocal = { display: tasksModel.data(activeTaskIndex, Qt.DisplayRole), decoration: tasksModel.data(activeTaskIndex, Qt.DecorationRole), AppName: tasksModel.data(activeTaskIndex, appName), IsMaximized: tasksModel.data(activeTaskIndex, isMaximized), VirtualDesktop: tasksModel.data(activeTaskIndex, virtualDesktop) } } var actTask = activeTask() noWindowActive = !activeTaskExists() currentWindowMaximized = !noWindowActive && actTask.IsMaximized === true isActiveWindowPinned = actTask.VirtualDesktop === -1; if (noWindowActive) { titleItem.text = composeNoWindowText() iconItem.source = plasmoid.configuration.noWindowIcon } else { titleItem.text = (textType === 1 ? actTask.AppName : null) || replaceTitle(actTask.display) iconItem.source = actTask.decoration } updateTooltip() } function toggleMaximized() { tasksModel.requestToggleMaximized(tasksModel.activeTask); } function toggleMinimized() { tasksModel.requestToggleMinimized(tasksModel.activeTask); } function toggleClose() { tasksModel.requestClose(tasksModel.activeTask); } function toggleFullscreen() { tasksModel.requestToggleFullScreen(tasksModel.activeTask); } function togglePinToAllDesktops() { tasksModel.requestVirtualDesktop(tasksModel.activeTask, 0); } function setMaximized(maximized) { if ((maximized && !activeTask().IsMaximized) || (!maximized && activeTask().IsMaximized)) { print('toggle maximized') toggleMaximized() } } function setMinimized() { if (!activeTask().IsMinimized) { toggleMinimized() } } function getConfigName(itemName) { return itemName.substring(0, 1).toUpperCase() + itemName.substring(1) } /* * Position can be: * 0 ... occupy * 1 ... floating layer (second occupy) * 2 ... absolute */ function getPosition(itemName) { var configName = getConfigName(itemName) print('getPosition: ' + configName) print('POS: ' + plasmoid.configuration['controlPart' + configName + 'Position']) return plasmoid.configuration['controlPart' + configName + 'Position'] } function isRelevant(itemName) { var configName = getConfigName(itemName) print('isRelevant: ' + configName) print('1IR: ' + plasmoid.configuration['controlPart' + configName + 'ShowOnMouseIn']) print('2IR: ' + plasmoid.configuration['controlPart' + configName + 'ShowOnMouseOut']) var result = plasmoid.configuration['controlPart' + configName + 'ShowOnMouseIn'] || plasmoid.configuration['controlPart' + configName + 'ShowOnMouseOut'] print('res: ' + result) return result } function getItem(itemName) { if (itemName === 'icon') { return iconItem } if (itemName === 'title') { return titleItem } if (itemName === 'menu') { return menuItem } if (itemName === 'buttons') { return buttonsItem } return null } function getItemWidth(itemName) { return getItem(itemName).width } function getLeftMargin(itemName) { var itemPosition = getPosition(itemName) print('position of ' + itemName + ' is ' + itemPosition) if (itemPosition === 2) { return 0 } var anchorSize = 0 itemPartOrder.some(function (iName, index) { print('iterating: ' + iName) if (iName === itemName) { return true } if (getPosition(iName) === itemPosition && isRelevant(iName)) { var currentItemWidth = getItemWidth(iName) print('width of ' + iName + ' is ' + currentItemWidth) anchorSize += currentItemWidth anchorSize += plasmoid.configuration.controlPartSpacing } }); print('leftMargin of ' + itemName + ' is ' + anchorSize) return anchorSize } function getWidth(itemName) { var itemPosition = getPosition(itemName) print('getWidth(): position of ' + itemName + ' is ' + itemPosition) if (itemPosition === 2) { return 0 } - var computedWidth = main.width + var computedWidth = widthForHorizontalPanel itemPartOrder.forEach(function (iName, index) { print('iterating: ' + iName) if (iName === itemName) { return; } if (getPosition(iName) === itemPosition && isRelevant(iName)) { var currentItemWidth = getItemWidth(iName) print('width of ' + iName + ' is ' + currentItemWidth) computedWidth -= currentItemWidth computedWidth -= plasmoid.configuration.controlPartSpacing } }); print('computedWidth of ' + itemName + ' is ' + computedWidth) return computedWidth } function refreshItemPosition() { - titleItem.width = getWidth('title') - menuItem.width = getWidth('menu') + titleItem.recommendedWidth = getWidth('title') + menuItem.recommendedWidth = getWidth('menu') iconItem.x = getLeftMargin('icon') titleItem.x = getLeftMargin('title') menuItem.x = getLeftMargin('menu') buttonsItem.x = getLeftMargin('buttons') textSeparator.x = getLeftMargin('menu') - (plasmoid.configuration.controlPartSpacing / 2) } function replaceTitle(title) { if (!plasmoid.configuration.useWindowTitleReplace) { return title } return title.replace(new RegExp(plasmoid.configuration.replaceTextRegex), plasmoid.configuration.replaceTextReplacement); } + onWidthForHorizontalPanelChanged: refreshItemPosition() + MouseArea { + id: mainMouseArea + anchors.fill: parent hoverEnabled: true acceptedButtons: Qt.LeftButton | Qt.MiddleButton - onEntered: { - mouseHover = true - buttonsItem.mouseInWidget = showControlButtons && !noWindowActive - } - - onExited: { - mouseHover = false - buttonsItem.mouseInWidget = false - } - onWheel: { if (wheel.angleDelta.y > 0) { if (wheelUpMaximizes) { setMaximized(true) } } else { if (wheelDownMinimizes) { setMinimized() } else if (wheelDownUnmaximizes) { setMaximized(false) } } } onDoubleClicked: { if (doubleClickMaximizes && mouse.button == Qt.LeftButton) { toggleMaximized() } } onClicked: { if (chosenLeftClickSource !== '' && !doubleClickMaximizes && mouse.button == Qt.LeftButton) { shortcutDS.connectedSources.push(chosenLeftClickSource) buttonsItem.mouseInWidget = false return } if (mouse.button == Qt.MiddleButton) { if (middleClickFullscreen) { toggleFullscreen() } else if (middleClickClose) { toggleClose() } } } PlasmaCore.ToolTipArea { anchors.fill: parent active: tooltipTextType > 0 && tooltipText !== '' interactive: true location: plasmoid.location mainItem: Row { spacing: 0 Layout.minimumWidth: fullText.width + units.largeSpacing Layout.minimumHeight: childrenRect.height Layout.maximumWidth: Layout.minimumWidth Layout.maximumHeight: Layout.minimumHeight Item { width: units.largeSpacing / 2 height: 2 } PlasmaComponents.Label { id: fullText text: tooltipText } } } } - property bool mouseInWidget: mouseHover || buttonsItem.mouseInWidget || menuItem.mouseInWidget - ListModel { id: controlButtonsModel } WindowIcon { id: iconItem visible: ((mouseInWidget && plasmoid.configuration.controlPartIconShowOnMouseIn) || (!mouseInWidget && plasmoid.configuration.controlPartIconShowOnMouseOut)) onWidthChanged: refreshItemPosition() } WindowTitle { id: titleItem visible: ((mouseInWidget && plasmoid.configuration.controlPartTitleShowOnMouseIn) || (!mouseInWidget && plasmoid.configuration.controlPartTitleShowOnMouseOut)) } AppMenu { id: menuItem property bool mouseIn: controlPartMouseAreaRestrictedToWidget ? menuItem.mouseInWidget : main.mouseInWidget height: main.height - showItem: ((mouseIn && plasmoid.configuration.controlPartMenuShowOnMouseIn) + showItem: !noWindowActive && ((mouseIn && plasmoid.configuration.controlPartMenuShowOnMouseIn) || (!mouseIn && plasmoid.configuration.controlPartMenuShowOnMouseOut)) } ControlButtons { id: buttonsItem property bool mouseIn: controlPartMouseAreaRestrictedToWidget ? buttonsItem.mouseInWidget : main.mouseInWidget - controlButtonsModel: controlButtonsModel - - showItem: ((mouseIn && plasmoid.configuration.controlPartButtonsShowOnMouseIn) + showItem: !noWindowActive && ((mouseIn && plasmoid.configuration.controlPartButtonsShowOnMouseIn) || (!mouseIn && plasmoid.configuration.controlPartButtonsShowOnMouseOut)) onWidthChanged: refreshItemPosition() } Rectangle { id: textSeparator x: 0 anchors.verticalCenter: main.verticalCenter height: 0.8 * parent.height width: 1 visible: plasmoid.configuration.appmenuSeparatorEnabled && menuItem.showItem color: theme.textColor opacity: 0.4 } - onMouseHoverChanged: { - print('mouse hover changed: ' + mouseHover); - } - - onMouseInWidgetChanged: { - print('mouseInWidget: ' + mouseInWidget); - } - - onManualAuroraeThemePathChanged: { - manualAuroraeThemeExtension = plasmoid.nativeInterface.extensionForTheme(manualAuroraeThemePath); - manualAuroraeThemePathResolved = plasmoid.nativeInterface.translateThemePath(manualAuroraeThemePath); - print('manualAuroraeThemePath=' + manualAuroraeThemePath) - print('manualAuroraeThemePathResolved=' + manualAuroraeThemePathResolved) - print('manualAuroraeThemeExtension=' + manualAuroraeThemeExtension) - } - - function addButton(preparedArray, buttonName) { - if (buttonName === 'close') { - preparedArray.push({ - iconName: 'close', - windowOperation: 'close' - }); - } else if (buttonName === 'maximize' && showMaximize) { - preparedArray.push({ - iconName: 'maximize', - windowOperation: 'toggleMaximized' - }); - } else if (buttonName === 'minimize' && showMinimize) { - preparedArray.push({ - iconName: 'minimize', - windowOperation: 'toggleMinimized' - }); - } else if ((buttonName === 'pin' || buttonName === 'alldesktops') && showPinToAllDesktops) { - preparedArray.push({ - iconName: 'alldesktops', - windowOperation: 'togglePinToAllDesktops' - }); - } - } - - function initializeControlButtonsModel() { - - var preparedArray = [] - buttonOrder.split('|').forEach(function (buttonName) { - addButton(preparedArray, buttonName); - }); - - controlButtonsModel.clear() - - preparedArray.forEach(function (item) { - print('adding item to buttons: ' + item.iconName); - controlButtonsModel.append(item); - }); - } - - function performActiveWindowAction(windowOperation) { - if (bp === 4) { - return; - } - if (windowOperation === 'close') { - toggleClose() - } else if (windowOperation === 'toggleMaximized') { - toggleMaximized() - } else if (windowOperation === 'toggleMinimized') { - toggleMinimized() - } else if (windowOperation === 'togglePinToAllDesktops') { - togglePinToAllDesktops() - } - } - function action_close() { toggleClose() } function action_maximise() { toggleMaximized() } function action_minimise() { toggleMinimized() } function action_pinToAllDesktops() { togglePinToAllDesktops() } function action_reloadTheme() { plasmoid.nativeInterface.refreshAuroraeTheme(); } function actionTriggered(actionName) { if (actionName.indexOf("switchToActivity_") == 0) { var activityIndex = actionName.replace("switchToActivity_", "") var activityId = activityInfo.runningActivities()[activityIndex] activityModel.setCurrentActivity(activityId, function() {}); } } function reAddActivityActions() { plasmoid.removeAction("separator1") for (var i = 0; i < activityActionCount; i++) { plasmoid.removeAction('switchToActivity_' + i) } plasmoid.removeAction("separator2") var runningActivities = activityInfo.runningActivities() activityActionCount = runningActivities.length if (activityActionCount === 0) { return } plasmoid.setActionSeparator("separator1") activityInfo.runningActivities().forEach(function (activityId, index) { if (activityId === activityInfo.currentActivity) { return; } var activityName = activityInfo.activityName(activityId) plasmoid.setAction('switchToActivity_' + index, i18n('Switch to activity: %1', activityName), 'preferences-activities') }) plasmoid.setActionSeparator("separator2") } property string controlPartOrder: plasmoid.configuration.controlPartOrder onControlPartOrderChanged: refreshControlPartOrder() function refreshControlPartOrder() { itemPartOrder.length = 0 plasmoid.configuration.controlPartOrder.split('|').forEach(function (itemName, index) { print('itemOrder: ' + itemName) itemPartOrder.push(itemName) print('itemZ: ' + index) getItem(itemName).z = index }); print('itemPartOrder initialized: ' + itemPartOrder) refreshItemPosition() } Component.onCompleted: { refreshControlPartOrder() refreshItemPosition() - initializeControlButtonsModel() updateActiveWindowInfo() + // actions plasmoid.setAction('close', i18n('Close'), 'window-close'); plasmoid.setAction('maximise', i18n('Toggle Maximise'), 'arrow-up-double'); plasmoid.setAction('minimise', i18n('Minimise'), 'draw-arrow-down'); plasmoid.setAction('pinToAllDesktops', i18n('Toggle Pin To All Desktops'), 'window-pin'); plasmoid.setActionSeparator("separator0") plasmoid.setAction('reloadTheme', i18n('Reload Theme'), 'system-reboot'); reAddActivityActions() } - onShowMaximizeChanged: initializeControlButtonsModel() - onShowMinimizeChanged: initializeControlButtonsModel() - onShowPinToAllDesktopsChanged: initializeControlButtonsModel() - onBpChanged: initializeControlButtonsModel() - onButtonOrderChanged: initializeControlButtonsModel() - PlasmaCore.DataSource { id: shortcutDS engine: 'executable' property string presentWindows: 'qdbus org.kde.kglobalaccel /component/kwin invokeShortcut "Expose"' property string presentWindowsAll: 'qdbus org.kde.kglobalaccel /component/kwin invokeShortcut "ExposeAll"' property string presentWindowsClass: 'qdbus org.kde.kglobalaccel /component/kwin invokeShortcut "ExposeClass"' connectedSources: [] onNewData: { connectedSources.length = 0 } } }