Warning, /frameworks/knewstuff/src/qtquick/qml/Action.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2021 Dan Leinir Turthra Jensen <admin@leinir.dk> 0003 SPDX-FileCopyrightText: 2023 ivan tkachenko <me@ratijas.tk> 0004 0005 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0006 */ 0007 0008 /** 0009 * @brief An action which when triggered will open a NewStuff.Dialog or a NewStuff.Page, depending on settings 0010 * 0011 * This component is equivalent to the old Button component, but functions in more modern applications 0012 * 0013 * The following is a simple example of how to use this Action to show wallpapers from the KDE Store, on a 0014 * system where Plasma has been installed (and consequently the wallpaper knsrc file is available). This also 0015 * shows how to make the action push a page to a pageStack rather than opening a dialog: 0016 * 0017 \code{.qml} 0018 import org.kde.newstuff as NewStuff 0019 0020 NewStuff.Action { 0021 configFile: "wallpaper.knsrc" 0022 text: i18n("&Get New Wallpapers…") 0023 pageStack: applicationWindow().pageStack 0024 onEntryEvent: function(entry, event) { 0025 if (event === NewStuff.Entry.StatusChangedEvent) { 0026 // A entry was installed, updated or removed 0027 } else if (event === NewStuff.Entry.AdoptedEvent) { 0028 // The "AdoptionCommand" from the knsrc file was run for the given entry. 0029 // This should not require refreshing the data for the model 0030 } 0031 } 0032 } 0033 \endcode 0034 * 0035 * @see NewStuff.Button 0036 * @since 5.81 0037 */ 0038 0039 import QtQuick 0040 import org.kde.kirigami 2 as Kirigami 0041 import org.kde.newstuff as NewStuff 0042 0043 Kirigami.Action { 0044 id: component 0045 0046 /* 0047 * The configuration file is not aliased, because then we end up initialising the 0048 * Engine immediately the Action is instantiated, which we want to avoid (as that 0049 * is effectively a phone-home scenario, and causes internet traffic in situations 0050 * where it would not seem likely that there should be any). 0051 * If we want, in the future, to add some status display to the Action (such as "there 0052 * are updates to be had" or somesuch, then we can do this, but until that choice is 0053 * made, let's not) 0054 */ 0055 /** 0056 * The configuration file to use for the Page created by this action 0057 */ 0058 property string configFile 0059 0060 /** 0061 * The default view mode of the page spawned by this action. This should be 0062 * set using the NewStuff.Page.ViewMode enum 0063 * @see NewStuff.Page.ViewMode 0064 */ 0065 property int viewMode: NewStuff.Page.ViewMode.Preview 0066 0067 /** 0068 * If this is set, the action will push a NewStuff.Page onto this page stack 0069 * (and request it is made visible if triggered again). If you do not set this 0070 * property, the action will spawn a NewStuff.Dialog instead. 0071 * @note If you are building a KCM, set this to your ```kcm``` object. 0072 */ 0073 property QtObject pageStack: null 0074 0075 /** 0076 * The engine which handles the content in this Action 0077 * This will be null until the action has been triggered the first time 0078 */ 0079 readonly property QtObject engine: component._private.engine 0080 0081 /** 0082 * This forwards the entry changed event from the QtQuick engine 0083 * @see Engine::entryEvent 0084 */ 0085 signal entryEvent(var entry, int event); 0086 0087 /** 0088 * If this is true (default is false), the action will be shown when the Kiosk settings are such 0089 * that Get Hot New Stuff is disallowed (and any other time enabled is set to false). 0090 * Usually you would want to leave this alone, but occasionally you may have a reason to 0091 * leave a action in place that the user is unable to enable. 0092 */ 0093 property bool visibleWhenDisabled: false 0094 0095 /** 0096 * Show the page/dialog (same as activating the action), if allowed by the Kiosk settings 0097 */ 0098 function showHotNewStuff() { 0099 component._private.showHotNewStuff(); 0100 } 0101 0102 onTriggered: showHotNewStuff() 0103 0104 icon.name: "get-hot-new-stuff" 0105 visible: enabled || visibleWhenDisabled 0106 enabled: NewStuff.Settings.allowedByKiosk 0107 onEnabledChanged: { 0108 // If the user resets this when kiosk has disallowed ghns, force enabled back to false 0109 if (enabled && !NewStuff.Settings.allowedByKiosk) { 0110 enabled = false; 0111 } 0112 } 0113 0114 readonly property QtObject _private: QtObject { 0115 property QtObject engine: pageItem ? pageItem.engine : null 0116 // Probably wants to be deleted and cleared if the "mode" changes at runtime... 0117 property QtObject pageItem 0118 0119 property string providerId 0120 property string entryId 0121 0122 readonly property Connections showSpecificEntryConnection: Connections { 0123 target: component.engine 0124 0125 function onInitialized() { 0126 pageItem.showEntryDetails(providerId, component._private.entryId); 0127 } 0128 } 0129 0130 readonly property Connections engineConnections: Connections { 0131 target: component.engine 0132 0133 function onEntryEvent(entry, event) { 0134 component.entryEvent(entry, event); 0135 } 0136 } 0137 0138 function showHotNewStuff() { 0139 if (NewStuff.Settings.allowedByKiosk) { 0140 if (component.pageStack !== null) { 0141 if (component._private.pageItem // If we already have a page created... 0142 && (component.pageStack.columnView !== undefined // first make sure that this pagestack is a Kirigami-style one (otherwise just assume we're ok) 0143 && component.pageStack.columnView.contains(component._private.pageItem))) // and then check if the page is still in the stack before attempting to... 0144 { 0145 // ...set the already existing page as the current page 0146 component.pageStack.currentItem = component._private.pageItem; 0147 } else { 0148 component._private.pageItem = newStuffPage.createObject(component); 0149 component.pageStack.push(component._private.pageItem); 0150 } 0151 } else { 0152 newStuffDialog.open(); 0153 } 0154 } else { 0155 // make some noise, because silently doing nothing is a bit annoying 0156 } 0157 } 0158 0159 property Component newStuffPage: Component { 0160 NewStuff.Page { 0161 configFile: component.configFile 0162 viewMode: component.viewMode 0163 } 0164 } 0165 0166 property Item newStuffDialog: Loader { 0167 // Use this function to open the dialog. It seems roundabout, but this ensures 0168 // that the dialog is not constructed until we want it to be shown the first time, 0169 // since it will initialise itself on the first load (which causes it to phone 0170 // home) and we don't want that until the user explicitly asks for it. 0171 function open() { 0172 if (item) { 0173 item.open(); 0174 } else { 0175 active = true; 0176 } 0177 } 0178 0179 onLoaded: { 0180 component._private.pageItem = item; 0181 item.open(); 0182 } 0183 0184 active: false 0185 asynchronous: true 0186 0187 sourceComponent: NewStuff.Dialog { 0188 configFile: component.configFile 0189 viewMode: component.viewMode 0190 } 0191 } 0192 } 0193 }