minor update
[qtodo.git] / qtodo.py
blob4dca1735b85da72aebf079ae0a71cea50efe0d9f
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 AddItemDlg import Ui_d_add_item
13 class TodoLists(QtGui.QListWidget):
14 def __init__(self, parent=None):
15 QtGui.QListWidget.__init__(self, parent)
16 self.setDragEnabled(True)
17 self.setViewMode(QtGui.QListView.ListMode)
18 self.setIconSize(QtCore.QSize(34, 34 ))
19 self.setSpacing(5)
20 self.setAcceptDrops(True)
21 self.setDropIndicatorShown(True)
22 self.setMovement(QtGui.QListView.Free)
24 def addList(self, oid_cat, id_cat):
25 listItem = QtGui.QListWidgetItem(self)
26 pixmap = QtGui.QIcon("pixmaps/todo_list.png")
27 listItem.setIcon(pixmap)
28 listItem.setText(id_cat)
29 listItem.setData(QtCore.Qt.UserRole, QtCore.QVariant(oid_cat))
30 listItem.setData(QtCore.Qt.UserRole+1, QtCore.QVariant(id_cat))
32 listItem.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled)
35 def dragEnterEvent(self, event):
36 if event.mimeData().hasFormat("application/x-qtodo"):
37 event.accept()
38 else:
39 event.ignore()
41 def dragMoveEvent(self, event):
42 if event.mimeData().hasFormat("application/x-qtodo"):
43 event.setDropAction(QtCore.Qt.MoveAction)
44 event.accept()
45 else:
46 event.ignore()
48 def dropEvent_(self, event):
49 if event.mimeData().hasFormat("application/x-qtodo"):
50 pieceData = event.mimeData().data("application/x-qtodo")
51 dataStream = QtCore.QDataStream(pieceData, QtCore.QIODevice.ReadOnly)
52 pixmap = QtGui.QPixmap()
53 location = QtCore.QPoint()
54 dataStream >> pixmap >> location
56 self.addList(pixmap, location)
58 event.setDropAction(QtCore.Qt.MoveAction)
59 event.accept()
60 else:
61 event.ignore()
63 def startDrag(self, supportedActions):
64 item = self.currentItem()
65 itemData = QtCore.QByteArray()
66 dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
67 oid_cat = item.data(QtCore.Qt.UserRole).toString()
68 id_cat = item.data(QtCore.Qt.UserRole+1).toString()
69 dataStream << oid_cat << id_cat
71 mimeData = QtCore.QMimeData()
72 mimeData.setData("application/x-qtodo", itemData)
73 drag = QtGui.QDrag(self)
74 drag.setMimeData(mimeData)
75 drag.setPixmap(QtGui.QPixmap("pixmaps/todo_list.png"))
77 if drag.start(QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction:
78 self.takeItem(self.row(item))
81 class ToDoItemList(QtGui.QListWidget):
82 def __init__(self, DbEngine, parent=None):
83 QtGui.QListWidget.__init__(self, parent)
84 self.setDragEnabled(True)
85 self.setViewMode(QtGui.QListView.ListMode)
86 self.setIconSize(QtCore.QSize(34, 34 ))
87 self.setSpacing(5)
88 self.setAcceptDrops(True)
89 self.setDropIndicatorShown(True)
90 self.setMovement(QtGui.QListView.Free)
91 self.DbEngine = DbEngine
92 QtCore.QObject.connect(self, QtCore.SIGNAL("itemDoubleClicked(QListWidgetItem *)"), self.itemSel)
94 def loadItems(self, recDict):
95 item = QtGui.QListWidgetItem(self)
96 pixmap = QtGui.QIcon("pixmaps/todo_list.png")
97 item.setIcon(pixmap)
98 item.setText(recDict["headline"])
99 #item.setData(QtCore.Qt.UserRole, QtCore.QVariant(oid_cat))
100 #item.setData(QtCore.Qt.UserRole+1, QtCore.QVariant(id_cat))
101 item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled)
103 def itemSel(self, item):
106 def dragEnterEvent(self, event):
107 if event.mimeData().hasFormat("application/x-qtodo"):
108 event.acceptProposedAction()
109 else:
110 event.ignore()
112 def dragMoveEvent(self, event):
113 if event.mimeData().hasFormat("application/x-qtodo"):
114 event.setDropAction(QtCore.Qt.CopyAction)
115 event.acceptProposedAction()
116 else:
117 event.ignore()
119 def dropEvent(self, event):
120 if event.mimeData().hasFormat("application/x-qtodo"):
121 pieceData = event.mimeData().data("application/x-qtodo")
122 dataStream = QtCore.QDataStream(pieceData, QtCore.QIODevice.ReadOnly)
123 oid_cat = QtCore.QString()
124 id_cat = QtCore.QString()
125 dataStream >> oid_cat >> id_cat
127 NewItemDialog = QtGui.QDialog()
128 NewItem = Ui_d_add_item()
129 NewItem.setupUi(NewItemDialog)
130 Pr = self.DbEngine.LoadPriority()
131 NewItem.CB_Priority.addItems(Pr)
132 NewItem.L_Category.setText(QtCore.QString(id_cat))
133 cur_time = QtCore.QDateTime().currentDateTime()
134 NewItem.DTE_Deadline.setDateTime(cur_time)
135 if NewItemDialog.exec_():
136 Priority = NewItem.CB_Priority.currentText()
137 Body = NewItem.TE_Body.toPlainText()
138 DeadLine = None
139 if NewItem.CB_Deadline.isChecked():
140 DeadLine = NewItem.DTE_Deadline.dateTime().toString('dd.MM.yyyy hh:mm')
141 dataDict = {
142 "body": str(Body),
143 "category": int(oid_cat),
144 "priority": str(Priority)
146 if DeadLine == None:
147 dataDict["deadline"] = ''
148 self.DbEngine.InsertItem(dataDict)
149 event.setDropAction(QtCore.Qt.CopyAction)
150 event.accept()
152 else:
153 event.ignore()
155 def startDrag_(self, supportedActions):
156 item = self.currentItem()
157 itemData = QtCore.QByteArray()
158 dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
159 oid_cat = item.data(QtCore.Qt.UserRole).toString()
160 id_cat = item.data(QtCore.Qt.UserRole+1).toString()
161 dataStream << oid_cat << id_cat
163 mimeData = QtCore.QMimeData()
164 mimeData.setData("application/x-qtodo", itemData)
165 drag = QtGui.QDrag(self)
166 drag.setMimeData(mimeData)
167 drag.setPixmap(QtGui.QPixmap("pixmaps/todo_list.png"))
169 if drag.start(QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction:
170 self.takeItem(self.row(item))
173 class ToDoItem(QtGui.QListWidgetItem):
174 def __init__(self, DbEngine, parent=None):
175 QtGui.QListWidgetItem.__init__(self, parent)
176 self.setAcceptDrops(False)
177 self.L_Pr = QtGui.QLabel("Priority: ")
178 self.L_St = QtGui.QLabel("Status: ")
179 self.L_De = QtGui.QLabel("Deadline: ")
180 self.L_PrImg = QtGui.QLabel(self)
181 self.L_StImg = QtGui.QLabel(self)
182 self.L_DeImg = QtGui.QLabel(self)
183 self.L_PrImg.setPixmap(QtGui.QPixmap("pixmaps/house.png"))
184 self.L_StImg.setPixmap(QtGui.QPixmap("pixmaps/house.png"))
185 self.L_DeImg.setPixmap(QtGui.QPixmap("pixmaps/house.png"))
186 self.TE_TodoBody = QtGui.QTextEdit(self)
187 self.Layout = QtGui.QGridLayout(self)
188 self.Layout.addWidget(self.L_Pr, 0,0)
189 self.Layout.addWidget(self.L_PrImg, 0,1)
190 self.Layout.addWidget(self.L_St, 0,2)
191 self.Layout.addWidget(self.L_StImg, 0,3)
192 self.Layout.addWidget(self.L_De, 0,4)
193 self.Layout.addWidget(self.L_DeImg, 0,5)
194 self.Layout.addWidget(self.TE_TodoBody, 1,0)
195 self.setLayout(self.Layout)
196 self.DbEngine = DbEngine
198 def dropEvent_(self, event):
199 if event.mimeData().hasFormat("application/x-qtodo"):
200 pieceData = event.mimeData().data("application/x-qtodo")
201 dataStream = QtCore.QDataStream(pieceData, QtCore.QIODevice.ReadOnly)
203 oid_cat = QtCore.QString()
204 id_cat = QtCore.QString()
206 dataStream >> oid_cat >> id_cat
207 event.setDropAction(QtCore.Qt.MoveAction)
208 event.accept()
209 # Delete the category from database
210 self.DbEngine.DeleteList(oid_cat)
212 def dropEvent_(self, event):
213 if event.mimeData().hasFormat("application/x-qtodo"):
214 itemData = event.mimeData().data("application/x-qtodo")
215 dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.ReadOnly)
216 text = QtCore.QString()
217 dataStream >> text
220 def dragEnterEvent(self, event):
221 event.accept()
224 class Trash(QtGui.QLabel):
225 def __init__(self, DbEngine, parent=None):
226 QtGui.QLabel.__init__(self, parent)
227 self.setAcceptDrops(True)
228 self.setPixmap(QtGui.QPixmap("pixmaps/eraser.png"))
229 self.DbEngine = DbEngine
231 def dropEvent(self, event):
232 if event.mimeData().hasFormat("application/x-qtodo"):
233 pieceData = event.mimeData().data("application/x-qtodo")
234 dataStream = QtCore.QDataStream(pieceData, QtCore.QIODevice.ReadOnly)
236 oid_cat = QtCore.QString()
237 id_cat = QtCore.QString()
239 dataStream >> oid_cat >> id_cat
240 event.setDropAction(QtCore.Qt.MoveAction)
241 event.accept()
242 # Delete the category from database
243 self.DbEngine.DeleteList(oid_cat)
245 def dropEvent_(self, event):
246 if event.mimeData().hasFormat("application/x-qtodo"):
247 itemData = event.mimeData().data("application/x-qtodo")
248 dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.ReadOnly)
249 text = QtCore.QString()
250 dataStream >> text
253 def dragEnterEvent(self, event):
254 event.accept()
258 class AddList(QtGui.QLabel):
259 def __init__(self, DbEngine, parent=None):
260 QtGui.QLabel.__init__(self, parent)
261 self.setAcceptDrops(True)
262 self.setPixmap(QtGui.QPixmap("pixmaps/eraser.png"))
263 self.DbEngine = DbEngine
265 def dropEvent(self, event):
266 if event.mimeData().hasFormat("application/x-qtodo"):
267 pieceData = event.mimeData().data("application/x-qtodo")
268 dataStream = QtCore.QDataStream(pieceData, QtCore.QIODevice.ReadOnly)
270 oid_cat = QtCore.QString()
271 id_cat = QtCore.QString()
273 dataStream >> oid_cat >> id_cat
274 event.setDropAction(QtCore.Qt.MoveAction)
275 event.accept()
276 # Delete the category from database
277 self.DbEngine.DeleteList(oid_cat)
279 def dragEnterEvent(self, event):
280 event.accept()
282 class QTodo(Ui_MainWindow):
283 def __init__(self):
284 self.IOEngine = QTodoIO()
285 pass
287 def Finalize(self):
288 QtCore.QObject.connect(ui.action_Quit, QtCore.SIGNAL("triggered()"), self.QuitApp)
289 QtCore.QObject.connect(ui.action_About, QtCore.SIGNAL("triggered()"), self.About)
290 QtCore.QObject.connect(ui.action_Documentation, QtCore.SIGNAL("triggered()"), self.Documentation)
292 # set the trash zone
293 ui.trash = Trash(self.IOEngine)
294 ui.actions_box.layout().addWidget(ui.trash, 0,0)
295 # set the todo lists area
296 ui.todo_lists = TodoLists()
297 ui.lists_box.layout().addWidget(ui.todo_lists, 1, 0)
299 ui.todo_items = ToDoItemList(self.IOEngine)
300 ui.items_box.layout().addWidget(ui.todo_items, 1, 0)
301 activeItems = self.IOEngine.CountActive()
302 closeItems = self.IOEngine.CountClosed()
303 ui.L_ActiveItem.setText(str(activeItems))
304 ui.L_CloseItem.setText(str(closeItems))
306 overdueItems = self.IOEngine.CountOverdue()
307 overdueItems = -1
308 if overdueItems < 0:
309 f = ui.L_OverdueItem.palette()
310 f.setColor(QtGui.QPalette.Foreground,QtGui.QColor(255, 0, 0))
311 ui.L_OverdueItem.setPalette(f)
312 ui.L_OverdueItem.setText(str(overdueItems))
315 def LoadData(self):
316 categories = self.IOEngine.GetCategories()
317 for rec in categories:
318 ui.todo_lists.addList(rec["oid"], rec["id_cat"])
319 items = self.IOEngine.GetItems()
320 for rec in items:
321 ui.todo_items.loadItems(rec)
323 def QuitApp(self):
324 app.quit()
327 def AddCategory(self):
328 AddCatDlg = QtGui.QDialog()
329 AddCat = Ui_D_Add()
330 AddCat.setupUi(AddCatDlg)
332 if AddCatDlg.exec_():
333 cat = AddCat.LE_cat_name.text()
334 if str(cat) == '':
335 return
336 desc = AddCat.LE_cat_desc.text()
337 it = QtGui.QListWidgetItem(QtGui.QIcon("pixmaps/todo_list.png"),cat)
338 it.setTextAlignment(QtCore.Qt.AlignVCenter)
339 ui.todo_lists.insertItem(0,it)
340 Data = {"id_category" : str(cat),
341 "ds_category" : str(desc) }
342 self.IOEngine.InsertCategory(Data)
344 def DeleteCategory(self):
345 print "Here"
347 def EditCategory(self):
348 pass
350 def About(self):
351 pass
353 def Documentation(self):
354 pass
356 app = QtGui.QApplication(sys.argv)
357 window = QtGui.QMainWindow()
358 ui = QTodo()
359 ui.setupUi(window)
361 #connect the menu items
362 ui.Finalize()
364 #Load the data present
365 ui.LoadData()
367 window.show()
368 sys.exit(app.exec_())