display a color picker for wallpaper color config
This commit is contained in:
parent
424868cecd
commit
d25ba46ae7
@ -209,14 +209,24 @@ Rectangle {
|
|||||||
iconSource: "dialog-ok"
|
iconSource: "dialog-ok"
|
||||||
text: "Ok"
|
text: "Ok"
|
||||||
onClicked: {
|
onClicked: {
|
||||||
root.saveConfig()
|
if (main.currentPage.saveConfig !== undefined) {
|
||||||
|
main.currentPage.saveConfig()
|
||||||
|
} else {
|
||||||
|
root.saveConfig()
|
||||||
|
}
|
||||||
configDialog.close()
|
configDialog.close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PlasmaComponents.Button {
|
PlasmaComponents.Button {
|
||||||
iconSource: "dialog-ok-apply"
|
iconSource: "dialog-ok-apply"
|
||||||
text: "Apply"
|
text: "Apply"
|
||||||
onClicked: root.saveConfig()
|
onClicked: {
|
||||||
|
if (main.currentPage.saveConfig !== undefined) {
|
||||||
|
main.currentPage.saveConfig()
|
||||||
|
} else {
|
||||||
|
root.saveConfig()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
PlasmaComponents.Button {
|
PlasmaComponents.Button {
|
||||||
iconSource: "dialog-cancel"
|
iconSource: "dialog-cancel"
|
||||||
|
@ -21,10 +21,29 @@ import org.kde.plasma.components 0.1 as PlasmaComponents
|
|||||||
import org.kde.plasma.configuration 0.1
|
import org.kde.plasma.configuration 0.1
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
|
id: root
|
||||||
PlasmaComponents.Label {
|
PlasmaComponents.Label {
|
||||||
text: "Plugins"
|
text: "Plugins"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//BEGIN functions
|
||||||
|
function saveConfig() {
|
||||||
|
for (var key in configDialog.wallpaperConfiguration) {
|
||||||
|
if (main.currentPage["cfg_"+key] !== undefined) {
|
||||||
|
configDialog.wallpaperConfiguration[key] = main.currentPage["cfg_"+key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function restoreConfig() {
|
||||||
|
for (var key in configDialog.wallpaperConfiguration) {
|
||||||
|
if (main.currentPage["cfg_"+key] !== undefined) {
|
||||||
|
main.currentPage["cfg_"+key] = configDialog.wallpaperConfiguration[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//END functions
|
||||||
|
|
||||||
ListView {
|
ListView {
|
||||||
id: categoriesView
|
id: categoriesView
|
||||||
anchors {
|
anchors {
|
||||||
@ -36,6 +55,7 @@ Column {
|
|||||||
|
|
||||||
model: configDialog.wallpaperConfigModel
|
model: configDialog.wallpaperConfigModel
|
||||||
delegate: ConfigCategoryDelegate {
|
delegate: ConfigCategoryDelegate {
|
||||||
|
id: delegate
|
||||||
anchors {
|
anchors {
|
||||||
top: parent.top
|
top: parent.top
|
||||||
bottom: parent.bottom
|
bottom: parent.bottom
|
||||||
|
@ -19,13 +19,150 @@
|
|||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import org.kde.plasma.components 0.1 as PlasmaComponents
|
import org.kde.plasma.components 0.1 as PlasmaComponents
|
||||||
|
|
||||||
Row {
|
Column {
|
||||||
id: root
|
id: root
|
||||||
PlasmaComponents.Label {
|
property alias cfg_Color: picker.color
|
||||||
text: "Color"
|
|
||||||
}
|
Column {
|
||||||
PlasmaComponents.TextField {
|
id: picker
|
||||||
text: configDialog.wallpaperConfiguration.Color
|
|
||||||
onTextChanged: configDialog.wallpaperConfiguration.Color = text
|
property color color
|
||||||
|
|
||||||
|
property real hue
|
||||||
|
property real saturation
|
||||||
|
property real lightness
|
||||||
|
|
||||||
|
onColorChanged: {
|
||||||
|
var min = Math.min(color.r, Math.min(color.g, color.b))
|
||||||
|
var max = Math.max(color.r, Math.max(color.g, color.b))
|
||||||
|
var c = max - min
|
||||||
|
var h
|
||||||
|
|
||||||
|
if (c == 0) {
|
||||||
|
h = 0
|
||||||
|
} else if (max == color.r) {
|
||||||
|
h = ((color.g - color.b) / c) % 6
|
||||||
|
} else if (max == color.g) {
|
||||||
|
h = ((color.b - color.r) / c) + 2
|
||||||
|
} else if (max == color.b) {
|
||||||
|
h = ((color.r - color.g) / c) + 4
|
||||||
|
}
|
||||||
|
picker.hue = (1/6) * h
|
||||||
|
picker.saturation = c / (1 - Math.abs(2 * ((max+min)/2) - 1))
|
||||||
|
picker.lightness = (max + min)/2
|
||||||
|
}
|
||||||
|
onHueChanged: redrawTimer.restart()
|
||||||
|
onSaturationChanged: redrawTimer.restart()
|
||||||
|
onLightnessChanged: redrawTimer.restart()
|
||||||
|
Timer {
|
||||||
|
id: redrawTimer
|
||||||
|
interval: 10
|
||||||
|
onTriggered: {
|
||||||
|
hsCanvas.requestPaint();
|
||||||
|
vCanvas.requestPaint();
|
||||||
|
hsMarker.x = Math.round(hsCanvas.width*picker.hue - 2)
|
||||||
|
hsMarker.y = Math.round(hsCanvas.width*(1-picker.saturation) - 2)
|
||||||
|
vMarker.y = Math.round(hsCanvas.height*(1-picker.lightness) - 2)
|
||||||
|
|
||||||
|
//this to work assumes the above rgb->hsl conversion is correct
|
||||||
|
picker.color = Qt.hsla(picker.hue, picker.saturation, picker.lightness, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Row {
|
||||||
|
MouseArea {
|
||||||
|
width: 255
|
||||||
|
height: 255
|
||||||
|
onPressed: {
|
||||||
|
hsMarker.x = mouse.x - 2
|
||||||
|
hsMarker.y = mouse.y - 2
|
||||||
|
picker.hue = mouse.x/width
|
||||||
|
picker.saturation = 1 - hsMarker.y/height
|
||||||
|
}
|
||||||
|
onPositionChanged: {
|
||||||
|
hsMarker.x = mouse.x - 2
|
||||||
|
hsMarker.y = mouse.y - 2
|
||||||
|
picker.hue = mouse.x/width
|
||||||
|
picker.saturation = 1 - hsMarker.y/height
|
||||||
|
}
|
||||||
|
Canvas {
|
||||||
|
id: hsCanvas
|
||||||
|
anchors.fill: parent
|
||||||
|
onPaint: {
|
||||||
|
var ctx = getContext('2d');
|
||||||
|
var gradient = ctx.createLinearGradient(0, 0, width, 0)
|
||||||
|
for (var i = 0; i < 10; ++i) {
|
||||||
|
gradient.addColorStop(i/10, Qt.hsla(i/10, 1, picker.lightness, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.fillStyle = gradient
|
||||||
|
ctx.fillRect(0, 0, width, height);
|
||||||
|
|
||||||
|
gradient = ctx.createLinearGradient(0, 0, 0, height)
|
||||||
|
gradient.addColorStop(0, Qt.hsla(0, 0, picker.lightness, 0));
|
||||||
|
gradient.addColorStop(1, Qt.hsla(0, 0, picker.lightness, 1));
|
||||||
|
|
||||||
|
ctx.fillStyle = gradient
|
||||||
|
ctx.fillRect(0, 0, width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Rectangle {
|
||||||
|
id: hsMarker
|
||||||
|
width: 5
|
||||||
|
height: 5
|
||||||
|
radius: 5
|
||||||
|
color: "black"
|
||||||
|
border {
|
||||||
|
color: "white"
|
||||||
|
width: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MouseArea {
|
||||||
|
width: 30
|
||||||
|
height: 255
|
||||||
|
onPressed: {
|
||||||
|
vMarker.y = mouse.y - 2
|
||||||
|
picker.lightness = 1 - vMarker.y/height
|
||||||
|
}
|
||||||
|
onPositionChanged: {
|
||||||
|
vMarker.y = mouse.y - 2
|
||||||
|
picker.lightness = 1 - vMarker.y/height
|
||||||
|
}
|
||||||
|
Canvas {
|
||||||
|
id: vCanvas
|
||||||
|
width: 30
|
||||||
|
height: 255
|
||||||
|
onPaint: {
|
||||||
|
var ctx = getContext('2d');
|
||||||
|
var gradient = ctx.createLinearGradient(0, 0, 0, height)
|
||||||
|
gradient.addColorStop(0, Qt.hsla(picker.hue, picker.saturation, 1, 1));
|
||||||
|
gradient.addColorStop(0.5, Qt.hsla(picker.hue, picker.saturation, 0.5, 1));
|
||||||
|
gradient.addColorStop(1, Qt.hsla(picker.hue, picker.saturation, 0, 1));
|
||||||
|
|
||||||
|
ctx.fillStyle = gradient
|
||||||
|
ctx.fillRect(0, 0, width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Rectangle {
|
||||||
|
id: vMarker
|
||||||
|
width: 30
|
||||||
|
height: 5
|
||||||
|
radius: 5
|
||||||
|
color: "black"
|
||||||
|
border {
|
||||||
|
color: "white"
|
||||||
|
width: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Rectangle {
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
right: parent.right
|
||||||
|
}
|
||||||
|
height: 30
|
||||||
|
color: Qt.hsla(picker.hue, picker.saturation, picker.lightness, 1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user