Added the homedir directive to the cfg file, thish should prevent the crash on startu...
[qtodo.git] / QtNote.py
blob00963b0587b72009cf76886ba740105207629b4f
1 #!/usr/bin/env python
5 from PyQt4 import Qt, QtCore, QtGui
6 import sys, time, os, ConfigParser
8 config = ConfigParser.ConfigParser()
9 config.readfp(open('QtNote.cfg'))
10 homedir = config.get("main", "homedir")
12 sys.path.append(homedir+'/src')
14 from QtNoteIO import *
15 from gui_MainWin import *
16 from gui_AddCatDlg import Ui_D_Add
17 from ToDoCategoryList import *
18 from ToDoItemList import *
21 class Trash(QtGui.QLabel):
22 def __init__(self, QtNoteWin, DbEngine, parent=None):
23 QtGui.QLabel.__init__(self, parent)
24 self.setAcceptDrops(True)
25 self.setPixmap(QtGui.QPixmap("pixmaps/eraser.png"))
26 self.setSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Minimum)
27 self.setMargin(2)
28 self.adjustSize()
29 self.DbEngine = DbEngine
30 self.QtNoteWin = QtNoteWin
32 def dropEvent(self, event):
33 if event.mimeData().hasFormat("application/x-QtNote"):
34 pieceData = event.mimeData().data("application/x-QtNote")
35 dataStream = QtCore.QDataStream(pieceData, QtCore.QIODevice.ReadOnly)
36 oid = QtCore.QString()
37 item_type = QtCore.QString()
38 dataStream >> oid >> item_type
39 event.setDropAction(QtCore.Qt.MoveAction)
40 if item_type == TYPE_LIST:
41 # Delete the category from database
42 res = self.DbEngine.DeleteList(oid)
43 if res == -1:
44 res = QtGui.QMessageBox.critical(None, "Error",
45 "There are some items still assigned to this category",
46 QtGui.QMessageBox.Ok )
47 self.setFrameShape(QtGui.QFrame.NoFrame)
48 self.setFrameShadow(QtGui.QFrame.Plain)
49 event.ignore()
50 else:
51 event.accept()
52 if item_type == TYPE_TODO:
53 # Delete the category from database
54 res = self.DbEngine.DeleteItem(oid)
55 event.accept()
56 else:
57 event.ignore()
58 self.setFrameShape(QtGui.QFrame.NoFrame)
59 self.setFrameShadow(QtGui.QFrame.Plain)
60 self.QtNoteWin.RefreshSummaryList()
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, parent=None):
97 self.IOEngine = QtNoteIO(config)
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(ui, 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(ui, 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)
145 QtCore.QObject.connect(ui.CB_CategoryFilter, QtCore.SIGNAL("currentIndexChanged(QString)"), self.UpdateCategoryFilter)
146 QtCore.QObject.connect(ui.CB_PriorityFilter, QtCore.SIGNAL("currentIndexChanged(QString)"), self.UpdatePriorityFilter)
147 QtCore.QObject.connect(ui.CB_StatusFilter, QtCore.SIGNAL("currentIndexChanged(QString)"), self.UpdateStatusFilter)
150 def LoadData(self):
151 categories = self.IOEngine.GetCategories()
152 for rec in categories:
153 ui.todo_lists.addList(rec["oid"], rec["id_cat"])
154 self.RefreshItemList()
157 def RefreshItemList(self):
158 items = self.IOEngine.GetItems(self.Filters)
159 for rec in items:
160 ui.todo_items.addItem(rec)
162 def RefreshSummaryList(self):
163 cA = self.IOEngine.CountItems(ST_ACTIVE)
164 cC = self.IOEngine.CountItems(ST_CLOSED)
165 cO = self.IOEngine.CountItems(ST_OVERDUE)
166 ui.L_ActiveItem.setText(str(cA))
167 ui.L_CloseItem.setText(str(cC))
168 if cO > 0:
169 f = ui.L_OverdueItem.palette()
170 f.setColor(QtGui.QPalette.Foreground,QtGui.QColor(255, 0, 0))
171 ui.L_OverdueItem.setPalette(f)
172 ui.L_OverdueItem.setText(str(cO))
174 def QuitApp(self):
175 global PidFilePath
176 try:
177 os.remove(PidFilePath)
178 except:
179 pass
180 app.quit()
182 def UpdateCategoryFilter(self, text):
183 if str(text) == ALL_RECORD:
184 self.Filters["OidCategory"] = None
185 else:
186 oidcat = self.IOEngine.GetCategory(str(text))
187 self.Filters["OidCategory"] = oidcat
188 self.UpdateItemList()
190 def UpdatePriorityFilter(self, text):
191 if str(text) == ALL_RECORD:
192 self.Filters["OidPriority"] = None
193 else:
194 oidpr = self.IOEngine.GetPriority(str(text))
195 self.Filters["OidPriority"] = oidpr
196 self.UpdateItemList()
198 def UpdateStatusFilter(self, text):
199 if str(text) == ALL_RECORD:
200 self.Filters["OidStatus"] = None
201 else:
202 oidsta = self.IOEngine.GetStatus(str(text))
203 self.Filters["OidStatus"] = oidsta
204 self.UpdateItemList()
206 def UpdateItemList(self):
207 ui.todo_items.clear()
208 self.RefreshItemList()
211 def CategoryConf(self):
212 AddCatDlg = QtGui.QDialog()
213 AddCat = Ui_D_Add()
214 AddCat.setupUi(AddCatDlg)
215 if AddCatDlg.exec_():
216 cat = AddCat.LE_cat_name.text()
217 if str(cat) == '':
218 return
219 desc = AddCat.LE_cat_desc.text()
220 Data = {"id_category" : str(cat),
221 "ds_category" : str(desc) }
222 oid_cat = self.IOEngine.InsertCategory(Data)
223 if oid_cat == DUPLICATED_CATEGORY:
224 res = QtGui.QMessageBox.critical(None, "Error",
225 "The category is already present",
226 QtGui.QMessageBox.Ok )
227 return
228 it = QtGui.QListWidgetItem(QtGui.QIcon("pixmaps/todo_list.png"),cat)
229 it.setTextAlignment(QtCore.Qt.AlignVCenter)
230 ui.todo_lists.insertItem(0,it)
231 it.setData(QtCore.Qt.UserRole, QtCore.QVariant(oid_cat))
232 it.setData(QtCore.Qt.UserRole+1, QtCore.QVariant(TYPE_LIST))
235 def DeleteCategory(self):
236 pass
238 def EditCategory(self):
239 pass
241 def About(self):
242 QtGui.QMessageBox.about(None, "About QNotes", "QNotes Ver %s.\nA simple todo manager"%VERSION)
245 def Documentation(self):
246 pass
248 class MainWindow(QtGui.QMainWindow):
249 def __init__(self):
250 QtGui.QMainWindow.__init__(self)
252 def closeEvent(self, ev):
253 self.hide()
254 systray.showMessage('QtNotes', 'Application minimized')
255 ev.ignore()
257 def ShowWindow(self):
258 self.show()
260 # implement also on minimize window
262 def CheckForPid():
263 try:
264 res = os.stat(PidFilePath)
265 return -1
266 except:
267 PF = open(PidFilePath, 'w')
268 PF.close()
269 return 0
271 if __name__ == "__main__":
272 app = QtGui.QApplication(sys.argv)
274 PidFilePath = os.environ["HOME"]+"/.QtNotes"
275 if os.sys.platform == "win32":
276 PidFilePath = os.environ["TEMP"]+"/.QtNotes"
277 res = CheckForPid()
278 res = 0
279 if res == -1:
280 QtGui.QMessageBox.critical(None,
281 "QtNotes - Error",
282 "The program is alred running",
283 QtGui.QMessageBox.StandardButtons(\
284 QtGui.QMessageBox.Ok),
285 QtGui.QMessageBox.Ok)
286 sys.exit()
288 #window = QtGui.QMainWindow()
289 window = MainWindow()
290 ui = QtNote()
291 ui.setupUi(window)
292 window.setWindowTitle(str(window.windowTitle()) + " " +VERSION)
294 #connect the menu items
295 ui.Finalize()
296 #Load the data present
297 ui.LoadData()
298 window.show()
300 app.connect(app, QtCore.SIGNAL("lastWindowClosed()"),ui.QuitApp)
302 icon=QtGui.QIcon("pixmaps/todo_list.png")
303 systray=QtGui.QSystemTrayIcon(icon)
304 menu = QtGui.QMenu()
305 showAction = menu.addAction('Show')
306 sep1 = menu.addSeparator()
307 quitAction = menu.addAction('Quit')
308 QtCore.QObject.connect(quitAction, QtCore.SIGNAL("triggered()"), ui.QuitApp)
309 QtCore.QObject.connect(showAction, QtCore.SIGNAL("triggered()"), window.ShowWindow)
310 systray.setContextMenu(menu)
311 systray.show()
314 sys.exit(app.exec_())