summaryrefslogtreecommitdiff
authorzecke <zecke>2002-10-07 23:37:48 (UTC)
committer zecke <zecke>2002-10-07 23:37:48 (UTC)
commit626183d58f43f010f5cfb055f8582be0227ff59c (patch) (unidiff)
treead219a64b642fe63480f04cca7c37de4795c5e84
parentcdc6cad191b866d481085da1d05806afb5602b2c (diff)
downloadopie-626183d58f43f010f5cfb055f8582be0227ff59c.zip
opie-626183d58f43f010f5cfb055f8582be0227ff59c.tar.gz
opie-626183d58f43f010f5cfb055f8582be0227ff59c.tar.bz2
We're now using a home made painting of cells
This will theoretically speed up things Currently it's noticeable slower on SQL Cause we do up to 80 queries for 10 different items. As you see a cache could be the answer to these problems. The reason for custom drawing is speed and memory consumption. Take the unlikely case of 10.000 items We would have 40.000 QTableItem but would only show 40 of them at a time. The rest seems to be wasted
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/todo/mainwindow.cpp3
-rw-r--r--core/pim/todo/tableitems.cpp4
-rw-r--r--core/pim/todo/tableview.cpp233
-rw-r--r--core/pim/todo/tableview.h44
-rw-r--r--core/pim/todo/todoview.h2
5 files changed, 126 insertions, 160 deletions
diff --git a/core/pim/todo/mainwindow.cpp b/core/pim/todo/mainwindow.cpp
index 47c0160..7e7d2f7 100644
--- a/core/pim/todo/mainwindow.cpp
+++ b/core/pim/todo/mainwindow.cpp
@@ -468,33 +468,34 @@ void MainWindow::slotDeleteAll() {
468 468
469 m_todoMgr.removeAll(); 469 m_todoMgr.removeAll();
470 currentView()->clear(); 470 currentView()->clear();
471 471
472 raiseCurrentView(); 472 raiseCurrentView();
473} 473}
474void MainWindow::slotDeleteCompleted() { 474void MainWindow::slotDeleteCompleted() {
475 if(m_syncing) { 475 if(m_syncing) {
476 QMessageBox::warning(this, tr("Todo"), 476 QMessageBox::warning(this, tr("Todo"),
477 tr("Can not edit data, currently syncing")); 477 tr("Can not edit data, currently syncing"));
478 return; 478 return;
479 } 479 }
480 480
481 if ( !QPEMessageBox::confirmDelete( this, tr( "Todo" ), tr("all completed tasks?") ) ) 481 if ( !QPEMessageBox::confirmDelete( this, tr( "Todo" ), tr("all completed tasks?") ) )
482 return; 482 return;
483 483
484 m_todoMgr.remove( currentView()->completed() ); 484 // FIXME
485 //m_todoMgr.remove( currentView()->completed() );
485 currentView()->updateView( ); 486 currentView()->updateView( );
486} 487}
487void MainWindow::slotFind() { 488void MainWindow::slotFind() {
488 489
489} 490}
490void MainWindow::slotEdit() { 491void MainWindow::slotEdit() {
491 slotEdit( currentView()->current() ); 492 slotEdit( currentView()->current() );
492} 493}
493/* 494/*
494 * set the category 495 * set the category
495 */ 496 */
496void MainWindow::setCategory( int c) { 497void MainWindow::setCategory( int c) {
497 if ( c <= 0 ) return; 498 if ( c <= 0 ) return;
498 499
499 qWarning("Iterating over cats %d", c ); 500 qWarning("Iterating over cats %d", c );
500 for ( unsigned int i = 1; i < m_catMenu->count(); i++ ) 501 for ( unsigned int i = 1; i < m_catMenu->count(); i++ )
diff --git a/core/pim/todo/tableitems.cpp b/core/pim/todo/tableitems.cpp
index ebfefc8..86fe07d 100644
--- a/core/pim/todo/tableitems.cpp
+++ b/core/pim/todo/tableitems.cpp
@@ -35,33 +35,33 @@ using namespace Todo;
35CheckItem::CheckItem( QTable* t, 35CheckItem::CheckItem( QTable* t,
36 const QString& sortKey, 36 const QString& sortKey,
37 int uid, 37 int uid,
38 const QArray<int>& lis) 38 const QArray<int>& lis)
39 : OCheckItem(t, sortKey), m_uid(uid ), m_cat( lis ) 39 : OCheckItem(t, sortKey), m_uid(uid ), m_cat( lis )
40{ 40{
41} 41}
42CheckItem::~CheckItem() { 42CheckItem::~CheckItem() {
43} 43}
44void CheckItem::setChecked( bool b ) { 44void CheckItem::setChecked( bool b ) {
45 OCheckItem::setChecked(b); 45 OCheckItem::setChecked(b);
46} 46}
47void CheckItem::toggle() { 47void CheckItem::toggle() {
48 TableView* view = static_cast<TableView*>( table() ); 48 TableView* view = static_cast<TableView*>( table() );
49 OTodo ev = view->find( view->current() ); 49 OTodo ev = view->find( view->current() );
50 ev.setCompleted(!isChecked() ); 50 ev.setCompleted(!isChecked() );
51 view->updateFromTable( ev ); 51 //view->updateFromTable( ev );
52 52
53 OCheckItem::toggle(); 53 OCheckItem::toggle();
54 table()->updateCell( row(), col() ); 54 table()->updateCell( row(), col() );
55} 55}
56int CheckItem::uid() const { 56int CheckItem::uid() const {
57 return m_uid; 57 return m_uid;
58} 58}
59QArray<int> CheckItem::cats() { 59QArray<int> CheckItem::cats() {
60 return m_cat; 60 return m_cat;
61} 61}
62 62
63/* ComboItem */ 63/* ComboItem */
64ComboItem::ComboItem( QTable* t, EditType et ) 64ComboItem::ComboItem( QTable* t, EditType et )
65 : QTableItem( t, et, "3" ), m_cb(0) 65 : QTableItem( t, et, "3" ), m_cb(0)
66{ 66{
67 setReplaceable( FALSE ); 67 setReplaceable( FALSE );
@@ -81,33 +81,33 @@ QWidget* ComboItem::createEditor()const {
81 m_cb->insertItem( "4" ); 81 m_cb->insertItem( "4" );
82 m_cb->insertItem( "5" ); 82 m_cb->insertItem( "5" );
83 m_cb->setCurrentItem( txt.toInt() - 1 ); 83 m_cb->setCurrentItem( txt.toInt() - 1 );
84 84
85 return m_cb; 85 return m_cb;
86} 86}
87void ComboItem::setContentFromEditor( QWidget* w) { 87void ComboItem::setContentFromEditor( QWidget* w) {
88 TableView* view = static_cast<TableView*>( table() ); 88 TableView* view = static_cast<TableView*>( table() );
89 OTodo ev = view->find( view->current() ); 89 OTodo ev = view->find( view->current() );
90 90
91 if ( w->inherits( "QComboBox" ) ) 91 if ( w->inherits( "QComboBox" ) )
92 setText( ( (QComboBox*)w )->currentText() ); 92 setText( ( (QComboBox*)w )->currentText() );
93 else 93 else
94 QTableItem::setContentFromEditor( w ); 94 QTableItem::setContentFromEditor( w );
95 95
96 ev.setPriority( text().toInt() ); 96 ev.setPriority( text().toInt() );
97 view->updateFromTable( ev ); 97 //view->updateFromTable( ev );
98} 98}
99void ComboItem::setText( const QString& s ) { 99void ComboItem::setText( const QString& s ) {
100 if ( m_cb ) 100 if ( m_cb )
101 m_cb->setCurrentItem( s.toInt()-1 ); 101 m_cb->setCurrentItem( s.toInt()-1 );
102 102
103 QTableItem::setText( s ); 103 QTableItem::setText( s );
104} 104}
105QString ComboItem::text()const { 105QString ComboItem::text()const {
106 if ( m_cb) 106 if ( m_cb)
107 return m_cb->currentText(); 107 return m_cb->currentText();
108 108
109 return QTableItem::text(); 109 return QTableItem::text();
110} 110}
111 111
112/* TodoTextItem */ 112/* TodoTextItem */
113TodoTextItem::~TodoTextItem() { 113TodoTextItem::~TodoTextItem() {
diff --git a/core/pim/todo/tableview.cpp b/core/pim/todo/tableview.cpp
index eaaf1bc..5594b13 100644
--- a/core/pim/todo/tableview.cpp
+++ b/core/pim/todo/tableview.cpp
@@ -23,32 +23,37 @@
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 28
29#include <qtimer.h> 29#include <qtimer.h>
30#include <qpoint.h> 30#include <qpoint.h>
31#include <qpopupmenu.h> 31#include <qpopupmenu.h>
32 32
33#include "mainwindow.h" 33#include "mainwindow.h"
34//#include "tableitems.h" 34//#include "tableitems.h"
35#include "tableview.h" 35#include "tableview.h"
36 36
37using namespace Todo; 37using namespace Todo;
38 38
39namespace {
40 static const int BoxSize = 14;
41 static const int RowHeight = 20;
42}
43
39 44
40TableView::TableView( MainWindow* window, QWidget* wid ) 45TableView::TableView( MainWindow* window, QWidget* wid )
41 : QTable( wid ), TodoView( window ) { 46 : QTable( wid ), TodoView( window ) {
42 setUpdatesEnabled( false ); 47 setUpdatesEnabled( false );
43 viewport()->setUpdatesEnabled( false ); 48 viewport()->setUpdatesEnabled( false );
44 m_enablePaint = false; 49 m_enablePaint = false;
45 setNumRows(0); 50 setNumRows(0);
46 setNumCols(4); 51 setNumCols(4);
47 52
48 setSorting( TRUE ); 53 setSorting( TRUE );
49 setSelectionMode( NoSelection ); 54 setSelectionMode( NoSelection );
50 setColumnStretchable( 2, TRUE ); 55 setColumnStretchable( 2, TRUE );
51 setColumnWidth(0, 20 ); 56 setColumnWidth(0, 20 );
52 setColumnWidth(1, 35 ); 57 setColumnWidth(1, 35 );
53 58
54 setLeftMargin( 0 ); 59 setLeftMargin( 0 );
@@ -87,282 +92,268 @@ TableView::TableView( MainWindow* window, QWidget* wid )
87} 92}
88/* a new day has started 93/* a new day has started
89 * update the day 94 * update the day
90 */ 95 */
91void TableView::newDay() { 96void TableView::newDay() {
92 clear(); 97 clear();
93 updateView(); 98 updateView();
94} 99}
95TableView::~TableView() { 100TableView::~TableView() {
96 101
97} 102}
98void TableView::slotShowMenu() { 103void TableView::slotShowMenu() {
99 QPopupMenu *menu = todoWindow()->contextMenu( current() ); 104 QPopupMenu *menu = todoWindow()->contextMenu( current() );
100 menu->exec(QCursor::pos() ); 105 menu->exec(QCursor::pos() );
101 delete menu; 106 delete menu;
102} 107}
103OTodo TableView::find(int uid ) {
104 OTodo ev = TodoView::event( uid );
105 return ev;
106}
107void TableView::updateFromTable( const OTodo& ev, CheckItem* item ) {
108 TodoView::update( ev.uid(), ev );
109
110 /* update the other columns */
111 /* if completed or not we need to update
112 * the table
113 *
114 * We've two cases
115 * either item or !item
116 * this makes cases more easy
117 */
118 if ( !item ) {
119 item = m_cache[ev.uid()];
120 }
121 DueTextItem *due = dueItem( item->row() );
122 due->setCompleted( ev.isCompleted() );
123}
124QString TableView::type() const { 108QString TableView::type() const {
125 return QString::fromLatin1( tr("Table View") ); 109 return QString::fromLatin1( tr("Table View") );
126} 110}
127int TableView::current() { 111int TableView::current() {
128 int cur = 0; 112 int cur = 0;
129 CheckItem* i = checkItem( currentRow() ); 113 // FIXME
130 if (i )
131 cur = i->uid();
132
133 return cur; 114 return cur;
134} 115}
135QString TableView::currentRepresentation() { 116QString TableView::currentRepresentation() {
136 return text( currentRow(), 2); 117 return text( currentRow(), 2);
137} 118}
138/* show overdue */ 119/* show overdue */
139void TableView::showOverDue( bool ) { 120void TableView::showOverDue( bool ) {
140 clear(); 121 clear();
141 updateView(); 122 updateView();
142} 123}
143 124
144void TableView::updateView( ) { 125void TableView::updateView( ) {
145 setSortOrder( 0 ); 126 setSortOrder( 0 );
146 setAscending( true ); 127 setAscending( true );
147 sort(); 128 sort();
148 OTodoAccess::List::Iterator it, end; 129 OTodoAccess::List::Iterator it, end;
149 it = sorted().begin(); 130 it = sorted().begin();
150 end = sorted().end(); 131 end = sorted().end();
132
151 qWarning("setTodos"); 133 qWarning("setTodos");
152 QTime time; 134 QTime time;
153 time.start(); 135 time.start();
154 m_enablePaint = false; 136 m_enablePaint = false;
155 setUpdatesEnabled( false ); 137 setUpdatesEnabled( false );
156 viewport()->setUpdatesEnabled( false ); 138 viewport()->setUpdatesEnabled( false );
157 clear(); 139
158 QString currentCat = todoWindow()->currentCategory();
159 bool showCompleted = todoWindow()->showCompleted();
160 bool showOverDue = todoWindow()->showOverDue();
161 qWarning( "Current Category:" + todoWindow()->currentCategory() );
162 int id = todoWindow()->currentCatId();
163 QTime t; 140 QTime t;
164 t.start(); 141 t.start();
165 setNumRows( it.count() ); 142 setNumRows( it.count() );
166 uint i = 0;
167 for (; it != end; ++it ) {
168 OTodo todo = (*it);
169 /* test if the categories match */
170 if ( !currentCat.isEmpty() &&
171 !todo.categories().contains( id ) ) {
172 continue;
173 }
174 /* the item is completed but we shouldn't show it */
175 if ( !showCompleted && todo.isCompleted() ) {
176 qWarning("isCompleted ");
177 continue;
178 }
179 /* the item is not overdue but we should only show overdue */
180 if ( showOverDue && !todo.isOverdue() ) {
181 continue;
182 }
183 /* now it's fine to add it */
184 insertTodo( todo, i );
185 i++;
186 }
187 setNumRows( i );
188 int elc = time.elapsed(); 143 int elc = time.elapsed();
189 qWarning("Adding took %d", elc/1000 ); 144 qWarning("Adding took %d", elc/1000 );
190 setUpdatesEnabled( true ); 145 setUpdatesEnabled( true );
191 viewport()->setUpdatesEnabled( true ); 146 viewport()->setUpdatesEnabled( true );
192 viewport()->update(); 147 viewport()->update();
148
193 m_enablePaint = true; 149 m_enablePaint = true;
194 int el = time.elapsed(); 150 int el = time.elapsed();
195 qWarning("adding took %d", el/1000 ); 151 qWarning("adding took %d", el/1000 );
196} 152}
197void TableView::setTodo( int uid, const OTodo& ev ) { 153void TableView::setTodo( int, const OTodo&) {
198 QMap<int, CheckItem*>::Iterator it = m_cache.find( uid ); 154 sort();
199
200 if ( it != m_cache.end() ) {
201 int row = it.data()->row();
202
203 /* update checked */
204 CheckItem* check = checkItem(row );
205 if (check)
206 check->setChecked( ev.isCompleted() );
207
208 /* update the text */
209 QString sum = ev.summary();
210 setText(row, 2, sum.isEmpty() ?
211 ev.description().left(40).simplifyWhiteSpace() :
212 sum );
213
214 /* update priority */
215 setText(row, 1, QString::number( ev.priority() ) );
216 155
217 /* update DueDate */ 156 /* repaint */
218 DueTextItem *due = dueItem( row ); 157 QTable::update();
219 due->setToDoEvent( ev );
220 }
221} 158}
222void TableView::addEvent( const OTodo& ev) { 159void TableView::addEvent( const OTodo&) {
223 int row= numRows(); 160 sort();
224 setNumRows( row + 1 ); 161
225 insertTodo( ev, row ); 162 QTable::update();
226} 163}
227/* 164/*
228 * find the event 165 * find the event
229 * and then replace the complete row 166 * and then replace the complete row
230 */ 167 */
231void TableView::replaceEvent( const OTodo& ev) { 168void TableView::replaceEvent( const OTodo& ev) {
232 setTodo( ev.uid(), ev ); 169 addEvent( ev );
233} 170}
234/* 171/*
235 * re aligning table can be slow too 172 * re aligning table can be slow too
236 * FIXME: look what performs better 173 * FIXME: look what performs better
237 * either this or the old align table 174 * either this or the old align table
238 */ 175 */
239void TableView::removeEvent( int ) { 176void TableView::removeEvent( int ) {
240 clear();
241 updateView(); 177 updateView();
242} 178}
243void TableView::setShowCompleted( bool b) { 179void TableView::setShowCompleted( bool b) {
244 qWarning("Show Completed %d" + b ); 180 qWarning("Show Completed %d" + b );
245 updateView(); 181 updateView();
246} 182}
247void TableView::setShowDeadline( bool b) { 183void TableView::setShowDeadline( bool b) {
248 qWarning("Show DeadLine %d" + b ); 184 qWarning("Show DeadLine %d" + b );
249 if (b) 185 if (b)
250 showColumn(3 ); 186 showColumn(3 );
251 else 187 else
252 hideColumn(3 ); 188 hideColumn(3 );
253} 189}
254void TableView::setShowCategory( const QString& ) { 190void TableView::setShowCategory( const QString& ) {
255 qWarning("setShowCategory"); 191 qWarning("setShowCategory");
256 updateView(); 192 updateView();
257} 193}
258void TableView::clear() { 194void TableView::clear() {
259 m_cache.clear(); 195 setNumRows(0);
260 int rows = numRows();
261 for (int r = 0; r < rows; r++ ) {
262 for (int c = 0; c < numCols(); c++ ) {
263 if ( cellWidget(r, c) )
264 clearCellWidget(r, c );
265 clearCell(r, c);
266 }
267 }
268 setNumRows( 0);
269}
270QArray<int> TableView::completed() {
271 int row = numRows();
272 QArray<int> ids( row );
273
274 int j=0;
275 for (int i = 0; i < row; i++ ) {
276 CheckItem* item = checkItem(i );
277 if (item->isChecked() ) {
278 ids[j] = item->uid();
279 j++;
280 }
281 }
282 ids.resize( j );
283 return ids;
284} 196}
285void TableView::slotClicked(int row, int col, int, 197void TableView::slotClicked(int row, int col, int,
286 const QPoint& point) { 198 const QPoint& point) {
287 if ( !cellGeometry(row, col ).contains(point ) ) 199 if ( !cellGeometry(row, col ).contains(point ) )
288 return; 200 return;
201 int ui=0; // FIXME = uid(row);
289 202
290 203
291 switch( col ) { 204 switch( col ) {
292 case 0: { 205 case 0: {
293 CheckItem* item = checkItem( row ); 206 // FIXME
207 CheckItem* item = 0l;
294 /* 208 /*
295 * let's see if we centered clicked 209 * let's see if we centered clicked
296 */ 210 */
297 if ( item ) { 211 if ( item ) {
298 int x = point.x() -columnPos( col ); 212 int x = point.x() -columnPos( col );
299 int y = point.y() -rowPos( row ); 213 int y = point.y() -rowPos( row );
300 int w = columnWidth( col ); 214 int w = columnWidth( col );
301 int h = rowHeight( row ); 215 int h = rowHeight( row );
302 if ( x >= ( w - OCheckItem::BoxSize ) / 2 && 216 if ( x >= ( w - OCheckItem::BoxSize ) / 2 &&
303 x <= ( w - OCheckItem::BoxSize ) / 2 + OCheckItem::BoxSize && 217 x <= ( w - OCheckItem::BoxSize ) / 2 + OCheckItem::BoxSize &&
304 y >= ( h - OCheckItem::BoxSize ) / 2 && 218 y >= ( h - OCheckItem::BoxSize ) / 2 &&
305 y <= ( h - OCheckItem::BoxSize ) / 2 + OCheckItem::BoxSize ) 219 y <= ( h - OCheckItem::BoxSize ) / 2 + OCheckItem::BoxSize )
306 item->toggle(); 220 item->toggle();
307 } 221 }
308 } 222 }
309 break; 223 break;
310 224
311 case 1: 225 case 1:
312 break; 226 break;
313 227
314 case 2: { 228 case 2: {
315 m_menuTimer->stop(); 229 m_menuTimer->stop();
316 showTodo( checkItem(row)->uid() ); 230 showTodo( ui );
317 break; 231 break;
318 } 232 }
319 case 3: { 233 case 3: {
320 m_menuTimer->stop(); 234 m_menuTimer->stop();
321 TodoView::edit( checkItem(row)->uid() ); 235 TodoView::edit( ui );
322 break; 236 break;
323 } 237 }
324 } 238 }
325 239
326 240
327} 241}
328void TableView::slotPressed(int row, int col, int, 242void TableView::slotPressed(int row, int col, int,
329 const QPoint& point) { 243 const QPoint& point) {
330 244
331 /* TextColumn column */ 245 /* TextColumn column */
332 if ( col == 2 && cellGeometry( row, col ).contains( point ) ) 246 if ( col == 2 && cellGeometry( row, col ).contains( point ) )
333 m_menuTimer->start( 750, TRUE ); 247 m_menuTimer->start( 750, TRUE );
334} 248}
335void TableView::slotValueChanged( int, int ) { 249void TableView::slotValueChanged( int, int ) {
336 qWarning("Value Changed"); 250 qWarning("Value Changed");
337} 251}
338void TableView::slotCurrentChanged(int, int ) { 252void TableView::slotCurrentChanged(int, int ) {
339 m_menuTimer->stop(); 253 m_menuTimer->stop();
340} 254}
341/*
342 * hardcode to column 0
343 */
344CheckItem* TableView::checkItem( int row ) {
345 CheckItem *i = static_cast<CheckItem*>( item( row, 0 ) );
346 return i;
347}
348DueTextItem* TableView::dueItem( int row ) {
349 DueTextItem* i = static_cast<DueTextItem*> ( item(row, 3 ) );
350 return i;
351}
352QWidget* TableView::widget() { 255QWidget* TableView::widget() {
353 return this; 256 return this;
354} 257}
355/* 258/*
356 * We need to overwrite sortColumn 259 * We need to overwrite sortColumn
357 * because we want to sort whole row 260 * because we want to sort whole row
358 * based 261 * based
262 * We event want to set the setOrder
263 * to a sort() and update()
359 */ 264 */
360void TableView::sortColumn( int row, bool asc, bool ) { 265void TableView::sortColumn( int row, bool asc, bool ) {
361 QTable::sortColumn( row, asc, TRUE ); 266 QTable::sortColumn( row, asc, TRUE );
362 267
363} 268}
364void TableView::viewportPaintEvent( QPaintEvent* e) { 269void TableView::viewportPaintEvent( QPaintEvent* e) {
365 qWarning("Paint event" ); 270 qWarning("Paint event" );
366 if (m_enablePaint ) 271 if (m_enablePaint )
367 QTable::viewportPaintEvent( e ); 272 QTable::viewportPaintEvent( e );
368} 273}
274/*
275 * This segment is copyrighted by TT
276 * it was taken from their todolist
277 * application this code is GPL
278 */
279void TableView::paintCell(QPainter* p, int row, int col, const QRect& cr, bool ) {
280 const QColorGroup &cg = colorGroup();
281
282 p->save();
283
284 OTodo task = sorted()[row];
285
286 p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) );
287
288 QPen op = p->pen();
289 p->setPen(cg.mid());
290 p->drawLine( 0, cr.height() - 1, cr.width() - 1, cr.height() - 1 );
291 p->drawLine( cr.width() - 1, 0, cr.width() - 1, cr.height() - 1 );
292 p->setPen(op);
293
294 QFont f = p->font();
295 QFontMetrics fm(f);
296
297 switch(col) {
298 case 0:
299 {
300 // completed field
301 int marg = ( cr.width() - BoxSize ) / 2;
302 int x = 0;
303 int y = ( cr.height() - BoxSize ) / 2;
304 p->setPen( QPen( cg.text() ) );
305 p->drawRect( x + marg, y, BoxSize, BoxSize );
306 p->drawRect( x + marg+1, y+1, BoxSize-2, BoxSize-2 );
307 p->setPen( darkGreen );
308 x += 1;
309 y += 1;
310 if ( task.isCompleted() ) {
311 QPointArray a( 9*2 );
312 int i, xx, yy;
313 xx = x+2+marg;
314 yy = y+4;
315 for ( i=0; i<4; i++ ) {
316 a.setPoint( 2*i, xx, yy );
317 a.setPoint( 2*i+1, xx, yy+2 );
318 xx++; yy++;
319 }
320 yy -= 2;
321 for ( i=4; i<9; i++ ) {
322 a.setPoint( 2*i, xx, yy );
323 a.setPoint( 2*i+1, xx, yy+2 );
324 xx++; yy--;
325 }
326 p->drawLineSegments( a );
327 }
328 }
329 break;
330 case 1:
331 // priority field
332 {
333 QString text = QString::number(task.priority());
334 p->drawText(2,2 + fm.ascent(), text);
335 }
336 break;
337 case 2:
338 // description field
339 {
340 QString text = task.summary().isEmpty() ?
341 task.description() :
342 task.summary();
343 p->drawText(2,2 + fm.ascent(), text);
344 }
345 break;
346 case 3:
347 {
348 QString text;
349 if (task.hasDueDate()) {
350 text = "HAS";
351 } else {
352 text = tr("None");
353 }
354 p->drawText(2,2 + fm.ascent(), text);
355 }
356 break;
357 }
358 p->restore();
359}
diff --git a/core/pim/todo/tableview.h b/core/pim/todo/tableview.h
index 1fa21b2..b608204 100644
--- a/core/pim/todo/tableview.h
+++ b/core/pim/todo/tableview.h
@@ -33,87 +33,61 @@
33#include <qmap.h> 33#include <qmap.h>
34 34
35#include "tableitems.h" 35#include "tableitems.h"
36#include "todoview.h" 36#include "todoview.h"
37 37
38class QTimer; 38class QTimer;
39 39
40namespace Todo { 40namespace Todo {
41 class CheckItem; 41 class CheckItem;
42 class DueTextItem; 42 class DueTextItem;
43 class TableView : public QTable, public TodoView { 43 class TableView : public QTable, public TodoView {
44 Q_OBJECT 44 Q_OBJECT
45 public: 45 public:
46 TableView( MainWindow*, QWidget* parent ); 46 TableView( MainWindow*, QWidget* parent );
47 ~TableView(); 47 ~TableView();
48 48
49 void updateFromTable( const OTodo&, CheckItem* = 0 );
50 OTodo find(int uid);
51 49
52 QString type()const; 50 QString type()const;
53 int current(); 51 int current();
54 QString currentRepresentation(); 52 QString currentRepresentation();
55 53
54 void clear();
56 void showOverDue( bool ); 55 void showOverDue( bool );
57 void updateView(); 56 void updateView();
58 void setTodo( int uid, const OTodo& ); 57 void setTodo( int uid, const OTodo& );
59 void addEvent( const OTodo& event ); 58 void addEvent( const OTodo& event );
60 void replaceEvent( const OTodo& ); 59 void replaceEvent( const OTodo& );
61 void removeEvent( int uid ); 60 void removeEvent( int uid );
62 void setShowCompleted( bool ); 61 void setShowCompleted( bool );
63 void setShowDeadline( bool ); 62 void setShowDeadline( bool );
64 63
65 void setShowCategory(const QString& =QString::null ); 64 void setShowCategory(const QString& =QString::null );
66 void clear();
67 void newDay(); 65 void newDay();
68 QArray<int> completed();
69 QWidget* widget(); 66 QWidget* widget();
70 void sortColumn(int, bool, bool ); 67 void sortColumn(int, bool, bool );
68
69 /*
70 * we do our drawing ourselves
71 * because we don't want to have
72 * 40.000 QTableItems for 10.000
73 * OTodos where we only show 10 at a time!
74 */
75 void paintCell(QPainter* p, int row, int col, const QRect&, bool );
71 private: 76 private:
72 /* reimplented for internal reasons */ 77 /* reimplented for internal reasons */
73 void viewportPaintEvent( QPaintEvent* ); 78 void viewportPaintEvent( QPaintEvent* );
74 inline void insertTodo( const OTodo&, int row );
75 CheckItem* checkItem( int row );
76 DueTextItem* dueItem( int row );
77 QTimer *m_menuTimer; 79 QTimer *m_menuTimer;
78 QMap<int, CheckItem*> m_cache;
79 bool m_enablePaint:1; 80 bool m_enablePaint:1;
80 81
81private slots: 82private slots:
82 void slotShowMenu(); 83 void slotShowMenu();
83 void slotClicked(int, int, int, 84 void slotClicked(int, int, int,
84 const QPoint& ); 85 const QPoint& );
85 void slotPressed(int, int, int, 86 void slotPressed(int, int, int,
86 const QPoint& ); 87 const QPoint& );
87 void slotValueChanged(int, int); 88 void slotValueChanged(int, int);
88 void slotCurrentChanged(int, int ); 89 void slotCurrentChanged(int, int );
89 }; 90 };
90 inline void TableView::insertTodo( const OTodo& event, int row ) {
91
92
93 QString sortKey = (char) ( (event.isCompleted() ? 'a' : 'A' )
94 + event.priority() )
95 + Qtopia::buildSortKey( event.description() );
96 CheckItem *chk = new CheckItem( this, sortKey, event.uid(), event.categories() );
97 chk->setChecked( event.isCompleted() );
98
99 ComboItem *cmb = new ComboItem(this, QTableItem::WhenCurrent );
100 cmb->setText( QString::number( event.priority() ) );
101
102 QString sum = event.summary();
103 QTableItem* ti = new TodoTextItem( this, sum.isEmpty() ?
104 event.description().left(40).simplifyWhiteSpace() :
105 sum );
106 ti->setReplaceable( FALSE );
107
108 DueTextItem *due = new DueTextItem(this, event );
109
110 setItem( row, 0, chk );
111 setItem( row, 1, cmb );
112 setItem( row, 2, ti );
113 setItem( row, 3, due );
114
115 m_cache.insert( event.uid(), chk );
116 }
117}; 91};
118 92
119#endif 93#endif
diff --git a/core/pim/todo/todoview.h b/core/pim/todo/todoview.h
index 81ace3a..9408ef1 100644
--- a/core/pim/todo/todoview.h
+++ b/core/pim/todo/todoview.h
@@ -89,33 +89,33 @@ namespace Todo {
89 virtual int current() = 0; 89 virtual int current() = 0;
90 virtual QString currentRepresentation() = 0; 90 virtual QString currentRepresentation() = 0;
91 virtual void showOverDue( bool ) = 0; 91 virtual void showOverDue( bool ) = 0;
92 92
93 /* 93 /*
94 * update the view 94 * update the view
95 */ 95 */
96 virtual void updateView() = 0; 96 virtual void updateView() = 0;
97 97
98 virtual void addEvent( const OTodo& ) = 0; 98 virtual void addEvent( const OTodo& ) = 0;
99 virtual void replaceEvent( const OTodo& ) = 0; 99 virtual void replaceEvent( const OTodo& ) = 0;
100 virtual void removeEvent( int uid ) = 0; 100 virtual void removeEvent( int uid ) = 0;
101 virtual void setShowCompleted( bool ) = 0; 101 virtual void setShowCompleted( bool ) = 0;
102 virtual void setShowDeadline( bool ) = 0; 102 virtual void setShowDeadline( bool ) = 0;
103 virtual void setShowCategory( const QString& = QString::null ) = 0; 103 virtual void setShowCategory( const QString& = QString::null ) = 0;
104 virtual void clear() = 0; 104 virtual void clear() = 0;
105 virtual QArray<int> completed() = 0; 105/* virtual QArray<int> completed() = 0; */
106 virtual void newDay() = 0; 106 virtual void newDay() = 0;
107 107
108 virtual void connectShow( QObject*, const char* ) = 0; 108 virtual void connectShow( QObject*, const char* ) = 0;
109 virtual void connectEdit( QObject*, const char* ) = 0; 109 virtual void connectEdit( QObject*, const char* ) = 0;
110 virtual void connectUpdateSmall( QObject*, const char* ) = 0; 110 virtual void connectUpdateSmall( QObject*, const char* ) = 0;
111 virtual void connectUpdateBig( QObject*, const char* ) = 0; 111 virtual void connectUpdateBig( QObject*, const char* ) = 0;
112 virtual void connectUpdateView( QObject*, const char*) = 0; 112 virtual void connectUpdateView( QObject*, const char*) = 0;
113 virtual void connectRemove( QObject*, const char* ) = 0; 113 virtual void connectRemove( QObject*, const char* ) = 0;
114 114
115 }; 115 };
116 116
117 /** 117 /**
118 * A base class for all TodoView which are showing 118 * A base class for all TodoView which are showing
119 * a list of todos. 119 * a list of todos.
120 * Either in a QTable, QListView or any other QWidget 120 * Either in a QTable, QListView or any other QWidget
121 * derived class 121 * derived class