summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--changes/feature_refactor_status2
-rw-r--r--data/images/light/16/accept.pngbin0 -> 285 bytes
-rw-r--r--data/images/light/16/down-arrow.pngbin0 -> 356 bytes
-rw-r--r--data/images/light/16/error.pngbin0 -> 355 bytes
-rw-r--r--data/images/light/16/refresh.pngbin0 -> 472 bytes
-rw-r--r--data/images/light/16/up-arrow.pngbin0 -> 357 bytes
-rw-r--r--data/images/light/64/network-eip-acquiring.pngbin0 -> 791 bytes
-rw-r--r--data/images/light/64/network-eip-down.pngbin0 -> 1429 bytes
-rw-r--r--data/images/light/64/network-eip-up.pngbin0 -> 426 bytes
-rw-r--r--data/resources/icons.qrc9
-rw-r--r--src/leap/gui/mainwindow.py238
-rw-r--r--src/leap/gui/statuspanel.py216
-rw-r--r--src/leap/gui/ui/mainwindow.ui304
-rw-r--r--src/leap/gui/ui/statuspanel.ui248
15 files changed, 659 insertions, 362 deletions
diff --git a/Makefile b/Makefile
index 8cdbe487..81db6886 100644
--- a/Makefile
+++ b/Makefile
@@ -20,9 +20,9 @@ TRANSLAT_DIR = data/translations
PROJFILE = data/leap_client.pro
#UI files to compile
-UI_FILES = loggerwindow.ui mainwindow.ui wizard.ui login.ui
+UI_FILES = loggerwindow.ui mainwindow.ui wizard.ui login.ui statuspanel.ui
#Qt resource files to compile
-RESOURCES = locale.qrc loggerwindow.qrc mainwindow.qrc
+RESOURCES = locale.qrc loggerwindow.qrc mainwindow.qrc icons.qrc
#pyuic4 and pyrcc4 binaries
PYUIC = pyside-uic
diff --git a/changes/feature_refactor_status b/changes/feature_refactor_status
new file mode 100644
index 00000000..5ea0d959
--- /dev/null
+++ b/changes/feature_refactor_status
@@ -0,0 +1,2 @@
+ o Refactor the status bits out of the MainWindow to its own
+ StatusPanelWidget. Closes #2792 \ No newline at end of file
diff --git a/data/images/light/16/accept.png b/data/images/light/16/accept.png
new file mode 100644
index 00000000..917a68c4
--- /dev/null
+++ b/data/images/light/16/accept.png
Binary files differ
diff --git a/data/images/light/16/down-arrow.png b/data/images/light/16/down-arrow.png
new file mode 100644
index 00000000..9beb5de3
--- /dev/null
+++ b/data/images/light/16/down-arrow.png
Binary files differ
diff --git a/data/images/light/16/error.png b/data/images/light/16/error.png
new file mode 100644
index 00000000..edc20985
--- /dev/null
+++ b/data/images/light/16/error.png
Binary files differ
diff --git a/data/images/light/16/refresh.png b/data/images/light/16/refresh.png
new file mode 100644
index 00000000..a948a071
--- /dev/null
+++ b/data/images/light/16/refresh.png
Binary files differ
diff --git a/data/images/light/16/up-arrow.png b/data/images/light/16/up-arrow.png
new file mode 100644
index 00000000..4e0ec404
--- /dev/null
+++ b/data/images/light/16/up-arrow.png
Binary files differ
diff --git a/data/images/light/64/network-eip-acquiring.png b/data/images/light/64/network-eip-acquiring.png
new file mode 100644
index 00000000..83e3ea75
--- /dev/null
+++ b/data/images/light/64/network-eip-acquiring.png
Binary files differ
diff --git a/data/images/light/64/network-eip-down.png b/data/images/light/64/network-eip-down.png
new file mode 100644
index 00000000..85669af6
--- /dev/null
+++ b/data/images/light/64/network-eip-down.png
Binary files differ
diff --git a/data/images/light/64/network-eip-up.png b/data/images/light/64/network-eip-up.png
new file mode 100644
index 00000000..a0db2a22
--- /dev/null
+++ b/data/images/light/64/network-eip-up.png
Binary files differ
diff --git a/data/resources/icons.qrc b/data/resources/icons.qrc
new file mode 100644
index 00000000..6a6de9e6
--- /dev/null
+++ b/data/resources/icons.qrc
@@ -0,0 +1,9 @@
+<RCC>
+ <qresource prefix="/">
+ <file>../images/light/16/down-arrow.png</file>
+ <file>../images/light/16/up-arrow.png</file>
+ <file>../images/light/64/network-eip-acquiring.png</file>
+ <file>../images/light/64/network-eip-down.png</file>
+ <file>../images/light/64/network-eip-up.png</file>
+ </qresource>
+</RCC>
diff --git a/src/leap/gui/mainwindow.py b/src/leap/gui/mainwindow.py
index e135c798..67fe34e3 100644
--- a/src/leap/gui/mainwindow.py
+++ b/src/leap/gui/mainwindow.py
@@ -38,14 +38,15 @@ from leap.crypto.srpauth import SRPAuth
from leap.gui.loggerwindow import LoggerWindow
from leap.gui.wizard import Wizard
from leap.gui.login import LoginWidget
+from leap.gui.statuspanel import StatusPanelWidget
from leap.services.eip.eipbootstrapper import EIPBootstrapper
from leap.services.eip.eipconfig import EIPConfig
from leap.services.eip.providerbootstrapper import ProviderBootstrapper
from leap.services.soledad.soledadbootstrapper import SoledadBootstrapper
from leap.services.mail.smtpbootstrapper import SMTPBootstrapper
-from leap.platform_init import IS_MAC, IS_WIN
+from leap.platform_init import IS_WIN
from leap.platform_init.initializers import init_platform
-from leap.services.eip.vpnprocess import VPN, VPNManager
+from leap.services.eip.vpnprocess import VPN
from leap.services.eip.vpnlaunchers import (VPNLauncherException,
OpenVPNNotFoundException,
@@ -115,24 +116,6 @@ class MainWindow(QtGui.QMainWindow):
self._updates_content = ""
- if IS_MAC:
- EIP_ICONS = (
- ":/images/conn_connecting-light.png",
- ":/images/conn_connected-light.png",
- ":/images/conn_error-light.png")
- else:
- EIP_ICONS = (
- ":/images/conn_connecting.png",
- ":/images/conn_connected.png",
- ":/images/conn_error.png")
-
- self.CONNECTING_ICON = QtGui.QPixmap(EIP_ICONS[0])
- self.CONNECTED_ICON = QtGui.QPixmap(EIP_ICONS[1])
- self.ERROR_ICON = QtGui.QPixmap(EIP_ICONS[2])
-
- self.LOGGED_OUT_ICON = QtGui.QPixmap(":/images/leap-gray-big.png")
- self.LOGGED_IN_ICON = QtGui.QPixmap(":/images/leap-color-big.png")
-
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
@@ -149,11 +132,14 @@ class MainWindow(QtGui.QMainWindow):
self.ui.btnShowLog.clicked.connect(self._show_logger_window)
+ self._status_panel = StatusPanelWidget(
+ self.ui.stackedWidget.widget(self.EIP_STATUS_INDEX))
+ self.ui.statusLayout.addWidget(self._status_panel)
+
self.ui.stackedWidget.setCurrentIndex(self.LOGIN_INDEX)
- self.ui.btnEipStartStop.setEnabled(False)
- self.ui.btnEipStartStop.clicked.connect(
- self._start_eip)
+ self._status_panel.start_eip.connect(self._start_eip)
+ self._status_panel.stop_eip.connect(self._stop_eip)
# This is loaded only once, there's a bug when doing that more
# than once
@@ -169,6 +155,7 @@ class MainWindow(QtGui.QMainWindow):
# This is created once we have a valid provider config
self._srp_auth = None
+ self._logged_user = None
# This thread is always running, although it's quite
# lightweight when it's done setting up provider
@@ -209,8 +196,10 @@ class MainWindow(QtGui.QMainWindow):
self._smtp_bootstrapped_stage)
self._vpn = VPN()
- self._vpn.qtsigs.state_changed.connect(self._update_vpn_state)
- self._vpn.qtsigs.status_changed.connect(self._update_vpn_status)
+ self._vpn.qtsigs.state_changed.connect(
+ self._status_panel.update_vpn_state)
+ self._vpn.qtsigs.status_changed.connect(
+ self._status_panel.update_vpn_status)
self._vpn.qtsigs.process_finished.connect(
self._eip_finished)
@@ -234,18 +223,14 @@ class MainWindow(QtGui.QMainWindow):
self.tr("Encrypted internet is OFF"),
self)
self._action_eip_status.setEnabled(False)
+
+ self._status_panel.set_action_eip_status(
+ self._action_eip_status)
+
self._action_eip_startstop = QtGui.QAction(
- self.tr("Turn encryption ON"), self)
+ self.tr("Turn ON"), self)
self._action_eip_startstop.triggered.connect(
self._stop_eip)
- self._action_eip_write = QtGui.QAction(
- QtGui.QIcon(":/images/Arrow-Up-32.png"),
- "%12.2f Kb" % (0.0,), self)
- self._action_eip_write.setEnabled(False)
- self._action_eip_read = QtGui.QAction(
- QtGui.QIcon(":/images/Arrow-Down-32.png"),
- "%12.2f Kb" % (0.0,), self)
- self._action_eip_read.setEnabled(False)
self._action_visible = QtGui.QAction(self.tr("Hide Main Window"), self)
self._action_visible.triggered.connect(self._toggle_visible)
@@ -527,10 +512,12 @@ class MainWindow(QtGui.QMainWindow):
systrayMenu.addAction(self._action_eip_startstop)
self._systray = QtGui.QSystemTrayIcon(self)
self._systray.setContextMenu(systrayMenu)
- self._systray.setIcon(QtGui.QIcon(self.ERROR_ICON))
+ self._systray.setIcon(self._status_panel.ERROR_ICON)
self._systray.setVisible(True)
self._systray.activated.connect(self._tray_activated)
+ self._status_panel.set_systray(self._systray)
+
def _tray_activated(self, reason=None):
"""
SLOT
@@ -662,18 +649,6 @@ class MainWindow(QtGui.QMainWindow):
is_proper_provider = self._settings.get_properprovider()
return not (has_provider_on_disk and is_proper_provider)
- def _set_eip_status(self, status, error=False):
- """
- Sets the status label at the VPN stage to status
-
- :param status: status message
- :type status: str
- """
- self._systray.setToolTip(status)
- if error:
- status = "<font color='red'><b>%s</b></font>" % (status,)
- self.ui.lblEIPStatus.setText(status)
-
def _download_provider_config(self):
"""
Starts the bootstrapping sequence. It will download the
@@ -812,6 +787,7 @@ class MainWindow(QtGui.QMainWindow):
"""
self._login_widget.set_status(message, error=not ok)
if ok:
+ self._logged_user = self._login_widget.get_user()
self.ui.action_sign_out.setEnabled(True)
# We leave a bit of room for the user to see the
# "Succeeded" message and then we switch to the EIP status
@@ -826,6 +802,11 @@ class MainWindow(QtGui.QMainWindow):
Changes the stackedWidget index to the EIP status one and
triggers the eip bootstrapping
"""
+ if not self._already_started_eip:
+ self._status_panel.set_provider(
+ "%s@%s" % (self._login_widget.get_user(),
+ self._provider_config.get_domain()))
+
self.ui.stackedWidget.setCurrentIndex(self.EIP_STATUS_INDEX)
self._soledad_bootstrapper.run_soledad_setup_checks(
@@ -883,13 +864,14 @@ class MainWindow(QtGui.QMainWindow):
else:
if self._enabled_services.count(self.MX_SERVICE) > 0:
pass # TODO: show MX status
- #self._set_eip_status(
+ #self._status_panel.set_eip_status(
# self.tr("%s does not support MX") %
# (self._provider_config.get_domain(),),
# error=True)
else:
pass # TODO: show MX status
- #self._set_eip_status(self.tr("MX is disabled"))
+ #self._status_panel.set_eip_status(
+ # self.tr("MX is disabled"))
def _smtp_bootstrapped_stage(self, data):
"""
@@ -969,45 +951,55 @@ class MainWindow(QtGui.QMainWindow):
self._settings.set_defaultprovider(
provider_config.get_domain())
+
+ provider = self._provider_config.get_domain()
+ if self._logged_user is not None:
+ provider = "%s@%s" % (self._logged_user, provider)
+
+ self._status_panel.set_provider(provider)
+
self._action_eip_provider.setText(provider_config.get_domain())
- self.ui.btnEipStartStop.setText(self.tr("Turn Encryption OFF"))
- self.ui.btnEipStartStop.disconnect(self)
- self.ui.btnEipStartStop.clicked.connect(
- self._stop_eip)
- self._action_eip_startstop.setText(self.tr("Turn Encryption OFF"))
+
+ self._status_panel.eip_started()
+
+ self._action_eip_startstop.setText(self.tr("Turn OFF"))
self._action_eip_startstop.disconnect(self)
self._action_eip_startstop.triggered.connect(
self._stop_eip)
except EIPNoPolkitAuthAgentAvailable:
- self._set_eip_status(self.tr("We could not find any "
- "authentication "
- "agent in your system.<br/>"
- "Make sure you have "
- "<b>polkit-gnome-authentication-"
- "agent-1</b> "
- "running and try again."),
- error=True)
+ self._status_panel.set_eip_status(
+ self.tr("We could not find any "
+ "authentication "
+ "agent in your system.<br/>"
+ "Make sure you have "
+ "<b>polkit-gnome-authentication-"
+ "agent-1</b> "
+ "running and try again."),
+ error=True)
except EIPNoPkexecAvailable:
- self._set_eip_status(self.tr("We could not find <b>pkexec</b> "
- "in your system."),
- error=True)
+ self._status_panel.set_eip_status(
+ self.tr("We could not find <b>pkexec</b> "
+ "in your system."),
+ error=True)
except OpenVPNNotFoundException:
- self._set_eip_status(self.tr("We couldn't find openvpn"),
- error=True)
+ self._status_panel.set_eip_status(
+ self.tr("We couldn't find openvpn"),
+ error=True)
except VPNLauncherException as e:
- self._set_eip_status("%s" % (e,), error=True)
+ self._status_panel.set_eip_status("%s" % (e,), error=True)
+ else:
+ self._already_started_eip = True
- self.ui.btnEipStartStop.setEnabled(True)
+ self._status_panel.set_startstop_enabled(True)
def _stop_eip(self):
self._vpn.terminate()
- self._set_eip_status(self.tr("EIP has stopped"))
- self._set_eip_status_icon("error")
- self.ui.btnEipStartStop.setText(self.tr("Turn Encryption ON"))
- self.ui.btnEipStartStop.disconnect(self)
- self.ui.btnEipStartStop.clicked.connect(
- self._start_eip)
- self._action_eip_startstop.setText(self.tr("Turn Encryption ON"))
+ self._status_panel.set_eip_status(self.tr("Off"))
+ self._status_panel.set_eip_status_icon("error")
+
+ self._status_panel.eip_stopped()
+
+ self._action_eip_startstop.setText(self.tr("Turn ON"))
self._action_eip_startstop.disconnect(self)
self._action_eip_startstop.triggered.connect(
self._start_eip)
@@ -1048,92 +1040,21 @@ class MainWindow(QtGui.QMainWindow):
self._enabled_services.count(self.OPENVPN_SERVICE) > 0 and \
not self._already_started_eip:
- self._set_eip_status(
- self.tr("Checking configuration, please wait..."))
+ self._status_panel.set_eip_status(
+ self.tr("Starting..."))
self._eip_bootstrapper.run_eip_setup_checks(
provider_config,
download_if_needed=True)
self._already_started_eip = True
elif not self._already_started_eip:
if self._enabled_services.count(self.OPENVPN_SERVICE) > 0:
- self._set_eip_status(self.tr("%s does not support EIP") %
- (provider_config.get_domain(),),
- error=True)
+ self._status_panel.set_eip_status(
+ self.tr("Not supported"),
+ error=True)
else:
- self._set_eip_status(self.tr("EIP is disabled"))
+ self._status_panel.set_eip_status(self.tr("Disabled"))
self.ui.btnEipStartStop.setEnabled(False)
- def _set_eip_status_icon(self, status):
- """
- Given a status step from the VPN thread, set the icon properly
-
- :param status: status step
- :type status: str
- """
- selected_pixmap = self.ERROR_ICON
- tray_message = self.tr("Encryption is OFF")
- if status in ("WAIT", "AUTH", "GET_CONFIG",
- "RECONNECTING", "ASSIGN_IP"):
- selected_pixmap = self.CONNECTING_ICON
- tray_message = self.tr("Turning Encryption ON")
- elif status in ("CONNECTED"):
- tray_message = self.tr("Encryption is ON")
- selected_pixmap = self.CONNECTED_ICON
-
- self.ui.lblVPNStatusIcon.setPixmap(selected_pixmap)
- self._systray.setIcon(QtGui.QIcon(selected_pixmap))
- self._action_eip_status.setText(tray_message)
-
- def _update_vpn_state(self, data):
- """
- SLOT
- TRIGGER: self._vpn.state_changed
-
- Updates the displayed VPN state based on the data provided by
- the VPN thread
- """
- status = data[VPNManager.STATUS_STEP_KEY]
- self._set_eip_status_icon(status)
- if status == "AUTH":
- self._set_eip_status(self.tr("VPN: Authenticating..."))
- elif status == "GET_CONFIG":
- self._set_eip_status(self.tr("VPN: Retrieving configuration..."))
- elif status == "CONNECTED":
- self._set_eip_status(self.tr("VPN: Connected!"))
- elif status == "WAIT":
- self._set_eip_status(self.tr("VPN: Waiting to start..."))
- elif status == "ASSIGN_IP":
- self._set_eip_status(self.tr("VPN: Assigning IP"))
- elif status == "ALREADYRUNNING":
- # Put the following calls in Qt's event queue, otherwise
- # the UI won't update properly
- QtCore.QTimer.singleShot(0, self._stop_eip)
- QtCore.QTimer.singleShot(0, partial(self._set_eip_status,
- self.tr("Unable to start VPN, "
- "it's already "
- "running.")))
- else:
- self._set_eip_status(status)
-
- def _update_vpn_status(self, data):
- """
- SLOT
- TRIGGER: self._vpn.status_changed
-
- Updates the download/upload labels based on the data provided
- by the VPN thread
- """
- upload = float(data[VPNManager.TUNTAP_WRITE_KEY])
- upload = upload / 1000.0
- upload_str = "%12.2f Kb" % (upload,)
- self.ui.lblUpload.setText(upload_str)
- self._action_eip_write.setText(upload_str)
- download = float(data[VPNManager.TUNTAP_READ_KEY])
- download = download / 1000.0
- download_str = "%12.2f Kb" % (download,)
- self.ui.lblDownload.setText(download_str)
- self._action_eip_read.setText(download_str)
-
def _finish_eip_bootstrap(self, data):
"""
SLOT
@@ -1157,11 +1078,13 @@ class MainWindow(QtGui.QMainWindow):
self._start_eip()
else:
if data[self._eip_bootstrapper.PASSED_KEY]:
- self._set_eip_status(self.tr("Could not load EIP "
- "Configuration"), error=True)
+ self._status_panel.set_eip_status(
+ self.tr("Could not load EIP Configuration"),
+ error=True)
else:
- self._set_eip_status(data[self._eip_bootstrapper.ERROR_KEY],
- error=True)
+ self._status_panel.set_eip_status(
+ data[self._eip_bootstrapper.ERROR_KEY],
+ error=True)
self._already_started_eip = False
def _logout(self):
@@ -1183,6 +1106,7 @@ class MainWindow(QtGui.QMainWindow):
Switches the stackedWidget back to the login stage after
logging out
"""
+ self._logged_user = None
self.ui.action_sign_out.setEnabled(False)
self.ui.stackedWidget.setCurrentIndex(self.LOGIN_INDEX)
self._login_widget.set_password("")
diff --git a/src/leap/gui/statuspanel.py b/src/leap/gui/statuspanel.py
new file mode 100644
index 00000000..53c19e86
--- /dev/null
+++ b/src/leap/gui/statuspanel.py
@@ -0,0 +1,216 @@
+# -*- coding: utf-8 -*-
+# statuspanel.py
+# Copyright (C) 2013 LEAP
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+Status Panel widget implementation
+"""
+import logging
+
+from functools import partial
+from PySide import QtCore, QtGui
+
+from ui_statuspanel import Ui_StatusPanel
+from leap.services.eip.vpnprocess import VPNManager
+from leap.platform_init import IS_MAC
+from leap.common.check import leap_assert_type
+
+logger = logging.getLogger(__name__)
+
+
+class StatusPanelWidget(QtGui.QWidget):
+ """
+ Status widget that displays the current state of the LEAP services
+ """
+
+ start_eip = QtCore.Signal()
+ stop_eip = QtCore.Signal()
+
+ def __init__(self, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+
+ self._systray = None
+ self._action_eip_status = None
+
+ self.ui = Ui_StatusPanel()
+ self.ui.setupUi(self)
+
+ self.ui.btnEipStartStop.setEnabled(False)
+ self.ui.btnEipStartStop.clicked.connect(
+ self.start_eip)
+
+ if IS_MAC:
+ EIP_ICONS = (
+ ":/images/conn_connecting-light.png",
+ ":/images/conn_connected-light.png",
+ ":/images/conn_error-light.png")
+ else:
+ EIP_ICONS = (
+ ":/images/conn_connecting.png",
+ ":/images/conn_connected.png",
+ ":/images/conn_error.png")
+
+ self.CONNECTING_ICON = QtGui.QPixmap(EIP_ICONS[0])
+ self.CONNECTED_ICON = QtGui.QPixmap(EIP_ICONS[1])
+ self.ERROR_ICON = QtGui.QPixmap(EIP_ICONS[2])
+
+ def set_systray(self, systray):
+ """
+ Sets the systray object to use
+
+ :param systray: Systray object
+ :type systray: QtGui.QSystemTrayIcon
+ """
+ leap_assert_type(systray, QtGui.QSystemTrayIcon)
+ self._systray = systray
+
+ def set_action_eip_status(self, action_eip_status):
+ """
+ Sets the action_eip_status to use
+
+ :param action_eip_status: action_eip_status to be used
+ :type action_eip_status: QtGui.QAction
+ """
+ leap_assert_type(action_eip_status, QtGui.QAction)
+ self._action_eip_status = action_eip_status
+
+ def set_eip_status(self, status, error=False):
+ """
+ Sets the status label at the VPN stage to status
+
+ :param status: status message
+ :type status: str or unicode
+ :param error: if the status is an erroneous one, then set this
+ to True
+ :type error: bool
+ """
+ leap_assert_type(error, bool)
+
+ self._systray.setToolTip(status)
+ if error:
+ status = "<font color='red'>%s</font>" % (status,)
+ self.ui.lblEIPStatus.setText(status)
+
+ def set_startstop_enabled(self, value):
+ """
+ Enable or disable btnEipStartStop based on value
+
+ :param value: True for enabled, False otherwise
+ :type value: bool
+ """
+ leap_assert_type(value, bool)
+ self.ui.btnEipStartStop.setEnabled(value)
+
+ def eip_started(self):
+ """
+ Sets the state of the widget to how it should look after EIP
+ has started
+ """
+ self.ui.btnEipStartStop.setText(self.tr("Turn OFF"))
+ self.ui.btnEipStartStop.disconnect(self)
+ self.ui.btnEipStartStop.clicked.connect(
+ self.stop_eip)
+
+ def eip_stopped(self):
+ """
+ Sets the state of the widget to how it should look after EIP
+ has stopped
+ """
+ self.ui.btnEipStartStop.setText(self.tr("Turn ON"))
+ self.ui.btnEipStartStop.disconnect(self)
+ self.ui.btnEipStartStop.clicked.connect(
+ self.start_eip)
+
+ def set_icon(self, icon):
+ """
+ Sets the icon to display for EIP
+
+ :param icon: icon to display
+ :type icon: QPixmap
+ """
+ self.ui.lblVPNStatusIcon.setPixmap(icon)
+
+ def update_vpn_status(self, data):
+ """
+ SLOT
+ TRIGGER: VPN.status_changed
+
+ Updates the download/upload labels based on the data provided
+ by the VPN thread
+ """
+ upload = float(data[VPNManager.TUNTAP_WRITE_KEY])
+ upload = upload / 1000.0
+ upload_str = "%12.2f Kb" % (upload,)
+ self.ui.lblUpload.setText(upload_str)
+ download = float(data[VPNManager.TUNTAP_READ_KEY])
+ download = download / 1000.0
+ download_str = "%12.2f Kb" % (download,)
+ self.ui.lblDownload.setText(download_str)
+
+ def update_vpn_state(self, data):
+ """
+ SLOT
+ TRIGGER: VPN.state_changed
+
+ Updates the displayed VPN state based on the data provided by
+ the VPN thread
+ """
+ status = data[VPNManager.STATUS_STEP_KEY]
+ self.set_eip_status_icon(status)
+ if status == "AUTH":
+ self.set_eip_status(self.tr("Authenticating..."))
+ elif status == "GET_CONFIG":
+ self.set_eip_status(self.tr("Retrieving configuration..."))
+ elif status == "CONNECTED":
+ self.set_eip_status(self.tr("On"))
+ elif status == "WAIT":
+ self.set_eip_status(self.tr("Waiting to start..."))
+ elif status == "ASSIGN_IP":
+ self.set_eip_status(self.tr("Assigning IP"))
+ elif status == "ALREADYRUNNING":
+ # Put the following calls in Qt's event queue, otherwise
+ # the UI won't update properly
+ QtCore.QTimer.singleShot(0, self.stop_eip)
+ QtCore.QTimer.singleShot(0, partial(self.set_eip_status,
+ self.tr("Unable to start VPN, "
+ "it's already "
+ "running.")))
+ else:
+ self._set_eip_status(status)
+
+ def set_eip_status_icon(self, status):
+ """
+ Given a status step from the VPN thread, set the icon properly
+
+ :param status: status step
+ :type status: str
+ """
+ selected_pixmap = self.ERROR_ICON
+ tray_message = self.tr("Encryption is OFF")
+ if status in ("WAIT", "AUTH", "GET_CONFIG",
+ "RECONNECTING", "ASSIGN_IP"):
+ selected_pixmap = self.CONNECTING_ICON
+ tray_message = self.tr("Turning ON")
+ elif status in ("CONNECTED"):
+ tray_message = self.tr("Encryption is ON")
+ selected_pixmap = self.CONNECTED_ICON
+
+ self.set_icon(selected_pixmap)
+ self._systray.setIcon(QtGui.QIcon(selected_pixmap))
+ self._action_eip_status.setText(tray_message)
+
+ def set_provider(self, provider):
+ self.ui.lblProvider.setText(provider)
diff --git a/src/leap/gui/ui/mainwindow.ui b/src/leap/gui/ui/mainwindow.ui
index 4874a324..58827fe0 100644
--- a/src/leap/gui/ui/mainwindow.ui
+++ b/src/leap/gui/ui/mainwindow.ui
@@ -28,6 +28,75 @@
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="5">
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="2" column="0">
+ <spacer name="horizontalSpacer_8">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="1">
+ <spacer name="horizontalSpacer_7">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="lblNewUpdates">
+ <property name="text">
+ <string>There are new updates available, please restart.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QPushButton" name="btnMore">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>More...</string>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <spacer name="horizontalSpacer_9">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
<item row="6" column="2">
<spacer name="verticalSpacer">
<property name="orientation">
@@ -41,39 +110,10 @@
</property>
</spacer>
</item>
- <item row="7" column="2">
- <widget class="QLabel" name="label">
- <property name="autoFillBackground">
- <bool>false</bool>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../../../../data/resources/mainwindow.qrc">:/images/leap-color-big.png</pixmap>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="7" column="0" colspan="2">
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
<item row="10" column="0" colspan="5">
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
- <number>0</number>
+ <number>1</number>
</property>
<widget class="QWidget" name="loginPage">
<layout class="QGridLayout" name="gridLayout_2">
@@ -110,115 +150,29 @@
</widget>
<widget class="QWidget" name="page_2">
<layout class="QGridLayout" name="gridLayout_3">
- <item row="0" column="0" colspan="6">
- <widget class="QLabel" name="lblVPNStatusIcon">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../../../../data/resources/mainwindow.qrc">:/images/conn_error.png</pixmap>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="2">
- <widget class="QLabel" name="lblUpload">
- <property name="minimumSize">
- <size>
- <width>70</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>0.0 Kb</string>
- </property>
- </widget>
- </item>
- <item row="3" column="4">
- <widget class="QLabel" name="lblDownload">
- <property name="minimumSize">
- <size>
- <width>70</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>0.0 Kb</string>
- </property>
- </widget>
- </item>
- <item row="3" column="5">
- <spacer name="horizontalSpacer_6">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="3" column="3">
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../../../../data/resources/mainwindow.qrc">:/images/Arrow-Up-32.png</pixmap>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../../../../data/resources/mainwindow.qrc">:/images/Arrow-Down-32.png</pixmap>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <spacer name="horizontalSpacer_5">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="0" colspan="6">
- <widget class="QLabel" name="lblEIPStatus">
- <property name="text">
- <string>Disconnected</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="1" colspan="4">
- <widget class="QPushButton" name="btnEipStartStop">
- <property name="text">
- <string>Turn Encryption ON</string>
- </property>
- </widget>
+ <item row="0" column="0">
+ <layout class="QVBoxLayout" name="statusLayout"/>
</item>
</layout>
</widget>
</widget>
</item>
+ <item row="7" column="2">
+ <widget class="QLabel" name="label">
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../../../../data/resources/mainwindow.qrc">:/images/leap-color-big.png</pixmap>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
<item row="7" column="3" colspan="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
@@ -245,76 +199,20 @@
</property>
</spacer>
</item>
- <item row="0" column="0" colspan="5">
- <layout class="QGridLayout" name="gridLayout_4">
- <item row="2" column="0">
- <spacer name="horizontalSpacer_8">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="1">
- <spacer name="horizontalSpacer_7">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>0</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="1">
- <widget class="QLabel" name="lblNewUpdates">
- <property name="text">
- <string>There are new updates available, please restart.</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QPushButton" name="btnMore">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>More...</string>
- </property>
- <property name="flat">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="3">
- <spacer name="horizontalSpacer_9">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
+ <item row="7" column="0" colspan="2">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
</item>
- <item row="9" column="2" colspan="3">
+ <item row="18" column="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer_10">
diff --git a/src/leap/gui/ui/statuspanel.ui b/src/leap/gui/ui/statuspanel.ui
new file mode 100644
index 00000000..67f5f669
--- /dev/null
+++ b/src/leap/gui/ui/statuspanel.ui
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>StatusPanel</class>
+ <widget class="QWidget" name="StatusPanel">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>506</width>
+ <height>403</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="lblProvider">
+ <property name="styleSheet">
+ <string notr="true">font: bold;</string>
+ </property>
+ <property name="text">
+ <string>user@domain.org</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="status_rows" native="true">
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="spacing">
+ <number>12</number>
+ </property>
+ <property name="leftMargin">
+ <number>16</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="eip_status_row">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="lblVPNStatusIcon">
+ <property name="maximumSize">
+ <size>
+ <width>64</width>
+ <height>64</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../../../../data/resources/icons.qrc">:/images/light/64/network-eip-down.png</pixmap>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="eip_split_row">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="eip_controls">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Encrypted Internet: </string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="lblEIPStatus">
+ <property name="styleSheet">
+ <string notr="true">font: bold;</string>
+ </property>
+ <property name="text">
+ <string>Off</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::AutoText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnEipStartStop">
+ <property name="text">
+ <string>Turn On</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="eip_bandwidth">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../../../../data/resources/icons.qrc">:/images/light/16/down-arrow.png</pixmap>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="lblUpload">
+ <property name="text">
+ <string>0.0 Kb</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../../../../data/resources/icons.qrc">:/images/light/16/up-arrow.png</pixmap>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="lblDownload">
+ <property name="text">
+ <string>0.0 Kb</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>11</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../../../../data/resources/icons.qrc"/>
+ </resources>
+ <connections/>
+</ui>