Fix to the start-up code
[qtodo.git] / QtNote.py
blobe9a2ffa01134f7c645ef8b5235773bb2d98a89b8
1 #!/usr/bin/env python
3 from PyQt4 import Qt, QtCore, QtGui
4 import sys, time, os
6 sys.path.append('./src')
8 from QtNoteIO import *
9 from gui_MainWin import *
10 from gui_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-QtNote"):
27 pieceData = event.mimeData().data("application/x-QtNote")
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-QtNote"):
80 pieceData = event.mimeData().data("application/x-QtNote")
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 QtNote(Ui_MainWindow):
96 def __init__(self):
97 self.IOEngine = QtNoteIO()
98 self.Filters = {
99 "Oid" : None,
100 "OidCategory" : None,
101 "OidPriority" : None,
102 "OidStatus" : None
105 def Finalize(self):
106 # set the trash zone
107 ui.trash = Trash(self.IOEngine)
108 ui.actions_box.layout().addWidget(ui.trash)
110 # insert a stretch to keep aligned the controls
111 ui.actions_box.layout().insertStretch(-1, 20)
113 # set the todo category area
114 ui.todo_lists = TodoLists()
115 ui.lists_box.layout().addWidget(ui.todo_lists, 0, 0)
116 ui.todo_lists.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred)
117 ui.todo_items = ToDoItemList(self.IOEngine)
118 ui.items_box.layout().addWidget(ui.todo_items, 1, 0)
121 # check for new overdue items
122 self.IOEngine.CheckForDeadlines()
123 self.RefreshSummaryList()
125 cats = self.IOEngine.GetCategories()
126 ui.CB_CategoryFilter.addItem('All')
127 for c in cats:
128 ui.CB_CategoryFilter.addItem(c["id_cat"])
130 stats = self.IOEngine.LoadStatus()
131 ui.CB_StatusFilter.addItem('All')
132 for s in stats:
133 ui.CB_StatusFilter.addItem(s["desc"])
135 prior = self.IOEngine.LoadPriorities()
136 ui.CB_PriorityFilter.addItem('All')
137 for p in prior:
138 ui.CB_PriorityFilter.addItem(p["id_pr"])
140 QtCore.QObject.connect(ui.action_Quit, QtCore.SIGNAL("triggered()"), self.QuitApp)
141 QtCore.QObject.connect(ui.action_About, QtCore.SIGNAL("triggered()"), self.About)
142 QtCore.QObject.connect(ui.action_Documentation, QtCore.SIGNAL("triggered()"), self.Documentation)
143 QtCore.QObject.connect(ui.action_Category, QtCore.SIGNAL("triggered()"), self.CategoryConf)
144 QtCore.QObject.connect(ui.action_Priority, QtCore.SIGNAL("triggered()"), self.PriorityConf)
146 QtCore.QObject.connect(ui.CB_CategoryFilter, QtCore.SIGNAL("currentIndexChanged(QString)"), self.UpdateCategoryFilter)
147 QtCore.QObject.connect(ui.CB_PriorityFilter, QtCore.SIGNAL("currentIndexChanged(QString)"), self.UpdatePriorityFilter)
148 QtCore.QObject.connect(ui.CB_StatusFilter, QtCore.SIGNAL("currentIndexChanged(QString)"), self.UpdateStatusFilter)
151 def LoadData(self):
152 categories = self.IOEngine.GetCategories()
153 for rec in categories:
154 ui.todo_lists.addList(rec["oid"], rec["id_cat"])
155 self.RefreshItemList()
158 def RefreshItemList(self):
159 items = self.IOEngine.GetItems(self.Filters)
160 for rec in items:
161 ui.todo_items.addItem(rec)
163 def RefreshSummaryList(self):
164 cA = self.IOEngine.CountItems(ST_ACTIVE)
165 cC = self.IOEngine.CountItems(ST_CLOSED)
166 cO = self.IOEngine.CountItems(ST_OVERDUE)
167 ui.L_ActiveItem.setText(str(cA))
168 ui.L_CloseItem.setText(str(cC))
169 if cO > 0:
170 f = ui.L_OverdueItem.palette()
171 f.setColor(QtGui.QPalette.Foreground,QtGui.QColor(255, 0, 0))
172 ui.L_OverdueItem.setPalette(f)
173 ui.L_OverdueItem.setText(str(cO))
175 def QuitApp(self):
176 global PidFilePath
177 try:
178 os.remove(PidFilePath)
179 except:
180 pass
181 app.quit()
184 def PriorityConf(self):
185 pass
188 def UpdateCategoryFilter(self, text):
189 if str(text) == ALL_RECORD:
190 self.Filters["OidCategory"] = None
191 else:
192 oidcat = self.IOEngine.GetCategory(str(text))
193 self.Filters["OidCategory"] = oidcat
194 self.UpdateItemList()
196 def UpdatePriorityFilter(self, text):
197 if str(text) == ALL_RECORD:
198 self.Filters["OidPriority"] = None
199 else:
200 oidpr = self.IOEngine.GetPriority(str(text))
201 self.Filters["OidPriority"] = oidpr
202 self.UpdateItemList()
204 def UpdateStatusFilter(self, text):
205 if str(text) == ALL_RECORD:
206 self.Filters["OidStatus"] = None
207 else:
208 oidsta = self.IOEngine.GetStatus(str(text))
209 self.Filters["OidStatus"] = oidsta
210 self.UpdateItemList()
212 def UpdateItemList(self):
213 ui.todo_items.clear()
214 self.RefreshItemList()
217 def CategoryConf(self):
218 AddCatDlg = QtGui.QDialog()
219 AddCat = Ui_D_Add()
220 AddCat.setupUi(AddCatDlg)
221 if AddCatDlg.exec_():
222 cat = AddCat.LE_cat_name.text()
223 if str(cat) == '':
224 return
225 desc = AddCat.LE_cat_desc.text()
226 Data = {"id_category" : str(cat),
227 "ds_category" : str(desc) }
228 oid_cat = self.IOEngine.InsertCategory(Data)
229 if oid_cat == DUPLICATED_CATEGORY:
230 res = QtGui.QMessageBox.critical(None, "Error",
231 "The category is already present",
232 QtGui.QMessageBox.Ok )
233 return
234 it = QtGui.QListWidgetItem(QtGui.QIcon("pixmaps/todo_list.png"),cat)
235 it.setTextAlignment(QtCore.Qt.AlignVCenter)
236 ui.todo_lists.insertItem(0,it)
237 it.setData(QtCore.Qt.UserRole, QtCore.QVariant(oid_cat))
238 it.setData(QtCore.Qt.UserRole+1, QtCore.QVariant(TYPE_LIST))
241 def DeleteCategory(self):
242 pass
244 def EditCategory(self):
245 pass
247 def About(self):
248 QtGui.QMessageBox.about(None, "About QNotes", "QNotes Ver %s.\nA simple todo manager"%VERSION)
252 def Documentation(self):
253 pass
257 def CheckForPid():
259 try:
260 res = os.stat(PidFilePath)
261 return -1
262 except:
263 PF = open(PidFilePath, 'w')
264 PF.close()
265 return 0
267 app = QtGui.QApplication(sys.argv)
269 PidFilePath = os.environ["HOME"]+"/.QtNotes"
270 if os.sys.platform == "win32":
271 PidFilePath = os.environ["TEMP"]+"/.QtNotes"
272 res = CheckForPid()
274 if res == -1:
275 QtGui.QMessageBox.critical(None,
276 "QtNotes - Error",
277 "The program is alred running",
278 QtGui.QMessageBox.StandardButtons(\
279 QtGui.QMessageBox.Ok),
280 QtGui.QMessageBox.Ok)
281 sys.exit()
283 #icon=QtGui.QIcon("pixmaps/todo_list.png")
284 #systray=QtGui.QSystemTrayIcon(icon)
285 #systray.show()
287 window = QtGui.QMainWindow()
288 ui = QtNote()
289 ui.setupUi(window)
290 window.setWindowTitle(str(window.windowTitle()) + " " +VERSION)
292 #connect the menu items
293 ui.Finalize()
295 #Load the data present
296 ui.LoadData()
298 window.show()
299 sys.exit(app.exec_())