3a0f9c3691bd3481ed180e1d06369b4b4dbc138e
[multilist] / src / libview.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 """
5 This file is part of Multilist.
6
7 Multilist is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 Multilist is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Multilist.  If not, see <http://www.gnu.org/licenses/>.
19
20 Copyright (C) 2008 Christoph Würstle
21 """
22
23 import logging
24
25 import gtk
26 import gobject
27 import pango
28
29 import gtk_toolbox
30
31
32 try:
33         _
34 except NameError:
35         _ = lambda x: x
36
37
38 _moduleLogger = logging.getLogger(__name__)
39
40
41 class TripleToggleCellRenderer(gtk.CellRendererToggle):
42
43         __gproperties__ = {
44                 "status": (gobject.TYPE_STRING, "Status",
45                 "Status", "", gobject.PARAM_READWRITE),
46         }
47
48         __gsignals__ = {
49                 'status_changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_INT, gobject.TYPE_STRING)),
50         }
51
52         def __init__(self):
53                 gtk.CellRendererToggle.__init__(self)
54                 self.set_property("activatable", True)
55                 self.connect('toggled', self._on_toggled)
56                 self.status = -1
57
58         def do_set_property(self, property, value):
59                 if getattr(self, property.name) == value:
60                         return
61
62                 setattr(self, property.name, value)
63
64                 if property.name == "status":
65                         active, inconsistent = {
66                                 "-1": (False, True),
67                                 "0": (False, False),
68                                 "1": (True, False),
69                         }[value]
70                         self.set_property("active", active)
71                         self.set_property("inconsistent", inconsistent)
72
73         def do_get_property(self, property):
74                 return getattr(self, property.name)
75
76         def _on_toggled(self, widget, path):
77                 self.emit("status_changed", int(path), "-1")
78
79
80 gobject.type_register(TripleToggleCellRenderer)
81
82
83 class View(gtk.VBox):
84
85         def __init__(self, db, liststorehandler, parent_window):
86                 self.db = db
87                 self.parent_window = parent_window
88                 self.liststorehandler = liststorehandler
89
90                 gtk.VBox.__init__(self, homogeneous = False, spacing = 0)
91
92                 logging.info("libview, init")
93
94                 self.scrolled_window = None
95                 self.reload_view()
96
97         def loadList(self):
98                 ls = self.liststorehandler.get_liststore()
99                 self.treeview.set_model(ls)
100
101         def col_edited(self, cell, irow, new_text, icol = None):
102                 if (irow != 4):
103                         self.liststorehandler.update_row(irow, icol, new_text)
104                 else:
105                         print cell, irow, new_text, icol
106
107         def col_toggled(self, widget, irow, status ):
108                 ls = self.treeview.get_model()
109
110                 if self.liststorehandler.get_filter() == self.liststorehandler.SHOW_ACTIVE:
111                         if ls[irow][1] == "0":
112                                 self.liststorehandler.update_row(irow, 1, "1")
113                         else:
114                                 self.liststorehandler.update_row(irow, 1, "0")
115                 else:
116                         if ls[irow][1] == "1":
117                                 self.liststorehandler.update_row(irow, 1, "-1")
118                         elif ls[irow][1] == "0":
119                                 self.liststorehandler.update_row(irow, 1, "1")
120                         else:
121                                 self.liststorehandler.update_row(irow, 1, "0")
122
123         def convert(self, s):
124                 if s == "1":
125                         return 1
126                 else:
127                         return 0
128
129         def del_active_row(self):
130                 path, col = self.treeview.get_cursor()
131                 if path is not None:
132                         irow = path[0]
133                         row_iter = self.treeview.get_model().get_iter(path)
134                         self.liststorehandler.del_row(irow, row_iter)
135
136         def sort_func_function(self, model, iter1, iter2, data = None):
137                 print "sorting"
138
139         def reload_view(self):
140                 # create the TreeView using liststore
141                 self.modelsort = gtk.TreeModelSort(self.liststorehandler.get_liststore())
142                 self.modelsort.set_sort_column_id(2, gtk.SORT_ASCENDING)
143
144                 self.treeview = gtk.TreeView(self.modelsort)
145                 self.treeview.set_headers_visible(True)
146                 self.treeview.set_reorderable(False)
147
148                 self.cell = range(self.liststorehandler.get_colcount())
149                 self.tvcolumn = range(self.liststorehandler.get_colcount())
150
151                 m = self.liststorehandler.get_unitsstore()
152
153                 for i in range(self.liststorehandler.get_colcount()):
154                         if i in [1, 2]:
155                                 default = "1"
156                         else:
157                                 default = "0"
158                         if self.db.ladeDirekt("showcol_"+str(self.liststorehandler.get_colname(i)), default) == "1":
159                                 if i in [1]:
160                                         #self.cell[i] = CellRendererTriple()
161                                         self.cell[i] = TripleToggleCellRenderer()
162                                         self.tvcolumn[i] = gtk.TreeViewColumn("", self.cell[i])
163                                         self.cell[i].connect( 'status_changed', self.col_toggled)
164                                         self.tvcolumn[i].set_attributes( self.cell[i], status = i)
165                                 elif i in [3, 6]:
166                                         self.cell[i] = gtk.CellRendererCombo()
167                                         self.tvcolumn[i] = gtk.TreeViewColumn(self.liststorehandler.get_colname(i), self.cell[i])
168                                         self.cell[i].set_property("model", m)
169                                         self.cell[i].set_property('text-column', i)
170                                         self.cell[i].set_property('editable', True)
171                                         self.cell[i].connect("edited", self.col_edited, i)
172                                         self.tvcolumn[i].set_attributes( self.cell[i], text = i)
173                                 else:
174                                         self.cell[i] = gtk.CellRendererText()
175                                         self.tvcolumn[i] = gtk.TreeViewColumn(self.liststorehandler.get_colname(i), self.cell[i])
176                                         self.cell[i].set_property('editable', True)
177                                         self.cell[i].set_property('editable-set', True)
178                                         self.cell[i].connect("edited", self.col_edited, i)
179                                         #self.cell[i].connect("editing-canceled", self.col_edited2, i) 
180                                         self.tvcolumn[i].set_attributes(self.cell[i], text = i)
181
182                                 self.cell[i].set_property('cell-background', 'lightgray')
183                                 self.tvcolumn[i].set_sort_column_id(i)
184                                 self.tvcolumn[i].set_resizable(True)
185                                 self.treeview.append_column(self.tvcolumn[i])
186
187                 if self.scrolled_window is not None:
188                         self.scrolled_window.destroy()
189
190                 self.scrolled_window = gtk.ScrolledWindow()
191                 self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
192
193                 self.scrolled_window.add(self.treeview)
194                 self.pack_start(self.scrolled_window, expand = True, fill = True, padding = 0)
195                 self.loadList()
196
197                 self.show_all()