Warning, /network/angelfish/src/contents/ui/desktop/Tabs.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2021 Felipe Kinoshita <kinofhek@gmail.com> 0002 // SPDX-FileCopyrightText: 2023 Michael Lang <criticaltemp@protonmail.com> 0003 // SPDX-License-Identifier: LGPL-2.0-or-later 0004 0005 import QtQuick 2.15 0006 import QtQuick.Controls 2.15 as QQC2 0007 import QtQuick.Layouts 1.15 0008 import org.kde.kirigami 2.19 as Kirigami 0009 0010 import org.kde.angelfish 1.0 0011 0012 RowLayout { 0013 id: tabsComponent 0014 spacing: 0 0015 0016 Shortcut { 0017 sequences: ["Ctrl+Tab", "Ctrl+PgDown"] 0018 onActivated: { 0019 if (listview.currentIndex != listview.count -1) { 0020 tabs.currentIndex++; 0021 } else { 0022 tabs.currentIndex = 0; 0023 } 0024 } 0025 } 0026 Shortcut { 0027 sequences: ["Ctrl+Shift+Tab", "Ctrl+PgUp"] 0028 onActivated: { 0029 if (listview.currentIndex === 0) { 0030 tabs.currentIndex = listview.count - 1; 0031 } else { 0032 tabs.currentIndex--; 0033 } 0034 } 0035 } 0036 0037 Shortcut { 0038 sequence: "Ctrl+W" 0039 onActivated: { 0040 tabs.tabsModel.closeTab(listview.currentIndex); 0041 } 0042 } 0043 0044 Shortcut { 0045 sequence: "Ctrl+1" 0046 onActivated: { 0047 if (listview.currentIndex !== 0) { 0048 tabs.currentIndex = 0; 0049 } 0050 } 0051 } 0052 Shortcut { 0053 sequence: "Ctrl+2" 0054 onActivated: { 0055 if (listview.currentIndex !== 1) { 0056 tabs.currentIndex = 1; 0057 } 0058 } 0059 } 0060 Shortcut { 0061 sequence: "Ctrl+3" 0062 onActivated: { 0063 if (listview.currentIndex !== 2) { 0064 tabs.currentIndex = 2; 0065 } 0066 } 0067 } 0068 Shortcut { 0069 sequence: "Ctrl+4" 0070 onActivated: { 0071 if (listview.currentIndex !== 3) { 0072 tabs.currentIndex = 3; 0073 } 0074 } 0075 } 0076 Shortcut { 0077 sequence: "Ctrl+5" 0078 onActivated: { 0079 if (listview.currentIndex !== 4) { 0080 tabs.currentIndex = 4; 0081 } 0082 } 0083 } 0084 Shortcut { 0085 sequence: "Ctrl+6" 0086 onActivated: { 0087 if (listview.currentIndex !== 5) { 0088 tabs.currentIndex = 5; 0089 } 0090 } 0091 } 0092 Shortcut { 0093 sequence: "Ctrl+7" 0094 onActivated: { 0095 if (listview.currentIndex !== 6) { 0096 tabs.currentIndex = 6; 0097 } 0098 } 0099 } 0100 Shortcut { 0101 sequence: "Ctrl+8" 0102 onActivated: { 0103 if (listview.currentIndex !== 7) { 0104 tabs.currentIndex = 7; 0105 } 0106 } 0107 } 0108 Shortcut { 0109 sequence: "Ctrl+9" 0110 onActivated: { 0111 if (listview.currentIndex !== listview.count - 1) { 0112 tabs.currentIndex = listview.count - 1; 0113 } 0114 } 0115 } 0116 0117 ListView { 0118 id: listview 0119 visible: Settings.showTabBar || listview.count > 1 0120 Layout.fillWidth: true 0121 Layout.preferredHeight: footerItem.height 0122 model: tabs.model 0123 orientation: ListView.Horizontal 0124 currentIndex: tabs.currentIndex 0125 interactive: false 0126 boundsBehavior: Flickable.StopAtBounds 0127 headerPositioning: ListView.OverlayHeader 0128 header: Rectangle { 0129 z: 3 0130 height: parent.height 0131 width: listview.tabScroll ? height : 0 0132 color: Kirigami.Theme.backgroundColor 0133 0134 QQC2.ToolButton { 0135 visible: listview.tabScroll 0136 enabled: !listview.atXBeginning 0137 icon.name: "arrow-left" 0138 onClicked: listview.flick(1000, 0) 0139 onDoubleClicked: listview.flick(5000, 0) 0140 } 0141 } 0142 0143 WheelHandler { 0144 acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad 0145 onWheel: listview.flick(event.angleDelta.y * 10, 0) 0146 } 0147 0148 property int baseWidth: Kirigami.Units.gridUnit * 14 0149 property real tabWidth: baseWidth * Math.min(Math.max(listview.width / (baseWidth * (listview.count + 1)), 0.4), 1) 0150 property bool tabScroll: listview.tabWidth * listview.count > listview.width 0151 0152 delegate: QQC2.ItemDelegate { 0153 id: control 0154 0155 required property int index 0156 0157 highlighted: ListView.isCurrentItem 0158 0159 width: listview.tabWidth 0160 height: tabsComponent.height 0161 0162 onClicked: { 0163 tabs.currentIndex = control.index; 0164 } 0165 0166 background: Rectangle { 0167 implicitHeight: Kirigami.Units.gridUnit * 3 + Kirigami.Units.smallSpacing * 2 0168 color: control.highlighted ? Qt.lighter(Kirigami.Theme.backgroundColor, 1.1) 0169 : (control.hovered ? Qt.darker(Kirigami.Theme.backgroundColor, 1.05) 0170 : Kirigami.Theme.backgroundColor) 0171 Behavior on color { ColorAnimation { duration: Kirigami.Units.shortDuration } } 0172 0173 QQC2.ToolSeparator { 0174 anchors.top: parent.top 0175 anchors.bottom: parent.bottom 0176 anchors.right: parent.right 0177 orientation: Qt.Vertical 0178 } 0179 0180 QQC2.ToolSeparator { 0181 visible: index === 0 0182 anchors.top: parent.top 0183 anchors.bottom: parent.bottom 0184 anchors.left: parent.left 0185 orientation: Qt.Vertical 0186 } 0187 0188 MouseArea { 0189 anchors.fill: parent 0190 0191 acceptedButtons: Qt.AllButtons 0192 0193 onClicked: (mouse) => { 0194 if (mouse.button === Qt.MiddleButton) { 0195 tabs.tabsModel.closeTab(control.index); 0196 } else if (mouse.button === Qt.RightButton) { 0197 tabMenu.index = control.index 0198 if (tabMenu.visible) { 0199 tabMenu.close() 0200 } else { 0201 tabMenu.popup(control) 0202 } 0203 } 0204 } 0205 } 0206 } 0207 0208 contentItem: RowLayout { 0209 id: layout 0210 spacing: Kirigami.Units.smallSpacing 0211 0212 Kirigami.Icon { 0213 id: tabIcon 0214 Layout.alignment: Qt.AlignLeft 0215 Layout.preferredWidth: Kirigami.Units.iconSizes.small 0216 Layout.preferredHeight: width 0217 source: tabs.itemAt(control.index).icon 0218 } 0219 0220 QQC2.Label { 0221 id: titleLabel 0222 Layout.fillWidth: true 0223 Layout.alignment: Qt.AlignLeft 0224 Layout.leftMargin: Kirigami.Units.smallSpacing 0225 Layout.rightMargin: Kirigami.Units.smallSpacing 0226 text: tabs.itemAt(control.index).readerMode ? 0227 i18n("Reader Mode: %1", tabs.itemAt(model.index).readerTitle) 0228 : tabs.itemAt(control.index).title 0229 elide: Text.ElideRight 0230 horizontalAlignment: Text.AlignLeft 0231 } 0232 0233 QQC2.AbstractButton { 0234 visible: control.highlighted || control.width > Kirigami.Units.gridUnit * 8 0235 Layout.alignment: Qt.AlignRight 0236 Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium 0237 Layout.preferredHeight: width 0238 onClicked: tabs.tabsModel.closeTab(model.index) 0239 0240 background: Rectangle { 0241 anchors.fill: parent 0242 radius: height / 2 0243 color: hoverHandler.hovered ? control.background.color : Kirigami.Theme.disabledTextColor 0244 border.width: 4 0245 border.color: control.background.color 0246 } 0247 0248 contentItem: Kirigami.Icon { 0249 source: "tab-close-symbolic" 0250 color: hoverHandler.hovered ? Kirigami.Theme.negativeTextColor : control.background.color 0251 anchors.centerIn: parent 0252 implicitWidth: parent.width 0253 implicitHeight: width 0254 } 0255 0256 QQC2.ToolTip.visible: hoverHandler.hovered 0257 QQC2.ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval 0258 QQC2.ToolTip.text: i18n("Close tab") 0259 0260 HoverHandler { 0261 id: hoverHandler 0262 acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus 0263 } 0264 } 0265 0266 QQC2.ToolTip.visible: hoverHandlerTab.hovered 0267 QQC2.ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval 0268 QQC2.ToolTip.text: titleLabel.text 0269 0270 HoverHandler { 0271 id: hoverHandlerTab 0272 acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus 0273 } 0274 } 0275 } 0276 footerPositioning: listview.tabScroll ? ListView.OverlayFooter : ListView.InlineFooter 0277 footer: Rectangle { 0278 z: 3 0279 height: row.height 0280 width: row.width 0281 color: Kirigami.Theme.backgroundColor 0282 0283 Row { 0284 id: row 0285 QQC2.ToolButton { 0286 visible: listview.tabScroll 0287 enabled: !listview.atXEnd 0288 icon.name: "arrow-right" 0289 onClicked: listview.flick(-1000, 0) 0290 onDoubleClicked: listview.flick(-5000, 0) 0291 } 0292 QQC2.ToolButton { 0293 icon.name: "list-add" 0294 onClicked: tabs.tabsModel.newTab(Settings.newTabUrl) 0295 0296 QQC2.ToolTip.visible: hoverHandler.hovered 0297 QQC2.ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval 0298 QQC2.ToolTip.text: i18n("Open a new tab") 0299 0300 HoverHandler { 0301 id: hoverHandler 0302 acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus 0303 } 0304 } 0305 0306 } 0307 } 0308 add: Transition { 0309 NumberAnimation { property: "opacity"; from: 0; to: 1; duration: Kirigami.Units.longDuration; easing.type: Easing.InQuad } 0310 } 0311 remove: Transition { 0312 NumberAnimation { property: "opacity"; to: 0; duration: Kirigami.Units.longDuration; easing.type: Easing.OutQuad } 0313 } 0314 } 0315 0316 Rectangle { 0317 Layout.alignment: Qt.AlignRight 0318 z: 3 0319 height: listview.footerItem.height 0320 width: height 0321 color: Kirigami.Theme.backgroundColor 0322 0323 QQC2.ToolButton { 0324 id: menuButton 0325 icon.name: "arrow-down" 0326 down: menu.visible 0327 onPressed: menu.visible ? menu.close() : menu.popup(tabsComponent.width, tabsComponent.y + menuButton.height) 0328 0329 QQC2.ToolTip.visible: hoverHandler.hovered 0330 QQC2.ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval 0331 QQC2.ToolTip.text: i18n("List all tabs") 0332 0333 HoverHandler { 0334 id: hoverHandler 0335 acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus 0336 } 0337 } 0338 } 0339 0340 QQC2.Menu { 0341 id: menu 0342 Instantiator { 0343 model: tabs.model 0344 onObjectAdded: (index, object) => menu.insertItem(index, object) 0345 onObjectRemoved: (index, object) => menu.removeItem(object) 0346 delegate: QQC2.MenuItem { 0347 icon.name: tabs.itemAt(model.index).icon 0348 text: tabs.itemAt(model.index).title 0349 onTriggered: { 0350 tabs.currentIndex = model.index; 0351 menu.close(); 0352 } 0353 } 0354 } 0355 } 0356 0357 QQC2.Menu { 0358 id: tabMenu 0359 property int index 0360 0361 Kirigami.Action { 0362 text: i18n("New Tab") 0363 icon.name: "list-add" 0364 shortcut: "Ctrl+T" 0365 onTriggered: tabs.tabsModel.newTab(Settings.newTabUrl) 0366 } 0367 0368 QQC2.MenuSeparator {} 0369 0370 Kirigami.Action { 0371 text: i18n("Reload Tab") 0372 icon.name: "view-refresh" 0373 shortcut: "Ctrl+R" 0374 onTriggered: { 0375 currentWebView.reload(); 0376 } 0377 } 0378 Kirigami.Action { 0379 text: i18n("Duplicate Tab") 0380 icon.name: "tab-duplicate" 0381 onTriggered: tabs.tabsModel.newTab(currentWebView.url) 0382 } 0383 0384 QQC2.MenuSeparator {} 0385 0386 Kirigami.Action { 0387 text: i18n("Bookmark Tab") 0388 icon.name: urlObserver.bookmarked ? "rating" : "rating-unrated" 0389 shortcut: "Ctrl+D" 0390 onTriggered: { 0391 const request = { 0392 url: currentWebView.url, 0393 title: currentWebView.title, 0394 icon: currentWebView.icon 0395 } 0396 BrowserManager.addBookmark(request) 0397 } 0398 } 0399 0400 QQC2.MenuSeparator {} 0401 0402 Kirigami.Action { 0403 text: i18n("Close Tab") 0404 icon.name: "tab-close" 0405 onTriggered: tabs.tabsModel.closeTab(tabMenu.index) 0406 } 0407 } 0408 }