summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkali kaneko (leap communications) <kali@leap.se>2021-10-03 22:46:41 +0200
committerkali kaneko (leap communications) <kali@leap.se>2021-11-23 21:51:12 +0100
commitcae08421ac569ce773cc619ff8042ebe33700ff9 (patch)
tree2002a7900150e400ed27abadcfdb3f569bab872c
parent79d25833bfd261c36d954cf57845e5a416aaf849 (diff)
[ui] systray actions
-rw-r--r--gui/components/Systray.qml64
-rw-r--r--gui/components/VPNState.qml4
-rw-r--r--gui/main.qml13
3 files changed, 78 insertions, 3 deletions
diff --git a/gui/components/Systray.qml b/gui/components/Systray.qml
index 9ed52f5..d23a7c4 100644
--- a/gui/components/Systray.qml
+++ b/gui/components/Systray.qml
@@ -17,6 +17,19 @@ Labs.SystemTrayIcon {
enabled: false
}
+ Labs.MenuItem {
+ id: vpnSystrayToggle
+ text: getConnectionText()
+ enabled: isConnectionTextEnabled()
+ onTriggered: {
+ if (ctx.status == "off") {
+ backend.switchOn()
+ } else if (ctx.status == "on") {
+ backend.switchOff()
+ }
+ }
+ }
+
Labs.MenuSeparator {}
Labs.MenuItem {
@@ -27,8 +40,59 @@ Labs.SystemTrayIcon {
Labs.MenuSeparator {}
Labs.MenuItem {
+ id: showAppItem
+ //: Part of the systray menu; show or hide the main app window
+ text: isVisible() ? qsTr("Hide") : qsTr("Show")
+ onTriggered: {
+ if (isVisible()) {
+ root.hide()
+ } else {
+ root.bringToFront()
+ }
+ }
+ }
+
+ Labs.MenuItem {
+ //: Part of the systray menu; quits que application
text: qsTr("Quit")
onTriggered: backend.quit()
}
}
+
+ function isVisible() {
+ return root.visibility != 0 && root.visibility != 3
+ }
+
+ function getConnectionText() {
+ if (!ctx) {
+ return ""
+ } else if (ctx.status == "off") {
+ // Not Turn on, because we will can later append "to <Location>"
+ if (ctx.locations && ctx.bestLocation) {
+ return qsTr("Connect to") + " " + getCanonicalLocation(ctx.bestLocation)
+ } else {
+ return qsTr("Connect")
+ }
+ } else if (ctx.status == "on") {
+ return qsTr("Disconnect")
+ }
+ return ""
+ }
+
+ function isConnectionTextEnabled() {
+ if (!ctx) {
+ return false
+ }
+ return ctx.status == "off" || ctx.status == "on"
+ }
+
+ // returns the composite of Location, CC
+ function getCanonicalLocation(label) {
+ try {
+ let loc = ctx.locationLabels[label]
+ return loc[0] + ", " + loc[1]
+ } catch(e) {
+ return "unknown"
+ }
+ }
}
diff --git a/gui/components/VPNState.qml b/gui/components/VPNState.qml
index d5115f2..189fd0b 100644
--- a/gui/components/VPNState.qml
+++ b/gui/components/VPNState.qml
@@ -37,7 +37,9 @@ StateGroup {
PropertyChanges {
target: toggleVPN
enabled: false
- text: ("...")
+ // XXX this is a fake cancel, won't do anything at this point. We need
+ // to queue this action for when the openvpn process becomes available.
+ text: ("Cancel")
}
PropertyChanges {
target: systray
diff --git a/gui/main.qml b/gui/main.qml
index 1c56925..c063739 100644
--- a/gui/main.qml
+++ b/gui/main.qml
@@ -3,8 +3,6 @@
/*
TODO (ui rewrite)
See https://0xacab.org/leap/bitmask-vpn/-/issues/523
- - [x] udp support
- - [ ] minimize/hide from systray
- [ ] control actions from systray
- [ ] add gateway to systray
*/
@@ -144,6 +142,17 @@ ApplicationWindow {
return Array.from(arr, (k,_) => k.key);
}
+ function bringToFront() {
+ // FIXME does not work properly, at least on linux
+ if (visibility == 3) {
+ showNormal()
+ } else {
+ show()
+ }
+ raise()
+ requestActivate()
+ }
+
onSceneGraphError: function (error, msg) {
console.debug("ERROR while initializing scene")
console.debug(msg)