Warning, /maui/mauikit/src/controls.5/private/ToastArea.qml is written in an unsupported language. File is not indexed.
0001
0002 /*
0003 * Copyright 2018 Camilo Higuita <milo.h@aol.com>
0004 *
0005 * This program is free software; you can redistribute it and/or modify
0006 * it under the terms of the GNU Library General Public License as
0007 * published by the Free Software Foundation; either version 2, or
0008 * (at your option) any later version.
0009 *
0010 * This program is distributed in the hope that it will be useful,
0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0013 * GNU General Public License for more details
0014 *
0015 * You should have received a copy of the GNU Library General Public
0016 * License along with this program; if not, write to the
0017 * Free Software Foundation, Inc.,
0018 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
0019 */
0020
0021 import QtQuick 2.15
0022 import QtQuick.Controls 2.15
0023 import QtQuick.Layouts 1.3
0024 import QtQuick.Window 2.3
0025
0026 import QtGraphicalEffects 1.12
0027
0028 import QtQml.Models 2.3
0029
0030 import QtMultimedia 5.15
0031
0032 import org.mauikit.controls 1.3 as Maui
0033
0034 Control
0035 {
0036 id: control
0037 focus: true
0038
0039 padding: Maui.Style.contentMargins
0040 visible: _container.count > 0
0041
0042 hoverEnabled: true
0043
0044 property bool autoClose : Window.window.active
0045
0046 SoundEffect
0047 {
0048 id: playSound
0049 source: "qrc:/assets/notification_simple-01.wav"
0050 }
0051
0052 SoundEffect
0053 {
0054 id: _dismissSound
0055 source: "qrc:/assets/notification_simple-02.wav"
0056 }
0057
0058 Keys.enabled: true
0059 Keys.onEscapePressed:
0060 {
0061 control.dismiss()
0062 }
0063
0064 onVisibleChanged:
0065 {
0066 if(visible)
0067 {
0068 control.forceActiveFocus()
0069 }
0070 }
0071
0072 background: MouseArea
0073 {
0074 // opacity: 0.8
0075
0076 onClicked:
0077 {
0078 if(_container.count === 1)
0079 control.dismiss()
0080 }
0081 LinearGradient
0082 {
0083 anchors.fill: parent
0084 start: Qt.point(control.width/2, 0)
0085 end: Qt.point(control.width/2, control.height - _container.height)
0086 gradient: Gradient {
0087 GradientStop { position: 0.0; color: "transparent" }
0088 GradientStop { position: 1.0; color: Maui.Theme.backgroundColor }
0089 }
0090 }
0091 }
0092
0093 Component
0094 {
0095 id: _toastComponent
0096
0097 ItemDelegate
0098 {
0099 id: _toast
0100
0101 Maui.Theme.colorSet: Maui.Theme.View
0102 Maui.Theme.inherit: false
0103
0104 readonly property int mindex : ObjectModel.index
0105 width: ListView.view.width
0106 height: _layout.implicitHeight + topPadding +bottomPadding
0107
0108 hoverEnabled: true
0109
0110 padding: Maui.Style.contentMargins
0111
0112 property alias title : _template.label1.text
0113 property alias iconSource: _template.iconSource
0114 property alias imageSource: _template.imageSource
0115 property alias body: _template.label2.text
0116 property var callback : ({})
0117 property alias buttonText: _button.text
0118 property int timeout : 3500
0119
0120 onClicked: control.remove(mindex)
0121
0122 background: Rectangle
0123 {
0124 radius: Maui.Style.radiusV
0125 color: _toast.hovered? Maui.Theme.hoverColor : Maui.Theme.backgroundColor
0126
0127 layer.enabled: true
0128 layer.effect: DropShadow
0129 {
0130 horizontalOffset: 0
0131 verticalOffset: 0
0132 radius: 8
0133 samples: 16
0134 color: "#80000000"
0135 transparentBorder: true
0136 }
0137 }
0138
0139 Component.onCompleted: _toastTimer.restart()
0140
0141 Timer
0142 {
0143 id: _toastTimer
0144 interval: _toast.timeout + (_toast.mindex * 500)
0145
0146 onTriggered:
0147 {
0148 if(_toast.hovered || _container.hovered || !control.autoClose)
0149 {
0150 _toastTimer.restart()
0151 return;
0152 }
0153 control.remove(_toast.mindex)
0154 }
0155 }
0156
0157 contentItem: ColumnLayout
0158 {
0159 id: _layout
0160 spacing: Maui.Style.space.medium
0161
0162 Maui.ListItemTemplate
0163 {
0164 id: _template
0165 Layout.fillWidth: true
0166 Layout.fillHeight: true
0167 label1.text: Maui.App.about.name
0168 label2.text: ""
0169 label2.wrapMode: Text.Wrap
0170 iconSource: "dialog-warning"
0171 iconSizeHint: Maui.Style.iconSizes.big
0172 }
0173
0174 Button
0175 {
0176 id: _button
0177 visible: _toast.callback instanceof Function
0178 text: i18n("Accept")
0179 Layout.fillWidth: true
0180 onClicked:
0181 {
0182 if(_toast.callback instanceof Function)
0183 {
0184 _toast.callback(_toast.mindex)
0185 }
0186 control.remove(_toast.mindex)
0187 }
0188 }
0189 }
0190
0191 DragHandler
0192 {
0193 id: _dragHandler
0194 yAxis.enabled: false
0195
0196 onActiveChanged:
0197 {
0198 if(!active)
0199 {
0200 if(_dragHandler.centroid.scenePressPosition.x.toFixed(1) - _dragHandler.centroid.scenePosition.x.toFixed(1) > 80)
0201 {
0202 control.remove(_toast.mindex)
0203 }else
0204 {
0205 _toast.x = 0
0206 }
0207 }
0208 }
0209 }
0210 }
0211 }
0212
0213 contentItem: Item
0214 {
0215
0216 Container
0217 {
0218 id: _container
0219
0220 hoverEnabled: true
0221
0222 width: Math.min(400, parent.width)
0223 height: Math.min( _listView.implicitHeight + topPadding + bottomPadding, 500)
0224
0225 anchors.bottom: parent.bottom
0226 anchors.horizontalCenter: parent.horizontalCenter
0227
0228
0229
0230 contentItem: Maui.ListBrowser
0231 {
0232 id: _listView
0233
0234 property bool expanded : true
0235
0236 orientation: ListView.Vertical
0237 snapMode: ListView.SnapOneItem
0238
0239 spacing: Maui.Style.space.medium
0240
0241
0242 model: _container.contentModel
0243
0244 footer: Item
0245 {
0246 width: ListView.view.width
0247 height: Maui.Style.toolBarHeight
0248 Button
0249 {
0250 id: _dimissButton
0251 visible: _container.count > 1
0252 width: parent.width
0253 anchors.centerIn: parent
0254 text: i18n("Dismiss All")
0255 onClicked: control.dismiss()
0256 }
0257 }
0258 }
0259 }
0260 }
0261
0262 function add(icon, title, body, callback, buttonText)
0263 {
0264 const properties = ({
0265 'iconSource': icon,
0266 'title': title,
0267 'body': body,
0268 'callback': callback,
0269 'buttonText': buttonText
0270 })
0271 const object = _toastComponent.createObject(_listView.flickable, properties);
0272 _container.insertItem(0, object)
0273 playSound.play()
0274 }
0275
0276
0277 function dismiss()
0278 {
0279 let count = _container.count
0280 let items = []
0281 for(var i = 0; i< count; i++)
0282 {
0283 items.push(_container.itemAt(i))
0284 }
0285
0286 for(var j of items)
0287 {
0288 _container.removeItem(j)
0289 }
0290
0291 _dismissSound.play()
0292 }
0293
0294 function remove(index)
0295 {
0296 _container.removeItem(_container.itemAt(index))
0297 }
0298 }