From dfb630d52ccae6c8fdd70ab7210c32b327a4fed7 Mon Sep 17 00:00:00 2001 From: Marek Siarkowicz Date: Fri, 12 Jun 2015 20:35:58 +0200 Subject: Refactor. --- ParrotZikTray | 4 +- SysIndicator.py | 315 +++++++++++++++++++++++++++++++++----------------------- 2 files changed, 191 insertions(+), 128 deletions(-) diff --git a/ParrotZikTray b/ParrotZikTray index 4518bc9..f66de17 100755 --- a/ParrotZikTray +++ b/ParrotZikTray @@ -4,7 +4,7 @@ import gtk import ParrotZik import BluetoothPairedDevices from SysIndicator import MenuItem -from SysIndicator import UniversalMenu +from SysIndicator import Menu from SysIndicator import SysIndicator REFRESH_FREQUENCY = 1000 @@ -37,7 +37,7 @@ class Stop(Exception): class ParrotZikIndicator(SysIndicator): def __init__(self): - self.menu = UniversalMenu() + self.menu = Menu() self.info_item = MenuItem("Parrot Zik Not connected..", None, sensitive=False) diff --git a/SysIndicator.py b/SysIndicator.py index e8d59be..804b001 100644 --- a/SysIndicator.py +++ b/SysIndicator.py @@ -13,59 +13,12 @@ elif sys.platform == "darwin": from StatusAppMac import StatusApp -class SysIndicator: - def __init__(self, icon, menu): - if sys.platform == "linux2": - self.menu = menu.gtk_menu - import appindicator - self.icon_directory = (os.path.sep + 'usr' + os.path.sep + 'share' - + os.path.sep + 'icons' + os.path.sep+'zik' - + os.path.sep) - if not os.path.isdir(self.icon_directory): - self.icon_directory = (os.path.dirname(sys.argv[0]) - + os.path.sep + 'share' + os.path.sep - + 'icons' + os.path.sep+'zik' - + os.path.sep) - self.statusicon = appindicator.Indicator( - "new-parrotzik-indicator", "indicator-messages", - appindicator.CATEGORY_APPLICATION_STATUS) - self.statusicon.set_status(appindicator.STATUS_ACTIVE) - self.statusicon.set_icon_theme_path(self.icon_directory) - self.statusicon.set_menu(self.menu) - - elif sys.platform == "win32": - self.menu = menu.gtk_menu - self.icon_directory = ( - os.path.dirname(os.path.realpath(sys.argv[0])) - + os.path.sep + 'share' + os.path.sep+'icons' - + os.path.sep +'zik' + os.path.sep) - self.statusicon = gtk.StatusIcon() - self.statusicon.connect("popup-menu", self.gtk_right_click_event) - self.statusicon.set_tooltip("Parrot Zik") - self.menu_shown = False - sys.stdout = open(tempfile.gettempdir() - + os.path.sep+"zik_tray_stdout.log", "w") - sys.stderr = open(tempfile.gettempdir() - + os.path.sep+"zik_tray_stderr.log", "w") - - elif sys.platform == "darwin": - self.icon_directory = ( - os.path.dirname(os.path.realpath(sys.argv[0])) + os.path.sep - + 'share' + os.path.sep + 'icons' + os.path.sep + 'zik' - + os.path.sep) - self.statusicon = StatusApp.sharedApplication() - self.statusicon.initMenu(menu) - +class BaseIndicator(object): + def __init__(self, icon, menu, statusicon): + self.menu = menu + self.statusicon = statusicon self.setIcon(icon) - def setIcon(self, name): - if sys.platform == "linux2": - self.statusicon.set_icon(name) - elif sys.platform == "win32": - self.statusicon.set_from_file(self.icon_directory + name + '.png') - elif sys.platform == "darwin": - self.statusicon.setIcon(name, self.icon_directory) - def gtk_right_click_event(self, icon, button, time): if not self.menu_shown: self.menu_shown = True @@ -75,60 +28,131 @@ class SysIndicator: self.menu_shown = False self.menu.popdown() + def setIcon(self, name): + raise NotImplementedError + + def main(self): + raise NotImplementedError + + def show_about_dialog(self, widget): + raise NotImplementedError + + +class WindowsIndicator(BaseIndicator): + def __init__(self, icon, menu): + self.icon_directory = ( + os.path.dirname(os.path.realpath(sys.argv[0])) + + os.path.sep + 'share' + os.path.sep + 'icons' + + os.path.sep +'zik' + os.path.sep) + self.menu_shown = False + sys.stdout = open(tempfile.gettempdir() + + os.path.sep + "zik_tray_stdout.log", "w") + sys.stderr = open(tempfile.gettempdir() + + os.path.sep + "zik_tray_stderr.log", "w") + statusicon = gtk.StatusIcon() + statusicon.connect("popup-menu", self.gtk_right_click_event) + statusicon.set_tooltip("Parrot Zik") + super(WindowsIndicator, self).__init__(icon, menu, statusicon) + + def setIcon(self, name): + self.statusicon.set_from_file(self.icon_directory + name + '.png') + + def main(self): + gtk.main() + + def show_about_dialog(self, widget): + about_dialog = gtk.AboutDialog() + about_dialog.set_destroy_with_parent(True) + about_dialog.set_name("Parrot Zik Tray") + about_dialog.set_version("0.3") + about_dialog.set_authors(["Dmitry Moiseev m0sia@m0sia.ru"]) + about_dialog.run() + about_dialog.destroy() + + +class LinuxIndicator(BaseIndicator): + def __init__(self, icon, menu): + import appindicator + self.icon_directory = (os.path.sep + 'usr' + os.path.sep + 'share' + + os.path.sep + 'icons' + os.path.sep+'zik' + + os.path.sep) + if not os.path.isdir(self.icon_directory): + self.icon_directory = (os.path.dirname(sys.argv[0]) + + os.path.sep + 'share' + os.path.sep + + 'icons' + os.path.sep+'zik' + + os.path.sep) + statusicon = appindicator.Indicator( + "new-parrotzik-indicator", "indicator-messages", + appindicator.CATEGORY_APPLICATION_STATUS) + statusicon.set_status(appindicator.STATUS_ACTIVE) + statusicon.set_icon_theme_path(self.icon_directory) + statusicon.set_menu(menu.gtk_menu) + super(LinuxIndicator, self).__init__(icon, menu, statusicon) + + def setIcon(self, name): + self.statusicon.set_icon(name) + def main(self): - if sys.platform == "linux2" or sys.platform == "win32": - gtk.main() - elif sys.platform == "darwin": - #self.statusicon.run() - AppHelper.runEventLoop() + gtk.main() def show_about_dialog(self, widget): - if sys.platform == "linux2" or sys.platform == "win32": - about_dialog = gtk.AboutDialog() - about_dialog.set_destroy_with_parent(True) - about_dialog.set_name("Parrot Zik Tray") - about_dialog.set_version("0.3") - about_dialog.set_authors(["Dmitry Moiseev m0sia@m0sia.ru"]) - about_dialog.run() - about_dialog.destroy() - - -class UniversalMenu: + about_dialog = gtk.AboutDialog() + about_dialog.set_destroy_with_parent(True) + about_dialog.set_name("Parrot Zik Tray") + about_dialog.set_version("0.3") + about_dialog.set_authors(["Dmitry Moiseev m0sia@m0sia.ru"]) + about_dialog.run() + about_dialog.destroy() + + +class DarwinIndicator(BaseIndicator): + def __init__(self, icon, menu): + self.icon_directory = ( + os.path.dirname(os.path.realpath(sys.argv[0])) + os.path.sep + + 'share' + os.path.sep + 'icons' + os.path.sep + 'zik' + + os.path.sep) + statusicon = StatusApp.sharedApplication() + statusicon.initMenu(menu) + super(DarwinIndicator, self).__init__(icon, menu, statusicon) + + def setIcon(self, name): + self.statusicon.setIcon(name, self.icon_directory) + + def main(self): + AppHelper.runEventLoop() + + def show_about_dialog(self, widget): + pass + + +class NSMenu(object): def __init__(self): - if sys.platform == "linux2" or sys.platform == "win32": - self.gtk_menu = gtk.Menu() - elif sys.platform == "darwin": - self.actions = {} - self.menubarMenu = NSMenu.alloc().init() - self.menubarMenu.setAutoenablesItems_(False) - - def append(self, MenuItem): - if sys.platform == "linux2" or sys.platform == "win32": - self.gtk_menu.append(MenuItem.gtk_item) - elif sys.platform == "darwin": - self.actions[MenuItem.title] = MenuItem.action - self.menubarMenu.addItem_(MenuItem.nsmenu_item) + self.actions = {} + self.menubarMenu = NSMenu.alloc().init() + self.menubarMenu.setAutoenablesItems_(False) + + def append(self, menu_item): + self.actions[menu_item.title] = menu_item.action + self.menubarMenu.addItem_(menu_item.nsmenu_item) def reposition(self): - if sys.platform == "linux2" or sys.platform == "win32": - self.gtk_menu.reposition() + # TODO + pass -class MenuItem: - def __init__(self, name, action, sensitive=True, checkitem=False, visible=True): - if sys.platform == "linux2" or sys.platform == "win32": - if checkitem: - self.gtk_item = gtk.CheckMenuItem(name) - else: - self.gtk_item = gtk.MenuItem(name) - if action: - self.gtk_item.connect("activate", action) - - elif sys.platform == "darwin": - self.title = name - self.action = action - self.nsmenu_item = ( - NSMenuItem.alloc().initWithTitle_action_keyEquivalent_( - name, 'clicked:', '')) +class GTKMenu(object): + def __init__(self): + self.gtk_menu = gtk.Menu() + + def append(self, menu_item): + self.gtk_menu.append(menu_item.base_item) + + def reposition(self): + self.gtk_menu.reposition() + + +class MenuItemBase(object): + def __init__(self, base_item, sensitive, visible): + self.base_item = base_item self.set_sensitive(sensitive) if visible: self.show() @@ -136,49 +160,88 @@ class MenuItem: self.hide() def set_sensitive(self, option): - if sys.platform == "linux2" or sys.platform == "win32": - return self.gtk_item.set_sensitive(option) - elif sys.platform == "darwin": - self.nsmenu_item.setEnabled_(option) + raise NotImplementedError def set_active(self, option): - if sys.platform == "linux2" or sys.platform == "win32": - return self.gtk_item.set_active(option) - elif sys.platform == "darwin": - self.nsmenu_item.setState_(option) + raise NotImplementedError def get_active(self): - if sys.platform == "linux2" or sys.platform == "win32": - return self.gtk_item.get_active() - elif sys.platform == "darwin": - print self.nsmenu_item.state - return self.nsmenu_item.state + raise NotImplementedError def set_label(self, option): - if sys.platform == "linux2" or sys.platform == "win32": - return self.gtk_item.set_label(option) - elif sys.platform == "darwin": - self.title = option - self.nsmenu_item.setTitle_(option) - #self.rumps_item.title=option + raise NotImplementedError def show(self): - if sys.platform == "linux2" or sys.platform == "win32": - self.gtk_item.show() - elif sys.platform == "darwin": - self.nsmenu_item.show() + self.base_item.show() def hide(self): - if sys.platform == "linux2" or sys.platform == "win32": - self.gtk_item.hide() - elif sys.platform == "darwin": - self.nsmenu_item.hide() + self.base_item.hide() + +class GTKMenuItem(MenuItemBase): + def __init__(self, name, action, sensitive=True, checkitem=False, visible=True): + if checkitem: + gtk_item = gtk.CheckMenuItem(name) + else: + gtk_item = gtk.MenuItem(name) + if action: + gtk_item.connect("activate", action) + super(GTKMenuItem, self).__init__(gtk_item, sensitive, visible) + + def set_sensitive(self, option): + return self.base_item.set_sensitive(option) + + def set_active(self, option): + return self.base_item.set_active(option) + + def get_active(self): + return self.base_item.get_active() + + def set_label(self, option): + return self.base_item.set_label(option) + + +class NSMenuItem(MenuItemBase): + def __init__(self, name, action, sensitive=True, checkitem=False, visible=True): + self.title = name + self.action = action + nsmenu_item = ( + NSMenuItem.alloc().initWithTitle_action_keyEquivalent_( + name, 'clicked:', '')) + super(NSMenuItem, self).__init__(nsmenu_item, sensitive, visible) + + def set_sensitive(self, option): + self.base_item.setEnabled_(option) + + def set_active(self, option): + self.base_item.setState_(option) + + def get_active(self): + return self.base_item.state + + def set_label(self, option): + self.title = option + self.base_item.setTitle_(option) + +if sys.platform == 'linux2': + SysIndicator = LinuxIndicator + Menu = GTKMenu + MenuItem = GTKMenuItem +elif sys.platform == 'win32': + SysIndicator = WindowsIndicator + Menu = GTKMenu + MenuItem = GTKMenuItem +elif sys.platform == 'darwin': + SysIndicator = DarwinIndicator + Menu = NSMenu + MenuItem = NSMenuItem +else: + raise Exception('Platform not supported') if __name__ == "__main__": quit_item = MenuItem("Quit", sys.exit, True) - menu = UniversalMenu() + menu = Menu() menu.append(quit_item) indicator = SysIndicator(icon="zik-audio-headset", menu=menu) -- cgit v1.2.1