You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
latte-dock/shell/package/contents/configuration/pages/AppearanceConfig.qml

1156 lines
50 KiB
QML

/*
* Copyright 2016 Smith AR <audoban@openmailbox.org>
* Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of Latte-Dock
*
* Latte-Dock 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.
*
* Latte-Dock 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 <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.3
import QtGraphicalEffects 1.0
import QtQuick.Dialogs 1.2
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.plasma.components 3.0 as PlasmaComponents3
import org.kde.latte.core 0.2 as LatteCore
import org.kde.latte.components 1.0 as LatteComponents
import org.kde.latte.private.containment 0.1 as LatteContainment
PlasmaComponents.Page {
Layout.maximumWidth: content.width + content.Layout.leftMargin * 2
Layout.maximumHeight: content.height + units.smallSpacing * 2
Timer {
id: syncGeometry
running: false
repeat: false
interval: 400
onTriggered: viewConfig.syncGeometry()
}
ColumnLayout {
id: content
width: (dialog.appliedWidth - units.smallSpacing * 2) - Layout.leftMargin * 2
spacing: dialog.subGroupSpacing
anchors.horizontalCenter: parent.horizontalCenter
Layout.leftMargin: units.smallSpacing * 2
//! BEGIN: Items
ColumnLayout {
Layout.fillWidth: true
Layout.topMargin: units.smallSpacing
spacing: units.smallSpacing
LatteComponents.Header {
text: i18n("Items")
}
ColumnLayout {
Layout.leftMargin: units.smallSpacing * 2
Layout.rightMargin: units.smallSpacing * 2
spacing: 0
LatteComponents.SubHeader {
text: i18nc("items effects", "Size")
isFirstSubCategory: true
}
RowLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
spacing: units.smallSpacing
enabled: proportionSizeSlider.value === 1
PlasmaComponents.Label {
text: i18nc("absolute size","Absolute")
horizontalAlignment: Text.AlignLeft
}
LatteComponents.Slider {
id: appletsSizeSlider
Layout.fillWidth: true
value: plasmoid.configuration.iconSize
from: 16
to: (latteView.visibility.mode === LatteCore.Types.SidebarOnDemand || latteView.visibility.mode === LatteCore.Types.SidebarAutoHide) ? 512 : 256
stepSize: dialog.advancedLevel || (plasmoid.configuration.iconSize % 8 !== 0) || dialog.viewIsPanel ? 1 : 8
wheelEnabled: false
function updateIconSize() {
if (!pressed) {
plasmoid.configuration.iconSize = value
syncGeometry.restart()
}
}
onPressedChanged: {
updateIconSize()
}
Component.onCompleted: {
valueChanged.connect(updateIconSize);
}
Component.onDestruction: {
valueChanged.disconnect(updateIconSize);
}
}
PlasmaComponents.Label {
text: i18nc("number in pixels, e.g. 12 px.", "%0 px.").arg(appletsSizeSlider.value)
horizontalAlignment: Text.AlignRight
Layout.minimumWidth: theme.mSize(theme.defaultFont).width * 4
Layout.maximumWidth: theme.mSize(theme.defaultFont).width * 4
}
}
RowLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
spacing: units.smallSpacing
visible: dialog.advancedLevel || plasmoid.configuration.proportionIconSize>0
PlasmaComponents.Label {
text: i18nc("relative size", "Relative")
horizontalAlignment: Text.AlignLeft
enabled: proportionSizeSlider.value !== proportionSizeSlider.from
}
LatteComponents.Slider {
id: proportionSizeSlider
Layout.fillWidth: true
value: plasmoid.configuration.proportionIconSize
from: 1.0
to: (latteView.visibility.mode === LatteCore.Types.SidebarOnDemand || latteView.visibility.mode === LatteCore.Types.SidebarAutoHide) ? 25 : 12
stepSize: 0.5
wheelEnabled: false
function updateProportionIconSize() {
if (!pressed) {
if(value===1) {
plasmoid.configuration.proportionIconSize = -1;
} else {
plasmoid.configuration.proportionIconSize = value;
}
}
}
onPressedChanged: {
updateProportionIconSize();
}
Component.onCompleted: {
valueChanged.connect(updateProportionIconSize)
}
Component.onDestruction: {
valueChanged.disconnect(updateProportionIconSize)
}
}
PlasmaComponents.Label {
text: proportionSizeSlider.value !== proportionSizeSlider.from ?
i18nc("number in percentage, e.g. 85 %","%0 %").arg(proportionSizeSlider.value.toFixed(1)) : i18nc("no value in percentage","--- %")
horizontalAlignment: Text.AlignRight
Layout.minimumWidth: theme.mSize(theme.defaultFont).width * 4
Layout.maximumWidth: theme.mSize(theme.defaultFont).width * 4
enabled: proportionSizeSlider.value !== proportionSizeSlider.from
}
}
LatteComponents.SubHeader {
text: i18nc("items effects", "Effects")
//isFirstSubCategory: true
}
RowLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
spacing: units.smallSpacing
enabled: LatteCore.WindowSystem.compositingActive && plasmoid.configuration.animationsEnabled
PlasmaComponents.Label {
text: i18n("Zoom On Hover")
horizontalAlignment: Text.AlignLeft
}
LatteComponents.Slider {
id: zoomSlider
Layout.fillWidth: true
value: Number(1 + plasmoid.configuration.zoomLevel / 20).toFixed(2)
from: 1
to: 2
stepSize: 0.05
wheelEnabled: false
function updateZoomLevel() {
if (!pressed) {
var result = Math.round((value - 1) * 20)
plasmoid.configuration.zoomLevel = result
}
}
onPressedChanged: {
updateZoomLevel()
}
Component.onCompleted: {
valueChanged.connect(updateZoomLevel)
}
Component.onDestruction: {
valueChanged.disconnect(updateZoomLevel)
}
}
PlasmaComponents.Label {
text: i18nc("number in percentage, e.g. 85 %","%0 %").arg(Number((zoomSlider.value * 100) - 100).toFixed(0))
horizontalAlignment: Text.AlignRight
Layout.minimumWidth: theme.mSize(theme.defaultFont).width * 4
Layout.maximumWidth: theme.mSize(theme.defaultFont).width * 4
}
}
}
}
//! END: Items
//! BEGIN: Length
ColumnLayout {
Layout.fillWidth: true
spacing: units.smallSpacing
LatteComponents.Header {
text: i18n("Length")
}
ColumnLayout {
id: lengthColumn
Layout.leftMargin: units.smallSpacing * 2
Layout.rightMargin: units.smallSpacing * 2
spacing: 0
readonly property int labelsMaxWidth: Math.max(maxLengthLbl.implicitWidth,
minLengthLbl.implicitWidth,
offsetLbl.implicitWidth)
RowLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
spacing: units.smallSpacing
PlasmaComponents.Label {
id: maxLengthLbl
Layout.minimumWidth: lengthColumn.labelsMaxWidth
text: i18n("Maximum")
horizontalAlignment: Text.AlignLeft
}
LatteComponents.Slider {
id: maxLengthSlider
Layout.fillWidth: true
value: plasmoid.configuration.maxLength
from: 0
to: 100
stepSize: 1
wheelEnabled: false
readonly property int localMinValue: 1
function updateMaxLength() {
if (!pressed) {
plasmoid.configuration.maxLength = Math.max(value, plasmoid.configuration.minLength, localMinValue);
var newTotal = Math.abs(plasmoid.configuration.offset) + value;
//centered and justify alignments based on offset and get out of the screen in some cases
var centeredCheck = ((plasmoid.configuration.alignment === LatteCore.Types.Center)
|| (plasmoid.configuration.alignment === LatteCore.Types.Justify))
&& ((Math.abs(plasmoid.configuration.offset) + value/2) > 50);
if (newTotal > 100 || centeredCheck) {
if ((plasmoid.configuration.alignment === LatteCore.Types.Center)
|| (plasmoid.configuration.alignment === LatteCore.Types.Justify)) {
var suggestedValue = (plasmoid.configuration.offset<0) ? Math.min(0, -(100-value)): Math.max(0, 100-value);
if ((Math.abs(suggestedValue) + value/2) > 50) {
if (suggestedValue < 0) {
suggestedValue = - (50 - value/2);
} else {
suggestedValue = 50 - value/2;
}
}
plasmoid.configuration.offset = suggestedValue;
} else {
plasmoid.configuration.offset = Math.max(0, 100-value);
}
}
if (plasmoid.configuration.maxLength < plasmoid.configuration.minLength) {
minLengthSlider.updateMinLength();
}
} else {
if ((value < plasmoid.configuration.minLength) || (value < localMinValue)) {
value = Math.max(plasmoid.configuration.minLength, localMinValue);
}
}
}
onPressedChanged: {
updateMaxLength();
}
Component.onCompleted: {
valueChanged.connect(updateMaxLength)
}
Component.onDestruction: {
valueChanged.disconnect(updateMaxLength)
}
}
PlasmaComponents.Label {
text: i18nc("number in percentage, e.g. 85 %","%0 %").arg(maxLengthSlider.value)
horizontalAlignment: Text.AlignRight
Layout.minimumWidth: theme.mSize(theme.defaultFont).width * 4
Layout.maximumWidth: theme.mSize(theme.defaultFont).width * 4
LatteComponents.ScrollArea {
anchors.fill: parent
delayIsEnabled: false
readonly property real smallStep: 0.1
onScrolledUp: {
var ctrlModifier = (wheel.modifiers & Qt.ControlModifier);
if (ctrlModifier) {
plasmoid.configuration.maxLength = plasmoid.configuration.maxLength + smallStep;
}
}
onScrolledDown: {
var ctrlModifier = (wheel.modifiers & Qt.ControlModifier);
if (ctrlModifier) {
plasmoid.configuration.maxLength = plasmoid.configuration.maxLength - smallStep;
}
}
onClicked: {
plasmoid.configuration.maxLength = Math.round(plasmoid.configuration.maxLength);
}
}
}
}
RowLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
spacing: units.smallSpacing
visible: dialog.advancedLevel
enabled: (plasmoid.configuration.alignment !== LatteCore.Types.Justify)
PlasmaComponents.Label {
id: minLengthLbl
Layout.minimumWidth: lengthColumn.labelsMaxWidth
text: i18n("Minimum")
horizontalAlignment: Text.AlignLeft
}
LatteComponents.Slider {
id: minLengthSlider
Layout.fillWidth: true
value: plasmoid.configuration.minLength
from: 0
to: 100
stepSize: 1
wheelEnabled: false
function updateMinLength() {
if (!pressed) {
plasmoid.configuration.minLength = value; //Math.min(value, plasmoid.configuration.maxLength);
if (plasmoid.configuration.minLength > maxLengthSlider.value) {
maxLengthSlider.updateMaxLength();
}
} else {
if (value > plasmoid.configuration.maxLength) {
value = plasmoid.configuration.maxLength
}
}
}
onPressedChanged: {
updateMinLength();
}
Component.onCompleted: {
valueChanged.connect(updateMinLength)
}
Component.onDestruction: {
valueChanged.disconnect(updateMinLength)
}
}
PlasmaComponents.Label {
text: i18nc("number in percentage, e.g. 85 %","%0 %").arg(minLengthSlider.value)
horizontalAlignment: Text.AlignRight
Layout.minimumWidth: theme.mSize(theme.defaultFont).width * 4
Layout.maximumWidth: theme.mSize(theme.defaultFont).width * 4
LatteComponents.ScrollArea {
anchors.fill: parent
delayIsEnabled: false
readonly property real smallStep: 0.1
onScrolledUp: {
var ctrlModifier = (wheel.modifiers & Qt.ControlModifier);
if (ctrlModifier) {
plasmoid.configuration.minLength = plasmoid.configuration.minLength + smallStep;
}
}
onScrolledDown: {
var ctrlModifier = (wheel.modifiers & Qt.ControlModifier);
if (ctrlModifier) {
plasmoid.configuration.minLength = plasmoid.configuration.minLength - smallStep;
}
}
onClicked: {
plasmoid.configuration.minLength = Math.round(plasmoid.configuration.minLength);
}
}
}
}
RowLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
spacing: units.smallSpacing
visible: dialog.advancedLevel
enabled: offsetSlider.to > offsetSlider.from
PlasmaComponents.Label {
id: offsetLbl
Layout.minimumWidth: lengthColumn.labelsMaxWidth
text: i18n("Offset")
horizontalAlignment: Text.AlignLeft
}
LatteComponents.Slider {
id: offsetSlider
Layout.fillWidth: true
stepSize: 1
wheelEnabled: false
readonly property int screenLengthMaxFactor: (100 - plasmoid.configuration.maxLength) / 2
//! Bindings are needed because from/to/value(s) are updated when PrimaryConfigView updates
//! its ParentView property. During that change these values must be recalculated only when
//! their final/new View properties are available; otherwise when changing from Center alignments
//! to Left or Right might alter the true Offset of the newly shown View
Binding {
target: offsetSlider
property: "value"
when: viewConfig.isReady
value: plasmoid.configuration.offset
}
Binding {
target: offsetSlider
property: "from"
when: viewConfig.isReady
value: ((plasmoid.configuration.alignment === LatteCore.Types.Center)
|| (plasmoid.configuration.alignment === LatteCore.Types.Justify)) ? -offsetSlider.screenLengthMaxFactor : 0
}
Binding {
target: offsetSlider
property: "to"
when: viewConfig.isReady
value: ((plasmoid.configuration.alignment === LatteCore.Types.Center)
|| (plasmoid.configuration.alignment === LatteCore.Types.Justify)) ? offsetSlider.screenLengthMaxFactor : 2*offsetSlider.screenLengthMaxFactor
}
function updateOffset() {
if (!pressed) {
plasmoid.configuration.offset = value;
var newTotal = Math.abs(value) + plasmoid.configuration.maxLength;
//centered and justify alignments based on offset and get out of the screen in some cases
var centeredCheck = ((plasmoid.configuration.alignment === LatteCore.Types.Center)
|| (plasmoid.configuration.alignment === LatteCore.Types.Justify))
&& ((Math.abs(value) + plasmoid.configuration.maxLength/2) > 50);
if (newTotal > 100 || centeredCheck) {
plasmoid.configuration.maxLength = ((plasmoid.configuration.alignment === LatteCore.Types.Center)
|| (plasmoid.configuration.alignment === LatteCore.Types.Justify)) ?
2*(50 - Math.abs(value)) :100 - Math.abs(value);
}
}
}
onPressedChanged: {
updateOffset();
}
Component.onCompleted: {
valueChanged.connect(updateOffset);
}
Component.onDestruction: {
valueChanged.disconnect(updateOffset);
}
}
PlasmaComponents.Label {
text: i18nc("number in percentage, e.g. 85 %","%0 %").arg(offsetSlider.value)
horizontalAlignment: Text.AlignRight
Layout.minimumWidth: theme.mSize(theme.defaultFont).width * 4
Layout.maximumWidth: theme.mSize(theme.defaultFont).width * 4
LatteComponents.ScrollArea {
anchors.fill: parent
delayIsEnabled: false
readonly property real smallStep: 0.1
onScrolledUp: {
var ctrlModifier = (wheel.modifiers & Qt.ControlModifier);
if (ctrlModifier) {
plasmoid.configuration.offset= plasmoid.configuration.offset + smallStep;
}
}
onScrolledDown: {
var ctrlModifier = (wheel.modifiers & Qt.ControlModifier);
if (ctrlModifier) {
plasmoid.configuration.offset = plasmoid.configuration.offset - smallStep;
}
}
onClicked: {
plasmoid.configuration.offset = Math.round(plasmoid.configuration.offset);
}
}
}
}
}
}
//! END: Length
//! BEGIN: Margins
ColumnLayout {
id: marginsColumn
Layout.fillWidth: true
spacing: units.smallSpacing
visible: dialog.advancedLevel
readonly property int maxMargin: 25
LatteComponents.Header {
text: i18n("Margins")
}
ColumnLayout{
Layout.leftMargin: units.smallSpacing * 2
Layout.rightMargin: units.smallSpacing * 2
spacing: 0
RowLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
spacing: units.smallSpacing
PlasmaComponents.Label {
text: i18n("Length")
horizontalAlignment: Text.AlignLeft
}
LatteComponents.Slider {
id: lengthExtMarginSlider
Layout.fillWidth: true
value: plasmoid.configuration.lengthExtMargin
from: 0
to: marginsColumn.maxMargin
stepSize: 1
wheelEnabled: false
onPressedChanged: {
if (!pressed) {
plasmoid.configuration.lengthExtMargin = value;
}
}
}
PlasmaComponents.Label {
text: i18nc("number in percentage, e.g. 85 %","%0 %").arg(lengthExtMarginSlider.value)
horizontalAlignment: Text.AlignRight
Layout.minimumWidth: theme.mSize(theme.defaultFont).width * 4
Layout.maximumWidth: theme.mSize(theme.defaultFont).width * 4
}
}
LatteComponents.HeaderSwitch {
id: shrinkThickMargins
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
Layout.minimumHeight: implicitHeight
Layout.bottomMargin: units.smallSpacing
checked: !plasmoid.configuration.shrinkThickMargins
level: 2
text: i18n("Thickness")
tooltip: i18n("Enable/disable thickness margins")
isFirstSubCategory: true
onPressed: {
plasmoid.configuration.shrinkThickMargins = !plasmoid.configuration.shrinkThickMargins;
}
}
RowLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
spacing: units.smallSpacing
enabled: !plasmoid.configuration.shrinkThickMargins
PlasmaComponents.Label {
text: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? i18n("Height") : i18n("Width")
horizontalAlignment: Text.AlignLeft
}
LatteComponents.Slider {
id: thickMarginSlider
Layout.fillWidth: true
value: plasmoid.configuration.thickMargin
from: 0
to: 60
stepSize: 1
wheelEnabled: false
minimumInternalValue: latteView.indicator.info.minThicknessPadding * 100
onPressedChanged: {
if (!pressed) {
plasmoid.configuration.thickMargin = value;
}
}
}
PlasmaComponents.Label {
text: i18nc("number in percentage, e.g. 85 %","%0 %").arg(currentValue)
horizontalAlignment: Text.AlignRight
Layout.minimumWidth: theme.mSize(theme.defaultFont).width * 4
Layout.maximumWidth: theme.mSize(theme.defaultFont).width * 4
readonly property int currentValue: Math.max(thickMarginSlider.minimumInternalValue, thickMarginSlider.value)
}
}
RowLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
spacing: units.smallSpacing
enabled: !plasmoid.configuration.shrinkThickMargins
PlasmaComponents.Label {
text: i18n("Screen")
horizontalAlignment: Text.AlignLeft
}
LatteComponents.Slider {
id: screenEdgeMarginSlider
Layout.fillWidth: true
value: plasmoid.configuration.screenEdgeMargin
from: -1
to: 256
stepSize: 1
wheelEnabled: false
onPressedChanged: {
if (!pressed) {
plasmoid.configuration.screenEdgeMargin = value;
}
}
}
PlasmaComponents.Label {
text: currentValue < 0 ? "---" : i18nc("number in pixels, e.g. 85 px.","%0 px.").arg(currentValue)
horizontalAlignment: Text.AlignRight
Layout.minimumWidth: theme.mSize(theme.defaultFont).width * 4
Layout.maximumWidth: theme.mSize(theme.defaultFont).width * 4
readonly property int currentValue: screenEdgeMarginSlider.value
}
}
}
}
//! END: Margins
//! BEGIN: Colors
ColumnLayout {
spacing: units.smallSpacing
visible: dialog.advancedLevel
LatteComponents.Header {
Layout.columnSpan: 4
text: i18n("Colors")
}
GridLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
Layout.leftMargin: units.smallSpacing * 2
Layout.rightMargin: units.smallSpacing * 2
columnSpacing: 2
rowSpacing: units.smallSpacing
columns: 3
property int themeColors: plasmoid.configuration.themeColors
property int windowColors: plasmoid.configuration.windowColors
readonly property int buttonSize: (dialog.optionsWidth - (columnSpacing*2)) / 3
ExclusiveGroup {
id: themeColorsGroup
onCurrentChanged: {
if (current.checked) {
plasmoid.configuration.themeColors = current.colors;
}
}
}
ExclusiveGroup {
id: windowColorsGroup
onCurrentChanged: {
if (current.checked) {
plasmoid.configuration.windowColors = current.colors;
}
}
}
LatteComponents.SubHeader {
Layout.columnSpan: 3
isFirstSubCategory: true
text: i18n("Theme")
}
PlasmaComponents.Button {
Layout.minimumWidth: parent.buttonSize
Layout.maximumWidth: Layout.minimumWidth
text: i18n("Plasma")
checked: parent.themeColors === colors
checkable: true
exclusiveGroup: themeColorsGroup
tooltip: i18n("Plasma theme color palette is going to be used")
readonly property int colors: LatteContainment.Types.PlasmaThemeColors
}
PlasmaComponents.Button {
Layout.minimumWidth: parent.buttonSize
Layout.maximumWidth: Layout.minimumWidth
text: i18n("Reverse")
checked: parent.themeColors === colors
checkable: true
exclusiveGroup: themeColorsGroup
tooltip: i18n("Reverse color palette from plasma theme is going to be used")
readonly property int colors: LatteContainment.Types.ReverseThemeColors
}
PlasmaComponents.Button {
Layout.minimumWidth: parent.buttonSize
Layout.maximumWidth: Layout.minimumWidth
text: i18n("Smart")
checked: parent.themeColors === colors
checkable: true
exclusiveGroup: themeColorsGroup
tooltip: i18n("Smart color palette is going to provide best contrast after taking into account the environment such as the underlying background")
readonly property int colors: LatteContainment.Types.SmartThemeColors
}
LatteComponents.SubHeader {
Layout.columnSpan: 3
text: i18n("From Window")
}
PlasmaComponents.Button {
Layout.minimumWidth: parent.buttonSize
Layout.maximumWidth: Layout.minimumWidth
text: i18n("None")
checked: parent.windowColors === colors
checkable: true
exclusiveGroup: windowColorsGroup
tooltip: i18n("Colors are not going to be based on any window")
readonly property int colors: LatteContainment.Types.NoneWindowColors
}
PlasmaComponents.Button {
Layout.minimumWidth: parent.buttonSize
Layout.maximumWidth: Layout.minimumWidth
text: i18n("Active")
checked: parent.windowColors === colors
checkable: true
exclusiveGroup: windowColorsGroup
tooltip: universalSettings.colorsScriptIsPresent ?
i18n("Colors are going to be based on the active window") :
i18n("Colors are going to be based on the active window.\nNotice: For optimal experience you are advised to install Colors KWin Script from KDE Store")
readonly property int colors: LatteContainment.Types.ActiveWindowColors
PlasmaCore.IconItem {
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
width: height
height: parent.height
source: "state-warning"
visible: !universalSettings.colorsScriptIsPresent
}
}
PlasmaComponents.Button {
Layout.minimumWidth: parent.buttonSize
Layout.maximumWidth: Layout.minimumWidth
text: i18n("Touching")
checked: parent.windowColors === colors
checkable: true
exclusiveGroup: windowColorsGroup
tooltip: universalSettings.colorsScriptIsPresent ?
i18n("Colors are going to be based on windows that are touching the view") :
i18n("Colors are going to be based on windows that are touching the view.\nNotice: For optimal experience you are advised to install Colors KWin Script from KDE Store")
readonly property int colors: LatteContainment.Types.TouchingWindowColors
PlasmaCore.IconItem {
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
width: height
height: parent.height
source: "state-warning"
visible: !universalSettings.colorsScriptIsPresent
}
}
}
}
//! END: Colors
//! BEGIN: Background
ColumnLayout {
Layout.fillWidth: true
spacing: units.smallSpacing
LatteComponents.HeaderSwitch {
id: showBackground
Layout.minimumWidth: dialog.optionsWidth + 2 *units.smallSpacing
Layout.maximumWidth: Layout.minimumWidth
Layout.minimumHeight: implicitHeight
Layout.bottomMargin: units.smallSpacing
enabled: LatteCore.WindowSystem.compositingActive
checked: plasmoid.configuration.useThemePanel
text: i18n("Background")
tooltip: i18n("Enable/disable background")
onPressed: {
plasmoid.configuration.useThemePanel = !plasmoid.configuration.useThemePanel;
}
}
ColumnLayout {
Layout.leftMargin: units.smallSpacing * 2
Layout.rightMargin: units.smallSpacing * 2
spacing: 0
RowLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
enabled: LatteCore.WindowSystem.compositingActive
PlasmaComponents.Label {
enabled: showBackground.checked
text: i18n("Size")
horizontalAlignment: Text.AlignLeft
}
LatteComponents.Slider {
id: panelSizeSlider
Layout.fillWidth: true
enabled: showBackground.checked
value: plasmoid.configuration.panelSize
from: 0
to: 100
stepSize: 1
wheelEnabled: false
function updatePanelSize() {
if (!pressed)
plasmoid.configuration.panelSize = value
}
onPressedChanged: {
updatePanelSize();
}
Component.onCompleted: {
valueChanged.connect(updatePanelSize)
}
Component.onDestruction: {
valueChanged.disconnect(updatePanelSize)
}
}
PlasmaComponents.Label {
enabled: showBackground.checked
text: i18nc("number in percentage, e.g. 85 %","%0 %").arg(panelSizeSlider.value)
horizontalAlignment: Text.AlignRight
Layout.minimumWidth: theme.mSize(theme.defaultFont).width * 4
Layout.maximumWidth: theme.mSize(theme.defaultFont).width * 4
}
}
RowLayout {
Layout.minimumWidth: dialog.optionsWidth
Layout.maximumWidth: Layout.minimumWidth
enabled: LatteCore.WindowSystem.compositingActive
PlasmaComponents.Label {
text: plasmoid.configuration.backgroundOnlyOnMaximized && plasmoid.configuration.solidBackgroundForMaximized ?
i18nc("opacity when desktop background is busy from contrast point of view","Busy Opacity") : i18n("Opacity")
horizontalAlignment: Text.AlignLeft
enabled: transparencySlider.enabled
}
LatteComponents.Slider {
id: transparencySlider
Layout.fillWidth: true
enabled: showBackground.checked //&& !blockOpacityAdjustment
value: plasmoid.configuration.panelTransparency
from: 0
to: 100
stepSize: 1
wheelEnabled: false
/*property bool blockOpacityAdjustment: (plasmoid.configuration.solidBackgroundForMaximized && plasmoid.configuration.backgroundOnlyOnMaximized)
|| (solidBackground.checked
&& !plasmoid.configuration.solidBackgroundForMaximized
&& !plasmoid.configuration.backgroundOnlyOnMaximized)*/
function updatePanelTransparency() {
if (!pressed)
plasmoid.configuration.panelTransparency = value
}
onPressedChanged: {
updatePanelTransparency();
}
Component.onCompleted: {
valueChanged.connect(updatePanelTransparency);
}
Component.onDestruction: {
valueChanged.disconnect(updatePanelTransparency);
}
}
PlasmaComponents.Label {
enabled: transparencySlider.enabled
text: i18nc("number in percentage, e.g. 85 %","%0 %").arg(transparencySlider.value)
horizontalAlignment: Text.AlignRight
Layout.minimumWidth: theme.mSize(theme.defaultFont).width * 4
Layout.maximumWidth: theme.mSize(theme.defaultFont).width * 4
}
}
LatteComponents.SubHeader {
visible: dialog.advancedLevel
isFirstSubCategory: true
text: i18n("Options")
}
RowLayout {
Layout.fillWidth: true
spacing: 2
visible: dialog.advancedLevel
readonly property int buttonSize: (dialog.optionsWidth - (spacing * (children.length-1))) / children.length
PlasmaComponents.Button {
id: panelBlur
Layout.minimumWidth: parent.buttonSize
Layout.maximumWidth: Layout.minimumWidth
text: i18n("Blur")
checked: plasmoid.configuration.blurEnabled
checkable: true
enabled: showBackground.checked && LatteCore.WindowSystem.compositingActive
tooltip: i18n("Background is blurred underneath")
onClicked: {
plasmoid.configuration.blurEnabled = checked
}
}
PlasmaComponents.Button {
id: panelShadows
Layout.minimumWidth: parent.buttonSize
Layout.maximumWidth: Layout.minimumWidth
text: i18n("Shadows")
checked: plasmoid.configuration.panelShadows
checkable: true
enabled: showBackground.checked && LatteCore.WindowSystem.compositingActive && themeExtended.hasShadow
tooltip: i18n("Background shows its shadows")
onClicked: {
plasmoid.configuration.panelShadows = checked
}
}
PlasmaComponents.Button {
id: solidBackground
Layout.minimumWidth: parent.buttonSize
Layout.maximumWidth: Layout.minimumWidth
text: i18n("Outline")
checked: plasmoid.configuration.panelOutline
checkable: true
enabled: showBackground.checked
tooltip: i18n("Background draws a line for its borders. You can set the line size from Latte Preferences")
onClicked: {
plasmoid.configuration.panelOutline = !plasmoid.configuration.panelOutline;
}
}
PlasmaComponents.Button {
id: allCorners
Layout.minimumWidth: parent.buttonSize
Layout.maximumWidth: Layout.minimumWidth
text: i18n("All Corners")
checked: plasmoid.configuration.backgroundAllCorners
checkable: true
enabled: showBackground.checked
&& ((plasmoid.configuration.screenEdgeMargin===-1) /*no-floating*/
|| (plasmoid.configuration.screenEdgeMargin > -1 /*floating with justify alignment and 100% maxlength*/
&& plasmoid.configuration.alignment ===LatteCore.Types.Justify
&& plasmoid.configuration.maxLength===100))
tooltip: i18n("Background draws all corners at all cases.")
onClicked: {
plasmoid.configuration.backgroundAllCorners = !plasmoid.configuration.backgroundAllCorners;
}
}
}
LatteComponents.SubHeader {
visible: dialog.advancedLevel
text: i18nc("dynamic visibility for background", "Dynamic Visibility")
enabled: LatteCore.WindowSystem.compositingActive
}
LatteComponents.CheckBoxesColumn {
enabled: LatteCore.WindowSystem.compositingActive
LatteComponents.CheckBox {
id: solidForMaximizedChk
Layout.maximumWidth: dialog.optionsWidth
text: i18n("Prefer opaque background when touching any window")
checked: plasmoid.configuration.solidBackgroundForMaximized
tooltip: i18n("Background removes its transparency setting when a window is touching")
enabled: showBackground.checked
visible: dialog.advancedLevel
onClicked: {
plasmoid.configuration.solidBackgroundForMaximized = checked;
}
}
LatteComponents.CheckBox {
id: onlyOnMaximizedChk
Layout.maximumWidth: dialog.optionsWidth
text: i18n("Hide background when not needed")
checked: plasmoid.configuration.backgroundOnlyOnMaximized
tooltip: i18n("Background becomes hidden except when a window is touching or the desktop background is busy")
enabled: showBackground.checked
visible: dialog.advancedLevel
onClicked: {
plasmoid.configuration.backgroundOnlyOnMaximized = checked;
}
}
LatteComponents.CheckBox {
id: hideShadowsOnMaximizedChk
Layout.maximumWidth: dialog.optionsWidth
text: i18n("Hide background shadow for maximized windows")
checked: plasmoid.configuration.disablePanelShadowForMaximized
tooltip: i18n("Background shadows become hidden when an active maximized window is touching the view")
enabled: showBackground.checked
visible: dialog.advancedLevel
onClicked: {
plasmoid.configuration.disablePanelShadowForMaximized = checked;
}
}
}
LatteComponents.SubHeader {
visible: dialog.advancedLevel
text: i18n("Exceptions")
enabled: LatteCore.WindowSystem.compositingActive
}
LatteComponents.CheckBox {
id: solidForPopupsChk
Layout.maximumWidth: dialog.optionsWidth
text: i18n("Prefer Plasma background and colors for expanded applets")
checked: plasmoid.configuration.plasmaBackgroundForPopups
tooltip: i18n("Background becomes opaque in plasma style when applets are expanded")
enabled: showBackground.checked
visible: dialog.advancedLevel
onClicked: {
plasmoid.configuration.plasmaBackgroundForPopups = checked;
}
}
}
}
//! END: Background
}
}