summaryrefslogtreecommitdiff
authorzecke <zecke>2002-11-15 10:31:59 (UTC)
committer zecke <zecke>2002-11-15 10:31:59 (UTC)
commit5fac1f8271dc037d8d3a3a765bccc44c4734e544 (patch) (unidiff)
tree206a64d41f94217962dcf5ec7055225e8a0c2481
parent39f256de174af80fd8ba2560e8586dda99d06b7d (diff)
downloadopie-5fac1f8271dc037d8d3a3a765bccc44c4734e544.zip
opie-5fac1f8271dc037d8d3a3a765bccc44c4734e544.tar.gz
opie-5fac1f8271dc037d8d3a3a765bccc44c4734e544.tar.bz2
Fix #423 dealing with strike through and DueDate...
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/todo/tableview.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/core/pim/todo/tableview.cpp b/core/pim/todo/tableview.cpp
index 743deb7..ded2dbd 100644
--- a/core/pim/todo/tableview.cpp
+++ b/core/pim/todo/tableview.cpp
@@ -1,517 +1,527 @@
1/* 1/*
2               =. This file is part of the OPIE Project 2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2002 <> 3             .=l. Copyright (c) 2002 <zecke>
4           .>+-= 4           .>+-=
5 _;:,     .>    :=|. This program is free software; you can 5 _;:,     .>    :=|. This program is free software; you can
6.> <`_,   >  .   <= redistribute it and/or modify it under 6.> <`_,   >  .   <= redistribute it and/or modify it under
7:`=1 )Y*s>-.--   : the terms of the GNU General Public 7:`=1 )Y*s>-.--   : the terms of the GNU General Public
8.="- .-=="i,     .._ License as published by the Free Software 8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; either version 2 of the License, 9 - .   .-<_>     .<> Foundation; either version 2 of the License,
10     ._= =}       : or (at your option) any later version. 10     ._= =}       : or (at your option) any later version.
11    .%`+i>       _;_. 11    .%`+i>       _;_.
12    .i_,=:_.      -<s. This program is distributed in the hope that 12    .i_,=:_.      -<s. This program is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of 14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 15    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 16  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
17..}^=.=       =       ; Library General Public License for more 17..}^=.=       =       ; Library General Public License for more
18++=   -.     .`     .: details. 18++=   -.     .`     .: details.
19 :     =  ...= . :.=- 19 :     =  ...= . :.=-
20 -.   .:....=;==+<; You should have received a copy of the GNU 20 -.   .:....=;==+<; You should have received a copy of the GNU
21  -_. . .   )=.  = Library General Public License along with 21  -_. . .   )=.  = Library General Public License along with
22    --        :-=` this library; see the file COPYING.LIB. 22    --        :-=` this library; see the file COPYING.LIB.
23 If not, write to the Free Software Foundation, 23 If not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330, 24 Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA. 25 Boston, MA 02111-1307, USA.
26 26
27*/ 27*/
28#include <stdlib.h> 28#include <stdlib.h>
29#include <cmath> 29#include <cmath>
30 30
31#include <qlineedit.h> 31#include <qlineedit.h>
32#include <qtimer.h> 32#include <qtimer.h>
33#include <qpoint.h> 33#include <qpoint.h>
34#include <qpopupmenu.h> 34#include <qpopupmenu.h>
35 35
36#include <qpe/config.h> 36#include <qpe/config.h>
37 37
38#include "mainwindow.h" 38#include "mainwindow.h"
39//#include "tableitems.h" 39//#include "tableitems.h"
40#include "tableview.h" 40#include "tableview.h"
41 41
42using namespace Todo; 42using namespace Todo;
43 43
44namespace { 44namespace {
45 static const int BoxSize = 14; 45 static const int BoxSize = 14;
46 static const int RowHeight = 20; 46 static const int RowHeight = 20;
47} 47}
48 48
49 49
50void TableView::initConfig() { 50void TableView::initConfig() {
51 Config config( "todo" ); 51 Config config( "todo" );
52 config.setGroup( "Options" ); 52 config.setGroup( "Options" );
53 m_completeStrokeWidth = config.readNumEntry( "CompleteStrokeWidth", 8 ); 53 m_completeStrokeWidth = config.readNumEntry( "CompleteStrokeWidth", 8 );
54} 54}
55 55
56TableView::TableView( MainWindow* window, QWidget* wid ) 56TableView::TableView( MainWindow* window, QWidget* wid )
57 : QTable( wid ), TodoView( window ) { 57 : QTable( wid ), TodoView( window ) {
58 setUpdatesEnabled( false ); 58 setUpdatesEnabled( false );
59 viewport()->setUpdatesEnabled( false ); 59 viewport()->setUpdatesEnabled( false );
60 m_enablePaint = false; 60 m_enablePaint = false;
61 setNumRows(0); 61 setNumRows(0);
62 setNumCols(4); 62 setNumCols(4);
63 63
64 setSorting( TRUE ); 64 setSorting( TRUE );
65 setSelectionMode( NoSelection ); 65 setSelectionMode( NoSelection );
66// setColumnStretchable( 2, TRUE ); 66// setColumnStretchable( 2, TRUE );
67 setColumnStretchable( 3, FALSE ); 67 setColumnStretchable( 3, FALSE );
68 setColumnWidth(0, 20 ); 68 setColumnWidth(0, 20 );
69 setColumnWidth(1, 35 ); 69 setColumnWidth(1, 35 );
70 setColumnWidth(3, 18 ); 70 setColumnWidth(3, 18 );
71 71
72 setLeftMargin( 0 ); 72 setLeftMargin( 0 );
73 verticalHeader()->hide(); 73 verticalHeader()->hide();
74 74
75 horizontalHeader()->setLabel(0, tr("C.") ); 75 horizontalHeader()->setLabel(0, tr("C.") );
76 horizontalHeader()->setLabel(1, tr("Prior.") ); 76 horizontalHeader()->setLabel(1, tr("Prior.") );
77 horizontalHeader()->setLabel(2, tr("Description" ) ); 77 horizontalHeader()->setLabel(2, tr("Description" ) );
78 78
79// setColumnStretchable(3, FALSE ); 79// setColumnStretchable(3, FALSE );
80 80
81 horizontalHeader()->setLabel(3, tr("Deadline") ); 81 horizontalHeader()->setLabel(3, tr("Deadline") );
82 82
83 if ( todoWindow()->showDeadline() ) 83 if ( todoWindow()->showDeadline() )
84 showColumn( 3); 84 showColumn( 3);
85 else 85 else
86 hideColumn(3 ); 86 hideColumn(3 );
87 87
88 connect((QTable*)this, SIGNAL( clicked( int, int, int, const QPoint& ) ), 88 connect((QTable*)this, SIGNAL( clicked( int, int, int, const QPoint& ) ),
89 this, SLOT( slotClicked(int, int, int, const QPoint& ) ) ); 89 this, SLOT( slotClicked(int, int, int, const QPoint& ) ) );
90 connect((QTable*)this, SIGNAL( pressed( int, int, int, const QPoint& ) ), 90 connect((QTable*)this, SIGNAL( pressed( int, int, int, const QPoint& ) ),
91 this, SLOT( slotPressed(int, int, int, const QPoint& ) ) ); 91 this, SLOT( slotPressed(int, int, int, const QPoint& ) ) );
92 connect((QTable*)this, SIGNAL(valueChanged(int, int) ), 92 connect((QTable*)this, SIGNAL(valueChanged(int, int) ),
93 this, SLOT( slotValueChanged(int, int) ) ); 93 this, SLOT( slotValueChanged(int, int) ) );
94 connect((QTable*)this, SIGNAL(currentChanged(int, int) ), 94 connect((QTable*)this, SIGNAL(currentChanged(int, int) ),
95 this, SLOT( slotCurrentChanged(int, int) ) ); 95 this, SLOT( slotCurrentChanged(int, int) ) );
96 96
97 m_menuTimer = new QTimer( this ); 97 m_menuTimer = new QTimer( this );
98 connect( m_menuTimer, SIGNAL(timeout()), 98 connect( m_menuTimer, SIGNAL(timeout()),
99 this, SLOT(slotShowMenu()) ); 99 this, SLOT(slotShowMenu()) );
100 100
101 m_enablePaint = true; 101 m_enablePaint = true;
102 setUpdatesEnabled( true ); 102 setUpdatesEnabled( true );
103 viewport()->setUpdatesEnabled( true ); 103 viewport()->setUpdatesEnabled( true );
104 viewport()->update(); 104 viewport()->update();
105 setSortOrder( 0 ); 105 setSortOrder( 0 );
106 setAscending( TRUE ); 106 setAscending( TRUE );
107 m_first = true; 107 m_first = true;
108 108
109 /* now let's init the config */ 109 /* now let's init the config */
110 initConfig(); 110 initConfig();
111} 111}
112/* a new day has started 112/* a new day has started
113 * update the day 113 * update the day
114 */ 114 */
115void TableView::newDay() { 115void TableView::newDay() {
116 clear(); 116 clear();
117 updateView(); 117 updateView();
118} 118}
119TableView::~TableView() { 119TableView::~TableView() {
120 120
121} 121}
122void TableView::slotShowMenu() { 122void TableView::slotShowMenu() {
123 QPopupMenu *menu = todoWindow()->contextMenu( current() ); 123 QPopupMenu *menu = todoWindow()->contextMenu( current() );
124 menu->exec(QCursor::pos() ); 124 menu->exec(QCursor::pos() );
125 delete menu; 125 delete menu;
126} 126}
127QString TableView::type() const { 127QString TableView::type() const {
128 return QString::fromLatin1( tr("Table View") ); 128 return QString::fromLatin1( tr("Table View") );
129} 129}
130int TableView::current() { 130int TableView::current() {
131 int uid = sorted().uidAt(currentRow() ); 131 int uid = sorted().uidAt(currentRow() );
132 qWarning("uid %d", uid ); 132 qWarning("uid %d", uid );
133 return uid; 133 return uid;
134} 134}
135QString TableView::currentRepresentation() { 135QString TableView::currentRepresentation() {
136 return text( currentRow(), 2); 136 return text( currentRow(), 2);
137} 137}
138/* show overdue */ 138/* show overdue */
139void TableView::showOverDue( bool ) { 139void TableView::showOverDue( bool ) {
140 clear(); 140 clear();
141 updateView(); 141 updateView();
142} 142}
143 143
144void TableView::updateView( ) { 144void TableView::updateView( ) {
145 qWarning("update view"); 145 qWarning("update view");
146 m_row = false; 146 m_row = false;
147 static int id; 147 static int id;
148 id = startTimer(2000 ); 148 id = startTimer(2000 );
149 /* FIXME we want one page to be read! 149 /* FIXME we want one page to be read!
150 * 150 *
151 * Calculate that screensize 151 * Calculate that screensize
152 */ 152 */
153 todoWindow()->setReadAhead( 4 ); 153 todoWindow()->setReadAhead( 4 );
154 sort(); 154 sort();
155 OTodoAccess::List::Iterator it, end; 155 OTodoAccess::List::Iterator it, end;
156 it = sorted().begin(); 156 it = sorted().begin();
157 end = sorted().end(); 157 end = sorted().end();
158 158
159 qWarning("setTodos"); 159 qWarning("setTodos");
160 QTime time; 160 QTime time;
161 time.start(); 161 time.start();
162 m_enablePaint = false; 162 m_enablePaint = false;
163 setUpdatesEnabled( false ); 163 setUpdatesEnabled( false );
164 viewport()->setUpdatesEnabled( false ); 164 viewport()->setUpdatesEnabled( false );
165 165
166 setNumRows( it.count() ); 166 setNumRows( it.count() );
167 if ( it.count() == 0 ) 167 if ( it.count() == 0 )
168 killTimer(id); 168 killTimer(id);
169 169
170 int elc = time.elapsed(); 170 int elc = time.elapsed();
171 setUpdatesEnabled( true ); 171 setUpdatesEnabled( true );
172 viewport()->setUpdatesEnabled( true ); 172 viewport()->setUpdatesEnabled( true );
173 viewport()->update(); 173 viewport()->update();
174 174
175 m_enablePaint = true; 175 m_enablePaint = true;
176 int el = time.elapsed(); 176 int el = time.elapsed();
177} 177}
178void TableView::setTodo( int, const OTodo&) { 178void TableView::setTodo( int, const OTodo&) {
179 sort(); 179 sort();
180 180
181 /* repaint */ 181 /* repaint */
182 repaint(); 182 repaint();
183} 183}
184void TableView::addEvent( const OTodo&) { 184void TableView::addEvent( const OTodo&) {
185 185
186 /* fix problems of not showing the 'Haken' */ 186 /* fix problems of not showing the 'Haken' */
187 updateView(); 187 updateView();
188} 188}
189/* 189/*
190 * find the event 190 * find the event
191 * and then replace the complete row 191 * and then replace the complete row
192 */ 192 */
193void TableView::replaceEvent( const OTodo& ev) { 193void TableView::replaceEvent( const OTodo& ev) {
194 addEvent( ev ); 194 addEvent( ev );
195} 195}
196/* 196/*
197 * re aligning table can be slow too 197 * re aligning table can be slow too
198 * FIXME: look what performs better 198 * FIXME: look what performs better
199 * either this or the old align table 199 * either this or the old align table
200 */ 200 */
201void TableView::removeEvent( int ) { 201void TableView::removeEvent( int ) {
202 updateView(); 202 updateView();
203} 203}
204void TableView::setShowCompleted( bool b) { 204void TableView::setShowCompleted( bool b) {
205 qWarning("Show Completed %d" + b ); 205 qWarning("Show Completed %d" + b );
206 updateView(); 206 updateView();
207} 207}
208void TableView::setShowDeadline( bool b) { 208void TableView::setShowDeadline( bool b) {
209 qWarning("Show DeadLine %d" + b ); 209 qWarning("Show DeadLine %d" + b );
210 if (b) 210 if (b)
211 showColumn(3 ); 211 showColumn(3 );
212 else 212 else
213 hideColumn(3 ); 213 hideColumn(3 );
214} 214}
215void TableView::setShowCategory( const QString& str) { 215void TableView::setShowCategory( const QString& str) {
216 qWarning("setShowCategory"); 216 qWarning("setShowCategory");
217 if ( str != m_oleCat || m_first ) 217 if ( str != m_oleCat || m_first )
218 updateView(); 218 updateView();
219 219
220 m_oleCat = str; 220 m_oleCat = str;
221 m_first = false; 221 m_first = false;
222 222
223} 223}
224void TableView::clear() { 224void TableView::clear() {
225 setNumRows(0); 225 setNumRows(0);
226} 226}
227void TableView::slotClicked(int row, int col, int, 227void TableView::slotClicked(int row, int col, int,
228 const QPoint& point) { 228 const QPoint& point) {
229 if ( !cellGeometry(row, col ).contains(point ) ) 229 if ( !cellGeometry(row, col ).contains(point ) )
230 return; 230 return;
231 231
232 int ui= sorted().uidAt( row ); 232 int ui= sorted().uidAt( row );
233 233
234 234
235 switch( col ) { 235 switch( col ) {
236 case 0:{ 236 case 0:{
237 int x = point.x() -columnPos( col ); 237 int x = point.x() -columnPos( col );
238 int y = point.y() -rowPos( row ); 238 int y = point.y() -rowPos( row );
239 int w = columnWidth( col ); 239 int w = columnWidth( col );
240 int h = rowHeight( row ); 240 int h = rowHeight( row );
241 if ( x >= ( w - BoxSize ) / 2 && 241 if ( x >= ( w - BoxSize ) / 2 &&
242 x <= ( w - BoxSize ) / 2 + BoxSize && 242 x <= ( w - BoxSize ) / 2 + BoxSize &&
243 y >= ( h - BoxSize ) / 2 && 243 y >= ( h - BoxSize ) / 2 &&
244 y <= ( h - BoxSize ) / 2 + BoxSize ) { 244 y <= ( h - BoxSize ) / 2 + BoxSize ) {
245 OTodo todo = sorted()[row]; 245 OTodo todo = sorted()[row];
246 todo.setCompleted( !todo.isCompleted() ); 246 todo.setCompleted( !todo.isCompleted() );
247 TodoView::update( todo.uid(), todo ); 247 TodoView::update( todo.uid(), todo );
248 updateView(); 248 updateView();
249 } 249 }
250 } 250 }
251 break; 251 break;
252 252
253 case 1: 253 case 1:
254 break; 254 break;
255 255
256 case 2: { 256 case 2: {
257 m_menuTimer->stop(); 257 m_menuTimer->stop();
258 showTodo( ui ); 258 showTodo( ui );
259 break; 259 break;
260 } 260 }
261 case 3: { 261 case 3: {
262 m_menuTimer->stop(); 262 m_menuTimer->stop();
263 TodoView::edit( ui ); 263 TodoView::edit( ui );
264 break; 264 break;
265 } 265 }
266 } 266 }
267 267
268 268
269} 269}
270void TableView::slotPressed(int row, int col, int, 270void TableView::slotPressed(int row, int col, int,
271 const QPoint& point) { 271 const QPoint& point) {
272 272
273 qWarning("pressed row %d col %d x:%d+y:%d", row,col,point.x(),point.y() );
273 m_prevP = point; 274 m_prevP = point;
274 /* TextColumn column */ 275 /* TextColumn column */
275 if ( col == 2 && cellGeometry( row, col ).contains( point ) ) 276 if ( col == 2 && cellGeometry( row, col ).contains( point ) )
276 m_menuTimer->start( 750, TRUE ); 277 m_menuTimer->start( 750, TRUE );
277} 278}
278void TableView::slotValueChanged( int, int ) { 279void TableView::slotValueChanged( int, int ) {
279 qWarning("Value Changed"); 280 qWarning("Value Changed");
280} 281}
281void TableView::slotCurrentChanged(int, int ) { 282void TableView::slotCurrentChanged(int, int ) {
282 m_menuTimer->stop(); 283 m_menuTimer->stop();
283} 284}
284QWidget* TableView::widget() { 285QWidget* TableView::widget() {
285 return this; 286 return this;
286} 287}
287/* 288/*
288 * We need to overwrite sortColumn 289 * We need to overwrite sortColumn
289 * because we want to sort whole row 290 * because we want to sort whole row
290 * based 291 * based
291 * We event want to set the setOrder 292 * We event want to set the setOrder
292 * to a sort() and update() 293 * to a sort() and update()
293 */ 294 */
294void TableView::sortColumn( int col, bool asc, bool ) { 295void TableView::sortColumn( int col, bool asc, bool ) {
295 qWarning("bool %d", asc ); 296 qWarning("bool %d", asc );
296 setSortOrder( col ); 297 setSortOrder( col );
297 setAscending( asc ); 298 setAscending( asc );
298 updateView(); 299 updateView();
299} 300}
300void TableView::viewportPaintEvent( QPaintEvent* e) { 301void TableView::viewportPaintEvent( QPaintEvent* e) {
301 if (m_enablePaint ) 302 if (m_enablePaint )
302 QTable::viewportPaintEvent( e ); 303 QTable::viewportPaintEvent( e );
303} 304}
304/* 305/*
305 * This segment is copyrighted by TT 306 * This segment is copyrighted by TT
306 * it was taken from their todolist 307 * it was taken from their todolist
307 * application this code is GPL 308 * application this code is GPL
308 */ 309 */
309void TableView::paintCell(QPainter* p, int row, int col, const QRect& cr, bool ) { 310void TableView::paintCell(QPainter* p, int row, int col, const QRect& cr, bool ) {
310 const QColorGroup &cg = colorGroup(); 311 const QColorGroup &cg = colorGroup();
311 312
312 p->save(); 313 p->save();
313 314
314 OTodo task = sorted()[row]; 315 OTodo task = sorted()[row];
315 316
316 p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) ); 317 p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) );
317 318
318 QPen op = p->pen(); 319 QPen op = p->pen();
319 p->setPen(cg.mid()); 320 p->setPen(cg.mid());
320 p->drawLine( 0, cr.height() - 1, cr.width() - 1, cr.height() - 1 ); 321 p->drawLine( 0, cr.height() - 1, cr.width() - 1, cr.height() - 1 );
321 p->drawLine( cr.width() - 1, 0, cr.width() - 1, cr.height() - 1 ); 322 p->drawLine( cr.width() - 1, 0, cr.width() - 1, cr.height() - 1 );
322 p->setPen(op); 323 p->setPen(op);
323 324
324 QFont f = p->font(); 325 QFont f = p->font();
325 QFontMetrics fm(f); 326 QFontMetrics fm(f);
326 327
327 switch(col) { 328 switch(col) {
328 case 0: 329 case 0:
329 { 330 {
330 // completed field 331 // completed field
331 int marg = ( cr.width() - BoxSize ) / 2; 332 int marg = ( cr.width() - BoxSize ) / 2;
332 int x = 0; 333 int x = 0;
333 int y = ( cr.height() - BoxSize ) / 2; 334 int y = ( cr.height() - BoxSize ) / 2;
334 p->setPen( QPen( cg.text() ) ); 335 p->setPen( QPen( cg.text() ) );
335 p->drawRect( x + marg, y, BoxSize, BoxSize ); 336 p->drawRect( x + marg, y, BoxSize, BoxSize );
336 p->drawRect( x + marg+1, y+1, BoxSize-2, BoxSize-2 ); 337 p->drawRect( x + marg+1, y+1, BoxSize-2, BoxSize-2 );
337 p->setPen( darkGreen ); 338 p->setPen( darkGreen );
338 x += 1; 339 x += 1;
339 y += 1; 340 y += 1;
340 if ( task.isCompleted() ) { 341 if ( task.isCompleted() ) {
341 QPointArray a( 9*2 ); 342 QPointArray a( 9*2 );
342 int i, xx, yy; 343 int i, xx, yy;
343 xx = x+2+marg; 344 xx = x+2+marg;
344 yy = y+4; 345 yy = y+4;
345 for ( i=0; i<4; i++ ) { 346 for ( i=0; i<4; i++ ) {
346 a.setPoint( 2*i, xx, yy ); 347 a.setPoint( 2*i, xx, yy );
347 a.setPoint( 2*i+1, xx, yy+2 ); 348 a.setPoint( 2*i+1, xx, yy+2 );
348 xx++; yy++; 349 xx++; yy++;
349 } 350 }
350 yy -= 2; 351 yy -= 2;
351 for ( i=4; i<9; i++ ) { 352 for ( i=4; i<9; i++ ) {
352 a.setPoint( 2*i, xx, yy ); 353 a.setPoint( 2*i, xx, yy );
353 a.setPoint( 2*i+1, xx, yy+2 ); 354 a.setPoint( 2*i+1, xx, yy+2 );
354 xx++; yy--; 355 xx++; yy--;
355 } 356 }
356 p->drawLineSegments( a ); 357 p->drawLineSegments( a );
357 } 358 }
358 } 359 }
359 break; 360 break;
360 case 1: 361 case 1:
361 // priority field 362 // priority field
362 { 363 {
363 QString text = QString::number(task.priority()); 364 QString text = QString::number(task.priority());
364 p->drawText(2,2 + fm.ascent(), text); 365 p->drawText(2,2 + fm.ascent(), text);
365 } 366 }
366 break; 367 break;
367 case 2: 368 case 2:
368 // description field 369 // description field
369 { 370 {
370 QString text = task.summary().isEmpty() ? 371 QString text = task.summary().isEmpty() ?
371 task.description() : 372 task.description() :
372 task.summary(); 373 task.summary();
373 p->drawText(2,2 + fm.ascent(), text); 374 p->drawText(2,2 + fm.ascent(), text);
374 } 375 }
375 break; 376 break;
376 case 3: 377 case 3:
377 { 378 {
378 QString text; 379 QString text;
379 if (task.hasDueDate()) { 380 if (task.hasDueDate()) {
380 int off = QDate::currentDate().daysTo( task.dueDate() ); 381 int off = QDate::currentDate().daysTo( task.dueDate() );
381 text = QString::number(off) + tr(" day(s)"); 382 text = QString::number(off) + tr(" day(s)");
382 /* 383 /*
383 * set color if not completed 384 * set color if not completed
384 */ 385 */
385 if (!task.isCompleted() ) { 386 if (!task.isCompleted() ) {
386 QColor color = Qt::black; 387 QColor color = Qt::black;
387 if ( off < 0 ) 388 if ( off < 0 )
388 color = Qt::red; 389 color = Qt::red;
389 else if ( off == 0 ) 390 else if ( off == 0 )
390 color = Qt::yellow; 391 color = Qt::yellow;
391 else if ( off > 0 ) 392 else if ( off > 0 )
392 color = Qt::green; 393 color = Qt::green;
393 p->setPen(color ); 394 p->setPen(color );
394 } 395 }
395 } else { 396 } else {
396 text = tr("None"); 397 text = tr("None");
397 } 398 }
398 p->drawText(2,2 + fm.ascent(), text); 399 p->drawText(2,2 + fm.ascent(), text);
399 } 400 }
400 break; 401 break;
401 } 402 }
402 p->restore(); 403 p->restore();
403} 404}
404QWidget* TableView::createEditor(int row, int col, bool )const { 405QWidget* TableView::createEditor(int row, int col, bool )const {
405 switch( col ) { 406 switch( col ) {
406 case 1: { 407 case 1: {
407 /* the priority stuff */ 408 /* the priority stuff */
408 QComboBox* combo = new QComboBox( viewport() ); 409 QComboBox* combo = new QComboBox( viewport() );
409 combo->insertItem( "1" ); 410 combo->insertItem( "1" );
410 combo->insertItem( "2" ); 411 combo->insertItem( "2" );
411 combo->insertItem( "3" ); 412 combo->insertItem( "3" );
412 combo->insertItem( "4" ); 413 combo->insertItem( "4" );
413 combo->insertItem( "5" ); 414 combo->insertItem( "5" );
414 combo->setCurrentItem( sorted()[row].priority()-1 ); 415 combo->setCurrentItem( sorted()[row].priority()-1 );
415 return combo; 416 return combo;
416 } 417 }
417 /* summary */ 418 /* summary */
418 case 2:{ 419 case 2:{
419 QLineEdit* edit = new QLineEdit( viewport() ); 420 QLineEdit* edit = new QLineEdit( viewport() );
420 edit->setText( sorted()[row].summary() ); 421 edit->setText( sorted()[row].summary() );
421 return edit; 422 return edit;
422 } 423 }
423 case 0: 424 case 0:
424 default: 425 default:
425 return 0l; 426 return 0l;
426 } 427 }
427} 428}
428void TableView::setCellContentFromEditor(int row, int col ) { 429void TableView::setCellContentFromEditor(int row, int col ) {
429 if ( col == 1 ) { 430 if ( col == 1 ) {
430 QWidget* wid = cellWidget(row, 1 ); 431 QWidget* wid = cellWidget(row, 1 );
431 if ( wid->inherits("QComboBox") ) { 432 if ( wid->inherits("QComboBox") ) {
432 int pri = ((QComboBox*)wid)->currentItem() + 1; 433 int pri = ((QComboBox*)wid)->currentItem() + 1;
433 OTodo todo = sorted()[row]; 434 OTodo todo = sorted()[row];
434 if ( todo.priority() != pri ) { 435 if ( todo.priority() != pri ) {
435 todo.setPriority( pri ); 436 todo.setPriority( pri );
436 TodoView::update( todo.uid(), todo ); 437 TodoView::update( todo.uid(), todo );
437 updateView(); 438 updateView();
438 } 439 }
439 } 440 }
440 }else if ( col == 2) { 441 }else if ( col == 2) {
441 QWidget* wid = cellWidget(row, 2); 442 QWidget* wid = cellWidget(row, 2);
442 if ( wid->inherits("QLineEdit") ) { 443 if ( wid->inherits("QLineEdit") ) {
443 QString text = ((QLineEdit*)wid)->text(); 444 QString text = ((QLineEdit*)wid)->text();
444 OTodo todo = sorted()[row]; 445 OTodo todo = sorted()[row];
445 if ( todo.summary() != text ) { 446 if ( todo.summary() != text ) {
446 todo.setSummary( text ); 447 todo.setSummary( text );
447 TodoView::update( todo.uid(), todo ); 448 TodoView::update( todo.uid(), todo );
448 updateView(); 449 updateView();
449 } 450 }
450 } 451 }
451 } 452 }
452} 453}
453void TableView::slotPriority() { 454void TableView::slotPriority() {
454 setCellContentFromEditor( currentRow(), currentColumn() ); 455 setCellContentFromEditor( currentRow(), currentColumn() );
455} 456}
456/* 457/*
457 * We'll use the TimerEvent to read ahead or to keep the cahce always 458 * We'll use the TimerEvent to read ahead or to keep the cahce always
458 * filled enough. 459 * filled enough.
459 * We will try to read ahead 4 items in both ways 460 * We will try to read ahead 4 items in both ways
460 * up and down. On odd or even we will currentRow()+-4 or +-9 461 * up and down. On odd or even we will currentRow()+-4 or +-9
461 * 462 *
462 */ 463 */
463void TableView::timerEvent( QTimerEvent* ev ) { 464void TableView::timerEvent( QTimerEvent* ev ) {
464 qWarning("sorted %d", sorted().count() ); 465 qWarning("sorted %d", sorted().count() );
465 if (sorted().count() == 0 ) 466 if (sorted().count() == 0 )
466 return; 467 return;
467 468
468 int row = currentRow(); 469 int row = currentRow();
469 if ( m_row ) { 470 if ( m_row ) {
470 int ro = row-4; 471 int ro = row-4;
471 if (ro < 0 ) ro = 0; 472 if (ro < 0 ) ro = 0;
472 sorted()[ro]; 473 sorted()[ro];
473 474
474 ro = row+4; 475 ro = row+4;
475 sorted()[ro]; 476 sorted()[ro];
476 } else { 477 } else {
477 int ro = row + 8; 478 int ro = row + 8;
478 sorted()[ro]; 479 sorted()[ro];
479 480
480 ro = row-8; 481 ro = row-8;
481 if (ro < 0 ) ro = 0; 482 if (ro < 0 ) ro = 0;
482 sorted()[ro]; 483 sorted()[ro];
483 } 484 }
484 485
485 m_row = !m_row; 486 m_row = !m_row;
486} 487}
487 488
488// We want a strike through completed ;) 489// We want a strike through completed ;)
489// durchstreichen to complete 490// durchstreichen to complete
490/* 491/*
491 * MouseTracking is off this mean we only receive 492 * MouseTracking is off this mean we only receive
492 * these events if the mouse button is pressed 493 * these events if the mouse button is pressed
493 * We've the previous point saved 494 * We've the previous point saved
494 * We check if the previous and current Point are 495 * We check if the previous and current Point are
495 * in the same row. 496 * in the same row.
496 * Then we check if they're some pixel horizontal away 497 * Then we check if they're some pixel horizontal away
497 * if the distance between the two points is greater than 498 * if the distance between the two points is greater than
498 * 8 we mark the underlying todo as completed and do a repaint 499 * 8 we mark the underlying todo as completed and do a repaint
500 *
501 * BUG: When clicking on the Due column and it's scrollable
502 * the todo is marked as completed...
503 * REASON: QTable is doing auto scrolling which leads to a move
504 * in the x coordinate and this way it's able to pass the
505 * m_completeStrokeWidth criteria
506 * WORKAROUND: strike through needs to strike through the same
507 * row and two columns!
499 */ 508 */
500void TableView::contentsMouseReleaseEvent( QMouseEvent* e) { 509void TableView::contentsMouseReleaseEvent( QMouseEvent* e) {
501 int row = rowAt(m_prevP.y()); 510 int row = rowAt(m_prevP.y());
502 if ( row == rowAt( e->y() ) && row != -1 ) { 511 int colOld = columnAt(m_prevP.x() );
503 if ( ::abs( m_prevP.x() - e->x() ) >= m_completeStrokeWidth ) { 512 int colNew = columnAt(e->x() );
504 qWarning("current row %d", row ); 513 qWarning("colNew: %d colOld: %d", colNew, colOld );
514 if ( row == rowAt( e->y() ) && row != -1 &&
515 colOld != colNew ) {
505 OTodo todo = sorted()[row]; 516 OTodo todo = sorted()[row];
506 todo.setCompleted( !todo.isCompleted() ); 517 todo.setCompleted( !todo.isCompleted() );
507 TodoView::update( todo.uid(), todo ); 518 TodoView::update( todo.uid(), todo );
508 updateView(); 519 updateView();
509 return; 520 return;
510 }
511 } 521 }
512 QTable::contentsMouseReleaseEvent( e ); 522 QTable::contentsMouseReleaseEvent( e );
513} 523}
514void TableView::contentsMouseMoveEvent( QMouseEvent* e ) { 524void TableView::contentsMouseMoveEvent( QMouseEvent* e ) {
515 m_menuTimer->stop(); 525 m_menuTimer->stop();
516 QTable::contentsMouseMoveEvent( e ); 526 QTable::contentsMouseMoveEvent( e );
517} 527}