You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
359 lines
14 KiB
359 lines
14 KiB
/* |
|
* Copyright 2013 Marco Martin <mart@kde.org> |
|
* Copyright 2014 Kai Uwe Broulik <kde@privat.broulik.de> |
|
* |
|
* This program is free software; you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation; either version 2 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this program; if not, write to the Free Software |
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. |
|
*/ |
|
|
|
import QtQuick 2.5 |
|
import QtQuick.Controls 1.0 as QtControls |
|
import QtQuick.Dialogs 1.1 as QtDialogs |
|
import QtQuick.Layouts 1.0 |
|
import QtQuick.Window 2.0 // for Screen |
|
//We need units from it |
|
import org.kde.plasma.core 2.0 as Plasmacore |
|
import org.kde.plasma.wallpapers.image 2.0 as Wallpaper |
|
import org.kde.kquickcontrolsaddons 2.0 |
|
import org.kde.kconfig 1.0 // for KAuthorized |
|
|
|
ColumnLayout { |
|
id: root |
|
property alias cfg_Color: colorDialog.color |
|
property string cfg_Image |
|
property int cfg_FillMode |
|
property var cfg_SlidePaths: "" |
|
property int cfg_SlideInterval: 0 |
|
|
|
function saveConfig() { |
|
imageWallpaper.commitDeletion(); |
|
} |
|
|
|
SystemPalette { |
|
id: syspal |
|
} |
|
|
|
Wallpaper.Image { |
|
id: imageWallpaper |
|
targetSize: { |
|
if (typeof plasmoid !== "undefined") { |
|
return Qt.size(plasmoid.width, plasmoid.height) |
|
} |
|
// Lock screen configuration case |
|
return Qt.size(Screen.width, Screen.height) |
|
} |
|
onSlidePathsChanged: cfg_SlidePaths = slidePaths |
|
} |
|
|
|
onCfg_SlidePathsChanged: { |
|
imageWallpaper.slidePaths = cfg_SlidePaths |
|
} |
|
|
|
property int hoursIntervalValue: Math.floor(cfg_SlideInterval / 3600) |
|
property int minutesIntervalValue: Math.floor(cfg_SlideInterval % 3600) / 60 |
|
property int secondsIntervalValue: cfg_SlideInterval % 3600 % 60 |
|
|
|
//Rectangle { color: "orange"; x: formAlignment; width: formAlignment; height: 20 } |
|
|
|
TextMetrics { |
|
id: textMetrics |
|
text: "00" |
|
} |
|
|
|
Row { |
|
//x: formAlignment - positionLabel.paintedWidth |
|
spacing: units.largeSpacing / 2 |
|
QtControls.Label { |
|
id: positionLabel |
|
width: formAlignment - units.largeSpacing |
|
anchors { |
|
verticalCenter: resizeComboBox.verticalCenter |
|
} |
|
text: i18nd("plasma_applet_org.kde.image", "Positioning:") |
|
horizontalAlignment: Text.AlignRight |
|
} |
|
QtControls.ComboBox { |
|
id: resizeComboBox |
|
property int textLength: 24 |
|
width: theme.mSize(theme.defaultFont).width * textLength |
|
model: [ |
|
{ |
|
'label': i18nd("plasma_applet_org.kde.image", "Scaled and Cropped"), |
|
'fillMode': Image.PreserveAspectCrop |
|
}, |
|
{ |
|
'label': i18nd("plasma_applet_org.kde.image","Scaled"), |
|
'fillMode': Image.Stretch |
|
}, |
|
{ |
|
'label': i18nd("plasma_applet_org.kde.image","Scaled, Keep Proportions"), |
|
'fillMode': Image.PreserveAspectFit |
|
}, |
|
{ |
|
'label': i18nd("plasma_applet_org.kde.image", "Centered"), |
|
'fillMode': Image.Pad |
|
}, |
|
{ |
|
'label': i18nd("plasma_applet_org.kde.image","Tiled"), |
|
'fillMode': Image.Tile |
|
} |
|
] |
|
|
|
textRole: "label" |
|
onCurrentIndexChanged: cfg_FillMode = model[currentIndex]["fillMode"] |
|
Component.onCompleted: setMethod(); |
|
|
|
function setMethod() { |
|
for (var i = 0; i < model.length; i++) { |
|
if (model[i]["fillMode"] == wallpaper.configuration.FillMode) { |
|
resizeComboBox.currentIndex = i; |
|
var tl = model[i]["label"].length; |
|
//resizeComboBox.textLength = Math.max(resizeComboBox.textLength, tl+5); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
QtDialogs.ColorDialog { |
|
id: colorDialog |
|
modality: Qt.WindowModal |
|
showAlphaChannel: false |
|
title: i18nd("plasma_applet_org.kde.image", "Select Background Color") |
|
} |
|
|
|
Row { |
|
id: colorRow |
|
spacing: units.largeSpacing / 2 |
|
QtControls.Label { |
|
width: formAlignment - units.largeSpacing |
|
anchors.verticalCenter: colorButton.verticalCenter |
|
horizontalAlignment: Text.AlignRight |
|
text: i18nd("plasma_applet_org.kde.image", "Background Color:") |
|
} |
|
QtControls.Button { |
|
id: colorButton |
|
width: units.gridUnit * 3 |
|
text: " " // needed to it gets a proper height... |
|
onClicked: colorDialog.open() |
|
|
|
Rectangle { |
|
id: colorRect |
|
anchors.centerIn: parent |
|
width: parent.width - 2 * units.smallSpacing |
|
height: theme.mSize(theme.defaultFont).height |
|
color: colorDialog.color |
|
} |
|
} |
|
} |
|
|
|
Component { |
|
id: foldersComponent |
|
ColumnLayout { |
|
anchors.fill: parent |
|
Connections { |
|
target: root |
|
onHoursIntervalValueChanged: hoursInterval.value = root.hoursIntervalValue |
|
onMinutesIntervalValueChanged: minutesInterval.value = root.minutesIntervalValue |
|
onSecondsIntervalValueChanged: secondsInterval.value = root.secondsIntervalValue |
|
} |
|
//FIXME: there should be only one spinbox: QtControls spinboxes are still too limited for it tough |
|
RowLayout { |
|
Layout.fillWidth: true |
|
spacing: units.largeSpacing / 2 |
|
QtControls.Label { |
|
Layout.minimumWidth: formAlignment - units.largeSpacing |
|
anchors.verticalCenter: parent.verticalCenter |
|
horizontalAlignment: Text.AlignRight |
|
text: i18nd("plasma_applet_org.kde.image","Change every:") |
|
} |
|
QtControls.SpinBox { |
|
id: hoursInterval |
|
anchors.verticalCenter: parent.verticalCenter |
|
Layout.minimumWidth: textMetrics.width + units.gridUnit |
|
width: units.gridUnit * 3 |
|
decimals: 0 |
|
value: root.hoursIntervalValue |
|
minimumValue: 0 |
|
maximumValue: 24 |
|
onValueChanged: cfg_SlideInterval = hoursInterval.value * 3600 + minutesInterval.value * 60 + secondsInterval.value |
|
} |
|
QtControls.Label { |
|
anchors.verticalCenter: parent.verticalCenter |
|
text: i18nd("plasma_applet_org.kde.image","Hours") |
|
} |
|
Item { |
|
Layout.preferredWidth: units.gridUnit |
|
} |
|
QtControls.SpinBox { |
|
id: minutesInterval |
|
anchors.verticalCenter: parent.verticalCenter |
|
Layout.minimumWidth: textMetrics.width + units.gridUnit |
|
width: units.gridUnit * 3 |
|
decimals: 0 |
|
value: root.minutesIntervalValue |
|
minimumValue: 0 |
|
maximumValue: 60 |
|
onValueChanged: cfg_SlideInterval = hoursInterval.value * 3600 + minutesInterval.value * 60 + secondsInterval.value |
|
} |
|
QtControls.Label { |
|
anchors.verticalCenter: parent.verticalCenter |
|
text: i18nd("plasma_applet_org.kde.image","Minutes") |
|
} |
|
Item { |
|
Layout.preferredWidth: units.gridUnit |
|
} |
|
QtControls.SpinBox { |
|
id: secondsInterval |
|
anchors.verticalCenter: parent.verticalCenter |
|
Layout.minimumWidth: textMetrics.width + units.gridUnit |
|
width: units.gridUnit * 3 |
|
decimals: 0 |
|
value: root.secondsIntervalValue |
|
minimumValue: root.hoursIntervalValue === 0 && root.minutesIntervalValue === 0 ? 1 : 0 |
|
maximumValue: 60 |
|
onValueChanged: cfg_SlideInterval = hoursInterval.value * 3600 + minutesInterval.value * 60 + secondsInterval.value |
|
} |
|
QtControls.Label { |
|
anchors.verticalCenter: parent.verticalCenter |
|
text: i18nd("plasma_applet_org.kde.image","Seconds") |
|
} |
|
} |
|
QtControls.ScrollView { |
|
Layout.fillHeight: true; |
|
Layout.fillWidth: true |
|
frameVisible: true |
|
ListView { |
|
id: slidePathsView |
|
anchors.margins: 4 |
|
model: imageWallpaper.slidePaths |
|
delegate: QtControls.Label { |
|
text: modelData |
|
width: slidePathsView.width |
|
height: Math.max(paintedHeight, removeButton.height); |
|
QtControls.ToolButton { |
|
id: removeButton |
|
anchors { |
|
verticalCenter: parent.verticalCenter |
|
right: parent.right |
|
} |
|
iconName: "list-remove" |
|
onClicked: imageWallpaper.removeSlidePath(modelData); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
Component { |
|
id: thumbnailsComponent |
|
QtControls.ScrollView { |
|
anchors.fill: parent |
|
|
|
frameVisible: true |
|
highlightOnFocus: true; |
|
|
|
Component.onCompleted: { |
|
//replace the current binding on the scrollbar that makes it visible when content doesn't fit |
|
|
|
//otherwise we adjust gridSize when we hide the vertical scrollbar and |
|
//due to layouting that can make everything adjust which changes the contentWidth/height which |
|
//changes our scrollbars and we continue being stuck in a loop |
|
|
|
//looks better to not have everything resize anyway. |
|
//BUG: 336301 |
|
__verticalScrollBar.visible = true |
|
} |
|
|
|
GridView { |
|
id: wallpapersGrid |
|
model: imageWallpaper.wallpaperModel |
|
currentIndex: -1 |
|
focus: true |
|
|
|
cellWidth: Math.floor(wallpapersGrid.width / Math.max(Math.floor(wallpapersGrid.width / (units.gridUnit*12)), 3)) |
|
cellHeight: Math.round(cellWidth / (imageWallpaper.targetSize.width / imageWallpaper.targetSize.height)) |
|
|
|
anchors.margins: 4 |
|
boundsBehavior: Flickable.StopAtBounds |
|
|
|
delegate: WallpaperDelegate { |
|
color: cfg_Color |
|
} |
|
|
|
onContentHeightChanged: { |
|
wallpapersGrid.currentIndex = imageWallpaper.wallpaperModel.indexOf(cfg_Image); |
|
wallpapersGrid.positionViewAtIndex(wallpapersGrid.currentIndex, GridView.Visible) |
|
} |
|
|
|
Keys.onPressed: { |
|
if (count < 1) { |
|
return; |
|
} |
|
|
|
if (event.key == Qt.Key_Home) { |
|
currentIndex = 0; |
|
} else if (event.key == Qt.Key_End) { |
|
currentIndex = count - 1; |
|
} |
|
} |
|
|
|
Keys.onLeftPressed: moveCurrentIndexLeft() |
|
Keys.onRightPressed: moveCurrentIndexRight() |
|
Keys.onUpPressed: moveCurrentIndexUp() |
|
Keys.onDownPressed: moveCurrentIndexDown() |
|
|
|
Connections { |
|
target: imageWallpaper |
|
onCustomWallpaperPicked: { |
|
wallpapersGrid.currentIndex = 0 |
|
} |
|
} |
|
|
|
} |
|
} |
|
} |
|
|
|
Loader { |
|
Layout.fillWidth: true |
|
Layout.fillHeight: true |
|
sourceComponent: (configDialog.currentWallpaper == "org.kde.image") ? thumbnailsComponent : foldersComponent |
|
} |
|
|
|
RowLayout { |
|
id: buttonsRow |
|
anchors { |
|
right: parent.right |
|
} |
|
QtControls.Button { |
|
visible: (configDialog.currentWallpaper == "org.kde.slideshow") |
|
iconName: "list-add" |
|
text: i18nd("plasma_applet_org.kde.image","Add Folder") |
|
onClicked: imageWallpaper.showAddSlidePathsDialog() |
|
} |
|
QtControls.Button { |
|
visible: (configDialog.currentWallpaper == "org.kde.image") |
|
iconName: "document-open-folder" |
|
text: i18nd("plasma_applet_org.kde.image","Open...") |
|
onClicked: imageWallpaper.showFileDialog(); |
|
} |
|
QtControls.Button { |
|
iconName: "get-hot-new-stuff" |
|
text: i18nd("plasma_applet_org.kde.image","Get New Wallpapers...") |
|
visible: KAuthorized.authorize("ghns") |
|
onClicked: imageWallpaper.getNewWallpaper(this); |
|
} |
|
} |
|
}
|
|
|