author | zecke <zecke> | 2002-10-07 23:37:48 (UTC) |
---|---|---|
committer | zecke <zecke> | 2002-10-07 23:37:48 (UTC) |
commit | 626183d58f43f010f5cfb055f8582be0227ff59c (patch) (unidiff) | |
tree | ad219a64b642fe63480f04cca7c37de4795c5e84 | |
parent | cdc6cad191b866d481085da1d05806afb5602b2c (diff) | |
download | opie-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
-rw-r--r-- | core/pim/todo/mainwindow.cpp | 3 | ||||
-rw-r--r-- | core/pim/todo/tableitems.cpp | 4 | ||||
-rw-r--r-- | core/pim/todo/tableview.cpp | 233 | ||||
-rw-r--r-- | core/pim/todo/tableview.h | 44 | ||||
-rw-r--r-- | core/pim/todo/todoview.h | 2 |
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 | |||
@@ -483,3 +483,4 @@ void MainWindow::slotDeleteCompleted() { | |||
483 | 483 | ||
484 | m_todoMgr.remove( currentView()->completed() ); | 484 | // FIXME |
485 | //m_todoMgr.remove( currentView()->completed() ); | ||
485 | currentView()->updateView( ); | 486 | currentView()->updateView( ); |
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 | |||
@@ -50,3 +50,3 @@ void CheckItem::toggle() { | |||
50 | ev.setCompleted(!isChecked() ); | 50 | ev.setCompleted(!isChecked() ); |
51 | view->updateFromTable( ev ); | 51 | //view->updateFromTable( ev ); |
52 | 52 | ||
@@ -96,3 +96,3 @@ void ComboItem::setContentFromEditor( QWidget* w) { | |||
96 | ev.setPriority( text().toInt() ); | 96 | ev.setPriority( text().toInt() ); |
97 | view->updateFromTable( ev ); | 97 | //view->updateFromTable( ev ); |
98 | } | 98 | } |
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 | |||
@@ -38,2 +38,7 @@ using namespace Todo; | |||
38 | 38 | ||
39 | namespace { | ||
40 | static const int BoxSize = 14; | ||
41 | static const int RowHeight = 20; | ||
42 | } | ||
43 | |||
39 | 44 | ||
@@ -102,23 +107,2 @@ void TableView::slotShowMenu() { | |||
102 | } | 107 | } |
103 | OTodo TableView::find(int uid ) { | ||
104 | OTodo ev = TodoView::event( uid ); | ||
105 | return ev; | ||
106 | } | ||
107 | void 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 | } | ||
124 | QString TableView::type() const { | 108 | QString TableView::type() const { |
@@ -128,6 +112,3 @@ int 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; |
@@ -150,2 +131,3 @@ void TableView::updateView( ) { | |||
150 | end = sorted().end(); | 131 | end = sorted().end(); |
132 | |||
151 | qWarning("setTodos"); | 133 | qWarning("setTodos"); |
@@ -156,8 +138,3 @@ void TableView::updateView( ) { | |||
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; |
@@ -165,24 +142,2 @@ void TableView::updateView( ) { | |||
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(); |
@@ -192,2 +147,3 @@ void TableView::updateView( ) { | |||
192 | viewport()->update(); | 147 | viewport()->update(); |
148 | |||
193 | m_enablePaint = true; | 149 | m_enablePaint = true; |
@@ -196,31 +152,12 @@ void TableView::updateView( ) { | |||
196 | } | 152 | } |
197 | void TableView::setTodo( int uid, const OTodo& ev ) { | 153 | void 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 | } |
222 | void TableView::addEvent( const OTodo& ev) { | 159 | void TableView::addEvent( const OTodo&) { |
223 | int row= numRows(); | 160 | sort(); |
224 | setNumRows( row + 1 ); | 161 | |
225 | insertTodo( ev, row ); | 162 | QTable::update(); |
226 | } | 163 | } |
@@ -231,3 +168,3 @@ void TableView::addEvent( const OTodo& ev) { | |||
231 | void TableView::replaceEvent( const OTodo& ev) { | 168 | void TableView::replaceEvent( const OTodo& ev) { |
232 | setTodo( ev.uid(), ev ); | 169 | addEvent( ev ); |
233 | } | 170 | } |
@@ -239,3 +176,2 @@ void TableView::replaceEvent( const OTodo& ev) { | |||
239 | void TableView::removeEvent( int ) { | 176 | void TableView::removeEvent( int ) { |
240 | clear(); | ||
241 | updateView(); | 177 | updateView(); |
@@ -258,27 +194,3 @@ void TableView::setShowCategory( const QString& ) { | |||
258 | void TableView::clear() { | 194 | void 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 | } | ||
270 | QArray<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 | } |
@@ -288,2 +200,3 @@ void TableView::slotClicked(int row, int col, int, | |||
288 | return; | 200 | return; |
201 | int ui=0; // FIXME = uid(row); | ||
289 | 202 | ||
@@ -292,3 +205,4 @@ void TableView::slotClicked(int row, int col, int, | |||
292 | case 0: { | 205 | case 0: { |
293 | CheckItem* item = checkItem( row ); | 206 | // FIXME |
207 | CheckItem* item = 0l; | ||
294 | /* | 208 | /* |
@@ -315,3 +229,3 @@ void TableView::slotClicked(int row, int col, int, | |||
315 | m_menuTimer->stop(); | 229 | m_menuTimer->stop(); |
316 | showTodo( checkItem(row)->uid() ); | 230 | showTodo( ui ); |
317 | break; | 231 | break; |
@@ -320,3 +234,3 @@ void TableView::slotClicked(int row, int col, int, | |||
320 | m_menuTimer->stop(); | 234 | m_menuTimer->stop(); |
321 | TodoView::edit( checkItem(row)->uid() ); | 235 | TodoView::edit( ui ); |
322 | break; | 236 | break; |
@@ -340,13 +254,2 @@ void TableView::slotCurrentChanged(int, int ) { | |||
340 | } | 254 | } |
341 | /* | ||
342 | * hardcode to column 0 | ||
343 | */ | ||
344 | CheckItem* TableView::checkItem( int row ) { | ||
345 | CheckItem *i = static_cast<CheckItem*>( item( row, 0 ) ); | ||
346 | return i; | ||
347 | } | ||
348 | DueTextItem* TableView::dueItem( int row ) { | ||
349 | DueTextItem* i = static_cast<DueTextItem*> ( item(row, 3 ) ); | ||
350 | return i; | ||
351 | } | ||
352 | QWidget* TableView::widget() { | 255 | QWidget* TableView::widget() { |
@@ -358,2 +261,4 @@ QWidget* TableView::widget() { | |||
358 | * based | 261 | * based |
262 | * We event want to set the setOrder | ||
263 | * to a sort() and update() | ||
359 | */ | 264 | */ |
@@ -368 +273,87 @@ void TableView::viewportPaintEvent( QPaintEvent* 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 | */ | ||
279 | void 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 | |||
@@ -48,4 +48,2 @@ namespace Todo { | |||
48 | 48 | ||
49 | void updateFromTable( const OTodo&, CheckItem* = 0 ); | ||
50 | OTodo find(int uid); | ||
51 | 49 | ||
@@ -55,2 +53,3 @@ namespace Todo { | |||
55 | 53 | ||
54 | void clear(); | ||
56 | void showOverDue( bool ); | 55 | void showOverDue( bool ); |
@@ -65,7 +64,13 @@ namespace Todo { | |||
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: |
@@ -73,7 +78,3 @@ namespace Todo { | |||
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; |
@@ -89,29 +90,2 @@ private slots: | |||
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 | }; |
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 | |||
@@ -104,3 +104,3 @@ namespace Todo { | |||
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; |