Warning, /frameworks/kirigami/src/controls/AbstractApplicationItem.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * SPDX-FileCopyrightText: 2017 Marco Martin <mart@kde.org> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 import QtQuick 0008 import QtQuick.Templates as T 0009 0010 import org.kde.kirigami as Kirigami 0011 import "templates/private" as TP 0012 import "templates" as KT 0013 0014 /** 0015 * @brief An item that provides the features of AbstractApplicationWindow without the window itself. 0016 * 0017 * This allows embedding into a larger application. 0018 * Unless you need extra flexibility it is recommended to use ApplicationItem instead. 0019 * 0020 * Example usage: 0021 * @code 0022 * import org.kde.kirigami 2.4 as Kirigami 0023 * 0024 * Kirigami.AbstractApplicationItem { 0025 * [...] 0026 * globalDrawer: Kirigami.GlobalDrawer { 0027 * actions: [ 0028 * Kirigami.Action { 0029 * text: "View" 0030 * icon.name: "view-list-icons" 0031 * Kirigami.Action { 0032 * text: "action 1" 0033 * } 0034 * Kirigami.Action { 0035 * text: "action 2" 0036 * } 0037 * Kirigami.Action { 0038 * text: "action 3" 0039 * } 0040 * }, 0041 * Kirigami.Action { 0042 * text: "Sync" 0043 * icon.name: "folder-sync" 0044 * } 0045 * ] 0046 * } 0047 * 0048 * contextDrawer: Kirigami.ContextDrawer { 0049 * id: contextDrawer 0050 * } 0051 * 0052 * pageStack: Kirigami.PageRow { 0053 * ... 0054 * } 0055 * [...] 0056 * } 0057 * @endcode 0058 * 0059 * @inherit QtQuick.Item 0060 */ 0061 Item { 0062 id: root 0063 0064 //BEGIN properties 0065 /** 0066 * @brief This property holds the stack used to allocate the pages and to manage the 0067 * transitions between them. 0068 * 0069 * Put a container here, such as QtQuick.Controls.StackView. 0070 */ 0071 property Item pageStack 0072 0073 /** 0074 * @brief This property holds the font for this item. 0075 * 0076 * default: ``Kirigami.Theme.defaultFont`` 0077 */ 0078 property font font: Kirigami.Theme.defaultFont 0079 0080 /** 0081 * @brief This property holds the locale for this item. 0082 */ 0083 property Locale locale 0084 0085 /** 0086 * @brief This property holds an item that can be used as a menuBar for the application. 0087 */ 0088 property T.MenuBar menuBar 0089 0090 /** 0091 * @brief This property holds an item that can be used as a title for the application. 0092 * 0093 * Scrolling the main page will make it taller or shorter (through the point of going away). 0094 * 0095 * It's a behavior similar to the typical mobile web browser addressbar. 0096 * 0097 * The minimum, preferred and maximum heights of the item can be controlled with 0098 * 0099 * * ``Layout.minimumHeight``: default is 0, i.e. hidden 0100 * * ``Layout.preferredHeight``: default is Kirigami.Units.gridUnit * 1.6 0101 * * ``Layout.maximumHeight``: default is Kirigami.Units.gridUnit * 3 0102 * 0103 * To achieve a titlebar that stays completely fixed, just set the 3 sizes as the same. 0104 * 0105 * @property kirigami::templates::AbstractApplicationHeader header 0106 */ 0107 property KT.AbstractApplicationHeader header 0108 0109 /** 0110 * @brief This property holds an item that can be used as a footer for the application. 0111 */ 0112 property Item footer 0113 0114 /** 0115 * @brief This property sets whether the standard chrome of the app is visible. 0116 * 0117 * These are the action button, the drawer handles and the application header. 0118 * 0119 * default: ``true`` 0120 */ 0121 property bool controlsVisible: true 0122 0123 /** 0124 * @brief This property holds the drawer for global actions. 0125 * 0126 * Thos drawer can be opened by sliding from the left screen edge 0127 * or by dragging the ActionButton to the right. 0128 * 0129 * @note It is recommended to use the GlobalDrawer here. 0130 * @property org::kde::kirigami::OverlayDrawer globalDrawer 0131 */ 0132 property OverlayDrawer globalDrawer 0133 0134 /** 0135 * @brief This property tells us whether the application is in "widescreen" mode. 0136 * 0137 * This is enabled on desktops or horizontal tablets. 0138 * 0139 * @note Different styles can have their own logic for deciding this. 0140 */ 0141 property bool wideScreen: width >= Kirigami.Units.gridUnit * 60 0142 0143 /** 0144 * @brief This property holds the drawer for context-dependent actions. 0145 * 0146 * The drawer that will be opened by sliding from the right screen edge 0147 * or by dragging the ActionButton to the left. 0148 * 0149 * @note It is recommended to use the ContextDrawer type here. 0150 * 0151 * The contents of the context drawer should depend from what page is 0152 * loaded in the main pageStack 0153 * 0154 * Example usage: 0155 * 0156 * @code 0157 * import org.kde.kirigami as Kirigami 0158 * 0159 * Kirigami.ApplicationWindow { 0160 * contextDrawer: Kirigami.ContextDrawer { 0161 * enabled: true 0162 * actions: [ 0163 * Kirigami.Action { 0164 * icon.name: "edit" 0165 * text: "Action text" 0166 * onTriggered: { 0167 * // do stuff 0168 * } 0169 * }, 0170 * Kirigami.Action { 0171 * icon.name: "edit" 0172 * text: "Action text" 0173 * onTriggered: { 0174 * // do stuff 0175 * } 0176 * } 0177 * ] 0178 * } 0179 * } 0180 * @endcode 0181 * 0182 * @property org::kde::kirigami::ContextDrawer contextDrawer 0183 */ 0184 property OverlayDrawer contextDrawer 0185 0186 /** 0187 * @brief This property holds the list of all children of this item. 0188 * @internal 0189 * @property list<Object> __data 0190 */ 0191 default property alias __data: contentItemRoot.data 0192 0193 /** 0194 * @brief This property holds the Item of the main part of the Application UI. 0195 */ 0196 readonly property Item contentItem: Item { 0197 id: contentItemRoot 0198 parent: root 0199 anchors { 0200 fill: parent 0201 topMargin: controlsVisible ? (root.header ? root.header.height : 0) + (root.menuBar ? root.menuBar.height : 0) : 0 0202 bottomMargin: controlsVisible && root.footer ? root.footer.height : 0 0203 leftMargin: root.globalDrawer && root.globalDrawer.modal === false ? root.globalDrawer.contentItem.width * root.globalDrawer.position : 0 0204 rightMargin: root.contextDrawer && root.contextDrawer.modal === false ? root.contextDrawer.contentItem.width * root.contextDrawer.position : 0 0205 } 0206 } 0207 0208 /** 0209 * @brief This property holds the color for the background. 0210 * 0211 * default: ``Kirigami.Theme.backgroundColor`` 0212 */ 0213 property color color: Kirigami.Theme.backgroundColor 0214 0215 /** 0216 * @brief This property holds the background of the Application UI. 0217 */ 0218 property Item background 0219 0220 property alias overlay: overlayRoot 0221 //END properties 0222 0223 //BEGIN functions 0224 /** 0225 * @brief This function shows a little passive notification at the bottom of the app window 0226 * lasting for few seconds, with an optional action button. 0227 * 0228 * @param message The text message to be shown to the user. 0229 * @param timeout How long to show the message: 0230 * possible values: "short", "long" or the number of milliseconds 0231 * @param actionText Text in the action button, if any. 0232 * @param callBack A JavaScript function that will be executed when the 0233 * user clicks the button. 0234 */ 0235 function showPassiveNotification(message, timeout, actionText, callBack) { 0236 notificationsObject.showNotification(message, timeout, actionText, callBack); 0237 } 0238 0239 /** 0240 * @brief This function hides the passive notification at specified index, if any is shown. 0241 * @param index Index of the notification to hide. Default is 0 (oldest notification). 0242 */ 0243 function hidePassiveNotification(index = 0) { 0244 notificationsObject.hideNotification(index); 0245 } 0246 0247 /** 0248 * @brief This property gets application windows object anywhere in the application. 0249 * @returns a pointer to this item. 0250 */ 0251 function applicationWindow() { 0252 return root; 0253 } 0254 //END functions 0255 0256 //BEGIN signals handlers 0257 onMenuBarChanged: { 0258 if (menuBar) { 0259 menuBar.parent = root.contentItem 0260 if (menuBar instanceof T.ToolBar) { 0261 menuBar.position = T.ToolBar.Footer 0262 } else if (menuBar instanceof T.DialogButtonBox) { 0263 menuBar.position = T.DialogButtonBox.Footer 0264 } 0265 menuBar.width = Qt.binding(() => root.contentItem.width) 0266 // FIXME: (root.header.height ?? 0) when we can depend from 5.15 0267 menuBar.y = Qt.binding(() => -menuBar.height - (root.header.height ? root.header.height : 0)) 0268 } 0269 } 0270 0271 onHeaderChanged: { 0272 if (header) { 0273 header.parent = root.contentItem 0274 if (header instanceof T.ToolBar) { 0275 header.position = T.ToolBar.Header 0276 } else if (header instanceof T.DialogButtonBox) { 0277 header.position = T.DialogButtonBox.Header 0278 } 0279 header.width = Qt.binding(() => root.contentItem.width) 0280 header.y = Qt.binding(() => -header.height) 0281 } 0282 } 0283 0284 onFooterChanged: { 0285 if (footer) { 0286 footer.parent = root.contentItem 0287 if (footer instanceof T.ToolBar) { 0288 footer.position = T.ToolBar.Footer 0289 } else if (footer instanceof T.DialogButtonBox) { 0290 footer.position = T.DialogButtonBox.Footer 0291 } 0292 footer.width = Qt.binding(() => root.contentItem.width) 0293 footer.y = Qt.binding(() => root.contentItem.height) 0294 } 0295 } 0296 0297 onBackgroundChanged: { 0298 if (background) { 0299 background.parent = root.contentItem 0300 background.anchors.fill = background.parent 0301 } 0302 } 0303 0304 onPageStackChanged: pageStack.parent = root.contentItem; 0305 //END signals handlers 0306 0307 LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft 0308 LayoutMirroring.childrenInherit: true 0309 0310 TP.PassiveNotificationsManager { 0311 id: notificationsObject 0312 anchors.bottom: parent.bottom 0313 anchors.horizontalCenter: parent.horizontalCenter 0314 z: 1 0315 } 0316 0317 Item { 0318 anchors.fill: parent 0319 parent: root.parent || root 0320 z: 999999 0321 0322 Item { 0323 id: overlayRoot 0324 z: -1 0325 anchors.fill: parent 0326 } 0327 } 0328 0329 // Don't use root.overlay property here. For one, we know that in a window 0330 // it will always be the same as T.Overlay.overlay; secondly Drawers 0331 // don't care about being contained/parented to anything else anyway. 0332 onGlobalDrawerChanged: { 0333 if (globalDrawer) { 0334 globalDrawer.parent = Qt.binding(() => visible ? T.Overlay.overlay : null); 0335 } 0336 } 0337 onContextDrawerChanged: { 0338 if (contextDrawer) { 0339 contextDrawer.parent = Qt.binding(() => visible ? T.Overlay.overlay : null); 0340 } 0341 } 0342 0343 Window.onWindowChanged: { 0344 if (globalDrawer) { 0345 globalDrawer.visible = globalDrawer.drawerOpen; 0346 } 0347 if (contextDrawer) { 0348 contextDrawer.visible = contextDrawer.drawerOpen; 0349 } 0350 } 0351 0352 implicitWidth: Kirigami.Settings.isMobile ? Kirigami.Units.gridUnit * 30 : Kirigami.Units.gridUnit * 55 0353 implicitHeight: Kirigami.Settings.isMobile ? Kirigami.Units.gridUnit * 45 : Kirigami.Units.gridUnit * 40 0354 visible: true 0355 }