fixed bts #35
[qtodo.git] / qtodo.py
blobaccb5d1ef861af6398aabcbb88e0e230ce136f89
1 #!/usr/bin/env python
3 from PyQt4 import Qt, QtCore, QtGui
4 import sys
6 sys.path.append('./src')
8 from qtodoIO import *
9 from mainwin import *
10 from AddCatDlg import Ui_D_Add
11 from ToDoCategoryList import *
12 from ToDoItemList import *
15 class Trash(QtGui.QLabel):
16 def __init__(self, DbEngine, parent=None):
17 QtGui.QLabel.__init__(self, parent)
18 self.setAcceptDrops(True)
19 self.setPixmap(QtGui.QPixmap("pixmaps/eraser.png"))
20 self.setSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Minimum)
21 self.setMargin(2)
22 self.adjustSize()
23 self.DbEngine = DbEngine
25 def dropEvent(self, event):
26 if event.mimeData().hasFormat("application/x-qtodo"):
27 pieceData = event.mimeData().data("application/x-qtodo")
28 dataStream = QtCore.QDataStream(pieceData, QtCore.QIODevice.ReadOnly)
29 oid = QtCore.QString()
30 item_type = QtCore.QString()
31 dataStream >> oid >> item_type
32 event.setDropAction(QtCore.Qt.MoveAction)
33 if item_type == TYPE_LIST:
34 # Delete the category from database
35 res = self.DbEngine.DeleteList(oid)
36 if res == -1:
37 res = QtGui.QMessageBox.critical(None, "Error",
38 "There are some items still assigned to this category",
39 QtGui.QMessageBox.Ok )
40 self.setFrameShape(QtGui.QFrame.NoFrame)
41 self.setFrameShadow(QtGui.QFrame.Plain)
42 event.ignore()
43 else:
44 event.accept()
45 if item_type == TYPE_TODO:
46 # Delete the category from database
47 res = self.DbEngine.DeleteItem(oid)
48 if res == -1:
49 res = QtGui.QMessageBox.critical(None, "Error",
50 "The item is still open",
51 QtGui.QMessageBox.Ok )
52 self.setFrameShape(QtGui.QFrame.NoFrame)
53 self.setFrameShadow(QtGui.QFrame.Plain)
54 event.ignore()
55 else:
56 event.accept()
57 else:
58 event.ignore()
59 self.setFrameShape(QtGui.QFrame.NoFrame)
60 self.setFrameShadow(QtGui.QFrame.Plain)
62 def dragEnterEvent(self, event):
63 self.setFrameShape(QtGui.QFrame.Panel)
64 self.setFrameShadow(QtGui.QFrame.Raised)
65 event.accept()
67 def dragLeaveEvent(self, event):
68 self.setFrameShape(QtGui.QFrame.NoFrame)
69 self.setFrameShadow(QtGui.QFrame.Plain)
71 class AddList(QtGui.QLabel):
72 def __init__(self, DbEngine, parent=None):
73 QtGui.QLabel.__init__(self, parent)
74 self.setAcceptDrops(True)
75 self.setPixmap(QtGui.QPixmap("pixmaps/eraser.png"))
76 self.DbEngine = DbEngine
78 def dropEvent(self, event):
79 if event.mimeData().hasFormat("application/x-qtodo"):
80 pieceData = event.mimeData().data("application/x-qtodo")
81 dataStream = QtCore.QDataStream(pieceData, QtCore.QIODevice.ReadOnly)
83 oid_cat = QtCore.QString()
84 id_cat = QtCore.QString()
86 dataStream >> oid_cat >> id_cat
87 event.setDropAction(QtCore.Qt.MoveAction)
88 event.accept()
89 # Delete the category from database
90 self.DbEngine.DeleteList(oid_cat)
92 def dragEnterEvent(self, event):
93 event.accept()
95 class QTodo(Ui_MainWindow):
96 def __init__(self):
97 self.IOEngine = QTodoIO()
98 self.Filters = {
99 "Oid" : None,
100 "OidCategory" : None,
101 "OidPriority" : None,
102 "OidStatus" : None
105 def Finalize(self):
106 QtCore.QObject.connect(ui.action_Quit, QtCore.SIGNAL("triggered()"), self.QuitApp)
107 QtCore.QObject.connect(ui.action_About, QtCore.SIGNAL("triggered()"), self.About)
108 QtCore.QObject.connect(ui.action_Documentation, QtCore.SIGNAL("triggered()"), self.Documentation)
109 QtCore.QObject.connect(ui.action_Category, QtCore.SIGNAL("triggered()"), self.CategoryConf)
110 QtCore.QObject.connect(ui.action_Priority, QtCore.SIGNAL("triggered()"), self.PriorityConf)
112 QtCore.QObject.connect(ui.CB_CategoryFilter, QtCore.SIGNAL("currentIndexChanged(QString)"), self.UpdateCategoryFilter)
113 QtCore.QObject.connect(ui.CB_PriorityFilter, QtCore.SIGNAL("currentIndexChanged(QString)"), self.UpdatePriorityFilter)
114 QtCore.QObject.connect(ui.CB_StatusFilter, QtCore.SIGNAL("currentIndexChanged(QString)"), self.UpdateStatusFilter)
116 # set the trash zone
117 ui.trash = Trash(self.IOEngine)
118 ui.actions_box.layout().addWidget(ui.trash)
120 # insert a stretch to keep aligned the controls
121 ui.actions_box.layout().insertStretch(-1, 20)
123 # set the todo category area
124 ui.todo_lists = TodoLists()
125 ui.lists_box.layout().addWidget(ui.todo_lists, 1, 0)
127 ui.todo_items = ToDoItemList(self.IOEngine)
128 ui.items_box.layout().addWidget(ui.todo_items, 2, 0)
129 activeItems = self.IOEngine.CountActive()
130 closeItems = self.IOEngine.CountClosed()
131 ui.L_ActiveItem.setText(str(activeItems))
132 ui.L_CloseItem.setText(str(closeItems))
134 overdueItems = self.IOEngine.CountOverdue()
135 if overdueItems > 0:
136 f = ui.L_OverdueItem.palette()
137 f.setColor(QtGui.QPalette.Foreground,QtGui.QColor(255, 0, 0))
138 ui.L_OverdueItem.setPalette(f)
139 ui.L_OverdueItem.setText(str(overdueItems))
141 cats = self.IOEngine.GetCategories()
142 ui.CB_CategoryFilter.addItem('All')
143 for c in cats:
144 ui.CB_CategoryFilter.addItem(c["id_cat"])
146 stats = self.IOEngine.LoadStatus()
147 ui.CB_StatusFilter.addItem('All')
148 for s in stats:
149 ui.CB_StatusFilter.addItem(s["desc"])
151 prior = self.IOEngine.LoadPriorities()
152 ui.CB_PriorityFilter.addItem('All')
153 for p in prior:
154 ui.CB_PriorityFilter.addItem(p["id_pr"])
156 def LoadData(self):
157 categories = self.IOEngine.GetCategories()
158 for rec in categories:
159 ui.todo_lists.addList(rec["oid"], rec["id_cat"])
160 self.RefreshItemList()
162 def RefreshItemList(self):
163 items = self.IOEngine.GetItems(self.Filters)
164 for rec in items:
165 ui.todo_items.addItem(rec)
168 def QuitApp(self):
169 app.quit()
172 def PriorityConf(self):
173 pass
176 def UpdateCategoryFilter(self, text):
177 if str(text) == ALL_RECORD:
178 self.Filters["OidCategory"] = None
179 return
180 oidcat = self.IOEngine.GetCategory(str(text))
181 self.Filters["OidCategory"] = oidcat
182 self.UpdateItemList()
184 def UpdatePriorityFilter(self, text):
185 if str(text) == ALL_RECORD:
186 self.Filters["OidPriority"] = None
187 return
188 oidpr = self.IOEngine.GetPriority(str(text))
189 self.Filters["OidPriority"] = oidpr
190 self.UpdateItemList()
192 def UpdateStatusFilter(self, text):
193 if str(text) == ALL_RECORD:
194 self.Filters["OidStatus"] = None
195 return
196 oidsta = self.IOEngine.GetStatus(str(text))
197 self.Filters["OidStatus"] = oidsta
198 self.UpdateItemList()
201 def UpdateItemList(self):
202 ui.todo_items.clear()
203 self.RefreshItemList()
205 def CategoryConf(self):
206 AddCatDlg = QtGui.QDialog()
207 AddCat = Ui_D_Add()
208 AddCat.setupUi(AddCatDlg)
210 if AddCatDlg.exec_():
211 cat = AddCat.LE_cat_name.text()
212 if str(cat) == '':
213 return
214 desc = AddCat.LE_cat_desc.text()
215 it = QtGui.QListWidgetItem(QtGui.QIcon("pixmaps/todo_list.png"),cat)
216 it.setTextAlignment(QtCore.Qt.AlignVCenter)
217 ui.todo_lists.insertItem(0,it)
218 Data = {"id_category" : str(cat),
219 "ds_category" : str(desc) }
220 oid_cat = self.IOEngine.InsertCategory(Data)
221 it.setData(QtCore.Qt.UserRole, QtCore.QVariant(oid_cat))
222 it.setData(QtCore.Qt.UserRole+1, QtCore.QVariant(TYPE_LIST))
225 def DeleteCategory(self):
226 print "Here"
228 def EditCategory(self):
229 pass
231 def About(self):
232 QtGui.QMessageBox.about(None, "About QTodo", "QTodo Ver %s.\nA simple todo manager"%VERSION)
235 def Documentation(self):
236 pass
238 app = QtGui.QApplication(sys.argv)
239 window = QtGui.QMainWindow()
240 ui = QTodo()
241 ui.setupUi(window)
243 #connect the menu items
244 ui.Finalize()
246 #Load the data present
247 ui.LoadData()
249 window.show()
250 sys.exit(app.exec_())