Use PREFIX in install rule.
[SysBars.git] / choicesui.py
blob0fe35559941d84d303691b74bc9322b6f881b890
1 import gobject
2 import gtk as g
4 from choices import settings
5 import plugins
7 VSPACING = 6
8 HSPACING = 6
10 class Dialog(g.Dialog):
11 def __init__(self, client, parent = None):
12 self.client = client
13 g.Dialog.__init__(self, _("SysBars Choices"), parent,
14 buttons = (g.STOCK_CLOSE, g.RESPONSE_CLOSE))
15 self.set_has_separator(False)
17 #table = g.Table(2, 2)
18 #table.set_row_spacings(VSPACING)
20 hbox = g.HBox(False, 0)
21 l = g.Label(_("Label font"))
22 #l.set_alignment(0, 0.5)
23 hbox.pack_start(l, False, True, HSPACING)
24 #table.attach(l, 0, 1, 0, 1, xoptions = g.FILL, xpadding = HSPACING)
25 self.font_w = g.FontButton(settings.get_label_font())
26 self.font_w.set_title(_("SysBars Label Font"))
27 self.font_w.connect("font-set", self.font_set_cb)
28 hbox.pack_start(self.font_w, True, True, HSPACING)
29 #table.attach(self.font_w, 1, 2, 0, 1, xpadding = HSPACING)
30 #l = g.Label(_("Label colour"))
31 #l.set_alignment(0, 0.5)
32 #table.attach(l, 0, 1, 1, 2, xoptions = g.FILL, xpadding = HSPACING)
33 #self.label_colour_w = g.ColorButton(settings.get_label_colour())
34 #self.label_colour_w.connect("color-set", self.label_colour_set_cb)
35 #table.attach(self.label_colour_w, 1, 2, 1, 2, xpadding = HSPACING)
36 #self.vbox.pack_start(table, padding = VSPACING)
37 self.vbox.pack_start(hbox, padding = VSPACING)
39 b = g.CheckButton(_("Overlap labels and bars"))
40 b.set_active(settings.get_overlap())
41 b.connect("toggled", self.overlap_toggled_cb)
42 self.vbox.pack_start(b, padding = VSPACING)
44 frame = g.Frame()
45 l = g.Label(_("<b>System Monitor Bars</b>"))
46 l.set_use_markup(True)
47 frame.set_label_widget(l)
48 frame.set_shadow_type(g.SHADOW_NONE)
49 self.vbox.pack_start(frame, padding = VSPACING)
51 self.list_store = g.ListStore(gobject.TYPE_STRING,
52 gobject.TYPE_PYOBJECT)
53 for b in plugins.all_descs:
54 iter = self.list_store.append()
55 self.list_store.set(iter, 0, b.get_name(), 1, b)
57 self.tree_view = g.TreeView(self.list_store)
58 self.tree_view.append_column( \
59 g.TreeViewColumn(None, g.CellRendererText(), text = 0))
60 self.tree_view.set_headers_visible(False)
61 self.tree_view.connect("row-activated", self.row_activated_cb)
63 scroll = g.ScrolledWindow()
64 scroll.set_policy(g.POLICY_AUTOMATIC, g.POLICY_AUTOMATIC)
65 scroll.set_shadow_type(g.SHADOW_ETCHED_IN)
66 scroll.set_size_request(200, -1)
67 scroll.add(self.tree_view)
69 vbox = g.VBox(False, VSPACING)
70 hbox = g.HBox(True, HSPACING)
71 self.up_button = g.Button(stock = g.STOCK_GO_UP)
72 self.up_button.connect("clicked", self.up_cb)
73 hbox.pack_start(self.up_button)
74 self.down_button = g.Button(stock = g.STOCK_GO_DOWN)
75 self.down_button.connect("clicked", self.down_cb)
76 hbox.pack_start(self.down_button)
77 vbox.pack_end(hbox, False, False)
78 self.add_button = g.Button(stock = g.STOCK_ADD)
79 self.add_button.connect("button-press-event", self.add_cb)
80 vbox.pack_end(self.add_button, False, False)
81 self.edit_button = g.Button(stock = g.STOCK_EDIT)
82 self.edit_button.connect("clicked", self.edit_cb)
83 vbox.pack_end(self.edit_button, False, False)
84 self.del_button = g.Button(stock = g.STOCK_DELETE)
85 self.del_button.connect("clicked", self.delete_cb)
86 vbox.pack_end(self.del_button, False, False)
88 hbox = g.HBox()
89 hbox.pack_start(scroll, padding = HSPACING)
90 hbox.pack_start(vbox, False, True, padding = HSPACING)
91 frame.add(hbox)
93 self.update_buttons()
95 self.tree_view.connect("cursor-changed", self.update_buttons)
96 self.tree_view.connect("move-cursor", self.update_buttons)
98 def update_buttons(self, *args):
99 sel = self.tree_view.get_selection()
100 has_sel = sel != None and sel.get_selected()[1] != None
101 n_items = self.list_store.iter_n_children(None)
102 moren1 = has_sel and n_items > 1
103 self.edit_button.set_sensitive(has_sel)
104 self.del_button.set_sensitive(moren1)
105 self.up_button.set_sensitive(moren1 and \
106 not sel.iter_is_selected(self.list_store.get_iter_first()))
107 self.down_button.set_sensitive(moren1 and \
108 self.list_store.iter_next(sel.get_selected()[1]) != None)
110 def get_selected_iter(self):
111 return self.tree_view.get_selection().get_selected()[1]
113 def run_edit_dialog(self, iter):
114 desc = self.list_store.get_value(iter, 1)
115 edit_dialog = plugins.dialog_factory(self, False, desc,
116 self.client.get_bar_widget(desc.num))
117 edit_dialog.run_apply_destroy()
118 self.update_buttons()
120 def update_bar_name(self, desc):
121 u = [None]
122 def find_desc(m, p, i, u):
123 if self.list_store.get_value(i, 1) == desc:
124 u[0] = i
125 self.list_store.foreach(find_desc, u)
126 self.list_store.set(u[0], 0, desc.get_name())
128 def font_set_cb(self, fw):
129 f = fw.get_font_name()
130 settings.set_label_font(f)
131 self.client.update_label_font(f)
133 def overlap_toggled_cb(self, b):
134 overlap = b.get_active()
135 settings.set_overlap(overlap)
136 self.client.update_overlap(overlap)
139 #def label_colour_set_cb(self, cw):
140 # settings.set_label_colour(cw.get_color())
142 def edit_cb(self, widget):
143 iter = self.get_selected_iter()
144 self.run_edit_dialog(iter)
146 def row_activated_cb(self, view, path, column):
147 iter = self.list_store.get_iter(path)
148 self.run_edit_dialog(iter)
150 def add_cb(self, widget, event):
151 if event.button != 1:
152 return True
153 menu = g.Menu()
154 for t, n in plugins.types.items():
155 i = g.MenuItem(n)
156 i.connect("activate", self.add_menu_cb, t)
157 menu.append(i)
158 menu.show_all()
159 menu.popup(None, None, None, event.button, event.time)
160 return True
162 def add_menu_cb(self, widget, type):
163 num = self.list_store.iter_n_children(None)
164 desc = plugins.desc_factory(num, type)
165 add_dialog = plugins.dialog_factory(self, True, desc)
166 if add_dialog.run_apply_destroy() == g.RESPONSE_OK:
167 iter = self.list_store.append()
168 self.list_store.set(iter, 0, desc.get_name(), 1, desc)
169 settings.set_bar_type(num, type)
170 settings.set_num_bars(num + 1)
171 plugins.all_descs.append(desc)
172 self.client.add_bar(num)
173 self.update_buttons()
175 def fix_nums_after_delete(self, model, path, iter, data):
176 if data[1] >= data[0]:
177 desc = model.get_value(iter, 1)
178 desc.change_num(data[1])
179 data[1] += 1
181 def delete_cb(self, widget):
182 iter = self.get_selected_iter()
183 desc = self.list_store.get_value(iter, 1)
184 num = desc.num
185 self.list_store.remove(iter)
186 del plugins.all_descs[num]
187 self.list_store.foreach(self.fix_nums_after_delete, [num, 0])
188 settings.set_num_bars(self.list_store.iter_n_children(None))
189 self.client.repack()
190 self.update_buttons()
192 def up_cb(self, widget):
193 i2 = self.get_selected_iter()
194 d2 = self.list_store.get_value(i2, 1)
195 i1 = self.list_store.get_iter_first()
196 while i1:
197 next = self.list_store.iter_next(i1)
198 dn = self.list_store.get_value(next, 1)
199 if dn == d2:
200 break
201 i1 = next
202 if i1:
203 self.swap(i1, i2)
205 def down_cb(self, widget):
206 i1 = self.get_selected_iter()
207 i2 = self.list_store.iter_next(i1)
208 self.swap(i1, i2)
210 def swap(self, i1, i2):
211 d1 = self.list_store.get_value(i1, 1)
212 d2 = self.list_store.get_value(i2, 1)
213 n1 = d1.num
214 n2 = d2.num
215 self.list_store.swap(i1, i2)
216 plugins.all_descs[n1] = d2
217 plugins.all_descs[n2] = d1
218 d1.change_num(n2)
219 d2.change_num(n1)
220 self.client.repack()
221 self.update_buttons()
225 def run_dialog(client, parent = None):
226 if parent and not isinstance(parent, g.Window):
227 parent = None
228 d = Dialog(client, parent)
229 d.show_all()
230 d.run()
231 d.destroy()