summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkali kaneko (leap communications) <kali@leap.se>2021-09-30 23:37:32 +0200
committerkali kaneko (leap communications) <kali@leap.se>2021-10-06 18:38:22 +0200
commit2e4cf7adcbcb0335ba251e014e2b8eb7c1e1468d (patch)
tree9ad073088ec937c24305404015cbde2a485243a3
parent45a5f7f5a431f17d0fabb5fd08229936e4390598 (diff)
[ui] size tweaks and new assets
plus work on the systray menu
-rw-r--r--gui/components/About.qml28
-rw-r--r--gui/components/Footer.qml37
-rw-r--r--gui/components/Locations.qml13
-rw-r--r--gui/components/MainView.qml29
-rw-r--r--gui/components/MaterialButton.qml1
-rw-r--r--gui/components/MaterialRadioButton.qml84
-rw-r--r--gui/components/MaterialRadioIndicator.qml63
-rw-r--r--gui/components/Spinner.qml63
-rw-r--r--gui/components/Splash.qml3
-rw-r--r--gui/components/StatusBox.qml2
-rw-r--r--gui/components/Systray.qml7
-rw-r--r--gui/components/VPNState.qml6
-rw-r--r--gui/components/WrappedRadioButton.qml10
-rw-r--r--gui/gui.qrc7
-rw-r--r--gui/main.qml6
-rw-r--r--gui/resources/birds.svg1
-rw-r--r--gui/resources/bridge.pngbin5543 -> 0 bytes
-rw-r--r--gui/resources/bridge.svg118
-rw-r--r--gui/resources/ravens.svg62
-rw-r--r--gui/themes/themes.js20
20 files changed, 443 insertions, 117 deletions
diff --git a/gui/components/About.qml b/gui/components/About.qml
index 8642578..cceaad4 100644
--- a/gui/components/About.qml
+++ b/gui/components/About.qml
@@ -27,7 +27,8 @@ ThemedPage {
Text {
width: parent.width - 40
- font.pixelSize: 11
+ color: Theme.fontColor
+ font.pixelSize: 12
wrapMode: Label.Wrap
text: getText()
anchors.horizontalCenter: parent.horizontalCenter
@@ -36,23 +37,30 @@ ThemedPage {
VerticalSpacer {
visible: true
- height: 20
+ height: 10
}
Image {
- height: 80
+ id: aboutIcon
+ height: 60
source: "../resources/icon-noshield.svg"
fillMode: Image.PreserveAspectFit
anchors.horizontalCenter: parent.horizontalCenter
}
- TextEdit {
- width: parent.width - 40
- font.pixelSize: 10
- readOnly: true
- selectByMouse: true
- text: getVersion()
+ Rectangle {
+ anchors.top: aboutIcon.bottom
+ width: 100
anchors.horizontalCenter: parent.horizontalCenter
+ TextEdit {
+ width: 100
+ font.pixelSize: 10
+ readOnly: true
+ selectByMouse: true
+ text: getVersion()
+ //horizontalAlignment: Text.AlignCenter
+ //anchors.horizontalCenter: parent.horizontalCenter
+ }
}
VerticalSpacer {
@@ -89,7 +97,7 @@ ThemedPage {
var _ver = ctx ? ctx.version : "unknown"
//: %1 -> application name
//: %2 -> version string
- var _txt = qsTr("%1 version: %2").arg(_name).arg(_ver)
+ var _txt = qsTr("%1 version: \n%2").arg(_name).arg(_ver)
return _txt
}
}
diff --git a/gui/components/Footer.qml b/gui/components/Footer.qml
index 1b0d8fa..b806807 100644
--- a/gui/components/Footer.qml
+++ b/gui/components/Footer.qml
@@ -34,18 +34,22 @@ ToolBar {
background.implicitHeight: 32
background.implicitWidth: 32
*/
- icon.width: 20
- icon.height: 20
- icon.source: stackView.depth > 1 ? "" : "../resources/globe.svg"
+ icon {
+ width: 20
+ height: 20
+ source: stackView.depth > 1 ? "" : "../resources/globe.svg"
+ }
onClicked: stackView.push("Locations.qml")
}
Label {
id: locationLabel
- anchors.left: gwButton.right
- anchors.leftMargin: -7
- anchors.verticalCenter: parent.verticalCenter
- anchors.verticalCenterOffset: 7
+ anchors {
+ left: gwButton.right
+ leftMargin: -7
+ verticalCenter: parent.verticalCenter
+ verticalCenterOffset: 7
+ }
text: locationStr()
color: getLocationColor()
}
@@ -57,14 +61,17 @@ ToolBar {
Image {
id: bridge
+ smooth: true
visible: isBridgeSelected()
- height: 24
- width: 24
- source: "../resources/bridge.png"
- anchors.verticalCenter: parent.verticalCenter
- anchors.verticalCenterOffset: 5
- anchors.right: gwQuality.left
- anchors.rightMargin: 10
+ width: 40
+ source: "../resources/bridge.svg"
+ fillMode: Image.PreserveAspectFit
+ anchors {
+ verticalCenter: parent.verticalCenter
+ verticalCenterOffset: 5
+ right: gwQuality.left
+ rightMargin: 10
+ }
}
Image {
@@ -75,7 +82,7 @@ ToolBar {
anchors.right: parent.right
anchors.rightMargin: 20
anchors.verticalCenter: parent.verticalCenter
- anchors.verticalCenterOffset: 5
+ anchors.verticalCenterOffset: 0
// TODO refactor with SignalIcon
ColorOverlay{
anchors.fill: gwQuality
diff --git a/gui/components/Locations.qml b/gui/components/Locations.qml
index ce510c5..600b504 100644
--- a/gui/components/Locations.qml
+++ b/gui/components/Locations.qml
@@ -64,10 +64,13 @@ ThemedPage {
}
WrappedRadioButton {
id: autoRadioButton
- anchors.top: recommendedLabel.bottom
text: getAutoLabel()
ButtonGroup.group: locsel
checked: false
+ anchors {
+ top: recommendedLabel.bottom
+ leftMargin: -5
+ }
onClicked: {
root.selectedGateway = "auto"
console.debug("Selected gateway: auto")
@@ -165,10 +168,12 @@ ThemedPage {
Layout.fillWidth: true
}
Image {
- height: 16
- width: 16
+ height: 30
+ width: 30
+ smooth: true
visible: isBridgeSelected()
- source: "../resources/bridge.png"
+ fillMode: Image.PreserveAspectFit
+ source: "../resources/bridge.svg"
Layout.alignment: Qt.AlignRight
Layout.rightMargin: 10
}
diff --git a/gui/components/MainView.qml b/gui/components/MainView.qml
index bae34fb..95bb212 100644
--- a/gui/components/MainView.qml
+++ b/gui/components/MainView.qml
@@ -4,6 +4,8 @@ import QtQuick.Dialogs 1.2
import QtQuick.Controls.Material 2.1
import QtQuick.Layouts 1.14
+import "../themes/themes.js" as Theme
+
Page {
StackView {
@@ -90,11 +92,20 @@ Page {
id: footer
}
+ Keys.onPressed: {
+ // shortcuts for avid users :)
+ // bug: doesnt work until the stack is pushed once
+ if (event.key == Qt.Key_G && stackView.depth == 1) {
+ console.debug("Open Locations")
+ stackView.push("Locations.qml")
+ }
+ }
+
Dialog {
id: donateDialog
- width: 350
+ width: root.appWidth
title: qsTr("Please donate!")
- standardButtons: Dialog.Ok
+ standardButtons: Dialog.Yes | Dialog.No
Text {
id: donateText
@@ -107,7 +118,7 @@ Page {
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 12
- text: qsTr("This service is paid for entirely by donations from users like you. The cost of running the VPN is approximately 5 USD per person every month, but every little bit counts.")
+ text: qsTr("This service is paid for entirely by donations from users like you. The cost of running the VPN is approximately 5 USD per person every month, but every little bit counts. Do you want to donate now?")
}
Label {
@@ -118,26 +129,32 @@ Page {
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 14
+ textFormat: Text.RichText
text: getLink(ctx.donateURL)
onLinkActivated: Qt.openUrlExternally(ctx.donateURL)
}
Image {
- height: 50
+ height: 40
source: "../resources/donate.svg"
fillMode: Image.PreserveAspectFit
anchors {
topMargin: 20
top: donateURL.bottom
+ bottomMargin: 50
horizontalCenter: parent.horizontalCenter
}
}
- onAccepted: Qt.openUrlExternally(ctx.donateURL)
+ onYes: Qt.openUrlExternally(ctx.donateURL)
}
function getLink(url) {
- return "<a href='#'>" + url + "</a>"
+ return "<style>a:link {color:'" + Theme.blue + "'; }</style><a href='#'>" + url + "</a>"
+ }
+
+ Component.onCompleted: {
+ root.openDonateDialog.connect(donateDialog.open)
}
}
diff --git a/gui/components/MaterialButton.qml b/gui/components/MaterialButton.qml
index 7fe04d9..7d4ff47 100644
--- a/gui/components/MaterialButton.qml
+++ b/gui/components/MaterialButton.qml
@@ -30,6 +30,7 @@ T.Button {
|| control.hovered ? 2 : 0 : control.down ? 8 : 2
Material.background: flat ? "transparent" : undefined
+
contentItem: IconLabel {
spacing: control.spacing
mirrored: control.mirrored
diff --git a/gui/components/MaterialRadioButton.qml b/gui/components/MaterialRadioButton.qml
new file mode 100644
index 0000000..31dad12
--- /dev/null
+++ b/gui/components/MaterialRadioButton.qml
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.RadioButton {
+ id: control
+
+ implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+ implicitContentWidth + leftPadding + rightPadding)
+ implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+ implicitContentHeight + topPadding + bottomPadding,
+ implicitIndicatorHeight + topPadding + bottomPadding)
+
+ spacing: 4
+ padding: 4
+ verticalPadding: padding + 2
+
+ indicator: MaterialRadioIndicator {
+ // XXX modified left offset to align with headers
+ x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) - 4 : control.leftPadding + (control.availableWidth - width) / 2
+ y: control.topPadding + (control.availableHeight - height) / 2
+ control: control
+
+ Ripple {
+ x: (parent.width - width) / 2
+ y: (parent.height - height) / 2
+ width: 18; height: 18
+
+ z: -1
+ anchor: control
+ pressed: control.pressed
+ active: control.down || control.visualFocus || control.hovered
+ color: control.checked ? control.Material.highlightedRippleColor : control.Material.rippleColor
+ }
+ }
+
+ contentItem: Text {
+ leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+ rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+ text: control.text
+ font: control.font
+ color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+ elide: Text.ElideRight
+ verticalAlignment: Text.AlignVCenter
+ }
+}
diff --git a/gui/components/MaterialRadioIndicator.qml b/gui/components/MaterialRadioIndicator.qml
new file mode 100644
index 0000000..b380f2a
--- /dev/null
+++ b/gui/components/MaterialRadioIndicator.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+Rectangle {
+ id: indicator
+ implicitWidth: 18
+ implicitHeight: 18
+ radius: width / 2
+ border.width: 2
+ border.color: !control.enabled ? control.Material.hintTextColor
+ : control.checked || control.down ? control.Material.accentColor : control.Material.secondaryTextColor
+ color: "transparent"
+
+ property Item control
+
+ Rectangle {
+ x: (parent.width - width) / 2
+ y: (parent.height - height) / 2
+ // XXX overridden size
+ width: 8
+ height: 8
+ radius: width / 2
+ color: parent.border.color
+ visible: indicator.control.checked || indicator.control.down
+ }
+}
diff --git a/gui/components/Spinner.qml b/gui/components/Spinner.qml
deleted file mode 100644
index 9fc535f..0000000
--- a/gui/components/Spinner.qml
+++ /dev/null
@@ -1,63 +0,0 @@
-import QtQuick 2.9
-import QtQuick.Controls 2.2
-import QtGraphicalEffects 1.0
-
-BusyIndicator {
-
- id: control
-
- anchors.horizontalCenter: parent.horizontalCenter
-
- contentItem: Item {
- implicitWidth: 64
- implicitHeight: 64
-
- Item {
- id: item
- x: parent.width / 2 - 32
- y: parent.height / 2 - 32
- width: 64
- height: 64
- opacity: control.running ? 1 : 0
-
- Behavior on opacity {
- OpacityAnimator {
- duration: 250
- }
- }
-
- RotationAnimator {
- target: item
- running: control.visible && control.running
- from: 0
- to: 360
- loops: Animation.Infinite
- duration: 6200
- }
-
- Repeater {
- id: repeater
- model: 6
-
- Rectangle {
- x: item.width / 2 - width / 2
- y: item.height / 2 - height / 2
- implicitWidth: 10
- implicitHeight: 10
- radius: 5
- color: "#21be2b"
- transform: [
- Translate {
- y: -Math.min(item.width, item.height) * 0.5 + 5
- },
- Rotation {
- angle: index / repeater.count * 360
- origin.x: 5
- origin.y: 5
- }
- ]
- }
- }
- }
- }
-}
diff --git a/gui/components/Splash.qml b/gui/components/Splash.qml
index 16f1b9d..625ab18 100644
--- a/gui/components/Splash.qml
+++ b/gui/components/Splash.qml
@@ -32,8 +32,9 @@ Page {
ProgressBar {
id: splashProgress
- anchors.horizontalCenter: parent.horizontalCenter
+ width: appWidth * 0.8 - 60
indeterminate: true
+ anchors.horizontalCenter: parent.horizontalCenter
}
InitErrors {
diff --git a/gui/components/StatusBox.qml b/gui/components/StatusBox.qml
index c4a4a08..00d0c2d 100644
--- a/gui/components/StatusBox.qml
+++ b/gui/components/StatusBox.qml
@@ -117,6 +117,8 @@ Item {
MaterialButton {
id: toggleVPN
+ // FIXME - this is a workaround. It will BREAK with i18n
+ width: 100
spacing: 8
anchors.horizontalCenter: parent.horizontalCenter
diff --git a/gui/components/Systray.qml b/gui/components/Systray.qml
index 6fb1046..9ed52f5 100644
--- a/gui/components/Systray.qml
+++ b/gui/components/Systray.qml
@@ -20,6 +20,13 @@ Labs.SystemTrayIcon {
Labs.MenuSeparator {}
Labs.MenuItem {
+ text: qsTr("Donate")
+ onTriggered: root.openDonateDialog()
+ }
+
+ Labs.MenuSeparator {}
+
+ Labs.MenuItem {
text: qsTr("Quit")
onTriggered: backend.quit()
}
diff --git a/gui/components/VPNState.qml b/gui/components/VPNState.qml
index d92065a..d5115f2 100644
--- a/gui/components/VPNState.qml
+++ b/gui/components/VPNState.qml
@@ -31,7 +31,7 @@ StateGroup {
}
PropertyChanges {
target: connectionImage
- source: "../resources/birds.svg"
+ source: "../resources/ravens.svg"
anchors.horizontalCenter: parent.horizontalCenter
}
PropertyChanges {
@@ -128,7 +128,7 @@ StateGroup {
}
PropertyChanges {
target: connectionImage
- source: "../resources/birds.svg"
+ source: "../resources/ravens.svg"
anchors.horizontalCenter: parent.horizontalCenter
}
PropertyChanges {
@@ -164,7 +164,7 @@ StateGroup {
PropertyChanges {
// ?? is this image correct?
target: connectionImage
- source: "../resources/birds.svg"
+ source: "../resources/ravens.svg"
anchors.horizontalCenter: parent.horizontalCenter
}
PropertyChanges {
diff --git a/gui/components/WrappedRadioButton.qml b/gui/components/WrappedRadioButton.qml
index 04643b1..2993bc4 100644
--- a/gui/components/WrappedRadioButton.qml
+++ b/gui/components/WrappedRadioButton.qml
@@ -5,11 +5,19 @@ import QtQuick.Controls.Material.impl 2.12
import "../themes/themes.js" as Theme
-RadioButton {
+MaterialRadioButton {
id: control
width: parent.width
property var location
+ /* this works for the pointer, but breaks the onClick connection
+ XXX need to dig into RadioButton implementation.
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: Qt.PointingHandCursor
+ }
+ */
+
contentItem: Label {
text: control.text
font: control.font
diff --git a/gui/gui.qrc b/gui/gui.qrc
index e4d1cd6..385b476 100644
--- a/gui/gui.qrc
+++ b/gui/gui.qrc
@@ -13,9 +13,10 @@
<file>components/Header.qml</file>
<file>components/Footer.qml</file>
<file>components/About.qml</file>
+ <file>components/MaterialRadioButton.qml</file>
+ <file>components/MaterialRadioIndicator.qml</file>
<file>components/WrappedRadioButton.qml</file>
<file>components/StatusBox.qml</file>
- <file>components/Spinner.qml</file>
<file>components/Systray.qml</file>
<file>components/Help.qml</file>
<file>components/Locations.qml</file>
@@ -42,14 +43,14 @@
<file>resources/tools.svg</file>
<file>resources/help.svg</file>
<file>resources/about.svg</file>
- <file>resources/bridge.png</file>
+ <file>resources/bridge.svg</file>
<file>resources/gear-fill.svg</file>
<file>resources/reception-0.svg</file>
<file>resources/reception-2.svg</file>
<file>resources/reception-4.svg</file>
<file>resources/arrow-left.svg</file>
<file>resources/globe.svg</file>
- <file>resources/birds.svg</file>
+ <file>resources/ravens.svg</file>
<file>resources/riseup-icon.svg</file>
<file>resources/spy.gif</file>
<file>resources/quit.svg</file>
diff --git a/gui/main.qml b/gui/main.qml
index 0024670..1c56925 100644
--- a/gui/main.qml
+++ b/gui/main.qml
@@ -22,7 +22,7 @@ ApplicationWindow {
visible: true
property int appHeight: 460
- property int appWidth: 260
+ property int appWidth: 280
width: appWidth
minimumWidth: appWidth
@@ -53,6 +53,8 @@ ApplicationWindow {
"blocked": "qrc:/assets/icon/png/white/vpn_blocked.png"
}
+ signal openDonateDialog()
+
FontLoader {
id: lightFont
source: "qrc:/poppins-light.ttf"
@@ -90,7 +92,7 @@ ApplicationWindow {
ctx = JSON.parse(j)
if (ctx != undefined) {
locationsModel = getSortedLocations()
- console.debug("Got sorted locations:" + locationsModel)
+ //console.debug("Got sorted locations: " + locationsModel)
}
if (ctx.errors) {
console.debug("errors, setting root.error")
diff --git a/gui/resources/birds.svg b/gui/resources/birds.svg
deleted file mode 100644
index cb2a1df..0000000
--- a/gui/resources/birds.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 174.92 102.4"><title>Asset 1</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="C0eYCH.tif"><image id="Layer_1-3" data-name="Layer 1" width="277" height="129" transform="translate(12.45) rotate(9.34) scale(0.59)" xlink:href="data:image/png;base64,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"/></g></g></g></svg> \ No newline at end of file
diff --git a/gui/resources/bridge.png b/gui/resources/bridge.png
deleted file mode 100644
index d0a2c80..0000000
--- a/gui/resources/bridge.png
+++ /dev/null
Binary files differ
diff --git a/gui/resources/bridge.svg b/gui/resources/bridge.svg
new file mode 100644
index 0000000..80788d9
--- /dev/null
+++ b/gui/resources/bridge.svg
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 30.71874 14.080019"
+ xml:space="preserve"
+ sodipodi:docname="bridge.svg"
+ width="30.71874"
+ height="14.08002"
+ inkscape:version="1.0.2 (e86c870879, 2021-01-15)"><metadata
+ id="metadata43"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs41" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1392"
+ id="namedview39"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="5.1644142"
+ inkscape:cx="42.764401"
+ inkscape:cy="85.409333"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1"
+ inkscape:document-rotation="0" />
+<g
+ id="g6"
+ transform="matrix(0.06,0,0,0.06,0,-8.31936)">
+ <g
+ id="g4">
+ <path
+ d="m 501.333,266.656 h -99.221 c -14.869,-72.939 -79.488,-128 -156.779,-128 -77.291,0 -141.909,55.061 -156.779,128 H 10.667 C 4.779,266.656 0,271.435 0,277.323 c 0,0.427 0.192,0.811 0.256,1.216 -0.747,5.333 2.453,10.517 7.787,11.861 42.667,10.731 77.291,51.392 77.291,72.256 0,5.781 4.608,10.517 10.389,10.667 6.144,-0.192 10.624,-4.352 10.923,-10.112 0.64,-11.861 0.427,-27.968 0.213,-43.456 -0.085,-7.36 -0.192,-14.571 -0.192,-21.099 0,-3.605 0.277,-7.125 0.533,-10.667 h 276.245 c 0.277,3.541 0.533,7.061 0.533,10.667 l 0.043,17.963 c 0.064,11.755 0.107,23.979 -0.043,45.973 -0.043,5.461 4.075,10.091 9.515,10.667 0.405,0.043 0.768,0.064 1.152,0.064 4.992,0 9.365,-3.477 10.432,-8.448 9.28,-43.84 50.645,-76.885 96.235,-76.885 5.888,0 10.667,-4.779 10.667,-10.667 0,-5.888 -4.758,-10.667 -10.646,-10.667 z M 85.461,315.936 C 76.672,305.611 65.664,295.968 53.525,287.989 h 32.363 c -0.235,3.541 -0.533,7.061 -0.533,10.667 -0.022,5.397 0.042,11.264 0.106,17.28 z m 25.067,-49.28 c 7.36,-31.019 25.131,-57.984 49.451,-77.077 v 77.077 z m 124.139,0 h -53.333 v -90.88 c 16.171,-8.469 34.219,-13.76 53.333,-15.232 z m 74.666,0 H 256 V 160.523 c 19.115,1.472 37.163,6.784 53.333,15.232 z m 21.334,0 v -77.077 c 24.32,19.072 42.091,46.059 49.451,77.077 z m 74.709,48.149 -0.043,-16.149 c 0,-3.605 -0.299,-7.125 -0.533,-10.667 h 29.056 c -10.859,7.403 -20.544,16.427 -28.48,26.816 z"
+ id="path2" />
+ </g>
+</g>
+<g
+ id="g8"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g10"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g12"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g14"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g16"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g18"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g20"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g22"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g24"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g26"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g28"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g30"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g32"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g34"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+<g
+ id="g36"
+ transform="translate(-17.487347,-29.425569)">
+</g>
+</svg>
diff --git a/gui/resources/ravens.svg b/gui/resources/ravens.svg
new file mode 100644
index 0000000..790eb4a
--- /dev/null
+++ b/gui/resources/ravens.svg
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 342 206"
+ style="enable-background:new 0 0 342 206;"
+ xml:space="preserve"
+ sodipodi:docname="ravens.svg"
+ inkscape:version="1.0.2 (e86c870879, 2021-01-15)"><metadata
+ id="metadata66"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs64" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1392"
+ id="namedview62"
+ showgrid="false"
+ inkscape:zoom="2.3859685"
+ inkscape:cx="288.27923"
+ inkscape:cy="142.49955"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" />
+
+<g
+ id="bird1"
+ transform="translate(-323.01817,-11.80531)"><path
+ style="fill:#000000;stroke-width:0.48"
+ d="m 385.13834,197.43106 c -0.72897,-1.36208 -0.61597,-2.15071 0.51401,-3.58724 l 1.0109,-1.28515 -2.7045,-3.53096 c -1.67306,-2.18432 -3.16903,-3.64755 -3.92253,-3.83667 -0.78962,-0.19818 -1.46242,-0.8906 -1.91284,-1.96862 -0.78944,-1.88939 -0.68998,-1.87306 -7.21616,-1.18532 -3.17774,0.33487 -5.21281,0.85767 -7.44,1.9113 -3.28857,1.55574 -5.44061,1.80404 -6.78577,0.78292 -1.02537,-0.77836 -1.06491,-1.42761 -0.13401,-2.20019 0.38829,-0.32225 0.65829,-1.03611 0.6,-1.58634 -0.0805,-0.75951 0.24078,-1.07485 1.33401,-1.3095 0.792,-0.17 1.87322,-0.54195 2.40272,-0.82656 0.66764,-0.35886 1.7028,-0.37114 3.37723,-0.0401 3.1702,0.62683 7.16506,-0.46946 9.11061,-2.50018 0.98579,-1.02893 1.81957,-1.42897 2.97837,-1.42897 0.88512,0 2.4561,-0.432 3.49107,-0.96 1.03497,-0.528 2.21436,-0.96 2.62088,-0.96 0.40651,0 0.73912,-0.30839 0.73912,-0.68532 0,-0.54071 -0.53763,-0.62982 -2.54805,-0.42233 -3.2514,0.33557 -4.17195,-0.44353 -4.17195,-3.53092 0,-1.44319 -0.32154,-2.57878 -0.96,-3.39045 -0.528,-0.67124 -0.96,-1.49047 -0.96,-1.8205 0,-0.33004 -0.54,-0.95389 -1.2,-1.38634 -0.7646,-0.50098 -1.2,-1.23373 -1.2,-2.01949 0,-0.67827 -0.432,-1.78243 -0.96,-2.45367 -0.528,-0.67124 -0.96,-1.5865 -0.96,-2.03391 0,-0.44741 -1.15388,-2.09228 -2.56419,-3.65527 -2.97648,-3.29873 -3.67581,-4.47263 -3.67581,-6.17024 0,-1.04577 -0.21517,-1.23156 -1.42631,-1.23156 -0.78448,0 -2.67448,-0.56194 -4.2,-1.24877 -3.87341,-1.74389 -9.21645,-3.55123 -10.49851,-3.55123 -1.57962,0 -2.59518,-0.491 -2.59518,-1.2547 0,-0.53914 0.68803,-0.61839 3.48,-0.40086 3.2635,0.25428 3.40535,0.22572 2.28,-0.45912 -0.66,-0.40165 -2.226,-0.87399 -3.48,-1.04964 -2.96604,-0.41545 -2.93747,-1.15568 0.0446,-1.15568 1.92868,0 9.64234,2.10373 13.15539,3.58785 0.50332,0.21263 0.84,0.14513 0.84,-0.16841 0,-0.28779 -1.13158,-1.09668 -2.51463,-1.79753 -2.92533,-1.48238 -12.13912,-7.58751 -12.61637,-8.35971 -1.35099,-2.18595 3.01241,-0.0675 12.14639,5.89721 3.24247,2.1174 6.04388,3.70133 6.22536,3.51984 0.18149,-0.18148 -0.38708,-0.89116 -1.26349,-1.57704 -2.20209,-1.7234 -10.13726,-10.73208 -10.13726,-11.50869 0,-1.14242 0.85579,-0.66795 2.72266,1.5095 2.27855,2.65762 9.24491,8.66726 13.01433,11.22703 2.8929,1.96453 11.64578,6.78995 12.31636,6.78995 0.20542,0 0.23167,-0.756 0.0583,-1.68 -0.22647,-1.20719 -0.14019,-1.69436 0.30658,-1.73102 0.34197,-0.0281 1.03481,-0.0821 1.53965,-0.12 1.86068,-0.13982 1.16626,-1.06327 -1.60872,-2.13929 -1.56874,-0.6083 -3.78307,-1.85532 -4.92072,-2.77115 -1.13765,-0.91584 -3.09446,-2.43544 -4.34846,-3.37688 -4.34658,-3.2632 -1.75366,-4.17202 3.18156,-1.11514 2.26983,1.40594 3.91431,1.53202 1.97844,0.15169 -6.31808,-4.50497 -6.96,-5.05256 -6.96,-5.93721 0,-0.52855 0.11494,-0.961 0.25542,-0.961 0.78964,0 4.15067,1.74166 8.39825,4.35188 2.65524,1.63171 4.93892,2.85554 5.07483,2.71963 0.13591,-0.13592 -1.94842,-2.37661 -4.63184,-4.97931 -5.53891,-5.37229 -7.03228,-7.22857 -6.35791,-7.90295 0.56718,-0.56718 1.61175,0.22173 8.939,6.7512 3.12276,2.78275 5.93076,5.14466 6.24,5.24868 0.30924,0.10402 -1.50978,-1.95528 -4.04226,-4.57623 -4.62994,-4.79166 -7.54368,-8.5847 -7.00693,-9.12146 0.15897,-0.15897 2.25393,1.41143 4.65545,3.48976 4.14801,3.58979 5.79244,4.76276 5.09498,3.63424 -0.17306,-0.28001 -0.11466,-0.6327 0.12976,-0.78376 0.64416,-0.39811 17.86024,17.63295 19.07981,19.98301 1.60753,3.09765 1.75025,5.81492 0.61158,11.64343 -0.65753,3.36572 -0.90221,5.90827 -0.699,7.26344 0.29317,1.95498 0.42327,2.10307 2.08577,2.37409 0.9752,0.15898 2.42109,0.39924 3.21309,0.5339 5.1256,0.87155 13.65736,4.80211 12.94067,5.96174 -0.15253,0.24679 -1.93858,0.44985 -3.969,0.45124 -3.88293,0.003 -3.90932,0.0128 -8.39867,3.23101 -1.6107,1.15463 -3.37986,1.81494 -6.89008,2.5716 -4.81503,1.03793 -7.97908,2.51326 -12.88292,6.00704 -4.80978,3.42677 -4.95621,3.84823 -2.4,6.90782 2.66507,3.18989 2.14762,5.66217 -1.51355,7.23153 -2.68358,1.15032 -2.89394,1.15032 -3.50956,3e-5 z m 4.78311,-5.20219 c 0,-0.57904 -2.89719,-3.94937 -3.39495,-3.94937 -0.77051,0 -0.49203,0.68428 1.0299,2.53064 1.38291,1.67772 2.36505,2.26687 2.36505,1.41873 z"
+ id="path70"
+ sodipodi:nodetypes="sscssssssssssssssssssssssssssssssssssssssssssssssscsssssssssssssssssssssssscsssssssssss" /></g><g
+ id="bird3"
+ transform="translate(-140.05272,-94.99309)"><path
+ style="fill:#000000;stroke-width:0.48"
+ d="m 447.80204,216.9559 c -0.72269,-0.39213 -1.64623,-1.35548 -2.05233,-2.14078 -0.92258,-1.78409 -1.47725,-1.82526 -1.45263,-0.10784 0.0256,1.78611 -1.56103,1.9993 -3.05379,0.41034 -0.92579,-0.98546 -1.26967,-1.09461 -2.00395,-0.63604 -0.71993,0.4496 -1.15887,0.3521 -2.33731,-0.51916 -1.20317,-0.88954 -1.60809,-0.97455 -2.37139,-0.49787 -0.73689,0.4602 -1.14575,0.42723 -2.0501,-0.16532 -0.64725,-0.42409 -1.74409,-0.64998 -2.56857,-0.52897 -1.09407,0.16058 -1.71749,-0.0853 -2.60113,-1.02589 -0.6392,-0.6804 -1.5772,-1.23709 -2.08445,-1.23709 -0.50725,0 -1.49559,-0.32252 -2.19633,-0.71671 -0.70073,-0.39419 -1.81406,-0.93368 -2.47406,-1.19885 -0.66,-0.26518 -1.524,-0.66225 -1.92,-0.88239 -2.1004,-1.1676 -3.9862,-2.00205 -4.5245,-2.00205 -0.33369,0 -0.99766,-0.432 -1.4755,-0.96 -0.47783,-0.528 -1.16856,-0.96 -1.53495,-0.96 -0.77161,0 -6.74173,-3.13454 -7.86284,-4.12828 -0.89689,-0.79501 -2.53748,-0.86858 -3.83877,-0.17215 -0.51341,0.27477 -1.88229,2.38077 -3.04196,4.68 -1.15968,2.29924 -2.72649,4.76604 -3.4818,5.48179 -1.40184,1.32842 -5.12659,2.93173 -5.63342,2.4249 -0.1543,-0.15429 -1.70398,-0.32663 -3.44374,-0.38296 -2.32752,-0.0754 -3.51734,-0.36424 -4.50361,-1.09342 -0.81562,-0.60301 -1.73721,-0.88722 -2.35394,-0.72594 -1.35459,0.35423 -3.92189,-0.18553 -5.09262,-1.0707 -0.66178,-0.50036 -0.98915,-1.4008 -1.08522,-2.98487 -0.0757,-1.2476 -0.25951,-4.04558 -0.40856,-6.21772 -0.25931,-3.77896 -0.21836,-3.99814 0.94896,-5.07999 1.35121,-1.25225 4.13171,-1.97137 10.61247,-2.74472 5.3395,-0.63715 6.25903,-0.85126 8.52,-1.98381 1.76578,-0.8845 2.45969,-2.32213 1.12084,-2.32213 -0.37355,0 -1.5596,-1.134 -2.63568,-2.52 -2.13022,-2.74373 -2.50653,-3.16958 -3.62217,-4.09893 -0.40864,-0.3404 -0.74299,-1.12556 -0.74299,-1.74479 0,-0.67126 -0.48454,-1.44336 -1.2,-1.91214 -0.66,-0.43245 -1.2,-1.23621 -1.2,-1.78612 0,-0.54992 -0.54,-1.42462 -1.2,-1.94378 -0.66,-0.51916 -1.2,-1.34367 -1.2,-1.83225 0,-0.48859 -0.54,-1.53009 -1.2,-2.31445 -0.66,-0.78437 -1.2,-1.85934 -1.2,-2.38883 0,-0.52949 -0.756,-1.71871 -1.68,-2.64271 -0.924,-0.924 -1.68,-2.09595 -1.68,-2.60433 0,-0.50838 -0.55232,-1.44321 -1.22738,-2.07739 -0.81219,-0.76302 -1.14213,-1.47902 -0.97538,-2.11669 0.17148,-0.65575 -0.2374,-1.46856 -1.27973,-2.54398 -1.31288,-1.35454 -1.4494,-1.71218 -0.95549,-2.50306 0.48388,-0.77482 0.38564,-1.14926 -0.61288,-2.33593 -1.29697,-1.54136 -1.48117,-2.47059 -0.65374,-3.29802 0.39386,-0.39386 0.19307,-0.98422 -0.75958,-2.2332 -0.88414,-1.15917 -1.19604,-2.00954 -0.98311,-2.68042 0.2246,-0.70765 -0.16728,-1.56735 -1.40042,-3.07223 -2.52054,-3.076 -2.28628,-3.69399 0.92771,-2.44729 0.528,0.20481 -0.498,-1.15368 -2.28,-3.01887 -2.97172,-3.11045 -3.98593,-4.92459 -2.75312,-4.92459 0.26778,0 2.38692,1.48253 4.7092,3.29452 6.33422,4.94234 8.3162,5.80749 3.95158,1.7249 -4.36141,-4.07959 -8.0677,-9.81942 -6.34054,-9.81942 0.28116,0 2.49842,2.05416 4.92723,4.5648 2.42882,2.51065 4.49954,4.48131 4.60161,4.37925 0.10205,-0.10206 -0.98133,-1.73668 -2.40752,-3.63249 -1.42619,-1.89581 -2.85494,-4.32096 -3.17499,-5.38921 -0.32005,-1.06825 -0.69762,-2.24379 -0.83904,-2.61231 -0.72243,-1.88264 1.03187,-0.1508 4.3051,4.24996 2.01269,2.706 4.67913,5.892 5.92543,7.08 l 2.266,2.16 -1.79464,-2.4 c -2.2233,-2.97326 -4.5686,-7.73418 -4.94128,-10.03072 -0.44513,-2.74301 0.50313,-2.04466 2.37988,1.75269 1.66581,3.37055 8.26211,12.81454 9.47338,13.56314 0.32795,0.20269 0.50635,0.17645 0.39644,-0.0583 -0.1099,-0.23474 -1.00191,-2.04072 -1.98227,-4.01327 -0.98034,-1.97255 -1.78245,-3.86255 -1.78245,-4.2 0,-1.51072 0.98617,-0.31134 2.75157,3.34646 2.25366,4.66945 5.11203,8.56401 10.59899,14.44126 4.9305,5.28122 8.54604,10.06515 10.94256,14.47874 6.17495,11.37222 8.31949,13.01948 14.29789,10.98244 2.27587,-0.77547 3.24479,-0.75419 9.27398,0.20364 2.25404,0.35809 4.45501,1.59731 4.45501,2.50832 0,0.19008 -0.60035,0.46567 -1.3341,0.61242 -0.73377,0.14675 -1.86777,0.78823 -2.52,1.42549 -1.81377,1.77213 -5.26658,5.9971 -5.26039,6.43677 0.006,0.39975 0.80419,0.80728 7.34031,3.74603 4.42236,1.98837 8.73868,4.82625 10.41418,6.84709 2.22226,2.68029 9.70388,8.73695 12.42297,10.05689 2.10404,1.02137 2.46767,1.34537 1.65388,1.47363 -0.57373,0.0904 -1.97773,-0.30571 -3.12,-0.88029 l -2.07685,-1.04469 1.3513,1.43507 c 0.74321,0.78928 2.79521,2.15598 4.56,3.03711 2.62921,1.31274 3.00331,1.63456 2.07139,1.78197 -0.62552,0.099 -2.40778,-0.44981 -3.96059,-1.21945 -2.26132,-1.12081 -2.65597,-1.21281 -1.9827,-0.4622 0.46233,0.51543 1.9746,1.57936 3.3606,2.36428 1.386,0.78492 2.52,1.65077 2.52,1.92411 0,0.83627 -3.35317,0.0235 -5.34728,-1.29618 -2.37621,-1.5725 -2.35309,-0.95606 0.0673,1.79363 2.28368,2.59439 2.44317,3.37594 0.6,2.94004 -1.49775,-0.3542 -4.44,-2.40221 -4.44,-3.09054 0,-0.25057 -0.23446,-0.45558 -0.52103,-0.45558 -0.28658,0 0.0374,0.99921 0.72,2.22046 0.68257,1.22125 1.24103,2.40925 1.24103,2.64 0,0.63619 -1.52046,0.46767 -2.99396,-0.33184 z"
+ id="path78"
+ sodipodi:nodetypes="ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssscssssssssssssssscssssscssssssssssssssss" /></g><g
+ id="bird2"
+ transform="translate(-60.420276,1.9176892)"><g
+ id="g91"><path
+ style="fill:#000000;stroke-width:0.48"
+ d="m 242.17687,151.65225 c -1.74028,-2.28162 -2.178,-4.03768 -2.178,-8.73776 0,-2.17974 -0.18432,-3.96317 -0.4096,-3.96317 -0.22529,0 -0.71129,2.81516 -1.08,6.25591 -0.36872,3.44074 -0.8864,6.28072 -1.1504,6.31105 -1.04841,0.12049 -2.28619,-3.10071 -2.57984,-6.71376 l -0.30016,-3.6932 -1.07056,1.81145 c -2.08936,3.5353 -3.47008,2.84679 -3.48209,-1.73638 -0.006,-2.37601 -0.1508,-2.84246 -0.94546,-3.05027 -0.61539,-0.16092 -1.21919,-1.09153 -1.75512,-2.70506 -0.44935,-1.35286 -1.32319,-2.85792 -1.94188,-3.34458 -0.78894,-0.62057 -1.12489,-1.37616 -1.12489,-2.53 0,-2.06355 -0.60376,-2.09129 -1.85358,-0.0852 -1.18439,1.90109 -2.71192,2.89912 -3.87313,2.53057 -0.64166,-0.20366 -1.0246,0.1062 -1.47495,1.19345 -0.7302,1.76286 -2.63143,3.35598 -4.00504,3.35598 -0.54848,0 -1.46581,0.58765 -2.03851,1.30588 -0.89827,1.12654 -1.14794,1.21735 -1.81803,0.66123 -0.42722,-0.35456 -0.77543,-1.32021 -0.7738,-2.14588 0.003,-1.54988 0.31834,-2.30174 2.59201,-6.18123 2.37785,-4.05724 0.51183,-2.41446 -2.48575,2.18836 -3.12365,4.79641 -4.09991,5.87182 -4.88819,5.38464 -1.17655,-0.72715 -0.0446,-4.77763 2.18334,-7.813 1.22554,-1.66965 0.0938,-1.27585 -1.72437,0.6 -2.65534,2.73963 -4.34104,1.74204 -2.45575,-1.4533 0.93339,-1.58198 0.94531,-1.72299 0.1698,-2.00903 -1.26447,-0.4664 -1.46738,-1.03369 -1.04291,-2.91573 0.30278,-1.34248 0.21909,-1.84412 -0.38085,-2.28281 -0.75536,-0.55233 -0.9059,-1.41732 -1.24948,-7.17913 -0.20592,-3.45317 -1.35998,-10.32002 -1.73441,-10.31993 -0.14652,3e-5 -3.1824,0.88931 -6.7464,1.97616 -3.564,1.08684 -6.8656,2.086 -7.33688,2.22033 -0.47128,0.13433 -2.09128,-0.15192 -3.6,-0.63611 -1.50872,-0.48419 -3.01312,-0.8259 -3.34312,-0.75935 -1.2262,0.24726 -0.53956,-1.304 1.32139,-2.98524 1.05676,-0.95472 2.08554,-1.73586 2.28617,-1.73586 0.20064,0 0.57802,-0.486 0.83862,-1.08 0.54254,-1.23661 2.67944,-1.701199 8.15382,-1.772749 5.57725,-0.0729 9.57243,-1.17346 13.90516,-3.83049 4.52997,-2.77799 15.85234,-6.751008 22.57484,-7.921507 2.65339,-0.462 7.19029,-0.754493 11.76,-0.758165 7.33879,-0.0059 7.50857,0.01795 12.48,1.754669 4.64388,1.622275 7.89361,3.607435 7.55725,4.616496 -0.0759,0.227717 -1.8631,0.454018 -3.97155,0.502891 -3.40039,0.07882 -4.27825,0.305799 -7.76936,2.008856 -2.16469,1.056 -3.93825,2.136 -3.94123,2.4 -0.003,0.264 0.9368,1.1895 2.0884,2.056649 1.1516,0.86716 2.32074,2.16316 2.59809,2.88 0.61481,1.58903 2.47015,14.53738 2.49976,17.44571 0.0373,3.66931 1.70932,11.11002 3.22173,14.33764 1.81937,3.88271 1.28959,4.93466 -1.08652,2.15745 -0.90229,-1.05459 -1.64863,-1.65817 -1.65854,-1.34126 -0.0271,0.86542 3.28286,9.82211 4.07847,11.03636 0.38106,0.58156 0.50275,1.17487 0.27043,1.31845 -0.59625,0.3685 -3.42187,-2.90311 -4.8461,-5.611 -0.65955,-1.254 -1.36566,-2.28 -1.56915,-2.28 -0.40909,0 -0.35407,0.31827 1.09899,6.35685 1.05557,4.3867 0.95137,5.67912 -0.36978,4.58646 -0.90254,-0.74644 -2.98958,-5.08951 -2.9962,-6.23498 -0.002,-0.44642 -0.2554,-0.96662 -0.56182,-1.156 -0.41664,-0.2575 -0.47655,0.88529 -0.23759,4.53167 0.18049,2.75413 0.13441,4.876 -0.1059,4.876 -0.23399,0 -1.00861,-0.76458 -1.72138,-1.69907 z"
+ id="path82"
+ sodipodi:nodetypes="sssssscscsssssssssssssssssssssssssssssssssssssssssssssssssscsssss" /></g></g></svg>
diff --git a/gui/themes/themes.js b/gui/themes/themes.js
index 1c7a7c8..d35c662 100644
--- a/gui/themes/themes.js
+++ b/gui/themes/themes.js
@@ -27,11 +27,19 @@ const desktopAppWidth = 360;
const darkFocusBorder = fontColor;
const lightFocusBorder = "#d5d3e0";
-const accentOff = "#af0909";
-const accentConnecting = "#FFCC33";
-const accentOn = "#669933";
+const red = "#af0909";
+const yellow = "#ffcc33";
+const green = "#669933";
-const blue = "#0060DF";
+const accentOff = red;
+const accentConnecting = yellow;
+const accentOn = green;
+
+const signalLow = red;
+const signalMedium = yellow;
+const signalGood = green;
+
+const blue = "#007ac6";
const blueHovered = "#0250BB";
const bluePressed = "#054096";
const blueDisabled = "#a3c0f3";
@@ -53,7 +61,3 @@ const buttonColor = "#eeeeee";
const bgColor = "#f3f3f3";
const fgColor = "#ffffff";
-
-const signalGood = "green";
-const signalMedium = "orange";
-const signalLow = "red";