8 Commits

5 changed files with 636 additions and 38 deletions
+14
View File
@@ -4,6 +4,8 @@ NowPlaying is a KDE Plasma 6 widget inspired by the Cleartext Rainmeter widget.
Now on KDE 6: https://www.pling.com/p/2195583/ Now on KDE 6: https://www.pling.com/p/2195583/
> Too little too late but I plan to update it regularly now if any issues are created - ruinivist
## Prerequisites ## Prerequisites
You need the basic KDE and Qt 6 tools for Plasma widget development. You need the basic KDE and Qt 6 tools for Plasma widget development.
@@ -90,6 +92,18 @@ Enable the repository pre-commit hook:
make hooks-install make hooks-install
``` ```
## Customization
The widget appearance can be tuned from the Plasma widget settings, including:
- custom multiline label text
- independent label, title, and artist font sizes
- title/artist vertical spacing
- NOW/PLAYING label vertical spacing
- separator gap from labels
- separator gap from track text
- separator height percentage
## Release Upload ## Release Upload
Required GitHub repository secrets: Required GitHub repository secrets:
+65
View File
@@ -13,5 +13,70 @@
<label>Font family</label> <label>Font family</label>
<default>Noto Sans</default> <default>Noto Sans</default>
</entry> </entry>
<entry name="labelFontSize" type="Int">
<label>Now Playing label font size</label>
<default>16</default>
</entry>
<entry name="titleFontSize" type="Int">
<label>Track title font size</label>
<default>28</default>
</entry>
<entry name="artistFontSize" type="Int">
<label>Track artist font size</label>
<default>26</default>
</entry>
<entry name="labelVisibilityMode" type="String">
<label>Now Playing label visibility mode</label>
<default>auto</default>
</entry>
<entry name="labelPlacement" type="String">
<label>Now Playing label placement</label>
<default>left</default>
</entry>
<entry name="labelText" type="String">
<label>Now Playing label text</label>
<default><![CDATA[NOW
PLAYING]]></default>
</entry>
<entry name="backgroundStyle" type="String">
<label>Background style</label>
<default>custom</default>
</entry>
<entry name="backgroundColor" type="String">
<label>Background color</label>
<default>transparent</default>
</entry>
<entry name="backgroundRadius" type="Int">
<label>Background radius</label>
<default>0</default>
</entry>
<entry name="foregroundColor" type="String">
<label>Foreground color</label>
<default>white</default>
</entry>
<entry name="textShadowEnabled" type="Bool">
<label>Enable text shadow</label>
<default>false</default>
</entry>
<entry name="trackTextVerticalSpacing" type="Int">
<label>Track text vertical spacing</label>
<default>5</default>
</entry>
<entry name="labelVerticalSpacing" type="Int">
<label>Now Playing label vertical spacing</label>
<default>0</default>
</entry>
<entry name="separatorGapLabel" type="Int">
<label>Separator gap from label rail</label>
<default>4</default>
</entry>
<entry name="separatorGapTrack" type="Int">
<label>Separator gap from track text</label>
<default>4</default>
</entry>
<entry name="separatorHeight" type="Int">
<label>Separator height percent</label>
<default>90</default>
</entry>
</group> </group>
</kcfg> </kcfg>
+182 -38
View File
@@ -7,10 +7,64 @@ import org.kde.plasma.components as PlasmaComponents
MouseArea { MouseArea {
id: mediaControlsMouseArea id: mediaControlsMouseArea
property string configuredFontFamily: "Noto Sans"
property int configuredLabelFontSize: 16
property int configuredTitleFontSize: 28
property int configuredArtistFontSize: 26
property string configuredLabelVisibilityMode: "auto"
property string configuredLabelPlacement: "left"
property string configuredLabelText: "NOW\nPLAYING"
property string configuredBackgroundStyle: "custom"
property string configuredBackgroundColor: "transparent"
property int configuredBackgroundRadius: 0
property string configuredForegroundColor: "white"
property bool configuredTextShadowEnabled: false
property int configuredTrackTextVerticalSpacing: 5
property int configuredLabelVerticalSpacing: 0
property int configuredSeparatorGapLabel: 4
property int configuredSeparatorGapTrack: 4
property int configuredSeparatorHeight: 90
readonly property double buttonSize: 16 readonly property double buttonSize: 16
readonly property string effectiveLabelVisibilityMode: configuredLabelVisibilityMode === "always" || configuredLabelVisibilityMode === "never" ? configuredLabelVisibilityMode : "auto"
readonly property bool labelsOnRight: configuredLabelPlacement === "right"
readonly property bool hideNowPlayingArea: effectiveLabelVisibilityMode === "never"
readonly property bool usesCustomBackground: configuredBackgroundStyle === "custom"
readonly property int hideModeHorizontalPadding: 8
readonly property int labelRailWidth: 100
readonly property string effectiveBackgroundColor: configuredBackgroundColor || "transparent"
readonly property int effectiveBackgroundRadius: Math.max(0, configuredBackgroundRadius)
readonly property string effectiveForegroundColor: configuredForegroundColor || "white"
readonly property int effectiveLabelFontSize: Math.max(1, configuredLabelFontSize)
readonly property int effectiveTitleFontSize: Math.max(1, configuredTitleFontSize)
readonly property int effectiveArtistFontSize: Math.max(1, configuredArtistFontSize)
readonly property int effectiveTrackTextVerticalSpacing: configuredTrackTextVerticalSpacing
readonly property int effectiveLabelVerticalSpacing: configuredLabelVerticalSpacing
readonly property int effectiveSeparatorGapLabel: Math.max(0, configuredSeparatorGapLabel)
readonly property int effectiveSeparatorGapTrack: Math.max(0, configuredSeparatorGapTrack)
readonly property int effectiveSeparatorHeight: Math.max(0, Math.min(100, configuredSeparatorHeight))
readonly property var effectiveLabelLines: (configuredLabelText || "").split(/\r?\n/)
readonly property bool hasTrackInfo: player.ready && (((player.title || "").trim().length > 0) || ((player.artists || "").trim().length > 0))
readonly property bool rawHoverActive: rootHoverHandler.hovered
readonly property bool controlsHoverActive: rawHoverActive || hoverExitTimer.running
readonly property bool nowPlayingLabelsVisible: {
if (effectiveLabelVisibilityMode === "always")
return true;
if (effectiveLabelVisibilityMode === "never")
return false;
return hasTrackInfo;
}
focus: true focus: true
acceptedButtons: Qt.NoButton
hoverEnabled: true hoverEnabled: true
onRawHoverActiveChanged: {
if (rawHoverActive)
hoverExitTimer.stop();
else
hoverExitTimer.restart();
}
Keys.onPressed: (event) => { Keys.onPressed: (event) => {
if (!event.modifiers) { if (!event.modifiers) {
event.accepted = true; event.accepted = true;
@@ -25,17 +79,41 @@ MouseArea {
} }
} }
HoverHandler {
id: rootHoverHandler
margin: 12
}
Timer {
id: hoverExitTimer
interval: 300
}
Rectangle {
anchors.fill: parent
visible: mediaControlsMouseArea.usesCustomBackground
color: mediaControlsMouseArea.effectiveBackgroundColor
radius: mediaControlsMouseArea.effectiveBackgroundRadius
}
RowLayout { RowLayout {
anchors.fill: parent anchors.fill: parent
layoutDirection: mediaControlsMouseArea.labelsOnRight ? Qt.RightToLeft : Qt.LeftToRight
ColumnLayout { ColumnLayout {
id: leftColumn id: leftColumn
visible: !mediaControlsMouseArea.hideNowPlayingArea
Layout.fillHeight: true Layout.fillHeight: true
Layout.minimumWidth: visible ? mediaControlsMouseArea.labelRailWidth : 0
Layout.preferredWidth: visible ? mediaControlsMouseArea.labelRailWidth : 0
Layout.maximumWidth: visible ? mediaControlsMouseArea.labelRailWidth : 0
states: [ states: [
State { State {
name: "buttonsVisible" name: "buttonsVisible"
when: mediaControlsMouseArea.containsMouse when: mediaControlsMouseArea.controlsHoverActive
PropertyChanges { PropertyChanges {
target: nowPlayingLabels target: nowPlayingLabels
@@ -45,7 +123,7 @@ MouseArea {
}, },
State { State {
name: "buttonsHidden" name: "buttonsHidden"
when: !mediaControlsMouseArea.containsMouse when: !mediaControlsMouseArea.controlsHoverActive
PropertyChanges { PropertyChanges {
target: nowPlayingLabels target: nowPlayingLabels
@@ -63,29 +141,29 @@ MouseArea {
ColumnLayout { ColumnLayout {
id: nowPlayingLabels id: nowPlayingLabels
Layout.alignment: Qt.AlignRight Layout.alignment: mediaControlsMouseArea.labelsOnRight ? Qt.AlignLeft : Qt.AlignRight
spacing: 0 Layout.fillWidth: true
spacing: mediaControlsMouseArea.effectiveLabelVerticalSpacing
visible: mediaControlsMouseArea.nowPlayingLabelsVisible
PlasmaComponents.Label { Repeater {
Layout.alignment: Qt.AlignRight model: mediaControlsMouseArea.effectiveLabelLines
text: "NOW"
delegate: ShadowedLabel {
required property string modelData
Layout.alignment: mediaControlsMouseArea.labelsOnRight ? Qt.AlignLeft : Qt.AlignRight
Layout.fillWidth: true
shadowEnabled: mediaControlsMouseArea.configuredTextShadowEnabled
text: modelData
lineHeight: 0.8 lineHeight: 0.8
font.pixelSize: 16
font.bold: true font.bold: true
// qmllint disable missing-property font.pixelSize: mediaControlsMouseArea.effectiveLabelFontSize
font.family: plasmoid.configuration.fontFamily font.family: mediaControlsMouseArea.configuredFontFamily
color: mediaControlsMouseArea.effectiveForegroundColor
horizontalAlignment: mediaControlsMouseArea.labelsOnRight ? Text.AlignLeft : Text.AlignRight
} }
PlasmaComponents.Label {
id: nowPlayingLabel2
Layout.alignment: Qt.AlignRight
text: "PLAYING"
lineHeight: 0.8
font.bold: true
font.pixelSize: 16
// qmllint disable missing-property
font.family: plasmoid.configuration.fontFamily
} }
} }
@@ -93,9 +171,10 @@ MouseArea {
RowLayout { RowLayout {
id: mediaControls id: mediaControls
Layout.alignment: Qt.AlignHCenter Layout.alignment: mediaControlsMouseArea.labelsOnRight ? Qt.AlignLeft : Qt.AlignRight
opacity: mediaControlsMouseArea.containsMouse ? 1 : 0 enabled: mediaControlsMouseArea.controlsHoverActive
visible: opacity > 0 opacity: mediaControlsMouseArea.controlsHoverActive && mediaControlsMouseArea.nowPlayingLabelsVisible && !mediaControlsMouseArea.hideNowPlayingArea ? 1 : 0
visible: mediaControlsMouseArea.controlsHoverActive && mediaControlsMouseArea.nowPlayingLabelsVisible && !mediaControlsMouseArea.hideNowPlayingArea
QQC2.Button { QQC2.Button {
Layout.preferredWidth: buttonSize Layout.preferredWidth: buttonSize
@@ -109,6 +188,7 @@ MouseArea {
contentItem: Kirigami.Icon { contentItem: Kirigami.Icon {
source: "media-skip-backward" source: "media-skip-backward"
color: mediaControlsMouseArea.effectiveForegroundColor
} }
} }
@@ -127,6 +207,7 @@ MouseArea {
contentItem: Kirigami.Icon { contentItem: Kirigami.Icon {
source: player.playbackStatus === 2 ? "media-playback-pause" : "media-playback-start" source: player.playbackStatus === 2 ? "media-playback-pause" : "media-playback-start"
color: mediaControlsMouseArea.effectiveForegroundColor
} }
} }
@@ -140,6 +221,7 @@ MouseArea {
contentItem: Kirigami.Icon { contentItem: Kirigami.Icon {
source: "media-skip-forward" source: "media-skip-forward"
color: mediaControlsMouseArea.effectiveForegroundColor
} }
} }
@@ -170,40 +252,102 @@ MouseArea {
} }
Rectangle { Item {
id: separator id: separatorContainer
visible: mediaControlsMouseArea.nowPlayingLabelsVisible && !mediaControlsMouseArea.hideNowPlayingArea
Layout.fillHeight: true Layout.fillHeight: true
Layout.leftMargin: visible ? mediaControlsMouseArea.effectiveSeparatorGapLabel : 0
Layout.rightMargin: visible ? mediaControlsMouseArea.effectiveSeparatorGapTrack : 0
Layout.minimumWidth: visible ? 1 : 0
Layout.preferredWidth: visible ? 1 : 0
Layout.maximumWidth: visible ? 1 : 0
Rectangle {
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
width: 1 width: 1
height: Math.round(parent.height * mediaControlsMouseArea.effectiveSeparatorHeight / 100)
color: mediaControlsMouseArea.effectiveForegroundColor
}
} }
ColumnLayout { ColumnLayout {
id: infoColumn id: infoColumn
Layout.fillWidth: true Layout.fillWidth: true
Layout.minimumWidth: 0
Layout.leftMargin: mediaControlsMouseArea.hideNowPlayingArea ? mediaControlsMouseArea.hideModeHorizontalPadding : 0
Layout.rightMargin: mediaControlsMouseArea.hideNowPlayingArea ? mediaControlsMouseArea.hideModeHorizontalPadding : 0
spacing: mediaControlsMouseArea.effectiveTrackTextVerticalSpacing
PlasmaComponents.Label { ShadowedLabel {
Layout.fillWidth: true Layout.fillWidth: true
shadowEnabled: mediaControlsMouseArea.configuredTextShadowEnabled
text: player.title text: player.title
font.pixelSize: 28 font.pixelSize: mediaControlsMouseArea.effectiveTitleFontSize
font.bold: true font.bold: true
// qmllint disable missing-property font.family: mediaControlsMouseArea.configuredFontFamily
font.family: plasmoid.configuration.fontFamily color: mediaControlsMouseArea.effectiveForegroundColor
lineHeight: 0.8 lineHeight: 0.8
elide: Text.ElideRight elide: Text.ElideRight
horizontalAlignment: mediaControlsMouseArea.labelsOnRight ? Text.AlignRight : Text.AlignLeft
}
ShadowedLabel {
Layout.fillWidth: true
Layout.alignment: mediaControlsMouseArea.labelsOnRight ? Qt.AlignRight : Qt.AlignLeft
shadowEnabled: mediaControlsMouseArea.configuredTextShadowEnabled
text: player.artists
font.pixelSize: mediaControlsMouseArea.effectiveArtistFontSize
font.family: mediaControlsMouseArea.configuredFontFamily
color: mediaControlsMouseArea.effectiveForegroundColor
lineHeight: 0.8
elide: Text.ElideRight
horizontalAlignment: mediaControlsMouseArea.labelsOnRight ? Text.AlignRight : Text.AlignLeft
}
}
}
component ShadowedLabel: Item {
id: shadowedLabel
property alias text: foregroundLabel.text
property alias font: foregroundLabel.font
property alias lineHeight: foregroundLabel.lineHeight
property alias elide: foregroundLabel.elide
property alias horizontalAlignment: foregroundLabel.horizontalAlignment
property alias verticalAlignment: foregroundLabel.verticalAlignment
property alias color: foregroundLabel.color
property bool shadowEnabled: false
implicitWidth: foregroundLabel.implicitWidth + (shadowEnabled ? 1 : 0)
implicitHeight: foregroundLabel.implicitHeight + (shadowEnabled ? 1 : 0)
PlasmaComponents.Label {
id: shadowLabel
visible: shadowedLabel.shadowEnabled
x: 1
y: 1
width: foregroundLabel.width
height: foregroundLabel.height
text: foregroundLabel.text
font: foregroundLabel.font
lineHeight: foregroundLabel.lineHeight
elide: foregroundLabel.elide
horizontalAlignment: foregroundLabel.horizontalAlignment
verticalAlignment: foregroundLabel.verticalAlignment
color: "#99000000"
} }
PlasmaComponents.Label { PlasmaComponents.Label {
Layout.maximumWidth: 300 id: foregroundLabel
Layout.fillWidth: true
text: player.artists
font.pixelSize: 26
// qmllint disable missing-property
font.family: plasmoid.configuration.fontFamily
lineHeight: 0.8
elide: Text.ElideRight
}
anchors.fill: parent
} }
} }
+290
View File
@@ -1,5 +1,6 @@
import QtQuick import QtQuick
import QtQuick.Controls as QQC2 import QtQuick.Controls as QQC2
import QtQuick.Dialogs as Dialogs
import QtQuick.Layouts import QtQuick.Layouts
import org.kde.kcmutils as KCM import org.kde.kcmutils as KCM
import org.kde.kirigami as Kirigami import org.kde.kirigami as Kirigami
@@ -9,16 +10,120 @@ KCM.SimpleKCM {
property alias cfg_opacity: opacitySpinBox.value property alias cfg_opacity: opacitySpinBox.value
property string cfg_fontFamily property string cfg_fontFamily
property alias cfg_labelFontSize: labelFontSizeSpinBox.value
property alias cfg_titleFontSize: titleFontSizeSpinBox.value
property alias cfg_artistFontSize: artistFontSizeSpinBox.value
property string cfg_labelVisibilityMode
property string cfg_labelPlacement
property alias cfg_labelText: labelTextArea.text
property string cfg_backgroundStyle
property alias cfg_backgroundColor: backgroundColorField.text
property alias cfg_backgroundRadius: backgroundRadiusSpinBox.value
property alias cfg_foregroundColor: foregroundColorField.text
property alias cfg_textShadowEnabled: textShadowCheckBox.checked
property alias cfg_trackTextVerticalSpacing: trackTextVerticalSpacingSpinBox.value
property alias cfg_labelVerticalSpacing: labelVerticalSpacingSpinBox.value
property alias cfg_separatorGapLabel: separatorGapLabelSpinBox.value
property alias cfg_separatorGapTrack: separatorGapTrackSpinBox.value
property alias cfg_separatorHeight: separatorHeightSpinBox.value
readonly property var availableFonts: Qt.fontFamilies() readonly property var availableFonts: Qt.fontFamilies()
readonly property var labelVisibilityOptions: [{
"text": i18n("Auto hide when idle"),
"value": "auto"
}, {
"text": i18n("Always show"),
"value": "always"
}, {
"text": i18n("Always hide"),
"value": "never"
}]
readonly property var labelPlacementOptions: [{
"text": i18n("Left"),
"value": "left"
}, {
"text": i18n("Right"),
"value": "right"
}]
readonly property var backgroundStyleOptions: [{
"text": i18n("Default"),
"value": "custom"
}, {
"text": i18n("Solid background"),
"value": "default"
}]
function syncComboByValue(comboBox, options, configuredValue, fallbackValue) {
const requestedValue = configuredValue || fallbackValue;
const requestedIndex = options.findIndex((option) => {
return option.value === requestedValue;
});
const fallbackIndex = options.findIndex((option) => {
return option.value === fallbackValue;
});
const resolvedIndex = requestedIndex >= 0 ? requestedIndex : (fallbackIndex >= 0 ? fallbackIndex : 0);
if (comboBox.currentIndex !== resolvedIndex)
comboBox.currentIndex = resolvedIndex;
return options[resolvedIndex].value;
}
component SectionHeader: Item {
required property string title
Kirigami.FormData.isSection: true
implicitHeight: sectionLayout.implicitHeight
ColumnLayout {
id: sectionLayout
anchors.left: parent.left
anchors.right: parent.right
spacing: Kirigami.Units.smallSpacing
QQC2.Label {
text: parent.parent.title
font.bold: true
}
Rectangle {
Layout.fillWidth: true
implicitHeight: 1
color: Kirigami.Theme.textColor
opacity: 0.25
}
}
}
onCfg_fontFamilyChanged: { onCfg_fontFamilyChanged: {
const index = availableFonts.indexOf(cfg_fontFamily); const index = availableFonts.indexOf(cfg_fontFamily);
if (index >= 0 && fontFamilyComboBox.currentIndex !== index) if (index >= 0 && fontFamilyComboBox.currentIndex !== index)
fontFamilyComboBox.currentIndex = index; fontFamilyComboBox.currentIndex = index;
}
onCfg_labelVisibilityModeChanged: {
const resolvedValue = syncComboByValue(labelVisibilityModeComboBox, labelVisibilityOptions, cfg_labelVisibilityMode, "auto");
if (cfg_labelVisibilityMode !== resolvedValue)
cfg_labelVisibilityMode = resolvedValue;
}
onCfg_labelPlacementChanged: {
const resolvedValue = syncComboByValue(labelPlacementComboBox, labelPlacementOptions, cfg_labelPlacement, "left");
if (cfg_labelPlacement !== resolvedValue)
cfg_labelPlacement = resolvedValue;
}
onCfg_backgroundStyleChanged: {
const resolvedValue = syncComboByValue(backgroundStyleComboBox, backgroundStyleOptions, cfg_backgroundStyle, "custom");
if (cfg_backgroundStyle !== resolvedValue)
cfg_backgroundStyle = resolvedValue;
} }
Kirigami.FormLayout { Kirigami.FormLayout {
SectionHeader {
title: i18n("Global")
}
QQC2.SpinBox { QQC2.SpinBox {
id: opacitySpinBox id: opacitySpinBox
@@ -35,6 +140,191 @@ KCM.SimpleKCM {
onActivated: configRoot.cfg_fontFamily = currentText onActivated: configRoot.cfg_fontFamily = currentText
} }
QQC2.ComboBox {
id: backgroundStyleComboBox
Kirigami.FormData.label: i18n("Background style:")
model: configRoot.backgroundStyleOptions
textRole: "text"
valueRole: "value"
onActivated: configRoot.cfg_backgroundStyle = currentValue
}
RowLayout {
Kirigami.FormData.label: i18n("Background color:")
enabled: configRoot.cfg_backgroundStyle === "custom"
QQC2.TextField {
id: backgroundColorField
Layout.fillWidth: true
placeholderText: i18n("transparent or #AARRGGBB")
}
QQC2.Button {
text: i18n("Pick...")
onClicked: {
backgroundColorDialog.selectedColor = backgroundColorField.text || "transparent";
backgroundColorDialog.open();
}
}
}
RowLayout {
Kirigami.FormData.label: i18n("Foreground color:")
QQC2.TextField {
id: foregroundColorField
Layout.fillWidth: true
placeholderText: i18n("white or #RRGGBB")
}
QQC2.Button {
text: i18n("Pick...")
onClicked: {
foregroundColorDialog.selectedColor = foregroundColorField.text || "white";
foregroundColorDialog.open();
}
}
}
QQC2.SpinBox {
id: backgroundRadiusSpinBox
Kirigami.FormData.label: i18n("Background radius:")
enabled: configRoot.cfg_backgroundStyle === "custom"
from: 0
to: 100
}
QQC2.CheckBox {
id: textShadowCheckBox
Kirigami.FormData.label: i18n("Text shadow:")
text: i18n("Enable")
}
QQC2.SpinBox {
id: separatorHeightSpinBox
Kirigami.FormData.label: i18n("Separator height (%):")
from: 0
to: 100
}
SectionHeader {
title: i18n("Label")
}
QQC2.ComboBox {
id: labelVisibilityModeComboBox
Kirigami.FormData.label: i18n("Now Playing labels:")
model: configRoot.labelVisibilityOptions
textRole: "text"
valueRole: "value"
onActivated: configRoot.cfg_labelVisibilityMode = currentValue
}
QQC2.ComboBox {
id: labelPlacementComboBox
Kirigami.FormData.label: i18n("Label placement:")
model: configRoot.labelPlacementOptions
textRole: "text"
valueRole: "value"
onActivated: configRoot.cfg_labelPlacement = currentValue
}
QQC2.TextArea {
id: labelTextArea
Kirigami.FormData.label: i18n("Label text:")
Layout.fillWidth: true
Layout.preferredHeight: Kirigami.Units.gridUnit * 3
placeholderText: i18n("Use a line break for multiple lines")
wrapMode: TextEdit.NoWrap
}
QQC2.SpinBox {
id: labelFontSizeSpinBox
Kirigami.FormData.label: i18n("Label font size:")
from: 8
to: 72
}
QQC2.SpinBox {
id: labelVerticalSpacingSpinBox
Kirigami.FormData.label: i18n("Label line spacing (negatives possible):")
from: -200
to: 200
}
QQC2.SpinBox {
id: separatorGapLabelSpinBox
Kirigami.FormData.label: i18n("Separator gap from label:")
from: 0
to: 24
}
SectionHeader {
title: i18n("Track & Artist")
}
QQC2.SpinBox {
id: titleFontSizeSpinBox
Kirigami.FormData.label: i18n("Title font size:")
from: 8
to: 96
}
QQC2.SpinBox {
id: artistFontSizeSpinBox
Kirigami.FormData.label: i18n("Artist font size:")
from: 8
to: 96
}
QQC2.SpinBox {
id: trackTextVerticalSpacingSpinBox
Kirigami.FormData.label: i18n("Title/artist spacing (negatives possible):")
from: -200
to: 200
}
QQC2.SpinBox {
id: separatorGapTrackSpinBox
Kirigami.FormData.label: i18n("Separator gap from track:")
from: 0
to: 24
}
}
Dialogs.ColorDialog {
id: backgroundColorDialog
title: i18n("Select background color")
options: Dialogs.ColorDialog.ShowAlphaChannel
onAccepted: configRoot.cfg_backgroundColor = selectedColor.toString()
}
Dialogs.ColorDialog {
id: foregroundColorDialog
title: i18n("Select foreground color")
options: Dialogs.ColorDialog.ShowAlphaChannel
onAccepted: configRoot.cfg_foregroundColor = selectedColor.toString()
} }
} }
+86 -1
View File
@@ -1,6 +1,7 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import org.kde.kirigami as Kirigami import org.kde.kirigami as Kirigami
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.plasmoid import org.kde.plasma.plasmoid
PlasmoidItem { PlasmoidItem {
@@ -10,12 +11,56 @@ PlasmoidItem {
// "qmllint" sees `plasmoid` as QObject here, but Plasma injects `configuration` at runtime. // "qmllint" sees `plasmoid` as QObject here, but Plasma injects `configuration` at runtime.
// qmllint disable missing-property // qmllint disable missing-property
property int configuredOpacity: plasmoid.configuration.opacity property int configuredOpacity: plasmoid.configuration.opacity
// qmllint disable missing-property
property string configuredFontFamily: plasmoid.configuration.fontFamily
// qmllint disable missing-property
property int configuredLabelFontSize: plasmoid.configuration.labelFontSize
// qmllint disable missing-property
property int configuredTitleFontSize: plasmoid.configuration.titleFontSize
// qmllint disable missing-property
property int configuredArtistFontSize: plasmoid.configuration.artistFontSize
// qmllint disable missing-property
property string configuredLabelVisibilityMode: plasmoid.configuration.labelVisibilityMode
// qmllint disable missing-property
// qmllint disable missing-property
property string configuredLabelPlacement: plasmoid.configuration.labelPlacement
// qmllint disable missing-property
property string configuredLabelText: plasmoid.configuration.labelText
// qmllint disable missing-property
property string configuredBackgroundStyle: plasmoid.configuration.backgroundStyle
// qmllint disable missing-property
property string configuredBackgroundColor: plasmoid.configuration.backgroundColor
// qmllint disable missing-property
property int configuredBackgroundRadius: plasmoid.configuration.backgroundRadius
// qmllint disable missing-property
property string configuredForegroundColor: plasmoid.configuration.foregroundColor
// qmllint disable missing-property
property bool configuredTextShadowEnabled: plasmoid.configuration.textShadowEnabled
// qmllint disable missing-property
property int configuredTrackTextVerticalSpacing: plasmoid.configuration.trackTextVerticalSpacing
// qmllint disable missing-property
property int configuredLabelVerticalSpacing: plasmoid.configuration.labelVerticalSpacing
// qmllint disable missing-property
property int configuredSeparatorGapLabel: plasmoid.configuration.separatorGapLabel
// qmllint disable missing-property
property int configuredSeparatorGapTrack: plasmoid.configuration.separatorGapTrack
// qmllint disable missing-property
property int configuredSeparatorHeight: plasmoid.configuration.separatorHeight
readonly property int resolvedBackgroundHints: {
if (configuredBackgroundStyle === "default")
return PlasmaCore.Types.DefaultBackground | PlasmaCore.Types.ConfigurableBackground;
if (configuredBackgroundStyle === "none")
return PlasmaCore.Types.NoBackground;
return PlasmaCore.Types.NoBackground;
}
width: Kirigami.Units.gridUnit * 25 width: Kirigami.Units.gridUnit * 25
height: Kirigami.Units.gridUnit * 5 height: Kirigami.Units.gridUnit * 5
Layout.minimumWidth: Kirigami.Units.gridUnit * 25 Layout.minimumWidth: Kirigami.Units.gridUnit * 25
Layout.minimumHeight: Kirigami.Units.gridUnit * 5 Layout.minimumHeight: Kirigami.Units.gridUnit * 5
Plasmoid.backgroundHints: "NoBackground" Plasmoid.backgroundHints: resolvedBackgroundHints
opacity: configuredOpacity / 100 opacity: configuredOpacity / 100
Player { Player {
@@ -23,15 +68,55 @@ PlasmoidItem {
} }
fullRepresentation: Representation { fullRepresentation: Representation {
width: root.width
height: root.height
Layout.minimumWidth: Kirigami.Units.gridUnit * 25 Layout.minimumWidth: Kirigami.Units.gridUnit * 25
Layout.minimumHeight: Kirigami.Units.gridUnit * 5 Layout.minimumHeight: Kirigami.Units.gridUnit * 5
Layout.preferredWidth: root.width Layout.preferredWidth: root.width
Layout.preferredHeight: root.height Layout.preferredHeight: root.height
configuredFontFamily: root.configuredFontFamily
configuredLabelFontSize: root.configuredLabelFontSize
configuredTitleFontSize: root.configuredTitleFontSize
configuredArtistFontSize: root.configuredArtistFontSize
configuredLabelVisibilityMode: root.configuredLabelVisibilityMode
configuredLabelPlacement: root.configuredLabelPlacement
configuredLabelText: root.configuredLabelText
configuredBackgroundStyle: root.configuredBackgroundStyle
configuredBackgroundColor: root.configuredBackgroundColor
configuredBackgroundRadius: root.configuredBackgroundRadius
configuredForegroundColor: root.configuredForegroundColor
configuredTextShadowEnabled: root.configuredTextShadowEnabled
configuredTrackTextVerticalSpacing: root.configuredTrackTextVerticalSpacing
configuredLabelVerticalSpacing: root.configuredLabelVerticalSpacing
configuredSeparatorGapLabel: root.configuredSeparatorGapLabel
configuredSeparatorGapTrack: root.configuredSeparatorGapTrack
configuredSeparatorHeight: root.configuredSeparatorHeight
} }
compactRepresentation: Representation { compactRepresentation: Representation {
width: root.width
height: root.height
Layout.minimumWidth: Kirigami.Units.gridUnit * 25 Layout.minimumWidth: Kirigami.Units.gridUnit * 25
Layout.minimumHeight: Kirigami.Units.gridUnit * 5 Layout.minimumHeight: Kirigami.Units.gridUnit * 5
Layout.preferredWidth: root.width
Layout.preferredHeight: root.height
configuredFontFamily: root.configuredFontFamily
configuredLabelFontSize: root.configuredLabelFontSize
configuredTitleFontSize: root.configuredTitleFontSize
configuredArtistFontSize: root.configuredArtistFontSize
configuredLabelVisibilityMode: root.configuredLabelVisibilityMode
configuredLabelPlacement: root.configuredLabelPlacement
configuredLabelText: root.configuredLabelText
configuredBackgroundStyle: root.configuredBackgroundStyle
configuredBackgroundColor: root.configuredBackgroundColor
configuredBackgroundRadius: root.configuredBackgroundRadius
configuredForegroundColor: root.configuredForegroundColor
configuredTextShadowEnabled: root.configuredTextShadowEnabled
configuredTrackTextVerticalSpacing: root.configuredTrackTextVerticalSpacing
configuredLabelVerticalSpacing: root.configuredLabelVerticalSpacing
configuredSeparatorGapLabel: root.configuredSeparatorGapLabel
configuredSeparatorGapTrack: root.configuredSeparatorGapTrack
configuredSeparatorHeight: root.configuredSeparatorHeight
} }
} }