summaryrefslogtreecommitdiff
path: root/src/leap/baseapp
diff options
context:
space:
mode:
authorkali <kali@leap.se>2012-09-20 05:00:32 +0900
committerkali <kali@leap.se>2012-09-20 05:00:32 +0900
commit1ab8247ecb8664af5159b7f1e050189f5e637146 (patch)
tree1fac7766356a2a69870fd0e00fd306131bd036a9 /src/leap/baseapp
parent50396fca082652dd1a1617e0d029c1c726e4c651 (diff)
parent3c7451d62363d0a3326552956db630dda09392fa (diff)
Merge branch 'feature/systray-menu' into develop
Close #536. Cleaning up of the systray menu. Main window starts hidden if not in debug mode. Incidentally, some fixes related to the subprocess invocation and termination, removing many of the annoying hangs during debug.
Diffstat (limited to 'src/leap/baseapp')
-rw-r--r--src/leap/baseapp/eip.py12
-rw-r--r--src/leap/baseapp/leap_app.py26
-rw-r--r--src/leap/baseapp/systray.py74
3 files changed, 79 insertions, 33 deletions
diff --git a/src/leap/baseapp/eip.py b/src/leap/baseapp/eip.py
index 8ebd84ae..98ff7142 100644
--- a/src/leap/baseapp/eip.py
+++ b/src/leap/baseapp/eip.py
@@ -152,13 +152,18 @@ class EIPConductorAppMixin(object):
# from openvpn manager)
if not self.eip_service_started:
+ # there is a race condition
+ # going on here. Depending on how long we take
+ # to init the qt app, the management socket
+ # is not ready yet.
return
if self.conductor.with_errors:
#XXX how to wait on pkexec???
#something better that this workaround, plz!!
- time.sleep(5)
- logger.debug('timeout')
+ #I removed the pkexec pass authentication at all.
+ #time.sleep(5)
+ #logger.debug('timeout')
logger.error('errors. disconnect')
self.start_or_stopVPN() # is stop
@@ -211,12 +216,12 @@ class EIPConductorAppMixin(object):
if self.debugmode:
self.startStopButton.setText('&Disconnect')
self.eip_service_started = True
+ self.toggleEIPAct()
# XXX decouple! (timer is init by icons class).
# we could bring Timer Init to this Mixin
# or to its own Mixin.
self.timer.start(constants.TIMER_MILLISECONDS)
-
return
if self.eip_service_started is True:
@@ -224,5 +229,6 @@ class EIPConductorAppMixin(object):
if self.debugmode:
self.startStopButton.setText('&Connect')
self.eip_service_started = False
+ self.toggleEIPAct()
self.timer.stop()
return
diff --git a/src/leap/baseapp/leap_app.py b/src/leap/baseapp/leap_app.py
index f91b2329..208c4e7c 100644
--- a/src/leap/baseapp/leap_app.py
+++ b/src/leap/baseapp/leap_app.py
@@ -7,6 +7,9 @@ from leap.gui import mainwindow_rc
logger = logging.getLogger(name=__name__)
+APP_LOGO = ':/images/leap-color-small.png'
+
+
class MainWindowMixin(object):
"""
create the main window
@@ -32,25 +35,30 @@ class MainWindowMixin(object):
widget.setLayout(mainLayout)
self.setWindowTitle("LEAP Client")
+ self.set_app_icon()
self.resize(400, 300)
self.set_statusbarMessage('ready')
+ def set_app_icon(self):
+ icon = QtGui.QIcon(APP_LOGO)
+ self.setWindowIcon(icon)
+
def createWindowHeader(self):
"""
description lines for main window
"""
self.headerBox = QtGui.QGroupBox()
- self.headerLabel = QtGui.QLabel("<font size=40><b>E</b>ncryption \
-<b>I</b>nternet <b>P</b>roxy</font>")
- self.headerLabelSub = QtGui.QLabel("<i>trust your \
-technolust</i>")
+ self.headerLabel = QtGui.QLabel(
+ "<font size=40>LEAP Encryption Access Project</font>")
+ self.headerLabelSub = QtGui.QLabel(
+ "<br><i>your internet encryption toolkit</i>")
- pixmap = QtGui.QPixmap(':/images/leapfrog.jpg')
- frog_lbl = QtGui.QLabel()
- frog_lbl.setPixmap(pixmap)
+ pixmap = QtGui.QPixmap(APP_LOGO)
+ leap_lbl = QtGui.QLabel()
+ leap_lbl.setPixmap(pixmap)
headerLayout = QtGui.QHBoxLayout()
- headerLayout.addWidget(frog_lbl)
+ headerLayout.addWidget(leap_lbl)
headerLayout.addWidget(self.headerLabel)
headerLayout.addWidget(self.headerLabelSub)
headerLayout.addStretch()
@@ -85,5 +93,5 @@ technolust</i>")
# XXX send signal instead?
logger.info('Shutting down')
self.conductor.cleanup()
- logger.info('Exiting')
+ logger.info('Exiting. Bye.')
QtGui.qApp.quit()
diff --git a/src/leap/baseapp/systray.py b/src/leap/baseapp/systray.py
index 762dac13..39a23f49 100644
--- a/src/leap/baseapp/systray.py
+++ b/src/leap/baseapp/systray.py
@@ -1,9 +1,15 @@
+import logging
+
from PyQt4 import QtCore
from PyQt4 import QtGui
+from leap import __branding as BRANDING
from leap import __version__ as VERSION
+
from leap.gui import mainwindow_rc
+logger = logging.getLogger(__name__)
+
class StatusAwareTrayIconMixin(object):
"""
@@ -61,7 +67,7 @@ class StatusAwareTrayIconMixin(object):
self.iconpath['connected'])),
self.ConnectionWidgets = con_widgets
- self.statusIconBox = QtGui.QGroupBox("Connection Status")
+ self.statusIconBox = QtGui.QGroupBox("EIP Connection Status")
statusIconLayout = QtGui.QHBoxLayout()
statusIconLayout.addWidget(self.ConnectionWidgets['disconnected'])
statusIconLayout.addWidget(self.ConnectionWidgets['connecting'])
@@ -76,12 +82,12 @@ class StatusAwareTrayIconMixin(object):
"""
self.trayIconMenu = QtGui.QMenu(self)
- self.trayIconMenu.addAction(self.connectVPNAction)
- self.trayIconMenu.addAction(self.dis_connectAction)
+ self.trayIconMenu.addAction(self.connAct)
+ #self.trayIconMenu.addAction(self.minimizeAction)
+ #self.trayIconMenu.addAction(self.maximizeAction)
+ #self.trayIconMenu.addAction(self.restoreAction)
self.trayIconMenu.addSeparator()
- self.trayIconMenu.addAction(self.minimizeAction)
- self.trayIconMenu.addAction(self.maximizeAction)
- self.trayIconMenu.addAction(self.restoreAction)
+ self.trayIconMenu.addAction(self.detailsAct)
self.trayIconMenu.addSeparator()
self.trayIconMenu.addAction(self.aboutAct)
self.trayIconMenu.addAction(self.aboutQtAct)
@@ -92,22 +98,26 @@ class StatusAwareTrayIconMixin(object):
self.setIcon('disconnected')
self.trayIcon.setContextMenu(self.trayIconMenu)
+ def bad(self):
+ logger.error('this should not be called')
+
def createActions(self):
"""
creates actions to be binded to tray icon
"""
- self.connectVPNAction = QtGui.QAction("Connect to &VPN", self,
- triggered=self.hide)
# XXX change action name on (dis)connect
- self.dis_connectAction = QtGui.QAction(
- "&(Dis)connect", self,
- triggered=lambda: self.start_or_stopVPN())
- self.minimizeAction = QtGui.QAction("Mi&nimize", self,
- triggered=self.hide)
- self.maximizeAction = QtGui.QAction("Ma&ximize", self,
- triggered=self.showMaximized)
- self.restoreAction = QtGui.QAction("&Restore", self,
- triggered=self.showNormal)
+ self.connAct = QtGui.QAction("Encryption ON turn &off", self,
+ triggered=lambda: self.start_or_stopVPN())
+
+ self.detailsAct = QtGui.QAction("&Details...",
+ self,
+ triggered=self.detailsWin)
+ #self.minimizeAction = QtGui.QAction("Mi&nimize", self,
+ #triggered=self.hide)
+ #self.maximizeAction = QtGui.QAction("Ma&ximize", self,
+ #triggered=self.showMaximized)
+ #self.restoreAction = QtGui.QAction("&Restore", self,
+ #triggered=self.showNormal)
self.aboutAct = QtGui.QAction("&About", self,
triggered=self.about)
self.aboutQtAct = QtGui.QAction("About Q&t", self,
@@ -115,11 +125,33 @@ class StatusAwareTrayIconMixin(object):
self.quitAction = QtGui.QAction("&Quit", self,
triggered=self.cleanupAndQuit)
+ def toggleEIPAct(self):
+ # this is too simple by now.
+ # XXX We need to get the REAL info for Encryption state.
+ # (now is ON as soon as vpn launched)
+ if self.eip_service_started is True:
+ self.connAct.setText('Encryption ON turn o&ff')
+ else:
+ self.connAct.setText('Encryption OFF turn &on')
+
+ def detailsWin(self):
+ visible = self.isVisible()
+ if visible:
+ self.hide()
+ else:
+ self.show()
+
def about(self):
# move to widget
- QtGui.QMessageBox.about(self, "About",
- "Running LEAP client<br>"
- "version <b>%s</b>" % VERSION)
+ flavor = BRANDING.get('short_name', None)
+ content = ("LEAP client<br>"
+ "(version <b>%s</b>)<br>" % VERSION)
+ if flavor:
+ content = content + ('<br>Flavor: <i>%s</i><br>' % flavor)
+ content = content + (
+ "<br><a href='https://leap.se/'>"
+ "https://leap.se</a>")
+ QtGui.QMessageBox.about(self, "About", content)
def setConnWidget(self, icon_name):
oldlayout = self.statusIconBox.layout()
@@ -132,7 +164,7 @@ class StatusAwareTrayIconMixin(object):
def setIcon(self, name):
icon = self.Icons.get(name)(self)
self.trayIcon.setIcon(icon)
- self.setWindowIcon(icon)
+ #self.setWindowIcon(icon)
def getIcon(self, icon_name):
return self.states.get(icon_name, None)