[X2Go-Commits] pyhoca-gui.git - build-59a18b6e3b5d3f1dd8f07f26433d37fe5984a57d (branch) updated: 2ab7ddf42913b5abb4e8ed11401d4abe30bece3d

X2Go dev team git-admin at x2go.org
Tue Aug 27 13:20:36 CEST 2013


The branch, build-59a18b6e3b5d3f1dd8f07f26433d37fe5984a57d has been updated
       via  2ab7ddf42913b5abb4e8ed11401d4abe30bece3d (commit)
      from  4d5862b911b74d8897c068370f224fc2ee70df18 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
-----------------------------------------------------------------------

Summary of changes:
 pyhoca/wxgui/frontend.py |    6 ++-
 pyhoca/wxgui/notify.py   |  131 ++++++++++------------------------------------
 pyhoca/wxgui/taskbar.py  |   75 +++++++++++++++++++++++++-
 3 files changed, 108 insertions(+), 104 deletions(-)

The diff of changes is:
diff --git a/pyhoca/wxgui/frontend.py b/pyhoca/wxgui/frontend.py
index 2848ad1..b8bcd67 100644
--- a/pyhoca/wxgui/frontend.py
+++ b/pyhoca/wxgui/frontend.py
@@ -181,7 +181,11 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
         #self._chooser_selected_profile_name = None
         self.taskbar = taskbar.PyHocaGUI_TaskBarIcon(self)
         self.taskbar.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.taskbar.CreateSessionManagerPopupMenu)
-        self.notifier = notify.libnotify_NotifierPopup(self)
+
+        if x2go.X2GOCLIENT_OS in ('Linux', 'Mac'):
+            self.notifier = notify.libnotify_NotifierPopup(self)
+        if x2go.X2GOCLIENT_OS in ('Windows'):
+            self.notifier = notify.win32gui_NotifierPopup(self)
 
         self._sub_windows = []
         self._eventid_profilenames_map = {}
diff --git a/pyhoca/wxgui/notify.py b/pyhoca/wxgui/notify.py
index 7f7e838..f8eb545 100644
--- a/pyhoca/wxgui/notify.py
+++ b/pyhoca/wxgui/notify.py
@@ -67,109 +67,36 @@ class libnotify_NotifierPopup(object):
     def Close(self):
         pass
 
-class wx_NotifierPopup(wx.Frame):
-    """notifier's popup window"""
 
-    def __init__(self, _PyHocaGUI):
+class win32gui_NotifierPopup(object):
+
+    title = {}
+    text = {}
 
+    def __init__(self, _PyHocaGUI):
         self._PyHocaGUI = _PyHocaGUI
-        wx.Frame.__init__(self, None, -1, style=wx.NO_BORDER|wx.FRAME_NO_TASKBAR)
-        self.padding = 12 # padding between edge, icon and text
-        self.popped = 0 # the time popup was opened
-        self.delay = 4 # time to leave the popup opened
-
-        # platform specific hacks
-        lines = 2
-        lineHeight = wx.MemoryDC().GetTextExtent(" ")[1]
-        if wx.Platform == "__WXGTK__":
-            # use the popup window widget on gtk as the
-            # frame widget can't animate outside the screen
-            self.popup = wx.PopupWindow(self, -1)
-        elif wx.Platform == "__WXMSW__":
-            # decrement line height on windows as the text calc below is off otherwise
-            self.popup = self
-            lineHeight -= 3
-        elif wx.Platform == "__WXMAC__":
-            # untested
-            self.popup = self
-
-        self.popup.SetSize((250, (lineHeight * (lines + 1)) + (self.padding * 2)))
-        self.panel = wx.Panel(self.popup, -1, size=self.popup.GetSize())
-
-        # popup's click handler
-        self.panel.Bind(wx.EVT_LEFT_DOWN, self.click)
-
-        # popup's logo
-        self.logo = wx.BitmapFromImage(images.getx2goclientImage())
-        wx.StaticBitmap(self.panel, -1, pos=(self.padding, self.padding)).SetBitmap(self.logo)
-
-        # main timer routine
-        self.timer = wx.Timer(self, -1)
-        self.Bind(wx.EVT_TIMER, self.main, self.timer)
-        self.timer.Start(700)
-
-    def main(self, event):
-
-        if self.focused():
-            # maintain opened state if focused
-            self.popped = time.time()
-        elif self.opened() and self.popped + self.delay < time.time():
-            # hide the popup once delay is reached
-            self.hide()
-
-    def click(self, event):
-        """handles popup click"""
-
-        self.popped = 0
-        self.hide()
-
-    def send(self, title, text):
-        """shows the popup"""
-
-        # create new text
-        if hasattr(self, "text"):
-            self.text.Destroy()
-        popupSize = self.popup.GetSize()
-        logoSize = self.logo.GetSize()
-        self.text = wx.StaticText(self.panel, -1, title)
-        self.text = wx.StaticText(self.panel, -1, text)
-        self.text.Bind(wx.EVT_LEFT_DOWN, self.click)
-        #self.text.Move((logoSize.width + (self.padding * 2), self.padding))
-        self.text.SetSize((
-            popupSize.width - logoSize.width - (self.padding * 3),
-            popupSize.height - (self.padding * 2)
-        ))
-
-        # animate the popup
-        screen = wx.GetClientDisplayRect()
-        self.popup.Show()
-        for i in range(1, popupSize.height + 1):
-            self.popup.Move((screen.width - popupSize.width, screen.height - i))
-            self.popup.SetTransparent(int(float(240) / popupSize.height * i))
-            self.popup.Update()
-            self.popup.Refresh()
-            time.sleep(0.01)
-        self.popped = time.time()
-
-    def hide(self):
-        """hides the popup"""
-
-        self.popup.Hide()
-        self.popped = 0
-
-    def focused(self):
-        """returns true if popup has mouse focus"""
-
-        mouse = wx.GetMousePosition()
-        popup = self.popup.GetScreenRect()
-        return (
-            self.popped and
-            mouse.x in range(popup.x, popup.x + popup.width)
-            and mouse.y in range(popup.y, popup.y + popup.height)
-        )
-
-    def opened(self):
-        """returns true if popup is open"""
-
-        return self.popped != 0
+        self.taskbar = self._PyhocaGUI.taskbar
+
+    def prepare(self, context, title=None, text=None):
+        if title is not None:
+            self.title[context] = title
+        if text is not None:
+            self.text[context] = text
 
+    def send(self, title=None, text=None, context=None, timeout=8000):
+        if context is not None:
+            try:
+                title = self.title[context]
+                del self.title[context]
+            except KeyError:
+                pass
+            try:
+                text = self.text[context]
+                del self.text[context]
+            except KeyError:
+                pass
+
+        self.taskbar.ShowBalloon(title, text, msec=timeout)
+
+    def Close(self):
+        pass
diff --git a/pyhoca/wxgui/taskbar.py b/pyhoca/wxgui/taskbar.py
index 3e1af8a..20dad7f 100644
--- a/pyhoca/wxgui/taskbar.py
+++ b/pyhoca/wxgui/taskbar.py
@@ -79,6 +79,7 @@ class PyHocaGUI_TaskBarIcon(wx.TaskBarIcon):
         icon = self.MakeIcon(images.getx2goclientImage())
         self.SetIcon(icon, "PyHoca-GUI (Python X2go Client)")
         self.imgidx = 1
+        self.tooltip = ""
 
     def CreateSessionManagerPopupMenu(self, evt):
         """\
@@ -113,4 +114,76 @@ class PyHocaGUI_TaskBarIcon(wx.TaskBarIcon):
         return icon
 
     def Close(self):
-        self.Destroy()
\ No newline at end of file
+        self.Destroy()
+
+    def ShowBalloon(self, title, text, msec=0, flags=0):
+        """
+        Show Balloon tooltip
+
+        @param title - Title for balloon tooltip
+        @param msg   - Balloon tooltip text
+        @param msec  - Timeout for balloon tooltip, in milliseconds
+        @param flags -  one of wx.ICON_INFORMATION, wx.ICON_WARNING, wx.ICON_ERROR
+        """
+        if WIN32 and self.IsIconInstalled():
+            try:
+                self.__SetBalloonTip(self.icon.GetHandle(), title, text, msec, flags)
+            except Exception, e:
+                self._PyHocaGUI._pyhoca_logger(str(e))
+ 
+    def __SetBalloonTip(self, hicon, title, msg, msec, flags):
+
+        # translate flags
+        infoFlags = 0
+        if flags & wx.ICON_INFORMATION:
+            infoFlags |= win32gui.NIIF_INFO
+        elif flags & wx.ICON_WARNING:
+            infoFlags |= win32gui.NIIF_WARNING
+        elif flags & wx.ICON_ERROR:
+            infoFlags |= win32gui.NIIF_ERROR
+
+        # Show balloon
+        lpdata = (self.__GetIconHandle(),   # hWnd
+                  99,                       # ID
+                  win32gui.NIF_MESSAGE|win32gui.NIF_INFO|win32gui.NIF_ICON, # flags: Combination of NIF_* flags
+                  0,                        # CallbackMessage: Message id to be pass to hWnd when processing messages
+                  hicon,                    # hIcon: Handle to the icon to be displayed
+                  '',                       # Tip: Tooltip text
+                  msg,                      # Info: Balloon tooltip text
+                  msec,                     # Timeout: Timeout for balloon tooltip, in milliseconds
+                  title,                    # InfoTitle: Title for balloon tooltip
+                  infoFlags                 # InfoFlags: Combination of NIIF_* flags
+                  )
+        win32gui.Shell_NotifyIcon(win32gui.NIM_MODIFY, lpdata)
+        self.SetIcon(self.icon, self.tooltip)   # Hack: because we have no access to the real CallbackMessage value
+
+    def __GetIconHandle(self):
+        """
+        Find the icon window.
+        This is ugly but for now there is no way to find this window directly from wx
+        """
+        if not hasattr(self, "_chwnd"):
+            try:
+                for handle in wx.GetTopLevelWindows():
+                    if handle.GetWindowStyle():
+                        continue
+                    handle = handle.GetHandle()
+                    if len(win32gui.GetWindowText(handle)) == 0 and \
+                       win32gui.GetWindowRect(handle) == (0,0,400,250):
+                        self._chwnd = handle
+                        break
+                if not hasattr(self, "_chwnd"):
+                    raise Exception
+            except:
+                raise Exception, "Icon window not found"
+        return self._chwnd
+
+    def SetIcon(self, icon, tooltip=""):
+        self.icon = icon
+        self.tooltip = tooltip
+        wx.TaskBarIcon.SetIcon(self, icon, tooltip)
+
+    def RemoveIcon(self):
+        self.icon = None
+        self.tooltip = ""
+        wx.TaskBarIcon.RemoveIcon(self) 
\ No newline at end of file


hooks/post-receive
-- 
pyhoca-gui.git (Python X2Go Client (wxPython GUI))

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "pyhoca-gui.git" (Python X2Go Client (wxPython GUI)).




More information about the x2go-commits mailing list