Warning, /network/angelfish/src/contents/ui/Navigation.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2014-2015 Sebastian Kügler <sebas@kde.org>
0002 // SPDX-FileCopyrightText: 2021 Devin Lin <espidev@gmail.com>
0003 //
0004 // SPDX-License-Identifier: GPL-2.0-or-later
0005 
0006 import QtQuick 2.15
0007 import QtQuick.Layouts 1.0
0008 import QtWebEngine 1.4
0009 import QtQuick.Controls 2.0 as Controls
0010 
0011 import org.kde.kirigami 2.5 as Kirigami
0012 import org.kde.angelfish 1.0
0013 
0014 Item {
0015     id: navigation
0016 
0017     height: expandedHeight
0018 
0019     property bool navigationShown: true
0020 
0021     property int expandedHeight: Kirigami.Units.gridUnit * 3
0022     property int buttonSize: Kirigami.Units.gridUnit * 2
0023     property int gestureThreshold: height * 2
0024     
0025     property var tabsSheet
0026     
0027     signal activateUrlEntry;
0028 
0029     Rectangle { anchors.fill: parent; color: Kirigami.Theme.backgroundColor; }
0030     
0031     // left/right gesture icons
0032     Kirigami.Icon {
0033         id: leftGestureIcon
0034         anchors.margins: Kirigami.Units.gridUnit
0035         anchors.left: navigation.left
0036         anchors.top: navigation.top
0037         anchors.bottom: navigation.bottom
0038         implicitWidth: height
0039         
0040         opacity: Math.abs(navContainer.x) / gestureThreshold
0041         source: "arrow-left"
0042         transform: Scale {
0043             origin.x: leftGestureIcon.implicitWidth / 2
0044             origin.y: leftGestureIcon.implicitWidth / 2
0045             xScale: Math.max(0, navContainer.x / gestureThreshold)
0046             yScale: Math.max(0, navContainer.x / gestureThreshold)
0047         }
0048     }
0049     Kirigami.Icon {
0050         id: rightGestureIcon
0051         anchors.margins: Kirigami.Units.gridUnit
0052         anchors.right: navigation.right
0053         anchors.top: navigation.top
0054         anchors.bottom: navigation.bottom
0055         implicitWidth: height
0056         
0057         opacity: Math.abs(navContainer.x) / gestureThreshold
0058         source: "arrow-right"
0059         transform: Scale {
0060             origin.x: rightGestureIcon.implicitWidth / 2
0061             origin.y: rightGestureIcon.implicitWidth / 2
0062             xScale: Math.max(0, -navContainer.x / gestureThreshold)
0063             yScale: Math.max(0, -navContainer.x / gestureThreshold)
0064         }
0065     }
0066     
0067     Item {
0068         id: navContainer
0069         width: navigation.width
0070         height: navigation.height
0071         anchors.bottom: parent.bottom
0072         
0073         opacity: 1 - (Math.abs(navContainer.x) / (gestureThreshold * 2))
0074         
0075         // left/right gestures
0076         HapticsEffectLoader {
0077             id: vibrate
0078         }
0079         DragHandler {
0080             id: dragHandler
0081             target: parent
0082             yAxis.enabled: false
0083             xAxis.enabled: true
0084             xAxis.minimum: currentWebView.canGoForward ? -gestureThreshold : 0
0085             xAxis.maximum: currentWebView.canGoBack ? gestureThreshold : 0
0086             onActiveChanged: {
0087                 xAnimator.restart(); // go back to center
0088                 
0089                 if (parent.x >= gestureThreshold && currentWebView.canGoBack) {
0090                     currentWebView.goBack()
0091                 } else if (parent.x <= -gestureThreshold && currentWebView.canGoForward) {
0092                     currentWebView.goForward()
0093                 }
0094             }
0095         }
0096         NumberAnimation on x {
0097             id: xAnimator
0098             running: !dragHandler.active
0099             duration: Kirigami.Units.longDuration
0100             easing.type: Easing.InOutQuad
0101             to: 0
0102         }
0103         onXChanged: {
0104             if ((x >= gestureThreshold && currentWebView.canGoBack) || (x <= -gestureThreshold && currentWebView.canGoForward)) {
0105                 vibrate.start();
0106             }
0107         }
0108         
0109         RowLayout {
0110             id: layout
0111             anchors.fill: parent
0112             anchors.leftMargin: Kirigami.Units.gridUnit / 2
0113             anchors.rightMargin: Kirigami.Units.gridUnit / 2
0114 
0115             spacing: Kirigami.Units.smallSpacing
0116             Kirigami.Theme.inherit: true
0117             
0118             Controls.ToolButton {
0119                 id: mainMenuButton
0120                 icon.name: rootPage.privateMode ? "view-private" : "application-menu"
0121                 visible: webBrowser.landscape || Settings.navBarMainMenu
0122 
0123                 Layout.preferredWidth: buttonSize
0124                 Layout.preferredHeight: buttonSize
0125 
0126                 Kirigami.Theme.inherit: true
0127 
0128                 onClicked: globalDrawer.open()
0129             }
0130 
0131             Controls.ToolButton {
0132                 visible: webBrowser.landscape || Settings.navBarTabs
0133                 Layout.preferredWidth: buttonSize
0134                 Layout.preferredHeight: buttonSize
0135 
0136                 Rectangle {
0137                     anchors.centerIn: parent
0138                     height: Kirigami.Units.gridUnit * 1.25
0139                     width: Kirigami.Units.gridUnit * 1.25
0140 
0141                     color: "transparent"
0142                     border.color: Kirigami.Theme.textColor
0143                     border.width: Kirigami.Units.gridUnit / 10
0144                     radius: Kirigami.Units.gridUnit / 5
0145 
0146                     Kirigami.Theme.inherit: true
0147 
0148                     Controls.Label {
0149                         anchors.centerIn: parent
0150                         height: Kirigami.Units.gridUnit
0151                         width: Kirigami.Units.gridUnit
0152                         fontSizeMode: Text.Fit
0153                         minimumPixelSize: 0
0154                         minimumPointSize: 0
0155                         clip: true
0156                         text: "%1".arg(tabs.count)
0157                         horizontalAlignment: Text.AlignHCenter
0158                         verticalAlignment: Text.AlignVCenter
0159                         Kirigami.Theme.inherit: true
0160                     }
0161                 }
0162 
0163                 onClicked: tabsSheet.open()
0164             }
0165 
0166             Controls.ToolButton {
0167                 id: backButton
0168 
0169                 Layout.preferredWidth: buttonSize
0170                 Layout.preferredHeight: buttonSize
0171 
0172                 visible: currentWebView.canGoBack && Settings.navBarBack
0173                 icon.name: "go-previous"
0174 
0175                 Kirigami.Theme.inherit: true
0176 
0177                 onClicked: currentWebView.goBack()
0178                 onPressAndHold: {
0179                     historySheet.backHistory = true;
0180                     historySheet.open();
0181                 }
0182             }
0183 
0184             Controls.ToolButton {
0185                 id: forwardButton
0186 
0187                 Layout.preferredWidth: buttonSize
0188                 Layout.preferredHeight: buttonSize
0189 
0190                 visible: currentWebView.canGoForward && Settings.navBarForward
0191                 icon.name: "go-next"
0192 
0193                 Kirigami.Theme.inherit: true
0194 
0195                 onClicked: currentWebView.goForward()
0196                 onPressAndHold: {
0197                     historySheet.backHistory = false;
0198                     historySheet.open();
0199                 }
0200             }
0201 
0202             Controls.ToolButton {
0203                 id: labelItem
0204                 Layout.fillWidth: true
0205                 Layout.preferredHeight: buttonSize
0206 
0207                 property string scheme: UrlUtils.urlScheme(currentWebView.requestedUrl)
0208 
0209                 Controls.ToolButton {
0210                     id: schemeIcon
0211                     anchors.left: parent.left
0212                     anchors.verticalCenter: parent.verticalCenter
0213                     icon.name: {
0214                         if (labelItem.scheme === "https") return "lock";
0215                         if (labelItem.scheme === "http") return "unlock";
0216                         return "";
0217                     }
0218                     visible: icon.name
0219                     height: buttonSize * 0.75
0220                     width: visible ? buttonSize * 0.75 : 0
0221                     Kirigami.Theme.inherit: true
0222                     background: Rectangle {
0223                         implicitWidth: schemeIcon.width
0224                         implicitHeight: schemeIcon.height
0225                         color: "transparent"
0226                     }
0227                     onClicked: activateUrlEntry()
0228                 }
0229 
0230                 Controls.Label {
0231                     anchors.left: schemeIcon.right
0232                     anchors.right: parent.right
0233                     anchors.top: parent.top
0234                     height: parent.height
0235 
0236                     text: {
0237                         if (labelItem.scheme === "http" || labelItem.scheme === "https") {
0238                             return UrlUtils.htmlFormattedUrl(currentWebView.requestedUrl)
0239                         }
0240                         return currentWebView.requestedUrl;
0241                     }
0242                     textFormat: Text.StyledText
0243                     elide: Text.ElideRight
0244                     verticalAlignment: Text.AlignVCenter
0245                     Kirigami.Theme.inherit: true
0246                 }
0247 
0248                 onClicked: activateUrlEntry()
0249             }
0250 
0251             Controls.ToolButton {
0252                 id: reloadButton
0253 
0254                 Layout.preferredWidth: buttonSize
0255                 Layout.preferredHeight: buttonSize
0256 
0257                 visible: Settings.navBarReload
0258                 icon.name: currentWebView.loading ? "process-stop" : "view-refresh"
0259 
0260                 Kirigami.Theme.inherit: true
0261 
0262                 onClicked: currentWebView.loading ? currentWebView.stopLoading() : currentWebView.reload()
0263 
0264             }
0265 
0266             Controls.ToolButton {
0267                 id: optionsButton
0268 
0269                 property string targetState: "overview"
0270 
0271                 Layout.fillWidth: false
0272                 Layout.preferredWidth: buttonSize
0273                 Layout.preferredHeight: buttonSize
0274 
0275                 visible: webBrowser.landscape || Settings.navBarContextMenu
0276                 icon.name: "overflow-menu"
0277 
0278                 Kirigami.Theme.inherit: true
0279 
0280                 onClicked: contextDrawer.open()
0281             }
0282         }
0283     }
0284 
0285     states: [
0286         State {
0287             name: "shown"
0288             when: navigationShown
0289             AnchorChanges {
0290                 target: navigation
0291                 anchors.bottom: navigation.parent.bottom
0292                 anchors.top: undefined
0293             }
0294         },
0295         State {
0296             name: "hidden"
0297             when: !navigationShown
0298             AnchorChanges {
0299                 target: navigation
0300                 anchors.bottom: undefined
0301                 anchors.top: navigation.parent.bottom
0302             }
0303         }
0304     ]
0305     transitions: Transition {
0306         AnchorAnimation {
0307             duration: navigation.visible ? Kirigami.Units.longDuration : 0
0308         }
0309     }
0310 }