diff --git a/src/controls/ApplicationWindow.qml b/src/controls/ApplicationWindow.qml index 64b2f36..d58c4f4 100644 --- a/src/controls/ApplicationWindow.qml +++ b/src/controls/ApplicationWindow.qml @@ -1,437 +1,435 @@ /* * Copyright 2018 Camilo Higuita * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2, 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 Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import QtQuick 2.9 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.3 import QtGraphicalEffects 1.0 import QtQuick.Window 2.3 import org.kde.kirigami 2.7 as Kirigami import org.kde.mauikit 1.0 as Maui import QtQuick.Controls.Material 2.1 import "private" Kirigami.AbstractApplicationWindow { id: root visible: true width: Screen.width * (Kirigami.Settings.isMobile ? 1 : 0.4) height: Screen.height * (Kirigami.Settings.isMobile ? 1 : 0.4) contentItem.anchors.leftMargin: root.sideBar && !root.globalDrawer ? ((root.sideBar.collapsible && root.sideBar.collapsed) ? root.sideBar.collapsedSize : (root.sideBar.modal ? 0 : root.sideBar.width * root.sideBar.position)) : (!root.sideBar && root.globalDrawer && (root.globalDrawer.modal === false) ? root.globalDrawer.width * root.globalDrawer.position : 0) property Maui.AbstractSideBar sideBar /***************************************************/ /******************** ALIASES *********************/ /*************************************************/ property alias headBar : _headBar property alias footBar: _footBar property alias dialog: dialogLoader.item property alias leftIcon : menuBtn property alias rightIcon : searchBtn property alias mainMenu : mainMenu.contentData property alias about : aboutDialog property alias accounts: _accountsDialogLoader.item property var currentAccount: Maui.App.accounts.currentAccount property alias notifyDialog: _notify property alias searchButton : searchBtn property alias menuButton : menuBtn wideScreen: isWide /***************************************************/ /*********************** UI ***********************/ /*************************************************/ property bool isWide : root.width >= Kirigami.Units.gridUnit * 30 property string colorSchemeName : Qt.application.name /***************************************************/ /********************* COLORS *********************/ /*************************************************/ property color headBarBGColor: Kirigami.Theme.backgroundColor property color headBarFGColor: Kirigami.Theme.textColor /***************************************************/ /**************** READONLY PROPS ******************/ /*************************************************/ readonly property bool isMobile : Kirigami.Settings.isMobile readonly property bool isAndroid: Qt.platform.os == "android" readonly property real screenWidth : Screen.width readonly property real screenHeight : Screen.height /***************************************************/ /******************** SIGNALS *********************/ /*************************************************/ signal menuButtonClicked(); signal searchButtonClicked(); onClosing: { if(!isMobile) { const height = root.height const width = root.width const x = root.x const y = root.y Maui.FM.saveSettings("GEOMETRY", Qt.rect(x, y, width, height), "WINDOW") } } property bool isPortrait: Screen.primaryOrientation === Qt.PortraitOrientation || Screen.primaryOrientation === Qt.InvertedPortraitOrientation onIsPortraitChanged: { if(isPortrait) { console.log("PORTARIT MODE CHANGED") width: Screen.width height: Screen.height } } // onHeadBarBGColorChanged: // { // if(!isMobile && colorSchemeName.length > 0) // Maui.KDE.setColorScheme(colorSchemeName, headBarBGColor, headBarFGColor) // else if(isAndroid && headBar.position === ToolBar.Header) // Maui.Android.statusbarColor(headBarBGColor, false) // else if(isAndroid && headBar.position === ToolBar.Footer) // Maui.Android.statusbarColor(Kirigami.Theme.viewBackgroundColor, true) // // } // // onHeadBarFGColorChanged: // { // if(!isAndroid && !isMobile && colorSchemeName.length > 0 && headBar.position === ToolBar.Header) // Maui.KDE.setColorScheme(colorSchemeName, headBarBGColor, headBarFGColor) // else if(isAndroid && headBar.position === ToolBar.Header) // Maui.Android.statusbarColor(headBarBGColor, false) // else if(isAndroid && headBar.position === ToolBar.Footer) // Maui.Android.statusbarColor(Kirigami.Theme.viewBackgroundColor, true) // } /* * background: Rectangle * { * color: bgColor } */ property Maui.ToolBar mheadBar : Maui.ToolBar { id: _headBar visible: count > 1 position: ToolBar.Header width: root.width height: implicitHeight // Kirigami.Theme.backgroundColor: headBarBGColor // Kirigami.Theme.textColor: headBarFGColor // Kirigami.Theme.inherit: true leftContent: [ ToolButton { id: menuBtn icon.name: "application-menu" icon.color: headBarFGColor icon.width: Maui.Style.iconSizes.medium icon.height: Maui.Style.iconSizes.medium checked: mainMenu.visible onClicked: { menuButtonClicked() mainMenu.visible ? mainMenu.close() : mainMenu.popup(parent, parent.x , parent.height+ Maui.Style.space.medium) } Menu { id: mainMenu modal: true z: 999 width: Maui.Style.unit * 200 MenuItem { visible: (_accountCombobox.count > 0) && Maui.App.handleAccounts height: visible ? _accountCombobox.implicitHeight + Maui.Style.space.big : 0 ComboBox { id: _accountCombobox anchors.fill: parent anchors.margins: Maui.Style.space.small popup.z: 999 width: parent.width textRole: "user" flat: true model: Maui.BaseModel { list: Maui.App.accounts } onActivated: Maui.App.accounts.currentAccountIndex = index; Component.onCompleted: { if(_accountCombobox.count > 0) { _accountCombobox.currentIndex = 0 Maui.App.accounts.currentAccountIndex = _accountCombobox.currentIndex } } } } MenuItem { text: qsTr("Accounts") visible: Maui.App.handleAccounts icon.name: "list-add-user" onTriggered: { if(root.accounts) accounts.open() } } MenuSeparator { visible: _accountCombobox.visible } MenuItem { text: qsTr("About") icon.name: "documentinfo" onTriggered: aboutDialog.open() } } - }, - - ToolSeparator{} + } ] rightContent: ToolButton { id: searchBtn icon.name: "edit-find" icon.color: headBarFGColor onClicked: searchButtonClicked() icon.width: Maui.Style.iconSizes.medium icon.height: Maui.Style.iconSizes.medium } } property Maui.ToolBar mfootBar : Maui.ToolBar { id: _footBar visible: count position: ToolBar.Footer width: root.width height: implicitHeight } header: headBar.count && headBar.position === ToolBar.Header ? headBar : null footer: Column { id: _footer visible : children children: { if(headBar.position === ToolBar.Footer && headBar.count && footBar.count) return [footBar , headBar] else if(headBar.position === ToolBar.Footer && headBar.count) return [headBar] else if(footBar.count) return [footBar] else return [] } } Maui.AboutDialog { id: aboutDialog } Loader { id: _accountsDialogLoader source: Maui.App.handleAccounts ? "private/AccountsHelper.qml" : "" } Maui.Dialog { id: _notify property var cb : ({}) verticalAlignment: Qt.AlignTop defaultButtons: _notify.cb !== null rejectButton.visible: false onAccepted: { if(_notify.cb) { _notify.cb() _notify.close() } } page.padding: Maui.Style.space.medium footBar.background: null maxHeight: Math.max(Maui.Style.iconSizes.large + Maui.Style.space.huge, (_notifyLayout.implicitHeight)) + Maui.Style.space.big + footBar.height maxWidth: Kirigami.Settings.isMobile ? parent.width * 0.9 : Maui.Style.unit * 500 widthHint: 0.8 Timer { id: _notifyTimer onTriggered: { if(_mouseArea.containsPress || _mouseArea.containsMouse) return; _notify.close() } } onClosed: _notifyTimer.stop() GridLayout { anchors.fill: parent columns: 2 rows: 1 Item { Layout.fillHeight: true Layout.preferredWidth: Maui.Style.iconSizes.large + Maui.Style.space.big Layout.row: 1 Layout.column: 1 Kirigami.Icon { id: _notifyIcon width: Maui.Style.iconSizes.large height: width anchors.centerIn: parent fallback : "dialog-warning" } } Item { Layout.fillHeight: true Layout.fillWidth: true Layout.margins: Maui.Style.space.medium Layout.row: 1 Layout.column: 2 ColumnLayout { id: _notifyLayout anchors.centerIn: parent width: parent.width Label { id: _notifyTitle Layout.fillHeight: true Layout.fillWidth: true font.weight: Font.Bold font.bold: true font.pointSize:Maui.Style.fontSizes.big elide: Qt.ElideRight wrapMode: Text.NoWrap } Label { id: _notifyBody Layout.fillHeight: true Layout.fillWidth: true font.pointSize:Maui.Style.fontSizes.default elide: Qt.ElideRight wrapMode: Text.Wrap } } } } MouseArea { id: _mouseArea anchors.fill: parent hoverEnabled: true } function show(callback) { _notify.cb = callback || null _notifyTimer.start() _notify.open() } } Loader { id: dialogLoader } Component.onCompleted: { if(isAndroid && headBar.position === ToolBar.Footer) Maui.Android.statusbarColor(Kirigami.Theme.backgroundColor, true) if(!isMobile) { const rect = Maui.FM.loadSettings("GEOMETRY", "WINDOW", Qt.rect(root.x, root.y, root.width, root.height)) root.x = rect.x root.y = rect.y root.width = rect.width root.height = rect.height } } function notify(icon, title, body, callback, timeout, buttonText) { _notifyIcon.source = icon || "emblem-warning" _notifyTitle.text = title _notifyBody.text = body _notifyTimer.interval = timeout ? timeout : 2500 _notify.acceptButton.text = buttonText || qsTr ("Accept") _notify.show(callback) } } diff --git a/src/controls/SelectionBar.qml b/src/controls/SelectionBar.qml index aced876..e60cc17 100644 --- a/src/controls/SelectionBar.qml +++ b/src/controls/SelectionBar.qml @@ -1,390 +1,390 @@ /* * Copyright 2018 Camilo Higuita * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2, 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 Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import QtQuick 2.9 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.3 import org.kde.kirigami 2.7 as Kirigami import org.kde.mauikit 1.0 as Maui import "private" Item { id: control focus: true Kirigami.Theme.inherit: false Kirigami.Theme.colorSet: Kirigami.Theme.Complementary readonly property int barHeight : Maui.Style.iconSizes.large + (Maui.Style.space.large * 1.5) property var selectedPaths: [] property var selectedItems: [] property alias selectionList : selectionList property alias anim : anim property alias model : selectionList.model property alias count : selectionList.count property color animColor : "black" property int position: Qt.Horizontal property string iconName : "overflow-menu" property bool iconVisible: true /** * if singleSelection is set to true then only a single item is selected * at time, and replaced with a newe item appended **/ property bool singleSelection: false signal iconClicked() signal cleared() signal exitClicked() signal itemClicked(int index) signal itemPressAndHold(int index) signal itemAdded(var item) signal itemRemoved(var item) signal pathAdded(string path) signal pathRemoved(string path) signal clicked(var mouse) signal rightClicked(var mouse) implicitHeight: if(position === Qt.Horizontal) barHeight else if(position === Qt.Vertical) parent.height else undefined implicitWidth: if(position === Qt.Horizontal) parent.width else if(position === Qt.Vertical) barHeight else undefined visible: control.count > 0 Rectangle { id: bg anchors.fill: parent color: Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 0.6) radius: Maui.Style.radiusV opacity: 1 border.color: Kirigami.Theme.backgroundColor MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton | Qt.LeftButton onClicked: { if(!Kirigami.Settings.isMobile && mouse.button === Qt.RightButton) control.rightClicked(mouse) else control.clicked(mouse) } onPressAndHold : { if(Kirigami.Settings.isMobile) control.rightClicked(mouse) } } SequentialAnimation { id: anim PropertyAnimation { target: bg property: "opacity" easing.type: Easing.InOutQuad from: 0.5 to: 1 duration: 600 } } } Maui.Badge { anchors.verticalCenter: parent.top anchors.horizontalCenter: parent.left iconName: "qrc://assets/dialog-close.svg" Kirigami.Theme.backgroundColor: Kirigami.Theme.negativeTextColor Kirigami.Theme.textColor: Kirigami.Theme.highlightedTextColor z: parent.z +1 onClicked: { clear() exitClicked() } } Maui.Badge { Kirigami.Theme.backgroundColor: Kirigami.Theme.highlightColor text: selectionList.count z: parent.z +1 anchors.verticalCenter: parent.top anchors.horizontalCenter: parent.right onClicked: clear() } GridLayout { anchors.fill: parent anchors.margins: Maui.Style.space.small rows: if(position === Qt.Horizontal) 1 else if(position === Qt.Vertical) 4 else undefined columns: if(position === Qt.Horizontal) 4 else if(position === Qt.Vertical) 1 else undefined Item { Layout.fillHeight: true Layout.fillWidth: true Layout.leftMargin: Maui.Style.space.small Layout.column: if(position === Qt.Horizontal) 2 else if(position === Qt.Vertical) 1 else undefined Layout.row: if(position === Qt.Horizontal) 1 else if(position === Qt.Vertical) 2 else undefined ListView { id: selectionList anchors.fill: parent highlightFollowsCurrentItem: true highlightMoveDuration: 0 keyNavigationEnabled: true interactive: Kirigami.Settings.isMobile boundsBehavior: !Kirigami.Settings.isMobile? Flickable.StopAtBounds : Flickable.OvershootBounds orientation: if(position === Qt.Horizontal) ListView.Horizontal else if(position === Qt.Vertical) ListView.Vertical else undefined clip: true focus: true spacing: Maui.Style.space.small ScrollBar.horizontal: ScrollBar { policy: Kirigami.Settings.isMobile? Qt.ScrollBarAlwaysOff : Qt.ScrollBarAsNeeded } model: ListModel{} delegate: Maui.GridBrowserDelegate { id: delegate isCurrentItem: ListView.isCurrentItem height: selectionList.height * 0.95 - width: height + Maui.Style.space.big + width: height + Maui.Style.space.medium folderSize: Maui.Style.iconSizes.big showLabel: true keepEmblemOverlay: true leftEmblem: "list-remove" showEmblem: !Kirigami.Settings.isMobile showTooltip: true showThumbnails: true emblemSize: Maui.Style.iconSizes.small Kirigami.Theme.backgroundColor: "transparent" Kirigami.Theme.textColor: control.Kirigami.Theme.textColor Connections { target: delegate onLeftEmblemClicked: removeAtIndex(index) onClicked: control.itemClicked(index) onPressAndHold: control.itemPressAndHold(index) } } } } Item { Layout.fillWidth: position === Qt.Vertical Layout.fillHeight: position === Qt.Horizontal Layout.preferredWidth: Maui.Style.iconSizes.medium Layout.preferredHeight: Maui.Style.iconSizes.medium Layout.column: if(position === Qt.Horizontal) 3 else if(position === Qt.Vertical) 1 else undefined Layout.row: if(position === Qt.Horizontal) 1 else if(position === Qt.Vertical) 3 else undefined Layout.margins: Maui.Style.space.medium ToolButton { visible: iconVisible anchors.centerIn: parent icon.name: control.iconName icon.color: control.Kirigami.Theme.textColor onClicked: iconClicked() } } } onVisibleChanged: { if(position === Qt.Vertical) return } Keys.onEscapePressed: { control.exitClicked(); event.accepted = true } Keys.onBackPressed: { control.exitClicked(); event.accepted = true } function clear() { selectedPaths = [] selectedItems = [] selectionList.model.clear() control.cleared() } function itemAt(index) { if(index < 0 || index > selectionList.count) return return selectionList.model.get(index) } function removeAtIndex(index) { if(index < 0) return const item = selectionList.model.get(index) const path = item.path if(contains(path)) { selectedPaths.splice(index, 1) selectedItems.splice(index, 1) selectionList.model.remove(index) control.itemRemoved(item) control.pathRemoved(path) } } function removeAtPath(path) { removeAtIndex(indexOf(path)) } function indexOf(path) { return control.selectedPaths.indexOf(path) } function append(item) { const index = selectedPaths.indexOf(item.path) if(index < 0) { if(control.singleSelection) clear() selectedItems.push(item) selectedPaths.push(item.path) selectionList.model.append(item) selectionList.positionViewAtEnd() selectionList.currentIndex = selectionList.count - 1 control.itemAdded(item) control.pathAdded(item.path) }else { selectionList.currentIndex = index // notify(item.icon, qsTr("Item already selected!"), String("The item '%1' is already in the selection box").arg(item.label), null, 4000) } animate(Kirigami.Theme.backgroundColor) } function animate(color) { animColor = color anim.running = true } function getSelectedPathsString() { return String(""+selectedPaths.join(",")) } function contains(path) { return control.selectedPaths.includes(path) } } diff --git a/src/controls/ToolActions.qml b/src/controls/ToolActions.qml index a5a771b..c515f51 100644 --- a/src/controls/ToolActions.qml +++ b/src/controls/ToolActions.qml @@ -1,175 +1,174 @@ import QtQuick 2.9 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 import QtQml.Models 2.3 import QtQml 2.1 import org.kde.kirigami 2.7 as Kirigami import org.kde.mauikit 1.0 as Maui MouseArea { id: control implicitWidth: _layout.implicitWidth + Maui.Style.space.medium implicitHeight: parent.height default property list actions property bool autoExclusive: true property int direction : Qt.Vertical property Action currentAction : actions[0] property bool expanded : false // Rectangle // { // anchors.fill: parent // color: control.expanded ? "#333" : "transparent" // opacity: 0.1 // radius: Math.min(Maui.Style.radiusV, height) // // Behavior on color // { // ColorAnimation // { // duration: Kirigami.Units.longDuration // } // } // } onClicked: { control.expanded = !control.expanded } Row { id: _layout height: parent.height spacing: Maui.Style.space.small anchors.centerIn: parent ToolButton { icon.name: control.currentAction.icon.name - text: " " onClicked: control.expanded = !control.expanded - - Kirigami.Icon + text: " " + indicator: Kirigami.Icon { anchors { right: parent.right verticalCenter: parent.verticalCenter } color: control.Kirigami.Theme.textColor source: "qrc://assets/arrow-down.svg" width: Maui.Style.iconSizes.small height: width isMask: true - } + } } Loader { id: _loader height: parent.height sourceComponent: control.direction === Qt.Horizontal ? _rowComponent : (control.direction === Qt.Vertical ? _menuComponent : "") } } Component { id: _rowComponent Row { id: _row width: control.expanded ? implicitWidth : 0 spacing: Maui.Style.space.medium clip: true height: parent.height Behavior on width { NumberAnimation { duration: Kirigami.Units.longDuration easing.type: Easing.InOutQuad } } Kirigami.Separator { width: 1 height: parent.height * 0.7 anchors.verticalCenter: parent.verticalCenter } Repeater { model: control.actions ToolButton { action: modelData autoExclusive: control.autoExclusive anchors.verticalCenter: parent.verticalCenter onClicked: { control.currentAction = action control.expanded = false } } } } } Component { id: _menuComponent Menu { id: _actionsMenu Connections { target: control onExpandedChanged: { if(control.expanded) _actionsMenu.popup(0, parent.height) else _actionsMenu.close() } } onClosed: control.expanded = false closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent Repeater { model: control.actions MenuItem { action: modelData autoExclusive: control.autoExclusive Connections { target: modelData onTriggered: control.currentAction = action } } } } } } diff --git a/src/controls/ToolBar.qml b/src/controls/ToolBar.qml index da1e2c9..1c8b38d 100644 --- a/src/controls/ToolBar.qml +++ b/src/controls/ToolBar.qml @@ -1,297 +1,297 @@ /* * Copyright 2018 Camilo Higuita * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2, 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 Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import QtQuick 2.6 import QtQuick.Controls 2.2 import org.kde.kirigami 2.7 as Kirigami import org.kde.mauikit 1.0 as Maui import QtQuick.Layouts 1.3 import QtGraphicalEffects 1.0 import "private" ToolBar { id: control implicitHeight: visible ? Maui.Style.toolBarHeight : 0 height: implicitHeight - spacing: Maui.Style.space.medium + spacing: Maui.Style.space.tiny padding: 0 property alias stickyRightContent : rightRowContent.sticky property alias stickyLeftContent : leftRowContent.sticky property alias stickyMiddleContent : middleRowContent.sticky property alias leftContent : leftRowContent.data property alias middleContent : middleRowContent.data property alias rightContent : rightRowContent.data property alias middleLayout : middleRowContent property alias leftLayout : leftRowContent property alias rightLayout : rightRowContent property alias layout : layout readonly property alias fits : mainFlickable.fits property int margins: Maui.Style.space.medium property int count : leftContent.length + middleContent.length + rightContent.length property bool flickable: true property bool strech : true property bool leftSretch: strech property bool rightSretch: strech property bool middleStrech: strech // leftPadding: Kirigami.Units.smallSpacing*2 // rightPadding: Kirigami.Units.smallSpacing*2 // background: Rectangle // { // id: headBarBG // color: colorScheme.backgroundColor // implicitHeight: Maui.Style.toolBarHeightAlt // radius: floating ? Maui.Style.radiusV : 0 // border.color: floating ? colorScheme.borderColor : "transparent" // // SequentialAnimation on radius // { // ColorAnimation { to: colorScheme.backgroundColor ; duration: 1000 } // } // // Kirigami.Separator // { // visible: drawBorder // color: colorScheme.borderColor // height: Maui.Style.unit // anchors // { // left: parent.left // right: parent.right // bottom: control.position == ToolBar.Footer ? undefined : parent.bottom // top: control.position == ToolBar.Footer ? parent.top : undefined // } // } // // layer.enabled: dropShadow // layer.effect: DropShadow // { // anchors.fill: headBarBG // horizontalOffset: 0 // verticalOffset: Maui.Style.unit * (altToolBars ? -1 : 1) // radius: 8 // samples: 25 // color: Qt.darker(colorScheme.backgroundColor, 1.4) // source: headBarBG // } // } MouseArea { id: _rightFlickRec width: Maui.Style.iconSizes.medium height: parent.height visible: !mainFlickable.atXEnd && !mainFlickable.fits && control.flickable hoverEnabled: true anchors { top: parent.top bottom: parent.bottom right: parent.right } z: 999 EdgeShadow { visible: true parent: parent edge: Qt.RightEdge anchors { right: parent.right top: parent.top bottom: parent.bottom } opacity: 1 Behavior on opacity { NumberAnimation { duration: Kirigami.Units.longDuration easing.type: Easing.InOutQuad } } } Kirigami.Icon { anchors.centerIn: parent source: "toolbar-expand-right" width: Maui.Style.iconSizes.small height: Maui.Style.iconSizes.small color: _rightFlickRec.hovered ? Kirigami.Theme.highlightColor : Kirigami.Theme.textColor } enabled: !mainFlickable.atXEnd opacity: enabled ? 1 : 0.4 onClicked: { if(!mainFlickable.atXEnd) mainFlickable.contentX += control.height if(mainFlickable.atXEnd) mainFlickable.returnToBounds() } } MouseArea { id: _leftFlickRec width: Maui.Style.iconSizes.medium height: parent.height visible: !mainFlickable.atXBeginning && !mainFlickable.fits && control.flickable hoverEnabled: true anchors { top: parent.top bottom: parent.bottom left: parent.left } z: 999 EdgeShadow { visible: true parent: parent edge: Qt.LeftEdge anchors { left: parent.left top: parent.top bottom: parent.bottom } opacity: 1 Behavior on opacity { NumberAnimation { duration: Kirigami.Units.longDuration easing.type: Easing.InOutQuad } } } Kirigami.Icon { anchors.centerIn: parent source: "toolbar-expand-left" width: Maui.Style.iconSizes.small height: Maui.Style.iconSizes.small color: _leftFlickRec.hovered ? Kirigami.Theme.highlightColor : Kirigami.Theme.textColor } enabled: !mainFlickable.atXBeginning opacity: enabled ? 1 : 0.4 onClicked: { if(!mainFlickable.atXBeginning) mainFlickable.contentX -= control.height if(mainFlickable.atXBeginning) mainFlickable.returnToBounds() } } Flickable { id: mainFlickable property bool fits : contentWidth < control.width onFitsChanged: returnToBounds() anchors.fill: parent anchors.leftMargin: !fits && _leftFlickRec.visible && control.flickable && !Kirigami.Settings.isMobile ? _leftFlickRec.width : margins anchors.rightMargin: !fits && _rightFlickRec.visible && control.flickable && !Kirigami.Settings.isMobile ? _rightFlickRec.width : margins flickableDirection: Flickable.HorizontalFlick interactive: !fits && Kirigami.Settings.isMobile contentWidth: ((control.margins) + Maui.Style.space.medium) + (control.stickyLeftContent ? leftRowContent.implicitWidth : leftRowContent.width) + (control.stickyMiddleContent ? middleRowContent.implicitWidth : middleRowContent.width) + (control.stickyRightContent ? rightRowContent.implicitWidth : rightRowContent.width) boundsBehavior: Kirigami.Settings.isMobile ? Flickable.DragOverBounds : Flickable.StopAtBounds clip: true RowLayout { id: layout width: control.width - control.margins - Maui.Style.space.medium height: control.height RowLayout { id: leftRowContent // visible: control.leftSretch && implicitWidth property bool sticky : false Layout.leftMargin: rightRowContent.implicitWidth && implicitWidth === 0 && middleRowContent.implicitWidth && control.leftSretch ? rightRowContent.implicitWidth : undefined Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft spacing: leftContent.length > 0 ? control.spacing : 0 Layout.minimumWidth: !sticky ? undefined : implicitWidth Layout.fillWidth: control.leftSretch && implicitWidth Layout.fillHeight: true } RowLayout { id: middleRowContent property bool sticky : false // visible: control.middleStrech && implicitWidth Layout.alignment: Qt.AlignCenter spacing: middleContent.length === 1 ? 0 : control.spacing Layout.minimumWidth: !sticky ? undefined : implicitWidth // Layout.maximumWidth: control.width - leftRowContent.implicitWidth - rightRowContent.implicitWidth Layout.fillWidth: control.middleStrech Layout.fillHeight: true } RowLayout { id: rightRowContent // visible: control.rightSretch && implicitWidth property bool sticky : false Layout.rightMargin: leftRowContent.implicitWidth && implicitWidth === 0 && middleRowContent.implicitWidth && control.rightSretch ? leftRowContent.implicitWidth : undefined Layout.alignment: Qt.AlignVCenter | Qt.AlignRight spacing: rightContent.length > 0 ? control.spacing : 0 Layout.minimumWidth: !sticky ? undefined : implicitWidth // Layout.maximumWidth: !sticky ? rightRowContent.width : implicitWidth Layout.fillWidth: control.rightSretch && implicitWidth Layout.fillHeight: true } } // ScrollBar.horizontal: ScrollBar { visible: false} } } diff --git a/src/controls/ToolButtonMenu.qml b/src/controls/ToolButtonMenu.qml index ff6d45d..e32985d 100644 --- a/src/controls/ToolButtonMenu.qml +++ b/src/controls/ToolButtonMenu.qml @@ -1,49 +1,49 @@ import QtQuick 2.9 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 import QtQml.Models 2.3 import QtQml 2.1 import org.kde.kirigami 2.7 as Kirigami import org.kde.mauikit 1.0 as Maui ToolButton { id: control default property list content checked: _menu.visible checkable: false - text: " " display: ToolButton.TextBesideIcon - + text: " " onClicked: { if(_menu.visible) _menu.close() else _menu.popup(0, height) } - Kirigami.Icon + indicator: Kirigami.Icon { anchors { right: parent.right +// bottom: parent.bottom verticalCenter: parent.verticalCenter } color: control.Kirigami.Theme.textColor source: "qrc://assets/arrow-down.svg" width: Maui.Style.iconSizes.small height: width isMask: true } Menu { id: _menu closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent contentData: control.content } }