Private GIT

Skip to content
Snippets Groups Projects
Select Git revision
  • 5941d0bf77e81448c2ae8d8411d7b3342d74b744
  • master default protected
  • develop
  • desktop
  • 3d
  • pip
  • build/2.0.6.1
  • build/2.0.6
  • build/2.0.5
  • build/2.0.4
  • build/2.0.3
  • build/2.0.1
  • build/2.0.0.pre2
  • build/2.0.0.pre1
14 results

Desktop.py

Blame
  • user avatar
    Ruud authored
    5941d0bf
    History
    Desktop.py 6.02 KiB
    from esky.util import appdir_from_executable #@UnresolvedImport
    from threading import Thread
    from version import VERSION
    from wx.lib.softwareupdate import SoftwareUpdate
    import os
    import sys
    import time
    import webbrowser
    import wx
    
    # Include proper dirs
    if hasattr(sys, 'frozen'):
        import libs
        base_path = os.path.dirname(os.path.dirname(os.path.abspath(libs.__file__)))
    else:
        base_path = os.path.dirname(os.path.abspath(__file__))
    
    lib_dir = os.path.join(base_path, 'libs')
    
    sys.path.insert(0, base_path)
    sys.path.insert(0, lib_dir)
    
    from couchpotato.environment import Env
    
    class TaskBarIcon(wx.TaskBarIcon):
    
        TBMENU_OPEN = wx.NewId()
        TBMENU_SETTINGS = wx.NewId()
        TBMENU_EXIT = wx.ID_EXIT
    
        closed = False
        menu = False
        enabled = False
    
        def __init__(self, frame):
            wx.TaskBarIcon.__init__(self)
            self.frame = frame
    
            icon = wx.Icon('icon.png', wx.BITMAP_TYPE_PNG)
            self.SetIcon(icon)
    
            self.Bind(wx.EVT_TASKBAR_LEFT_UP, self.OnTaskBarClick)
            self.Bind(wx.EVT_TASKBAR_RIGHT_UP, self.OnTaskBarClick)
    
            self.Bind(wx.EVT_MENU, self.onOpen, id = self.TBMENU_OPEN)
            self.Bind(wx.EVT_MENU, self.onSettings, id = self.TBMENU_SETTINGS)
            self.Bind(wx.EVT_MENU, self.onTaskBarClose, id = self.TBMENU_EXIT)
    
        def OnTaskBarClick(self, evt):
            menu = self.CreatePopupMenu()
            self.PopupMenu(menu)
            menu.Destroy()
    
        def enable(self):
            self.enabled = True
    
            if self.menu:
                self.open_menu.Enable(True)
                self.setting_menu.Enable(True)
    
                self.open_menu.SetText('Open')
    
        def CreatePopupMenu(self):
    
            if not self.menu:
                self.menu = wx.Menu()
                self.open_menu = self.menu.Append(self.TBMENU_OPEN, 'Open')
                self.setting_menu = self.menu.Append(self.TBMENU_SETTINGS, 'About')
                self.exit_menu = self.menu.Append(self.TBMENU_EXIT, 'Quit')
    
                if not self.enabled:
                    self.open_menu.Enable(False)
                    self.setting_menu.Enable(False)
    
                    self.open_menu.SetText('Loading...')
    
            return self.menu
    
        def onOpen(self, event):
            url = self.frame.parent.getSetting('base_url')
            webbrowser.open(url)
    
        def onSettings(self, event):
            url = self.frame.parent.getSetting('base_url') + '/settings/'
            webbrowser.open(url)
    
        def onTaskBarClose(self, evt):
            if self.closed:
                return
    
            self.closed = True
    
            self.RemoveIcon()
            wx.CallAfter(self.frame.Close)
    
    
        def makeIcon(self, img):
            if "wxMSW" in wx.PlatformInfo:
                img = img.Scale(16, 16)
            elif "wxGTK" in wx.PlatformInfo:
                img = img.Scale(22, 22)
    
            icon = wx.IconFromBitmap(img.CopyFromBitmap())
            return icon
    
    
    class MainFrame(wx.Frame):
    
        def __init__(self, parent):
            wx.Frame.__init__(self, None, style = wx.FRAME_NO_TASKBAR)
    
            self.parent = parent
            self.tbicon = TaskBarIcon(self)
    
    
    class WorkerThread(Thread):
    
        def __init__(self, desktop):
            Thread.__init__(self)
            self.daemon = True
            self._desktop = desktop
    
            self.start()
    
        def run(self):
    
            # Get options via arg
            from couchpotato.runner import getOptions
            args = ['--quiet']
            self.options = getOptions(base_path, args)
    
            # Load settings
            settings = Env.get('settings')
            settings.setFile(self.options.config_file)
    
            # Create data dir if needed
            self.data_dir = os.path.expanduser(Env.setting('data_dir'))
            if self.data_dir == '':
                from couchpotato.core.helpers.variable import getDataDir
                self.data_dir = getDataDir()
    
            if not os.path.isdir(self.data_dir):
                os.makedirs(self.data_dir)
    
            # Create logging dir
            self.log_dir = os.path.join(self.data_dir, 'logs');
            if not os.path.isdir(self.log_dir):
                os.mkdir(self.log_dir)
    
            try:
                from couchpotato.runner import runCouchPotato
                runCouchPotato(self.options, base_path, args, data_dir = self.data_dir, log_dir = self.log_dir, Env = Env, desktop = self._desktop)
            except:
                pass
    
            self._desktop.frame.Close()
    
    
    class CouchPotatoApp(wx.App, SoftwareUpdate):
    
        settings = {}
        events = {}
        restart = False
        closing = False
    
        def OnInit(self):
    
            # Updater
            base_url = 'http://couchpota.to/updates/%s/' % VERSION
            self.InitUpdates(base_url, base_url + 'changelog.html',
                             icon = wx.Icon('icon.png'))
    
            self.frame = MainFrame(self)
            self.frame.Bind(wx.EVT_CLOSE, self.onClose)
    
            # CouchPotato thread
            self.worker = WorkerThread(self)
    
            return True
    
        def onAppLoad(self):
            self.frame.tbicon.enable()
    
        def setSettings(self, settings = {}):
            self.settings = settings
    
        def getSetting(self, name):
            return self.settings.get(name)
    
        def addEvents(self, events = {}):
            for name in events.iterkeys():
                self.events[name] = events[name]
    
        def onClose(self, event):
    
            if not self.closing:
                self.closing = True
                self.frame.tbicon.onTaskBarClose(event)
    
                onClose = self.events.get('onClose')
                onClose(event)
    
        def afterShutdown(self, restart = False):
            self.frame.Destroy()
            self.restart = restart
            self.ExitMainLoop()
    
    
    if __name__ == '__main__':
    
        app = CouchPotatoApp(redirect = False)
        app.MainLoop()
    
        time.sleep(1)
    
        if app.restart:
    
            def appexe_from_executable(exepath):
                appdir = appdir_from_executable(exepath)
                exename = os.path.basename(exepath)
    
                if sys.platform == "darwin":
                    if os.path.isdir(os.path.join(appdir, "Contents", "MacOS")):
                        return os.path.join(appdir, "Contents", "MacOS", exename)
    
                return os.path.join(appdir, exename)
    
            exe = appexe_from_executable(sys.executable)
            os.chdir(os.path.dirname(exe))
    
            os.execv(exe, [exe] + sys.argv[1:])