summaryrefslogtreecommitdiff
authorharlekin <harlekin>2002-05-13 21:56:32 (UTC)
committer harlekin <harlekin>2002-05-13 21:56:32 (UTC)
commit654f18b7201655379a515d12e30e06de4ae2e564 (patch) (unidiff)
tree7faec6092629ab4a9387c7d9b9633ae6ea6e6115
parentaddcce2881f07c1f04113e4df2ec7e4186d4cee4 (diff)
downloadopie-654f18b7201655379a515d12e30e06de4ae2e564.zip
opie-654f18b7201655379a515d12e30e06de4ae2e564.tar.gz
opie-654f18b7201655379a515d12e30e06de4ae2e564.tar.bz2
serveral bugfixes regarding todo section
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/today/changelog4
-rw-r--r--core/pim/today/opie-today.control2
-rw-r--r--core/pim/today/today.cpp12
3 files changed, 11 insertions, 7 deletions
diff --git a/core/pim/today/changelog b/core/pim/today/changelog
index c687cea..93bbcac 100644
--- a/core/pim/today/changelog
+++ b/core/pim/today/changelog
@@ -1,48 +1,52 @@
10.3.4
2
3* Several bugfixes regarding todo section.
4
10.3.3 50.3.3
2 6
3* Changed the logo so it better scales to bigger display and also 7* Changed the logo so it better scales to bigger display and also
4 made the "Today" string translatable. 8 made the "Today" string translatable.
5* some am/pm fixes 9* some am/pm fixes
6* clickable labels now in libopie 10* clickable labels now in libopie
7 11
80.3.2 120.3.2
9 13
10* Autostart is now more configurable. You can decide how long 14* Autostart is now more configurable. You can decide how long
11 the ipaq has to has been suspended, before autostart is triggered.(Opie 15 the ipaq has to has been suspended, before autostart is triggered.(Opie
12 only) 16 only)
13* am/pm time optinal (autodetect) 17* am/pm time optinal (autodetect)
14 18
150.3.1 190.3.1
16 20
17* fixed the wrong color of the buttons 21* fixed the wrong color of the buttons
18* better translation (thanks carsten and others) 22* better translation (thanks carsten and others)
19* fixes memory leaks 23* fixes memory leaks
20* bugfixes in calendar part, now location and note are working again. 24* bugfixes in calendar part, now location and note are working again.
21 25
220.3.0 260.3.0
23 27
24* today uses now tododb from libopie. So major changes in the todo part: 28* today uses now tododb from libopie. So major changes in the todo part:
25 - overdue items on top 29 - overdue items on top
26 - then sorted by date, then by priority 30 - then sorted by date, then by priority
27* some cleanups 31* some cleanups
28* speed optimisations 32* speed optimisations
29 33
300.2.9 340.2.9
31 35
32* Many bugfixes. 36* Many bugfixes.
33* Today now apparently sorts the dates _allways_ right, i would assume it 37* Today now apparently sorts the dates _allways_ right, i would assume it
34to be a qt bug 38to be a qt bug
35 39
360.2.8 400.2.8
37 41
38* Appointments are now clickable (connection to datebook still missing) 42* Appointments are now clickable (connection to datebook still missing)
39* autostart support (opie only) 43* autostart support (opie only)
40 44
410.2.7 450.2.7
42 46
43* check if todolist.xml was changed before parsing it 47* check if todolist.xml was changed before parsing it
44* check only every 30 sec for changes. 48* check only every 30 sec for changes.
45* some visual stuff 49* some visual stuff
46* as usual many little improvements .-) 50* as usual many little improvements .-)
47 51
480.2.6 520.2.6
diff --git a/core/pim/today/opie-today.control b/core/pim/today/opie-today.control
index da9d9fa..46c0d71 100644
--- a/core/pim/today/opie-today.control
+++ b/core/pim/today/opie-today.control
@@ -1,16 +1,16 @@
1Files: bin/today apps/Applications/today.desktop pics/today/* 1Files: bin/today apps/Applications/today.desktop pics/today/*
2Priority: optional 2Priority: optional
3Section: opie/applications 3Section: opie/applications
4Maintainer: Maximilian Reiß <max.reiss@gmx.de> 4Maintainer: Maximilian Reiß <max.reiss@gmx.de>
5Architecture: arm 5Architecture: arm
6Version: 0.3.3-$SUB_VERSION 6Version: 0.3.4-$SUB_VERSION
7Depends: opie-base ($QPE_VERSION), libopie ($QPE_VERSION) 7Depends: opie-base ($QPE_VERSION), libopie ($QPE_VERSION)
8License: GPL 8License: GPL
9Description: today screen 9Description: today screen
10 This today screen app gives an overview of appointments 10 This today screen app gives an overview of appointments
11 and todos. 11 and todos.
12 It also shows incoming and outgoing mails from opiemail. 12 It also shows incoming and outgoing mails from opiemail.
13 When using Opie (opie.handhelds.org) today can be autostarted 13 When using Opie (opie.handhelds.org) today can be autostarted
14 on resume. 14 on resume.
15 It is highly configurable. 15 It is highly configurable.
16 16
diff --git a/core/pim/today/today.cpp b/core/pim/today/today.cpp
index 0f4cbdb..4368201 100644
--- a/core/pim/today/today.cpp
+++ b/core/pim/today/today.cpp
@@ -37,169 +37,169 @@
37#include <qpushbutton.h> 37#include <qpushbutton.h>
38#include <qlabel.h> 38#include <qlabel.h>
39#include <qtimer.h> 39#include <qtimer.h>
40#include <qpixmap.h> 40#include <qpixmap.h>
41//#include <qfileinfo.h> 41//#include <qfileinfo.h>
42#include <qlayout.h> 42#include <qlayout.h>
43#include <qtl.h> 43#include <qtl.h>
44 44
45 45
46//#include <iostream.h> 46//#include <iostream.h>
47#include <unistd.h> 47#include <unistd.h>
48#include <stdlib.h> 48#include <stdlib.h>
49 49
50int MAX_LINES_TASK; 50int MAX_LINES_TASK;
51int MAX_CHAR_CLIP; 51int MAX_CHAR_CLIP;
52int MAX_LINES_MEET; 52int MAX_LINES_MEET;
53int SHOW_LOCATION; 53int SHOW_LOCATION;
54int SHOW_NOTES; 54int SHOW_NOTES;
55// show only later dates 55// show only later dates
56int ONLY_LATER; 56int ONLY_LATER;
57int AUTOSTART; 57int AUTOSTART;
58int NEW_START=1; 58int NEW_START=1;
59QString AUTOSTART_TIMER; 59QString AUTOSTART_TIMER;
60 60
61/* 61/*
62 * Constructs a Example which is a child of 'parent', with the 62 * Constructs a Example which is a child of 'parent', with the
63 * name 'name' and widget flags set to 'f' 63 * name 'name' and widget flags set to 'f'
64 */ 64 */
65Today::Today( QWidget* parent, const char* name, WFlags fl ) 65Today::Today( QWidget* parent, const char* name, WFlags fl )
66 : TodayBase( parent, name, fl ), AllDateBookEvents(NULL) { 66 : TodayBase( parent, name, fl ), AllDateBookEvents(NULL) {
67 QObject::connect( (QObject*)PushButton1, SIGNAL( clicked() ), this, SLOT(startConfig() ) ); 67 QObject::connect( (QObject*)PushButton1, SIGNAL( clicked() ), this, SLOT(startConfig() ) );
68 QObject::connect( (QObject*)TodoButton, SIGNAL( clicked() ), this, SLOT(startTodo() ) ); 68 QObject::connect( (QObject*)TodoButton, SIGNAL( clicked() ), this, SLOT(startTodo() ) );
69 QObject::connect( (QObject*)DatesButton, SIGNAL( clicked() ), this, SLOT(startDatebook() ) ); 69 QObject::connect( (QObject*)DatesButton, SIGNAL( clicked() ), this, SLOT(startDatebook() ) );
70 QObject::connect( (QObject*)MailButton, SIGNAL( clicked() ), this, SLOT(startMail() ) ); 70 QObject::connect( (QObject*)MailButton, SIGNAL( clicked() ), this, SLOT(startMail() ) );
71 71
72#if defined(Q_WS_QWS) 72#if defined(Q_WS_QWS)
73#if !defined(QT_NO_COP) 73#if !defined(QT_NO_COP)
74 QCopChannel *todayChannel = new QCopChannel("QPE/Today" , this ); 74 QCopChannel *todayChannel = new QCopChannel("QPE/Today" , this );
75 connect (todayChannel, SIGNAL( received(const QCString &, const QByteArray &)), 75 connect (todayChannel, SIGNAL( received(const QCString &, const QByteArray &)),
76 this, SLOT ( channelReceived(const QCString &, const QByteArray &)) ); 76 this, SLOT ( channelReceived(const QCString &, const QByteArray &)) );
77#endif 77#endif
78#endif 78#endif
79 79
80 80
81 81
82 db = NULL; 82 db = NULL;
83 setOwnerField(); 83 setOwnerField();
84 todo = new ToDoDB; 84 todo = new ToDoDB;
85 getTodo();
86 draw(); 85 draw();
86 getTodo();
87 autoStart(); 87 autoStart();
88} 88}
89 89
90/* 90/*
91 * Qcop receive method. 91 * Qcop receive method.
92 */ 92 */
93void Today::channelReceived(const QCString &msg, const QByteArray & data) { 93void Today::channelReceived(const QCString &msg, const QByteArray & data) {
94 QDataStream stream(data, IO_ReadOnly ); 94 QDataStream stream(data, IO_ReadOnly );
95 if ( msg == "message(QString)" ) { 95 if ( msg == "message(QString)" ) {
96 QString message; 96 QString message;
97 stream >> message; 97 stream >> message;
98 setOwnerField(message); 98 setOwnerField(message);
99 } 99 }
100 100
101} 101}
102 102
103/* 103/*
104 * Initialises the owner field with the default value, the username 104 * Initialises the owner field with the default value, the username
105 */ 105 */
106void Today::setOwnerField() { 106void Today::setOwnerField() {
107 QString file = Global::applicationFileName("addressbook", "businesscard.vcf"); 107 QString file = Global::applicationFileName("addressbook", "businesscard.vcf");
108 if (QFile::exists(file)) { 108 if (QFile::exists(file)) {
109 Contact cont = Contact::readVCard(file)[0]; 109 Contact cont = Contact::readVCard(file)[0];
110 QString returnString = cont.fullName(); 110 QString returnString = cont.fullName();
111 OwnerField->setText( "<b>" +tr ("Owned by ") + returnString + "</b>"); 111 OwnerField->setText( "<b>" +tr ("Owned by ") + returnString + "</b>");
112 } else { 112 } else {
113 OwnerField->setText( "<b>" + tr ("Please fill out the business card")+" </b>"); 113 OwnerField->setText( "<b>" + tr ("Please fill out the business card")+" </b>");
114 } 114 }
115} 115}
116 116
117/* 117/*
118 * Set the owner field with a given QString, for example per qcop. 118 * Set the owner field with a given QString, for example per qcop.
119 */ 119 */
120void Today::setOwnerField(QString &message) { 120void Today::setOwnerField(QString &message) {
121 if (!message.isEmpty()) { 121 if (!message.isEmpty()) {
122 OwnerField->setText("<b>" + message + "</b>"); 122 OwnerField->setText("<b>" + message + "</b>");
123 } 123 }
124} 124}
125 125
126/* 126/*
127 * Autostart, uses the new (opie only) autostart method in the launcher code. 127 * Autostart, uses the new (opie only) autostart method in the launcher code.
128 * If registered against that today ist started on each resume. 128 * If registered against that today ist started on each resume.
129 */ 129 */
130void Today::autoStart() { 130void Today::autoStart() {
131 Config cfg("today"); 131 Config cfg("today");
132 cfg.setGroup("Autostart"); 132 cfg.setGroup("Autostart");
133 int AUTOSTART = cfg.readNumEntry("autostart",1); 133 int AUTOSTART = cfg.readNumEntry("autostart",1);
134// qDebug(QString("%1").arg(AUTOSTART)); 134// qDebug(QString("%1").arg(AUTOSTART));
135 if (AUTOSTART) { 135 if (AUTOSTART) {
136 QCopEnvelope e("QPE/System", "autoStart(QString, QString, QString)"); 136 QCopEnvelope e("QPE/System", "autoStart(QString, QString, QString)");
137 e << QString("add"); 137 e << QString("add");
138 e << QString("today"); 138 e << QString("today");
139 e << AUTOSTART_TIMER; 139 e << AUTOSTART_TIMER;
140 } else { 140 } else {
141 qDebug("Nun in else bei autostart"); 141 qDebug("Nun in else bei autostart");
142 QCopEnvelope e("QPE/System", "autoStart(QString, QString)"); 142 QCopEnvelope e("QPE/System", "autoStart(QString, QString)");
143 e << QString("remove"); 143 e << QString("remove");
144 e << QString("today"); 144 e << QString("today");
145 } 145 }
146} 146}
147 147
148/* 148/*
149 * Repaint method. Reread all fields. 149 * Repaint method. Reread all fields.
150 */ 150 */
151void Today::draw() { 151void Today::draw() {
152 init(); 152 init();
153 getDates(); 153 getDates();
154 getMail(); 154 getMail();
155 155
156 // if the todolist.xml file was not modified in between, do not parse it. 156 // if the todolist.xml file was not modified in between, do not parse it.
157 if (checkIfModified()) { 157 if (checkIfModified() || NEW_START==1) {
158 if (todo) delete todo; 158 if (todo) delete todo;
159 todo = new ToDoDB; 159 todo = new ToDoDB;
160 getTodo(); 160 getTodo();
161 } 161 }
162 162
163 // how often refresh 163 // how often refresh
164 QTimer::singleShot( 20*1000, this, SLOT(draw() ) ); 164 QTimer::singleShot( 20*1000, this, SLOT(draw() ) );
165} 165}
166 166
167/* 167/*
168 * Check if the todolist.xml was modified (if there are new entries. 168 * Check if the todolist.xml was modified (if there are new entries.
169 * Returns true if it was modified. 169 * Returns true if it was modified.
170 */ 170 */
171bool Today::checkIfModified() { 171bool Today::checkIfModified() {
172 172
173 QDir dir; 173 QDir dir;
174 QString homedir = dir.homeDirPath (); 174 QString homedir = dir.homeDirPath ();
175 QString time; 175 QString time;
176 176
177 Config cfg("today"); 177 Config cfg("today");
178 cfg.setGroup("Files"); 178 cfg.setGroup("Files");
179 time = cfg.readEntry("todolisttimestamp", ""); 179 time = cfg.readEntry("todolisttimestamp", "");
180 180
181 QFileInfo file = (homedir +"/Applications/todolist/todolist.xml"); 181 QFileInfo file = (homedir +"/Applications/todolist/todolist.xml");
182 QDateTime fileTime = file.lastModified(); 182 QDateTime fileTime = file.lastModified();
183 if (time.compare(fileTime.toString()) == 0) { 183 if (time.compare(fileTime.toString()) == 0) {
184 return false; 184 return false;
185 } else { 185 } else {
186 cfg.writeEntry("todolisttimestamp", fileTime.toString() ); 186 cfg.writeEntry("todolisttimestamp", fileTime.toString() );
187 cfg.write(); 187 cfg.write();
188 return true; 188 return true;
189 } 189 }
190} 190}
191 191
192 192
193/* 193/*
194 * Init stuff needed for today. Reads the config file. 194 * Init stuff needed for today. Reads the config file.
195 */ 195 */
196void Today::init() { 196void Today::init() {
197 QDate date = QDate::currentDate(); 197 QDate date = QDate::currentDate();
198 QString time = (tr( date.toString()) ); 198 QString time = (tr( date.toString()) );
199 199
200 TextLabel1->setText(QString("<font color=#FFFFFF>" + time + "</font>")); 200 TextLabel1->setText(QString("<font color=#FFFFFF>" + time + "</font>"));
201 201
202 // read config 202 // read config
203 Config cfg("today"); 203 Config cfg("today");
204 cfg.setGroup("BaseConfig"); 204 cfg.setGroup("BaseConfig");
205 205
@@ -344,100 +344,100 @@ void Today::getDates() {
344 } else { 344 } else {
345 QLabel* noEvents = new QLabel(AllDateBookEvents); 345 QLabel* noEvents = new QLabel(AllDateBookEvents);
346 noEvents->setText(tr("No appointments today")); 346 noEvents->setText(tr("No appointments today"));
347 layoutDates->addWidget(noEvents); 347 layoutDates->addWidget(noEvents);
348 } 348 }
349 349
350 layoutDates->addItem(new QSpacerItem(1,1, QSizePolicy::Minimum, QSizePolicy::Expanding)); 350 layoutDates->addItem(new QSpacerItem(1,1, QSizePolicy::Minimum, QSizePolicy::Expanding));
351 sv1->addChild(AllDateBookEvents); 351 sv1->addChild(AllDateBookEvents);
352 AllDateBookEvents->show(); 352 AllDateBookEvents->show();
353} 353}
354 354
355 355
356void Today::getMail() { 356void Today::getMail() {
357 Config cfg("opiemail"); 357 Config cfg("opiemail");
358 cfg.setGroup("today"); 358 cfg.setGroup("today");
359 359
360 // how many lines should be showed in the task section 360 // how many lines should be showed in the task section
361 int NEW_MAILS = cfg.readNumEntry("newmails",0); 361 int NEW_MAILS = cfg.readNumEntry("newmails",0);
362 int OUTGOING = cfg.readNumEntry("outgoing",0); 362 int OUTGOING = cfg.readNumEntry("outgoing",0);
363 363
364 QString output = tr("<b>%1</b> new mail(s), <b>%2</b> outgoing").arg(NEW_MAILS).arg(OUTGOING); 364 QString output = tr("<b>%1</b> new mail(s), <b>%2</b> outgoing").arg(NEW_MAILS).arg(OUTGOING);
365 365
366 MailField->setText(output); 366 MailField->setText(output);
367} 367}
368 368
369 369
370/* 370/*
371 * Get the todos 371 * Get the todos
372 */ 372 */
373void Today::getTodo() { 373void Today::getTodo() {
374 374
375 QString output; 375 QString output;
376 QString tmpout; 376 QString tmpout;
377 int count = 0; 377 int count = 0;
378 int ammount = 0; 378 int ammount = 0;
379 379
380 // get overdue todos first 380 // get overdue todos first
381 QValueList<ToDoEvent> overDueList = todo->overDue(); 381 QValueList<ToDoEvent> overDueList = todo->overDue();
382 qBubbleSort(overDueList); 382 qBubbleSort(overDueList);
383 for ( QValueList<ToDoEvent>::Iterator it=overDueList.begin(); 383 for ( QValueList<ToDoEvent>::Iterator it=overDueList.begin();
384 it!=overDueList.end(); ++it ) { 384 it!=overDueList.end(); ++it ) {
385 if (!(*it).isCompleted() && ( ammount < MAX_LINES_TASK) ) { 385 if (!(*it).isCompleted() && ( ammount < MAX_LINES_TASK) ) {
386 tmpout += "<font color=#e00000><b>-" +((*it).description()).mid(0, MAX_CHAR_CLIP) + "</b></font><br>"; 386 tmpout += "<font color=#e00000><b>-" +((*it).description()).mid(0, MAX_CHAR_CLIP) + "</b></font><br>";
387 ammount++; 387 ammount++;
388 } 388 }
389 } 389 }
390 390
391 // get total number of still open todos 391 // get total number of still open todos
392 QValueList<ToDoEvent> open = todo->rawToDos(); 392 QValueList<ToDoEvent> openTodo = todo->rawToDos();
393 qBubbleSort(open); 393 qBubbleSort(openTodo);
394 for ( QValueList<ToDoEvent>::Iterator it=open.begin(); 394 for ( QValueList<ToDoEvent>::Iterator it=openTodo.begin();
395 it!=open.end(); ++it ) { 395 it!=openTodo.end(); ++it ) {
396 if (!(*it).isCompleted()){ 396 if (!(*it).isCompleted()){
397 count +=1; 397 count +=1;
398 // not the overdues, we allready got them, and not if we are 398 // not the overdues, we allready got them, and not if we are
399 // over the maxlines 399 // over the maxlines
400 if (!(*it).isOverdue() && ( ammount < MAX_LINES_TASK) ) { 400 if (!(*it).isOverdue() && ( ammount < MAX_LINES_TASK) ) {
401 tmpout += "<b>-</b>" + ((*it).description()).mid(0, MAX_CHAR_CLIP) + "<br>"; 401 tmpout += "<b>-</b>" + ((*it).description()).mid(0, MAX_CHAR_CLIP) + "<br>";
402 ammount++; 402 ammount++;
403 } 403 }
404 } 404 }
405 } 405 }
406 406
407 407
408 if (count > 0) { 408 if (count > 0) {
409 if( count == 1 ) { 409 if( count == 1 ) {
410 output = tr("There is <b> 1</b> active task: <br>" ); 410 output = tr("There is <b> 1</b> active task: <br>" );
411 } else { 411 } else {
412 output = tr("There are <b> %1</b> active tasks: <br>").arg(count); 412 output = tr("There are <b> %1</b> active tasks: <br>").arg(count);
413 } 413 }
414 output += tmpout; 414 output += tmpout;
415 } else { 415 } else {
416 output = tr("No active tasks"); 416 output = tr("No active tasks");
417 } 417 }
418 418
419 TodoField->setText(tr(output)); 419 TodoField->setText(tr(output));
420} 420}
421 421
422/* 422/*
423 * launches datebook 423 * launches datebook
424 */ 424 */
425void Today::startDatebook() { 425void Today::startDatebook() {
426 QCopEnvelope e("QPE/System", "execute(QString)"); 426 QCopEnvelope e("QPE/System", "execute(QString)");
427 e << QString("datebook"); 427 e << QString("datebook");
428} 428}
429 429
430/* 430/*
431 * starts the edit dialog as known from datebook 431 * starts the edit dialog as known from datebook
432 */ 432 */
433 433
434extern QPEApplication *todayApp; 434extern QPEApplication *todayApp;
435 435
436void Today::editEvent(const Event &e) { 436void Today::editEvent(const Event &e) {
437 startDatebook(); 437 startDatebook();
438 438
439 while(!QCopChannel::isRegistered("QPE/Datebook")) todayApp->processEvents(); 439 while(!QCopChannel::isRegistered("QPE/Datebook")) todayApp->processEvents();
440 QCopEnvelope env("QPE/Datebook", "editEvent(int)"); 440 QCopEnvelope env("QPE/Datebook", "editEvent(int)");
441 env << e.uid(); 441 env << e.uid();
442} 442}
443 443