From f11d4bda64b58abfebf77485d5d77143a10dc8c9 Mon Sep 17 00:00:00 2001 From: zecke Date: Mon, 07 Oct 2002 11:39:30 +0000 Subject: Re add files for todo --- (limited to 'core/pim/todo/tableview.cpp') diff --git a/core/pim/todo/tableview.cpp b/core/pim/todo/tableview.cpp new file mode 100644 index 0000000..39f0d72 --- a/dev/null +++ b/core/pim/todo/tableview.cpp @@ -0,0 +1,362 @@ +/* +               =. This file is part of the OPIE Project +             .=l. Copyright (c) 2002 <> +           .>+-= + _;:,     .>    :=|. This program is free software; you can +.> <`_,   >  .   <= redistribute it and/or modify it under +:`=1 )Y*s>-.--   : the terms of the GNU General Public +.="- .-=="i,     .._ License as published by the Free Software + - .   .-<_>     .<> Foundation; either version 2 of the License, +     ._= =}       : or (at your option) any later version. +    .%`+i>       _;_. +    .i_,=:_.      -`: PARTICULAR PURPOSE. See the GNU +..}^=.=       =       ; Library General Public License for more +++=   -.     .`     .: details. + :     =  ...= . :.=- + -.   .:....=;==+<; You should have received a copy of the GNU +  -_. . .   )=.  = Library General Public License along with +    --        :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include +#include +#include + +#include "mainwindow.h" +//#include "tableitems.h" +#include "tableview.h" + +using namespace Todo; + + +TableView::TableView( MainWindow* window, QWidget* wid ) + : QTable( wid ), TodoView( window ) { + setUpdatesEnabled( false ); + viewport()->setUpdatesEnabled( false ); + m_enablePaint = false; + setNumRows(0); + setNumCols(4); + + setSorting( TRUE ); + setSelectionMode( NoSelection ); + setColumnStretchable( 2, TRUE ); + setColumnWidth(0, 20 ); + setColumnWidth(1, 35 ); + + setLeftMargin( 0 ); + verticalHeader()->hide(); + + horizontalHeader()->setLabel(0, tr("C.") ); + horizontalHeader()->setLabel(1, tr("Prior.") ); + horizontalHeader()->setLabel(2, tr("Description" ) ); + + setColumnStretchable(3, FALSE ); + setColumnWidth(3, 20 ); + horizontalHeader()->setLabel(3, tr("Deadline") ); + + if ( todoWindow()->showDeadline() ) + showColumn( 3); + else + hideColumn(3 ); + + connect((QTable*)this, SIGNAL( clicked( int, int, int, const QPoint& ) ), + this, SLOT( slotClicked(int, int, int, const QPoint& ) ) ); + connect((QTable*)this, SIGNAL( pressed( int, int, int, const QPoint& ) ), + this, SLOT( slotPressed(int, int, int, const QPoint& ) ) ); + connect((QTable*)this, SIGNAL(valueChanged(int, int) ), + this, SLOT( slotValueChanged(int, int) ) ); + connect((QTable*)this, SIGNAL(currentChanged(int, int) ), + this, SLOT( slotCurrentChanged(int, int) ) ); + + m_menuTimer = new QTimer( this ); + connect( m_menuTimer, SIGNAL(timeout()), + this, SLOT(slotShowMenu()) ); + + m_enablePaint = true; + setUpdatesEnabled( true ); + viewport()->setUpdatesEnabled( true ); + viewport()->update(); +} +/* a new day has started + * update the day + */ +void TableView::newDay() { + clear(); + setTodos( begin(),end() ); +} +TableView::~TableView() { + +} +void TableView::slotShowMenu() { + QPopupMenu *menu = todoWindow()->contextMenu( current() ); + menu->exec(QCursor::pos() ); + delete menu; +} +OTodo TableView::find(int uid ) { + OTodo ev = TodoView::event( uid ); + return ev; +} +void TableView::updateFromTable( const OTodo& ev, CheckItem* item ) { + TodoView::update( ev.uid(), ev ); + + /* update the other columns */ + /* if completed or not we need to update + * the table + * + * We've two cases + * either item or !item + * this makes cases more easy + */ + if ( !item ) { + item = m_cache[ev.uid()]; + } + DueTextItem *due = dueItem( item->row() ); + due->setCompleted( ev.isCompleted() ); +} +QString TableView::type() const { + return QString::fromLatin1( tr("Table View") ); +} +int TableView::current() { + int cur = 0; + CheckItem* i = checkItem( currentRow() ); + if (i ) + cur = i->uid(); + + return cur; +} +QString TableView::currentRepresentation() { + return text( currentRow(), 2); +} +/* show overdue */ +void TableView::showOverDue( bool ) { + clear(); + setTodos( begin(), end() ); +} + +void TableView::setTodos( OTodoAccess::List::Iterator it, + OTodoAccess::List::Iterator end ) { + qWarning("setTodos"); + QTime time; + time.start(); + m_enablePaint = false; + setUpdatesEnabled( false ); + viewport()->setUpdatesEnabled( false ); + clear(); + QString currentCat = todoWindow()->currentCategory(); + bool showCompleted = todoWindow()->currentCatId(); + bool showOverDue = todoWindow()->showOverDue(); + qWarning( "Current Category:" + todoWindow()->currentCategory() ); + int id = todoWindow()->currentCatId(); + QTime t; + t.start(); + setNumRows( it.count() ); + uint i = 0; + for (; it != end; ++it ) { + OTodo todo = (*it); + /* test if the categories match */ + if ( !currentCat.isEmpty() && + !todo.categories().contains( id ) ) { + continue; + } + /* the item is completed but we shouldn't show it */ + if ( !showCompleted && todo.isCompleted() ) { + continue; + } + /* the item is not overdue but we should only show overdue */ + if ( showOverDue && !todo.isOverdue() ) { + continue; + } + /* now it's fine to add it */ + insertTodo( todo, i ); + i++; + } + setNumRows( i ); + int elc = time.elapsed(); + qWarning("Adding took %d", elc/1000 ); + setUpdatesEnabled( true ); + viewport()->setUpdatesEnabled( true ); + viewport()->update(); + m_enablePaint = true; + int el = time.elapsed(); + qWarning("adding took %d", el/1000 ); +} +void TableView::setTodo( int uid, const OTodo& ev ) { + QMap::Iterator it = m_cache.find( uid ); + + if ( it != m_cache.end() ) { + int row = it.data()->row(); + + /* update checked */ + CheckItem* check = checkItem(row ); + if (check) + check->setChecked( ev.isCompleted() ); + + /* update the text */ + QString sum = ev.summary(); + setText(row, 2, sum.isEmpty() ? + ev.description().left(40).simplifyWhiteSpace() : + sum ); + + /* update priority */ + setText(row, 1, QString::number( ev.priority() ) ); + + /* update DueDate */ + DueTextItem *due = dueItem( row ); + due->setToDoEvent( ev ); + } +} +void TableView::addEvent( const OTodo& ev) { + int row= numRows(); + setNumRows( row + 1 ); + insertTodo( ev, row ); +} +/* + * find the event + * and then replace the complete row + */ +void TableView::replaceEvent( const OTodo& ev) { + setTodo( ev.uid(), ev ); +} +/* + * re aligning table can be slow too + * FIXME: look what performs better + * either this or the old align table + */ +void TableView::removeEvent( int ) { + clear(); + setTodos( begin(), end() ); +} +void TableView::setShowCompleted( bool b) { + qWarning("Show Completed %d" + b ); + setTodos( begin(), end() ); +} +void TableView::setShowDeadline( bool b) { + qWarning("Show DeadLine %d" + b ); + if (b) + showColumn(3 ); + else + hideColumn(3 ); +} +void TableView::setShowCategory( const QString& ) { + qWarning("setShowCategory"); + setTodos( begin(), end() ); +} +void TableView::clear() { + m_cache.clear(); + int rows = numRows(); + for (int r = 0; r < rows; r++ ) { + for (int c = 0; c < numCols(); c++ ) { + if ( cellWidget(r, c) ) + clearCellWidget(r, c ); + clearCell(r, c); + } + } + setNumRows( 0); +} +QArray TableView::completed() { + int row = numRows(); + QArray ids( row ); + + int j=0; + for (int i = 0; i < row; i++ ) { + CheckItem* item = checkItem(i ); + if (item->isChecked() ) { + ids[j] = item->uid(); + j++; + } + } + ids.resize( j ); + return ids; +} +void TableView::slotClicked(int row, int col, int, + const QPoint& point) { + if ( !cellGeometry(row, col ).contains(point ) ) + return; + + + switch( col ) { + case 0: { + CheckItem* item = checkItem( row ); + /* + * let's see if we centered clicked + */ + if ( item ) { + int x = point.x() -columnPos( col ); + int y = point.y() -rowPos( row ); + int w = columnWidth( col ); + int h = rowHeight( row ); + if ( x >= ( w - OCheckItem::BoxSize ) / 2 && + x <= ( w - OCheckItem::BoxSize ) / 2 + OCheckItem::BoxSize && + y >= ( h - OCheckItem::BoxSize ) / 2 && + y <= ( h - OCheckItem::BoxSize ) / 2 + OCheckItem::BoxSize ) + item->toggle(); + } + } + break; + + case 1: + break; + + case 2: { + m_menuTimer->stop(); + showTodo( checkItem(row)->uid() ); + break; + } + case 3: { + m_menuTimer->stop(); + TodoView::edit( checkItem(row)->uid() ); + break; + } + } + + +} +void TableView::slotPressed(int row, int col, int, + const QPoint& point) { + + /* TextColumn column */ + if ( col == 2 && cellGeometry( row, col ).contains( point ) ) + m_menuTimer->start( 750, TRUE ); +} +void TableView::slotValueChanged( int, int ) { + qWarning("Value Changed"); +} +void TableView::slotCurrentChanged(int, int ) { + m_menuTimer->stop(); +} +/* + * hardcode to column 0 + */ +CheckItem* TableView::checkItem( int row ) { + CheckItem *i = static_cast( item( row, 0 ) ); + return i; +} +DueTextItem* TableView::dueItem( int row ) { + DueTextItem* i = static_cast ( item(row, 3 ) ); + return i; +} +QWidget* TableView::widget() { + return this; +} +/* + * We need to overwrite sortColumn + * because we want to sort whole row + * based + */ +void TableView::sortColumn( int row, bool asc, bool ) { + QTable::sortColumn( row, asc, TRUE ); + +} +void TableView::viewportPaintEvent( QPaintEvent* e) { + qWarning("Paint event" ); + if (m_enablePaint ) + QTable::viewportPaintEvent( e ); +} -- cgit v0.9.0.2