X-Git-Url: https://v.licheni.net/stack/code/dboxswitch.git/blobdiff_plain/f19cd7df7f4f366e903c5160d6ca9eceb8555db5..4ccfdabe53cd795fe1e74b704c15da311986ecaf:/gui.py diff --git a/gui.py b/gui.py old mode 100755 new mode 100644 index dd7e81e..ae2c3c8 --- a/gui.py +++ b/gui.py @@ -1,4 +1,3 @@ -#!/usr/bin/python # -*- coding: utf-8 -*- """ @@ -34,7 +33,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ import sys import os -from PyQt4 import QtGui +from time import sleep +from PyQt4 import QtGui, QtCore from PyQt4.QtCore import SIGNAL from qmenutooltip import QMenuToolTip @@ -48,7 +48,11 @@ class Gui(QtGui.QDialog): Default actions are builded and profile manager stored from argument (instance of ProfHandler """ self.app = QtGui.QApplication(sys.argv) - + for i in range(3): + if not QtGui.QSystemTrayIcon.isSystemTrayAvailable(): + sleep(4) + else: + break #check if system tray is avaiable on the system if not QtGui.QSystemTrayIcon.isSystemTrayAvailable(): QtGui.QMessageBox.critical(None, "Systray", @@ -59,14 +63,14 @@ class Gui(QtGui.QDialog): super(Gui, self).__init__() + self.profiles = [] + self.createActions() self.createTrayIcon() + self.createMainDialog() self.trayIcon.show() - - self.setWindowTitle("Profile manager / Dboxswitch - dropbox profile switcher") - self.resize(200, 200) - + self.profileManager = prManager def main(self): @@ -86,14 +90,71 @@ class Gui(QtGui.QDialog): """ Create actions for the various components """ self.manageprofiles = QtGui.QAction("Manage &Profiles", self, - triggered=self.hide) + triggered=self.show) self.quitAction = QtGui.QAction("&Quit", self, triggered=QtGui.qApp.quit) #profile manager component - self.addProfile = QtGui.QAction(" Add &Profile ", self, - triggered=self.addProfile, icon=QtGui.QIcon(appconf.icon)) + self.addProfileAction = QtGui.QAction(" Add &Profile ", self, + triggered=self.addProfile) + def createMainDialog(self): + """ Build the main dialog layout """ + + self.setWindowTitle("Profile manager / Dboxswitch - dropbox profile switcher") + #add a default action to create a profile + self.addButton = QtGui.QPushButton(QtGui.QIcon(appconf.addpicon), + "Add Profile") + self.addButton.clicked.connect(self.addProfile) + self.addButton.setVisible(False) + + self.la = QtGui.QFormLayout() + + self.la.addRow(self.addButton) + self.la.sizePolicy = QtGui.QSizePolicy.Minimum + self.la.setVerticalSpacing(15) + self.la.setHorizontalSpacing(15) + self.formGroupBox = QtGui.QGroupBox("Manage profiles:") + self.formGroupBox.setLayout(self.la) + mainLayout = QtGui.QVBoxLayout() + mainLayout.addWidget(self.formGroupBox) + self.setLayout(mainLayout) + + + def show(self): + """ Show the main dialog for dealing with profiles """ + + profiles = self.profileManager.getProfilesList() + + for pr in profiles: + prname = self.profileManager.getBaseProfileName(pr) + delButton = QtGui.QToolButton() + label = QtGui.QLabel(prname) + self.la.addRow(label, delButton) + delAction = QtGui.QAction(QtGui.QIcon(appconf.delpicon),"Delete", self, + triggered=self.deleteProfileAction(prname, (label, delButton))) + delButton.setDefaultAction(delAction) + self.profiles.append((label, delButton)) + + #if profiles was empty + if len(profiles) == 0: + self.addButton.setVisible(True) + else: + self.addButton.setVisible(False) + + super(Gui, self).show() + + def hide(self): + """ Hides the main dialog """ + + #Hides all the profiles in the Dialog + #User can deal with profiles like removing the dir manually + + for ws in self.profiles: + for w in ws: + w.setVisible(False) + w.setParent(None) + super(Gui, self).hide() def createTrayIcon(self): """ Builds a new tray icon with a context menu and an action for the profile manager menu """ @@ -121,16 +182,19 @@ class Gui(QtGui.QDialog): if reason in (QtGui.QSystemTrayIcon.Trigger, QtGui.QSystemTrayIcon.DoubleClick): self.menuProfiles = QMenuToolTip() self.menuProfiles.setTitle("Profiles") + QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_DontShowIconsInMenus, False) #Get profiles from the ProfHandler embedded in the gui profiles = self.profileManager.getProfilesList() - for pr in profiles: - pr = os.path.basename(pr) + for prpath in profiles: + pr = self.profileManager.getBaseProfileName(prpath) + receiver = self.activateProfileAction(prpath) menuItem_Profile = self.menuProfiles.addAction(pr) - + if self.profileManager.isCurrentProfile(prpath): + menuItem_Profile.setIcon(QtGui.QIcon(appconf.cpicon)) + #Using lambda function to pass additional arguments to the function, in this case the path of the profile - receiver = lambda pr=pr: self.profileManager.activateProfile(pr) self.connect(menuItem_Profile, SIGNAL('triggered()'), receiver) #set menu item ToolTip menuItem_Profile.setToolTip("Activate profile: "+pr) @@ -139,11 +203,39 @@ class Gui(QtGui.QDialog): self.menuProfiles.addSeparator() #action and menu item for adding a New Profile - self.menuProfiles.addAction(self.addProfile) + self.menuProfiles.addAction(self.addProfileAction) self.menuProfiles.activateWindow() self.menuProfiles.popup(QtGui.QCursor.pos()) + def activateProfileAction(self, pr): + """ Returns a callable to be passed as an action for the switching profile mechanism + to self.connect(menuItem_Profile... + It compiles a function with a profile name as argument and also handle the displaying of errors.""" + + def f(): + try: + self.profileManager.activateProfile(pr) + except AppError, e: + self.showError(str(e)) + return f + + def deleteProfileAction(self, pr, prWidgets): + """ Returns a callable to be passed as an action for the profile manager mechanism + to self.connect(menuItem_Profile... + It compiles a function with a profile name as argument and also handle the displaying of errors.""" + + def f(): + try: + self.profileManager.delProfile(pr) + for w in prWidgets: + w.setParent(None) + w.setVisible(False) + except AppError, e: + self.showError(str(e)) + return f + + def addProfile(self): """ Gui frontend to add a new Profile, it requests the user a profile name through a QInputDialog and creates a new profile with the help of the ProfHandler embedded in the Gui """