Skip to content

Commit 1ea73be

Browse files
committedJan 8, 2016
gui/applets: all basic functionality, no state save/restore
1 parent 597c2e4 commit 1ea73be

File tree

1 file changed

+60
-7
lines changed

1 file changed

+60
-7
lines changed
 

Diff for: ‎artiq/gui/applets.py

+60-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
import asyncio
33
import shlex
4+
from functools import partial
45

56
from quamash import QtCore, QtGui, QtWidgets
67
from pyqtgraph import dockarea
@@ -19,16 +20,19 @@ def __init__(self, token, name, command):
1920
self.applet_name = name
2021
self.command = command
2122

23+
def rename(self, name):
24+
self.applet_name = name
25+
self.label.setText("Applet: " + name)
26+
2227
async def start(self):
2328
command = self.command.format(embed_token=self.token)
2429
logger.debug("starting command %s for %s", command, self.applet_name)
2530
try:
2631
self.process = await asyncio.create_subprocess_exec(
2732
*shlex.split(command))
28-
except FileNotFoundError:
29-
logger.warning("Applet %s failed to start", self.applet_name)
30-
else:
31-
logger.warning("Applet %s exited", self.applet_name)
33+
except:
34+
logger.warning("Applet %s failed to start", self.applet_name,
35+
exc_info=True)
3236

3337
def capture(self, win_id):
3438
logger.debug("capturing window 0x%x for %s", win_id, self.applet_name)
@@ -54,11 +58,17 @@ async def terminate(self):
5458
except ProcessLookupError:
5559
pass
5660
await self.process.wait()
61+
del self.process
62+
63+
async def restart(self):
64+
await self.terminate()
65+
await self.start()
5766

5867

5968
class AppletsDock(dockarea.Dock):
6069
def __init__(self, manager):
6170
self.manager = manager
71+
self.token_to_checkbox = dict()
6272

6373
dockarea.Dock.__init__(self, "Applets")
6474
self.setMinimumSize(QtCore.QSize(850, 450))
@@ -81,6 +91,7 @@ def __init__(self, manager):
8191
new_action.triggered.connect(self.new)
8292
self.table.addAction(new_action)
8393
restart_action = QtGui.QAction("Restart selected applet", self.table)
94+
restart_action.triggered.connect(self.restart)
8495
self.table.addAction(restart_action)
8596
delete_action = QtGui.QAction("Delete selected applet", self.table)
8697
delete_action.triggered.connect(self.delete)
@@ -102,12 +113,26 @@ def cell_changed(self, row, column):
102113
name = name.text()
103114
token = self.manager.create(name, command)
104115
item.applet_token = token
116+
self.token_to_checkbox[token] = item
105117
else:
106118
token = getattr(item, "applet_token", None)
107119
if token is not None:
108120
# cell_changed is emitted at row creation
109121
self.manager.delete(token)
110-
item.applet_token = None
122+
elif column == 1 or column == 2:
123+
new_value = self.table.item(row, column).text()
124+
token = getattr(self.table.item(row, 0), "applet_token", None)
125+
if token is not None:
126+
if column == 1:
127+
self.manager.rename(token, new_value)
128+
else:
129+
self.manager.set_command(token, new_value)
130+
131+
def disable_token(self, token):
132+
checkbox_item = self.token_to_checkbox[token]
133+
checkbox_item.applet_token = None
134+
del self.token_to_checkbox[token]
135+
checkbox_item.setCheckState(QtCore.Qt.Unchecked)
111136

112137
def new(self):
113138
row = self.table.rowCount()
@@ -119,10 +144,22 @@ def new(self):
119144
checkbox.setCheckState(QtCore.Qt.Unchecked)
120145
self.table.setItem(row, 0, checkbox)
121146

147+
def restart(self):
148+
selection = self.table.selectedRanges()
149+
if selection:
150+
row = selection[0].topRow()
151+
token = getattr(self.table.item(row, 0), "applet_token", None)
152+
if token is not None:
153+
asyncio.ensure_future(self.manager.restart(token))
154+
122155
def delete(self):
123156
selection = self.table.selectedRanges()
124157
if selection:
125-
self.table.deleteRow(selection[0].topRow())
158+
row = selection[0].topRow()
159+
token = getattr(self.table.item(row, 0), "applet_token", None)
160+
if token is not None:
161+
self.manager.delete(token)
162+
self.table.deleteRow(row)
126163

127164

128165
class AppletManagerRPC:
@@ -154,11 +191,27 @@ def create(self, name, command):
154191
self.applet_docks[token] = dock
155192
self.dock_area.floatDock(dock)
156193
asyncio.ensure_future(dock.start())
194+
dock.sigClosed.connect(partial(self.on_dock_closed, token))
157195
return token
158196

159-
def delete(self, token):
197+
def on_dock_closed(self, token):
198+
asyncio.ensure_future(self.applet_docks[token].terminate())
199+
self.main_dock.disable_token(token)
160200
del self.applet_docks[token]
161201

202+
def delete(self, token):
203+
# This in turns calls on_dock_closed and main_dock.disable_token
204+
self.applet_docks[token].close()
205+
206+
def rename(self, token, name):
207+
self.applet_docks[token].rename(name)
208+
209+
def set_command(self, token, command):
210+
self.applet_docks[token].command = command
211+
212+
async def restart(self, token):
213+
await self.applet_docks[token].restart()
214+
162215
async def stop(self):
163216
for dock in self.applet_docks.values():
164217
await dock.terminate()

0 commit comments

Comments
 (0)
Please sign in to comment.