Skip to content

Commit 650baa9

Browse files
committedJan 2, 2015
gui: factorize dict synchronization
1 parent f352e7f commit 650baa9

File tree

3 files changed

+58
-69
lines changed

3 files changed

+58
-69
lines changed
 

‎artiq/gui/parameters.py

+5-31
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,17 @@
44

55
from gi.repository import Gtk
66

7-
from artiq.gui.tools import Window, ListSyncer
7+
from artiq.gui.tools import Window, ListSyncer, DictSyncer
88
from artiq.management.sync_struct import Subscriber
99

1010

11-
class _ParameterStoreSyncer:
12-
def __init__(self, parameters_store, init):
13-
self.parameters_store = parameters_store
14-
self.parameters_store.clear()
15-
for name, value in sorted(init.items(), key=itemgetter(0)):
16-
self.parameters_store.append(self._convert(name, value))
11+
class _ParameterStoreSyncer(DictSyncer):
12+
def order_key(self, kv_pair):
13+
return kv_pair[0]
1714

18-
def _convert(self, name, value):
15+
def convert(self, name, value):
1916
return [name, str(value)]
2017

21-
def _find_index(self, name):
22-
for i, e in enumerate(self.parameters_store):
23-
if e[0] == name:
24-
return i
25-
raise KeyError
26-
27-
def __setitem__(self, name, value):
28-
try:
29-
i = self._find_index(name)
30-
except KeyError:
31-
pass
32-
else:
33-
del self.parameters_store[i]
34-
j = len(self.parameters_store)
35-
for i, e in enumerate(self.parameters_store):
36-
if e[0] > name:
37-
j = i
38-
break
39-
self.parameters_store.insert(j, self._convert(name, value))
40-
41-
def __delitem__(self, key):
42-
del self.parameters_store[self._find_index(key)]
43-
4418

4519
class _LastChangesStoreSyncer(ListSyncer):
4620
def convert(self, x):

‎artiq/gui/scheduler.py

+6-38
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from gi.repository import Gtk
55

6-
from artiq.gui.tools import Window, ListSyncer
6+
from artiq.gui.tools import Window, ListSyncer, DictSyncer
77
from artiq.management.sync_struct import Subscriber
88

99

@@ -16,16 +16,12 @@ def convert(self, x):
1616
return row
1717

1818

19-
class _PeriodicStoreSyncer:
20-
def __init__(self, periodic_store, init):
21-
self.periodic_store = periodic_store
22-
self.periodic_store.clear()
23-
self.order = []
24-
for prid, x in sorted(init.items(), key=lambda e: (e[1][0], e[0])):
25-
self.periodic_store.append(self._convert(prid, x))
26-
self.order.append((x[0], prid))
19+
class _PeriodicStoreSyncer(DictSyncer):
20+
def order_key(self, kv_pair):
21+
# order by next run time, and then by PRID
22+
return (kv_pair[1][0], kv_pair[0])
2723

28-
def _convert(self, prid, x):
24+
def convert(self, prid, x):
2925
next_run, run_params, timeout, period = x
3026
row = [time.strftime("%m/%d %H:%M:%S", time.localtime(next_run)),
3127
prid, run_params["file"]]
@@ -34,34 +30,6 @@ def _convert(self, prid, x):
3430
row.append(str(period))
3531
return row
3632

37-
def _find_index(self, prid):
38-
for i, e in enumerate(self.periodic_store):
39-
if e[1] == prid:
40-
return i
41-
raise KeyError
42-
43-
def __setitem__(self, prid, x):
44-
try:
45-
i = self._find_index(prid)
46-
except KeyError:
47-
pass
48-
else:
49-
del self.periodic_store[i]
50-
del self.order[i]
51-
ord_el = (x[0], prid)
52-
j = len(self.order)
53-
for i, o in enumerate(self.order):
54-
if o > ord_el:
55-
j = i
56-
break
57-
self.periodic_store.insert(j, self._convert(prid, x))
58-
self.order.insert(j, ord_el)
59-
60-
def __delitem__(self, key):
61-
i = self._find_index(key)
62-
del self.periodic_store[i]
63-
del self.order[i]
64-
6533

6634
class SchedulerWindow(Window):
6735
def __init__(self):

‎artiq/gui/tools.py

+47
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,50 @@ def insert(self, i, x):
2929

3030
def __delitem__(self, key):
3131
del self.store[key]
32+
33+
def convert(self, x):
34+
raise NotImplementedError
35+
36+
37+
class DictSyncer:
38+
def __init__(self, store, init):
39+
self.store = store
40+
self.store.clear()
41+
self.order = []
42+
for k, v in sorted(init.items(), key=self.order_key):
43+
self.store.append(self.convert(k, v))
44+
self.order.append((k, self.order_key((k, v))))
45+
46+
def _find_index(self, key):
47+
for i, e in enumerate(self.order):
48+
if e[0] == key:
49+
return i
50+
raise KeyError
51+
52+
def __setitem__(self, key, value):
53+
try:
54+
i = self._find_index(key)
55+
except KeyError:
56+
pass
57+
else:
58+
del self.store[i]
59+
del self.order[i]
60+
ord_el = self.order_key((key, value))
61+
j = len(self.order)
62+
for i, (k, o) in enumerate(self.order):
63+
if o > ord_el:
64+
j = i
65+
break
66+
self.store.insert(j, self.convert(key, value))
67+
self.order.insert(j, (key, ord_el))
68+
69+
def __delitem__(self, key):
70+
i = self._find_index(key)
71+
del self.store[i]
72+
del self.order[i]
73+
74+
def order_key(self, kv_pair):
75+
raise NotImplementedError
76+
77+
def convert(self, key, value):
78+
raise NotImplementedError

0 commit comments

Comments
 (0)
Please sign in to comment.