bump version
[ppt-control.git] / ppt_control / ppt_control.py
index 664866677a3749a5aa48ca271f75a7789c50622f..4218f5c9ebdc59839e300a67d05da18bd1ff1349 100755 (executable)
@@ -32,6 +32,7 @@ global STATE
 global STATE_DEFAULT\r
 global current_slideshow\r
 global interface_root\r
+global interface_thread\r
 global logger\r
 global refresh_daemon\r
 global status_label\r
@@ -39,9 +40,11 @@ global http_label
 global ws_label\r
 global reset_ppt_button\r
 global http_server\r
+global icon\r
 scheduler = None\r
 current_slideshow = None\r
 interface_root = None\r
+interface_thread = None\r
 CONFIG_FILE = r'''..\ppt-control.ini'''\r
 LOGFILE = r'''..\ppt-control.log'''\r
 logger = None\r
@@ -52,6 +55,7 @@ ws_label = None
 ws_daemon = None\r
 http_server = None\r
 reset_ppt_button = None\r
+icon = None\r
 \r
 \r
 class Handler(server.SimpleHTTPRequestHandler):\r
@@ -260,7 +264,6 @@ class Slideshow:
 \r
     def unload(self):\r
         connect_ppt()\r
-        reset_ppt_button.config(state = tk.DISABLED)\r
 \r
     def refresh(self):\r
         try:\r
@@ -426,20 +429,28 @@ def refresh_interval():
         time.sleep(0.5)\r
 \r
 def refresh_status():\r
-    if status_label is not None:\r
-        status_label.config(text="PowerPoint status: " + ("not " if not STATE["connected"] else "") +  "connected")\r
-        http_label.config(text="HTTP server: " + ("not " if http_server is None else "") +  "running")\r
-        #ws_label.config(text="WebSocket server: " + ("not " if ws_daemon is not None or not ws_daemon.is_alive() else "") +  "running")\r
-    if reset_ppt_button is not None:\r
-        reset_ppt_button.config(state = tk.DISABLED if not STATE["connected"] else tk.NORMAL)\r
+    if interface_root is not None and interface_root.state == "normal":\r
+        logger.debug("Refreshing UI")\r
+        if status_label is not None:\r
+            status_label.config(text="PowerPoint status: " + ("not " if not STATE["connected"] else "") +  "connected")\r
+        if http_label is not None:\r
+            http_label.config(text="HTTP server: " + ("not " if http_server is None else "") +  "running")\r
+            #ws_label.config(text="WebSocket server: " + ("not " if ws_daemon is not None or not ws_daemon.is_alive() else "") +  "running")\r
+        if reset_ppt_button is not None:\r
+            reset_ppt_button.config(state = tk.DISABLED if not STATE["connected"] else tk.NORMAL)\r
 \r
 def connect_ppt():\r
     global STATE\r
     global refresh_daemon\r
     if STATE["connected"] == 1:\r
         logger.info("Disconnected from PowerPoint instance")\r
+        icon.notify("Disconnected from PowerPoint instance")\r
+        if reset_ppt_button is not None:\r
+            reset_ppt_button.config(state = tk.DISABLED)\r
         refresh_daemon.do_run = False\r
         STATE = copy(STATE_DEFAULT)\r
+        if icon is not None:\r
+            refresh_menu()\r
         refresh_status()\r
         logger.debug("State is now " + str(STATE))\r
     while True:\r
@@ -450,6 +461,9 @@ def connect_ppt():
             STATE["connected"] = 1\r
             STATE["current"] = current_slideshow.current_slide()\r
             STATE["total"] = current_slideshow.total_slides()\r
+            icon.notify("Connected to PowerPoint instance")\r
+            if icon is not None:\r
+                refresh_menu()\r
             refresh_status()\r
             logger.info("Connected to PowerPoint instance")\r
             refresh_daemon = threading.Thread(name="refresh_daemon", target=refresh_interval)\r
@@ -470,13 +484,19 @@ def on_closing():
     global status_label\r
     global http_label\r
     global ws_label\r
+    global interface_thread\r
     status_label = None\r
     http_label = None\r
     ws_label = None\r
+    logger.debug("Destroying interface root")\r
     interface_root.destroy()\r
+    logger.debug("Destroying interface thread")\r
+    interface_thread.root.quit()\r
+    interface_thread = None\r
     \r
 def open_settings(_=None):\r
     global interface_root\r
+    global interface_thread\r
     interface_root = tk.Tk()\r
     interface_root.protocol("WM_DELETE_WINDOW", on_closing)\r
     interface_root.iconphoto(False, tk.PhotoImage(file=os.path.dirname(os.path.realpath(__file__)) + r'''\static\icons\ppt.png'''))\r
@@ -526,8 +546,8 @@ class Interface(ttk.Frame):
         reset_http_button = ttk.Button(self, text="Restart", command=restart_http)\r
         reset_http_button.place(x=300, y=30)\r
 \r
-        reset_ws_button = ttk.Button(self, text="Restart", command=null_action)\r
-        reset_ws_button.place(x=300, y=50)\r
+        #reset_ws_button = ttk.Button(self, text="Restart", command=null_action)\r
+        #reset_ws_button.place(x=300, y=50)\r
 \r
         status_label = ttk.Label(self)\r
         status_label.place(x=10,y=10)\r
@@ -546,16 +566,19 @@ def exit_action(icon):
     icon.visible = False\r
     icon.stop()\r
 \r
+def refresh_menu():\r
+    icon.menu = (pystray.MenuItem("Status: " + "dis"*(not STATE["connected"]) + "connected", lambda: null_action(), enabled=False),\r
+            pystray.MenuItem("Stop", lambda: exit_action(icon)),\r
+            pystray.MenuItem("Settings", lambda: open_settings(), enabled=False)\r
+            )\r
+\r
 def show_icon():\r
+    global icon\r
     logger.debug("Starting system tray icon")\r
     icon = pystray.Icon("ppt-control")\r
-    icon.menu = (pystray.MenuItem("Status", lambda: null_action(), enabled=False),\r
-            pystray.MenuItem("Restart", lambda: start()),\r
-            pystray.MenuItem("Stop", lambda: exit_action(icon)),\r
-            pystray.MenuItem("Settings", lambda: open_settings())\r
-            )\r
     icon.icon = Image.open(os.path.dirname(os.path.realpath(__file__)) + r'''\static\icons\ppt.ico''')\r
     icon.title = "ppt-control"\r
+    refresh_menu()\r
     icon.visible = True\r
     icon.run(setup=start)\r
 \r