2020-10-07 20:14:55 +00:00
|
|
|
import QtQuick 2.13
|
|
|
|
import QtQuick.Controls 2.13
|
|
|
|
import QtQuick.Layouts 1.13
|
|
|
|
import Qt.labs.settings 1.0
|
|
|
|
import QtQuick.Controls.Styles 1.0
|
2020-10-08 15:31:53 +00:00
|
|
|
import QtWebEngine 1.10
|
2021-10-20 09:45:38 +00:00
|
|
|
|
2021-09-28 15:04:06 +00:00
|
|
|
import utils 1.0
|
2021-10-27 21:27:49 +00:00
|
|
|
import shared.controls 1.0
|
2021-10-20 09:45:38 +00:00
|
|
|
import StatusQ.Controls 0.1 as StatusQControls
|
|
|
|
|
2021-10-27 21:27:49 +00:00
|
|
|
import shared 1.0
|
|
|
|
import shared.panels 1.0
|
|
|
|
import shared.status 1.0
|
2021-10-20 09:45:38 +00:00
|
|
|
|
2021-09-30 09:43:29 +00:00
|
|
|
import "../popups"
|
|
|
|
import "../controls"
|
2020-10-07 20:14:55 +00:00
|
|
|
|
2020-10-08 15:31:53 +00:00
|
|
|
Rectangle {
|
2021-09-30 09:43:29 +00:00
|
|
|
id: browserHeader
|
|
|
|
|
|
|
|
property alias favoriteComponent: favoritesBarLoader.sourceComponent
|
2020-10-08 18:08:50 +00:00
|
|
|
property alias addressBar: addressBar
|
2021-09-30 09:43:29 +00:00
|
|
|
|
2020-10-08 15:31:53 +00:00
|
|
|
readonly property int innerMargin: 12
|
2021-09-30 09:43:29 +00:00
|
|
|
property var currentFavorite
|
2020-10-09 17:56:42 +00:00
|
|
|
property var addNewTab: function () {}
|
2021-09-30 09:43:29 +00:00
|
|
|
property string dappBrowserAccName: ""
|
|
|
|
property string dappBrowserAccIcon: ""
|
|
|
|
|
|
|
|
signal addNewFavoritelClicked(var xPos)
|
2020-10-07 20:14:55 +00:00
|
|
|
|
|
|
|
width: parent.width
|
2020-12-29 17:10:22 +00:00
|
|
|
height: barRow.height + favoritesBarLoader.height
|
2020-10-08 15:31:53 +00:00
|
|
|
color: Style.current.background
|
|
|
|
border.width: 0
|
2020-10-07 20:14:55 +00:00
|
|
|
|
|
|
|
RowLayout {
|
2020-12-29 17:10:22 +00:00
|
|
|
id: barRow
|
|
|
|
width: parent.width
|
|
|
|
height: 45
|
2021-09-30 09:43:29 +00:00
|
|
|
spacing: browserHeader.innerMargin
|
2020-10-07 20:14:55 +00:00
|
|
|
|
|
|
|
Menu {
|
|
|
|
id: historyMenu
|
|
|
|
Instantiator {
|
|
|
|
model: currentWebView && currentWebView.navigationHistory.items
|
|
|
|
MenuItem {
|
|
|
|
text: model.title
|
|
|
|
onTriggered: currentWebView.goBackOrForward(model.offset)
|
|
|
|
checkable: !enabled
|
|
|
|
checked: !enabled
|
|
|
|
enabled: model.offset
|
|
|
|
}
|
|
|
|
onObjectAdded: function(index, object) {
|
|
|
|
historyMenu.insertItem(index, object)
|
|
|
|
}
|
|
|
|
onObjectRemoved: function(index, object) {
|
|
|
|
historyMenu.removeItem(object)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-18 10:34:16 +00:00
|
|
|
StatusQControls.StatusFlatRoundButton {
|
2020-10-07 20:14:55 +00:00
|
|
|
id: backButton
|
2021-10-18 10:34:16 +00:00
|
|
|
width: 32
|
|
|
|
height: 32
|
|
|
|
icon.height: 20
|
|
|
|
icon.width: 20
|
|
|
|
icon.name: "left"
|
|
|
|
icon.disabledColor: Style.current.lightGrey
|
|
|
|
type: StatusQControls.StatusFlatRoundButton.Type.Tertiary
|
|
|
|
enabled: currentWebView && currentWebView.canGoBack
|
|
|
|
Layout.leftMargin: browserHeader.innerMargin
|
2020-10-07 20:14:55 +00:00
|
|
|
onClicked: currentWebView.goBack()
|
|
|
|
onPressAndHold: {
|
|
|
|
if (currentWebView && (currentWebView.canGoBack || currentWebView.canGoForward)){
|
|
|
|
historyMenu.popup(backButton.x, backButton.y + backButton.height)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-18 10:34:16 +00:00
|
|
|
StatusQControls.StatusFlatRoundButton {
|
2020-10-07 20:14:55 +00:00
|
|
|
id: forwardButton
|
2021-10-18 10:34:16 +00:00
|
|
|
width: 32
|
|
|
|
height: 32
|
|
|
|
icon.width: 20
|
|
|
|
icon.height: 20
|
|
|
|
icon.name: "right"
|
|
|
|
icon.disabledColor: Style.current.lightGrey
|
|
|
|
type: StatusQControls.StatusFlatRoundButton.Type.Tertiary
|
|
|
|
enabled: currentWebView && currentWebView.canGoForward
|
|
|
|
Layout.leftMargin: -browserHeader.innerMargin/2
|
2020-10-07 20:14:55 +00:00
|
|
|
onClicked: currentWebView.goForward()
|
|
|
|
onPressAndHold: {
|
|
|
|
if (currentWebView && (currentWebView.canGoBack || currentWebView.canGoForward)){
|
|
|
|
historyMenu.popup(forwardButton.x, forwardButton.y + forwardButton.height)
|
|
|
|
}
|
|
|
|
}
|
2020-10-29 19:02:32 +00:00
|
|
|
}
|
|
|
|
|
2020-10-07 20:14:55 +00:00
|
|
|
StyledTextField {
|
|
|
|
id: addressBar
|
2020-10-08 15:31:53 +00:00
|
|
|
height: 40
|
2020-10-07 20:14:55 +00:00
|
|
|
Layout.fillWidth: true
|
|
|
|
background: Rectangle {
|
2020-10-08 15:31:53 +00:00
|
|
|
color: Style.current.inputBackground
|
|
|
|
border.color: Style.current.inputBorderFocus
|
|
|
|
border.width: activeFocus ? 1 : 0
|
|
|
|
radius: 20
|
2020-10-07 20:14:55 +00:00
|
|
|
}
|
2020-10-08 15:31:53 +00:00
|
|
|
leftPadding: Style.current.padding
|
2021-02-18 16:36:05 +00:00
|
|
|
//% "Enter URL"
|
|
|
|
placeholderText: qsTrId("enter-url")
|
2020-10-07 20:14:55 +00:00
|
|
|
focus: true
|
|
|
|
text: ""
|
2020-10-08 15:31:53 +00:00
|
|
|
color: Style.current.textColor
|
2021-04-19 14:02:59 +00:00
|
|
|
onActiveFocusChanged: {
|
|
|
|
if (activeFocus) {
|
|
|
|
addressBar.selectAll()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-07 20:14:55 +00:00
|
|
|
Keys.onPressed: {
|
|
|
|
// TODO: disable browsing local files? file://
|
2021-01-04 21:32:36 +00:00
|
|
|
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
|
2021-10-20 09:50:50 +00:00
|
|
|
if (localAccountSensitiveSettings.useBrowserEthereumExplorer !== Constants.browserEthereumExplorerNone && text.startsWith("0x")) {
|
|
|
|
switch (localAccountSensitiveSettings.useBrowserEthereumExplorer) {
|
2021-01-04 21:32:36 +00:00
|
|
|
case Constants.browserEthereumExplorerEtherscan:
|
|
|
|
if (text.length > 42) {
|
|
|
|
currentWebView.url = "https://etherscan.io/tx/" + text; break;
|
|
|
|
} else {
|
|
|
|
currentWebView.url = "https://etherscan.io/address/" + text; break;
|
|
|
|
}
|
|
|
|
case Constants.browserEthereumExplorerEthplorer:
|
|
|
|
if (text.length > 42) {
|
|
|
|
currentWebView.url = "https://ethplorer.io/tx/" + text; break;
|
|
|
|
} else {
|
|
|
|
currentWebView.url = "https://ethplorer.io/address/" + text; break;
|
|
|
|
}
|
|
|
|
case Constants.browserEthereumExplorerBlockchair:
|
|
|
|
if (text.length > 42) {
|
|
|
|
currentWebView.url = "https://blockchair.com/ethereum/transaction/" + text; break;
|
|
|
|
} else {
|
|
|
|
currentWebView.url = "https://blockchair.com/ethereum/address/" + text; break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
2021-10-20 09:50:50 +00:00
|
|
|
if (localAccountSensitiveSettings.shouldShowBrowserSearchEngine !== Constants.browserSearchEngineNone && !Utils.isURL(text) && !Utils.isURLWithOptionalProtocol(text)) {
|
|
|
|
switch (localAccountSensitiveSettings.shouldShowBrowserSearchEngine) {
|
2021-01-04 21:13:41 +00:00
|
|
|
case Constants.browserSearchEngineGoogle: currentWebView.url = "https://www.google.com/search?q=" + text; break;
|
|
|
|
case Constants.browserSearchEngineYahoo: currentWebView.url = "https://search.yahoo.com/search?p=" + text; break;
|
|
|
|
case Constants.browserSearchEngineDuckDuckGo: currentWebView.url = "https://duckduckgo.com/?q=" + text; break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
2021-04-19 10:34:03 +00:00
|
|
|
} else if (Utils.isURLWithOptionalProtocol(text)) {
|
|
|
|
text = "https://" + text
|
2021-01-04 21:13:41 +00:00
|
|
|
}
|
|
|
|
|
2020-10-07 20:14:55 +00:00
|
|
|
currentWebView.url = determineRealURL(text);
|
|
|
|
}
|
|
|
|
}
|
2020-10-08 15:31:53 +00:00
|
|
|
|
2021-10-18 10:34:16 +00:00
|
|
|
StatusQControls.StatusFlatRoundButton {
|
2020-10-29 19:02:32 +00:00
|
|
|
id: addFavoriteBtn
|
2021-10-18 10:34:16 +00:00
|
|
|
width: 24
|
|
|
|
height: 24
|
2020-10-29 19:02:32 +00:00
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
anchors.right: reloadBtn.left
|
|
|
|
anchors.rightMargin: Style.current.halfPadding
|
2021-10-18 10:34:16 +00:00
|
|
|
visible: !!currentWebView && !!currentWebView.url
|
|
|
|
icon.source: !!browserHeader.currentFavorite ? Style.svg("browser/favoriteActive") : Style.svg("browser/favorite")
|
|
|
|
color: "transparent"
|
|
|
|
type: StatusQControls.StatusFlatRoundButton.Type.Tertiary
|
2021-09-30 09:43:29 +00:00
|
|
|
onClicked: addNewFavoritelClicked(addFavoriteBtn.x)
|
2020-10-29 19:02:32 +00:00
|
|
|
}
|
|
|
|
|
2021-10-18 10:34:16 +00:00
|
|
|
StatusQControls.StatusFlatRoundButton {
|
2020-10-29 19:02:32 +00:00
|
|
|
id: reloadBtn
|
2021-10-18 10:34:16 +00:00
|
|
|
width: 24
|
|
|
|
height: 24
|
2020-10-08 15:31:53 +00:00
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
anchors.right: parent.right
|
|
|
|
anchors.rightMargin: Style.current.halfPadding
|
2021-10-18 10:34:16 +00:00
|
|
|
icon.name: currentWebView && currentWebView.loading ? "close-circle" : "refresh"
|
|
|
|
color: "transparent"
|
|
|
|
type: StatusQControls.StatusFlatRoundButton.Type.Tertiary
|
2020-10-08 15:31:53 +00:00
|
|
|
onClicked: currentWebView && currentWebView.loading ? currentWebView.stop() : currentWebView.reload()
|
|
|
|
}
|
2020-10-07 20:14:55 +00:00
|
|
|
}
|
|
|
|
|
2020-10-15 17:05:34 +00:00
|
|
|
BrowserWalletMenu {
|
|
|
|
id: browserWalletMenu
|
2021-09-30 09:43:29 +00:00
|
|
|
y: browserHeader.height + browserHeader.anchors.topMargin
|
2020-10-15 17:05:34 +00:00
|
|
|
x: parent.width - width - Style.current.halfPadding
|
|
|
|
}
|
|
|
|
|
2020-10-19 20:26:16 +00:00
|
|
|
Loader {
|
|
|
|
active: true
|
|
|
|
sourceComponent: currentTabConnected ? connectedBtnComponent : notConnectedBtnCompoent
|
|
|
|
}
|
|
|
|
|
|
|
|
Component {
|
|
|
|
id: notConnectedBtnCompoent
|
2021-10-18 10:34:16 +00:00
|
|
|
StatusQControls.StatusFlatRoundButton {
|
2020-10-19 20:26:16 +00:00
|
|
|
id: accountBtn
|
2021-10-18 10:34:16 +00:00
|
|
|
width: 24
|
|
|
|
height: 24
|
|
|
|
icon.width: 24
|
|
|
|
icon.height: 24
|
|
|
|
icon.name: "filled-account"
|
|
|
|
type: StatusQControls.StatusFlatRoundButton.Type.Tertiary
|
2020-10-19 20:26:16 +00:00
|
|
|
onClicked: {
|
|
|
|
if (browserWalletMenu.opened) {
|
|
|
|
browserWalletMenu.close()
|
|
|
|
} else {
|
|
|
|
browserWalletMenu.open()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Component {
|
|
|
|
id: connectedBtnComponent
|
2021-10-20 09:45:38 +00:00
|
|
|
StatusQControls.StatusFlatButton {
|
2020-10-19 20:26:16 +00:00
|
|
|
id: accountBtnConnected
|
2021-10-20 09:45:38 +00:00
|
|
|
icon.name: "wallet"
|
2020-10-19 20:26:16 +00:00
|
|
|
icon.width: 18
|
|
|
|
icon.height: 18
|
2021-09-30 09:43:29 +00:00
|
|
|
icon.color: dappBrowserAccIcon
|
|
|
|
text: dappBrowserAccName
|
2020-10-19 20:26:16 +00:00
|
|
|
onClicked: {
|
|
|
|
if (browserWalletMenu.opened) {
|
|
|
|
browserWalletMenu.close()
|
|
|
|
} else {
|
|
|
|
browserWalletMenu.open()
|
|
|
|
}
|
2020-10-15 17:05:34 +00:00
|
|
|
}
|
|
|
|
}
|
2020-10-07 20:14:55 +00:00
|
|
|
}
|
|
|
|
|
2020-10-09 17:56:42 +00:00
|
|
|
BrowserSettingsMenu {
|
|
|
|
id: settingsMenu
|
2021-09-30 09:43:29 +00:00
|
|
|
addNewTab: browserHeader.addNewTab
|
2020-10-09 17:56:42 +00:00
|
|
|
x: parent.width - width
|
|
|
|
y: parent.height
|
|
|
|
}
|
|
|
|
|
2021-10-18 10:34:16 +00:00
|
|
|
StatusQControls.StatusFlatRoundButton {
|
2020-10-07 20:14:55 +00:00
|
|
|
id: settingsMenuButton
|
2021-10-18 10:34:16 +00:00
|
|
|
implicitHeight: 32
|
|
|
|
implicitWidth: 32
|
|
|
|
icon.width: 24
|
|
|
|
icon.height: 24
|
|
|
|
icon.name: "more"
|
|
|
|
type: StatusQControls.StatusFlatRoundButton.Type.Tertiary
|
|
|
|
Layout.rightMargin: browserHeader.innerMargin
|
2020-10-09 17:56:42 +00:00
|
|
|
onClicked: {
|
|
|
|
if (settingsMenu.opened) {
|
|
|
|
settingsMenu.close()
|
|
|
|
} else {
|
|
|
|
settingsMenu.open()
|
|
|
|
}
|
|
|
|
}
|
2020-10-07 20:14:55 +00:00
|
|
|
}
|
|
|
|
}
|
2020-12-29 17:10:22 +00:00
|
|
|
|
|
|
|
Loader {
|
|
|
|
id: favoritesBarLoader
|
2021-10-20 09:50:50 +00:00
|
|
|
active: localAccountSensitiveSettings.shouldShowFavoritesBar
|
2020-12-29 17:10:22 +00:00
|
|
|
height: active ? item.height : 0
|
|
|
|
anchors.top: barRow.bottom
|
|
|
|
anchors.left: parent.left
|
|
|
|
anchors.leftMargin: Style.current.smallPadding
|
|
|
|
anchors.right: parent.right
|
|
|
|
anchors.rightMargin: Style.current.smallPadding
|
|
|
|
}
|
2020-10-07 20:14:55 +00:00
|
|
|
}
|