Warning, /plasma/plasma-workspace/wallpapers/image/imagepackage/contents/ui/config.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
0003     SPDX-FileCopyrightText: 2014 Kai Uwe Broulik <kde@privat.broulik.de>
0004     SPDX-FileCopyrightText: 2019 David Redondo <kde@david-redondo.de>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 import QtQuick
0010 import QtQuick.Controls as QtControls2
0011 import QtQuick.Layouts
0012 import org.kde.plasma.wallpapers.image as PlasmaWallpaper
0013 import org.kde.kquickcontrols as KQuickControls
0014 import org.kde.kquickcontrolsaddons
0015 import org.kde.newstuff as NewStuff
0016 import org.kde.kcmutils as KCM
0017 import org.kde.kirigami as Kirigami
0018 
0019 /**
0020  * For proper alignment, an ancestor **MUST** have id "appearanceRoot" and property "parentLayout"
0021  */
0022 ColumnLayout {
0023     id: root
0024         
0025     property var configDialog
0026     property var wallpaperConfiguration: wallpaper.configuration
0027     property var parentLayout
0028     property var screen : Screen
0029     property var screenSize: !!screen.geometry ? Qt.size(screen.geometry.width, screen.geometry.height):  Qt.size(screen.width, screen.height)
0030     
0031     property alias cfg_Color: colorButton.color
0032     property color cfg_ColorDefault
0033     property string cfg_Image
0034     property string cfg_ImageDefault
0035     property int cfg_FillMode
0036     property int cfg_FillModeDefault
0037     property int cfg_SlideshowMode
0038     property int cfg_SlideshowModeDefault
0039     property bool cfg_SlideshowFoldersFirst
0040     property bool cfg_SlideshowFoldersFirstDefault: false
0041     property alias cfg_Blur: blurRadioButton.checked
0042     property bool cfg_BlurDefault
0043     property var cfg_SlidePaths: []
0044     property var cfg_SlidePathsDefault: []
0045     property int cfg_SlideInterval: 0
0046     property int cfg_SlideIntervalDefault: 0
0047     property var cfg_UncheckedSlides: []
0048     property var cfg_UncheckedSlidesDefault: []
0049 
0050     signal configurationChanged()
0051     /**
0052      * Emitted when the user finishes adding images using the file dialog.
0053      */
0054     signal wallpaperBrowseCompleted();
0055     
0056     onScreenChanged: function() {
0057         if (thumbnailsLoader.item) {
0058             thumbnailsLoader.item.screenSize = !!root.screen.geometry ? Qt.size(root.screen.geometry.width, root.screen.geometry.height):  Qt.size(root.screen.width, root.screen.height);
0059         }
0060     }
0061     
0062     function saveConfig() {
0063         if (configDialog.currentWallpaper === "org.kde.image") {
0064             imageWallpaper.wallpaperModel.commitAddition();
0065             imageWallpaper.wallpaperModel.commitDeletion();
0066         }
0067     }
0068 
0069     function openChooserDialog() {
0070         const dialogComponent = Qt.createComponent("AddFileDialog.qml");
0071         dialogComponent.createObject(root);
0072         dialogComponent.destroy();
0073     }
0074 
0075     PlasmaWallpaper.ImageBackend {
0076         id: imageWallpaper
0077         renderingMode: (configDialog.currentWallpaper === "org.kde.image") ? PlasmaWallpaper.ImageBackend.SingleImage : PlasmaWallpaper.ImageBackend.SlideShow
0078         targetSize: {
0079             // Lock screen configuration case
0080             return Qt.size(root.screenSize.width * root.screen.devicePixelRatio, root.screenSize.height * root.screen.devicePixelRatio)
0081         }
0082         onSlidePathsChanged: cfg_SlidePaths = slidePaths
0083         onUncheckedSlidesChanged: cfg_UncheckedSlides = uncheckedSlides
0084         onSlideshowModeChanged: cfg_SlideshowMode = slideshowMode
0085         onSlideshowFoldersFirstChanged: cfg_SlideshowFoldersFirst = slideshowFoldersFirst
0086 
0087         onSettingsChanged: root.configurationChanged()
0088     }
0089 
0090     onCfg_FillModeChanged: {
0091         resizeComboBox.setMethod()
0092     }
0093 
0094     onCfg_SlidePathsChanged: {
0095         if (cfg_SlidePaths)
0096             imageWallpaper.slidePaths = cfg_SlidePaths
0097     }
0098     onCfg_UncheckedSlidesChanged: {
0099         if (cfg_UncheckedSlides)
0100             imageWallpaper.uncheckedSlides = cfg_UncheckedSlides
0101     }
0102 
0103     onCfg_SlideshowModeChanged: {
0104         if (cfg_SlideshowMode)
0105             imageWallpaper.slideshowMode = cfg_SlideshowMode
0106     }
0107 
0108     onCfg_SlideshowFoldersFirstChanged: {
0109         if (cfg_SlideshowFoldersFirst)
0110             imageWallpaper.slideshowFoldersFirst = cfg_SlideshowFoldersFirst
0111     }
0112 
0113     //Rectangle { color: "orange"; x: formAlignment; width: formAlignment; height: 20 }
0114 
0115     Kirigami.FormLayout {
0116         id: formLayout
0117         
0118         Component.onCompleted: function() {
0119             if (typeof appearanceRoot !== "undefined") {
0120                 twinFormLayouts.push(appearanceRoot.parentLayout);
0121             }
0122         }
0123         
0124         QtControls2.ComboBox {
0125             id: resizeComboBox
0126             Kirigami.FormData.label: i18nd("plasma_wallpaper_org.kde.image", "Positioning:")
0127             model: [
0128                         {
0129                             'label': i18nd("plasma_wallpaper_org.kde.image", "Scaled and Cropped"),
0130                             'fillMode': Image.PreserveAspectCrop
0131                         },
0132                         {
0133                             'label': i18nd("plasma_wallpaper_org.kde.image", "Scaled"),
0134                             'fillMode': Image.Stretch
0135                         },
0136                         {
0137                             'label': i18nd("plasma_wallpaper_org.kde.image", "Scaled, Keep Proportions"),
0138                             'fillMode': Image.PreserveAspectFit
0139                         },
0140                         {
0141                             'label': i18nd("plasma_wallpaper_org.kde.image", "Centered"),
0142                             'fillMode': Image.Pad
0143                         },
0144                         {
0145                             'label': i18nd("plasma_wallpaper_org.kde.image", "Tiled"),
0146                             'fillMode': Image.Tile
0147                         }
0148             ]
0149 
0150             textRole: "label"
0151             onActivated: cfg_FillMode = model[currentIndex]["fillMode"]
0152             Component.onCompleted: setMethod();
0153 
0154             KCM.SettingHighlighter {
0155                 highlight: cfg_FillModeDefault != cfg_FillMode
0156             }
0157 
0158             function setMethod() {
0159                 for (var i = 0; i < model.length; i++) {
0160                     if (model[i]["fillMode"] === root.cfg_FillMode) {
0161                         resizeComboBox.currentIndex = i;
0162                         break;
0163                     }
0164                 }
0165             }
0166         }
0167 
0168         QtControls2.ButtonGroup { id: backgroundGroup }
0169 
0170         QtControls2.RadioButton {
0171             id: blurRadioButton
0172             visible: cfg_FillMode === Image.PreserveAspectFit || cfg_FillMode === Image.Pad
0173             Kirigami.FormData.label: i18nd("plasma_wallpaper_org.kde.image", "Background:")
0174             text: i18nd("plasma_wallpaper_org.kde.image", "Blur")
0175             QtControls2.ButtonGroup.group: backgroundGroup
0176         }
0177 
0178         RowLayout {
0179             id: colorRow
0180             visible: cfg_FillMode === Image.PreserveAspectFit || cfg_FillMode === Image.Pad
0181             QtControls2.RadioButton {
0182                 id: colorRadioButton
0183                 text: i18nd("plasma_wallpaper_org.kde.image", "Solid color")
0184                 checked: !cfg_Blur
0185                 QtControls2.ButtonGroup.group: backgroundGroup
0186 
0187                 KCM.SettingHighlighter {
0188                     highlight: cfg_Blur != cfg_BlurDefault
0189                 }
0190             }
0191             KQuickControls.ColorButton {
0192                 id: colorButton
0193                 color: cfg_Color
0194                 dialogTitle: i18nd("plasma_wallpaper_org.kde.image", "Select Background Color")
0195 
0196                 KCM.SettingHighlighter {
0197                     highlight: cfg_Color != cfg_ColorDefault
0198                 }
0199             }
0200         }
0201     }
0202 
0203     DropArea {
0204         Layout.fillWidth: true
0205         Layout.fillHeight: true
0206 
0207         onEntered: drag => {
0208             if (drag.hasUrls) {
0209                 drag.accept();
0210             }
0211         }
0212         onDropped: drop => {
0213             drop.urls.forEach(function (url) {
0214                 if (configDialog.currentWallpaper === "org.kde.image") {
0215                     imageWallpaper.addUsersWallpaper(url);
0216                 } else {
0217                     imageWallpaper.addSlidePath(url);
0218                 }
0219             });
0220             // Scroll to top to view added images
0221             if (configDialog.currentWallpaper === "org.kde.image") {
0222                 thumbnailsLoader.item.view.positionViewAtIndex(0, GridView.Beginning);
0223             }
0224         }
0225 
0226         Loader {
0227             id: thumbnailsLoader
0228             anchors.fill: parent
0229         
0230             function loadWallpaper () {
0231                 let source = (configDialog.currentWallpaper == "org.kde.image") ? "ThumbnailsComponent.qml" :
0232                     ((configDialog.currentWallpaper == "org.kde.slideshow") ? "SlideshowComponent.qml" : "");
0233                 
0234                 let props = {screenSize: screenSize};
0235                 
0236                 if (configDialog.currentWallpaper == "org.kde.slideshow") {
0237                     props["configuration"] = wallpaperConfiguration;
0238                 }
0239                 thumbnailsLoader.setSource(source, props);
0240             }
0241         }
0242         
0243         Connections {
0244             target: configDialog
0245             function onCurrentWallpaperChanged() {
0246                 thumbnailsLoader.loadWallpaper();
0247             }
0248         }
0249         
0250         Component.onCompleted: () => {
0251             thumbnailsLoader.loadWallpaper();
0252         }
0253         
0254     }
0255 
0256     Component.onDestruction: {
0257         if (wallpaperConfiguration)
0258             wallpaperConfiguration.PreviewImage = "null";
0259     }
0260 }