3 from PyQt4
import Qt
, QtCore
, QtGui
6 sys
.path
.append('./src')
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
)
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
)
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
)
45 if item_type
== TYPE_TODO
:
46 # Delete the category from database
47 res
= self
.DbEngine
.DeleteItem(oid
)
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
)
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
)
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
)
89 # Delete the category from database
90 self
.DbEngine
.DeleteList(oid_cat
)
92 def dragEnterEvent(self
, event
):
95 class QtNote(Ui_MainWindow
):
97 self
.IOEngine
= QtNoteIO()
100 "OidCategory" : None,
101 "OidPriority" : None,
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')
128 ui
.CB_CategoryFilter
.addItem(c
["id_cat"])
130 stats
= self
.IOEngine
.LoadStatus()
131 ui
.CB_StatusFilter
.addItem('All')
133 ui
.CB_StatusFilter
.addItem(s
["desc"])
135 prior
= self
.IOEngine
.LoadPriorities()
136 ui
.CB_PriorityFilter
.addItem('All')
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
)
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
)
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
))
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
))
178 os
.remove(PidFilePath
)
184 def PriorityConf(self
):
188 def UpdateCategoryFilter(self
, text
):
189 if str(text
) == ALL_RECORD
:
190 self
.Filters
["OidCategory"] = None
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
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
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()
220 AddCat
.setupUi(AddCatDlg
)
221 if AddCatDlg
.exec_():
222 cat
= AddCat
.LE_cat_name
.text()
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
)
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
):
244 def EditCategory(self
):
248 QtGui
.QMessageBox
.about(None, "About QNotes", "QNotes Ver %s.\nA simple todo manager"%VERSION
)
252 def Documentation(self
):
260 res
= os
.stat(PidFilePath
)
263 PF
= open(PidFilePath
, 'w')
267 app
= QtGui
.QApplication(sys
.argv
)
269 PidFilePath
= os
.environ
["HOME"]+"/.QtNotes"
270 if os
.sys
.platform
== "win32":
271 PidFilePath
= os
.environ
["TEMP"]+"/.QtNotes"
275 QtGui
.QMessageBox
.critical(None,
277 "The program is alred running",
278 QtGui
.QMessageBox
.StandardButtons(\
279 QtGui
.QMessageBox
.Ok
),
280 QtGui
.QMessageBox
.Ok
)
283 #icon=QtGui.QIcon("pixmaps/todo_list.png")
284 #systray=QtGui.QSystemTrayIcon(icon)
287 window
= QtGui
.QMainWindow()
290 window
.setWindowTitle(str(window
.windowTitle()) + " " +VERSION
)
292 #connect the menu items
295 #Load the data present
299 sys
.exit(app
.exec_())