-rw-r--r-- | core/pim/todo/main.cpp | 3 | ||||
-rw-r--r-- | core/pim/todo/mainwindow.cpp | 120 | ||||
-rw-r--r-- | core/pim/todo/mainwindow.h | 4 | ||||
-rw-r--r-- | core/pim/todo/opie-todo.control | 6 | ||||
-rw-r--r-- | core/pim/todo/otaskeditor.cpp | 14 | ||||
-rw-r--r-- | core/pim/todo/otaskeditor.h | 3 | ||||
-rw-r--r-- | core/pim/todo/quickedit.cpp | 1 | ||||
-rw-r--r-- | core/pim/todo/quickeditimpl.cpp | 7 | ||||
-rw-r--r-- | core/pim/todo/smalltodo.cpp | 1 | ||||
-rw-r--r-- | core/pim/todo/tableview.cpp | 84 | ||||
-rw-r--r-- | core/pim/todo/tableview.h | 18 | ||||
-rw-r--r-- | core/pim/todo/taskeditoralarms.cpp | 5 | ||||
-rw-r--r-- | core/pim/todo/taskeditoroverview.cpp | 6 | ||||
-rw-r--r-- | core/pim/todo/taskeditorstatus.cpp | 5 | ||||
-rw-r--r-- | core/pim/todo/templatedialogimpl.cpp | 1 | ||||
-rw-r--r-- | core/pim/todo/textviewshow.cpp | 18 | ||||
-rw-r--r-- | core/pim/todo/todomanager.cpp | 1 | ||||
-rw-r--r-- | core/pim/todo/todoshow.cpp | 8 | ||||
-rw-r--r-- | core/pim/todo/todoshow.h | 2 | ||||
-rw-r--r-- | core/pim/todo/todoview.cpp | 3 | ||||
-rw-r--r-- | core/pim/todo/todoview.h | 12 |
21 files changed, 264 insertions, 58 deletions
diff --git a/core/pim/todo/main.cpp b/core/pim/todo/main.cpp index 58ed45c..7763169 100644 --- a/core/pim/todo/main.cpp +++ b/core/pim/todo/main.cpp @@ -16,17 +16,16 @@ ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "mainwindow.h" -#include <qdatetime.h> #include <qpe/qpeapplication.h> void myMessages( QtMsgType, const char* ) { } int main( int argc, char **argv ) @@ -34,16 +33,16 @@ int main( int argc, char **argv ) qInstallMsgHandler( myMessages ); QPEApplication a( argc, argv ); QTime time; time.start(); Todo::MainWindow mw; int t = time.elapsed(); qWarning("QTime %d", t/1000 ); - mw.setCaption("Opie Todolist"); + mw.setCaption( QObject::tr("Opie Todolist")); QObject::connect( &a, SIGNAL( flush() ), &mw, SLOT( slotFlush() ) ); QObject::connect( &a, SIGNAL( reload() ), &mw, SLOT( slotReload() ) ); a.showMainWidget(&mw); return a.exec(); } diff --git a/core/pim/todo/mainwindow.cpp b/core/pim/todo/mainwindow.cpp index 5119ae0..6725951 100644 --- a/core/pim/todo/mainwindow.cpp +++ b/core/pim/todo/mainwindow.cpp @@ -66,16 +66,17 @@ using namespace Todo; MainWindow::MainWindow( QWidget* parent, const char* name ) : OPimMainWindow( "Todolist", parent, name, WType_TopLevel | WStyle_ContextHelp ) { m_syncing = false; + m_showing = false; m_counter = 0; m_tempManager = new TemplateManager(); m_tempManager->load(); initUI(); initConfig(); initViews(); initActions(); @@ -156,24 +157,27 @@ void MainWindow::initActions() { if ( Ir::supported() ) { a = new QAction( QWidget::tr( "Beam" ), Resource::loadPixmap( "beam" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( slotBeam() ) ); a->setWhatsThis( QWidget::tr( "Click here to send the current task to another device." ) ); a->addTo( m_edit ); a->addTo( m_tool ); } +#if 0 // Options menu a = new QAction( QWidget::tr("Find"), Resource::loadIconSet( "mag" ), QString::null, 0, this, 0 ); connect(a, SIGNAL( activated() ), this, SLOT( slotFind() ) ); a->addTo( m_options ); m_findAction = a; + m_options->insertSeparator(); +#endif m_completedAction = new QAction( QString::null, QWidget::tr("Show completed tasks"), 0, this, 0, TRUE ); m_completedAction->addTo( m_options ); m_completedAction->setOn( showCompleted() ); connect(m_completedAction, SIGNAL( toggled(bool) ), this, SLOT(slotShowCompleted(bool) ) ); a = new QAction( QString::null, QWidget::tr("Show only over-due tasks"), @@ -347,16 +351,17 @@ TodoShow* MainWindow::currentShow() { } void MainWindow::slotReload() { m_todoMgr.reload(); currentView()->updateView( ); raiseCurrentView(); } void MainWindow::closeEvent( QCloseEvent* e ) { if (m_stack->visibleWidget() == currentShow()->widget() ) { + m_showing = false; raiseCurrentView(); e->ignore(); return; } /* * we should have flushed and now we're still saving * so there is no need to flush */ @@ -404,94 +409,112 @@ void MainWindow::populateTemplates() { QStringList::Iterator it; for ( it = list.begin(); it != list.end(); ++it ) { m_template->insertItem( (*it) ); } } /* * slotNewFromTemplate * We use the edit widget to do - * the config but we setUid(-1) + * the config but we setUid(1) * to get a new uid */ /* * first we get the name of the template * then we will use the TemplateManager */ void MainWindow::slotNewFromTemplate( int id ) { QString name = m_template->text( id ); OTodo event = templateManager()->templateEvent( name ); event = currentEditor()->edit(this, event ); if ( currentEditor()->accepted() ) { /* assign new todo */ - event.setUid( -1 ); - currentView()->addEvent( event ); + event.setUid( 1 ); + handleAlarms( OTodo(), event ); m_todoMgr.add( event ); + currentView()->addEvent( event ); populateCategories(); } + raiseCurrentView(); } void MainWindow::slotNew() { create(); } void MainWindow::slotDuplicate() { if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), - QWidget::tr("Can not edit data, currently syncing")); + QWidget::tr("Data can not be edited, currently syncing")); return; } OTodo ev = m_todoMgr.event( currentView()->current() ); /* let's generate a new uid */ - ev.setUid(-1); + ev.setUid(1); m_todoMgr.add( ev ); currentView()->addEvent( ev ); raiseCurrentView(); } void MainWindow::slotDelete() { if (!currentView()->current() ) return; if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), - QWidget::tr("Can not edit data, currently syncing")); + QWidget::tr("Data can not be edited, currently syncing")); return; } QString strName = currentView()->currentRepresentation(); if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), strName ) ) return; - handleAlarms( OTodo(), m_todoMgr.event( currentView()->current() ) ); + handleAlarms( m_todoMgr.event( currentView()->current() ), OTodo() ); m_todoMgr.remove( currentView()->current() ); currentView()->removeEvent( currentView()->current() ); raiseCurrentView(); } +void MainWindow::slotDelete(int uid ) { + if( uid == 0 ) return; + if(m_syncing) { + QMessageBox::warning(this, QWidget::tr("Todo"), + QWidget::tr("Data can not be edited, currently syncing")); + return; + } + OTodo to = m_todoMgr.event(uid); + if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), to.toShortText() ) ) + return; + + handleAlarms(to, OTodo() ); + m_todoMgr.remove( to.uid() ); + currentView()->removeEvent( to.uid() ); + raiseCurrentView(); +} void MainWindow::slotDeleteAll() { if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), - QWidget::tr("Can not edit data, currently syncing")); + QWidget::tr("Data can not be edited, currently syncing")); return; } if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all tasks?") ) ) return; m_todoMgr.removeAll(); currentView()->clear(); raiseCurrentView(); } void MainWindow::slotDeleteCompleted() { if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), - QWidget::tr("Can not edit data, currently syncing")); + QWidget::tr("Data can not be edited, currently syncing")); return; } if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all completed tasks?") ) ) return; m_todoMgr.removeCompleted(); @@ -561,32 +584,36 @@ void MainWindow::slotBeam() { beam( currentView()->current() ); } void MainWindow::beamDone( Ir* ir) { delete ir; ::unlink( beamfile ); } void MainWindow::receiveFile( const QString& filename ) { OTodoAccessVCal* cal = new OTodoAccessVCal(filename ); + OTodoAccess acc( cal ); acc.load(); OTodoAccess::List list = acc.allRecords(); + if (list.count()){ + QString message = QWidget::tr("<P>%1 new tasks arrived.<p>Would you like to add them to your Todolist?").arg(list.count() ); if ( QMessageBox::information(this, QWidget::tr("New Tasks"), message, QMessageBox::Ok, QMessageBox::Cancel ) == QMessageBox::Ok ) { OTodoAccess::List::Iterator it; for ( it = list.begin(); it != list.end(); ++it ) m_todoMgr.add( (*it) ); currentView()->updateView(); } } +} void MainWindow::slotFlush() { m_syncing = FALSE; m_todoMgr.save(); } void MainWindow::slotShowDetails() { slotShow( currentView()->current() ); } @@ -629,43 +656,60 @@ QString MainWindow::currentCategory()const { } int MainWindow::currentCatId() { return m_todoMgr.catId( m_curCat ); } ViewBase* MainWindow::currentView() { return m_curView; } void MainWindow::raiseCurrentView() { + // due QPE/Application/todolist show(int) + // we might not have the populateCategories slot called once + // we would show the otodo but then imediately switch to the currentView + // if we're initially showing we shouldn't raise the table + // in returnFromView we fix up m_showing + if (m_showing ) return; + m_stack->raiseWidget( m_curView->widget() ); } void MainWindow::slotShowDue(bool ov) { m_overdue = ov; currentView()->showOverDue( ov ); raiseCurrentView(); } void MainWindow::slotShow( int uid ) { + if ( uid == 0 ) return; qWarning("slotShow"); currentShow()->slotShow( event( uid ) ); m_stack->raiseWidget( currentShow()->widget() ); } +void MainWindow::slotShowNext() { + int l = currentView()->next(); + if (l!=0) + slotShow(l); +} +void MainWindow::slotShowPrev() { + int l = currentView()->prev(); + if (l!=0) + slotShow(l); +} void MainWindow::slotEdit( int uid ) { - if (uid == 1 ) return; + if (uid == 0 ) return; if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), - QWidget::tr("Can not edit data, currently syncing")); + QWidget::tr("Data can't be edited, currently syncing")); return; } OTodo old_todo = m_todoMgr.event( uid ); OTodo todo = currentEditor()->edit(this, old_todo ); /* if completed */ if ( currentEditor()->accepted() ) { - qWarning("Replacing now" ); handleAlarms( old_todo, todo ); m_todoMgr.update( todo.uid(), todo ); currentView()->replaceEvent( todo ); /* a Category might have changed */ populateCategories(); } raiseCurrentView(); @@ -713,48 +757,75 @@ void MainWindow::slotComplete( const OTodo& todo ) { to.setCompletedDate( QDate::currentDate() ); /* * if the item does recur * we need to spin it off * and update the items duedate to the next * possible recurrance of this item... * the spinned off one will loose the + * recurrence. + * We calculate the difference between the old due date and the + * new one and add this diff to start, completed and alarm dates + * -zecke */ if ( to.hasRecurrence() && to.isCompleted() ) { OTodo to2( to ); /* the spinned off one won't recur anymore */ to.setRecurrence( ORecur() ); ORecur rec = to2.recurrence(); rec.setStart( to.dueDate() ); to2.setRecurrence( rec ); /* * if there is a next occurence * from the duedate of the last recurrance */ QDate date; if ( to2.recurrence().nextOcurrence( to2.dueDate().addDays(1), date ) ) { + int dayDiff = to.dueDate().daysTo( date ); + qWarning("day diff is %d", dayDiff ); QDate inval; /* generate a new uid for the old record */ to.setUid( 1 ); /* add the old one cause it has a new UID here cause it was spin off */ m_todoMgr.add( to ); /* * update the due date * start date * and complete date */ to2.setDueDate( date ); - to2.setStartDate( inval ); + rec.setStart( date ); + to2.setRecurrence( rec ); // could be Monday, TuesDay, Thursday every week + + /* move start date */ + if (to2.hasStartDate() ) + to2.setStartDate( to2.startDate().addDays( dayDiff ) ); + + /* now the alarms */ + if (to2.hasNotifiers() ) { + OPimNotifyManager::Alarms _als = to2.notifiers().alarms(); + OPimNotifyManager::Alarms als; + + /* for every alarm move the day */ + for ( OPimNotifyManager::Alarms::Iterator it = _als.begin(); it != _als.end(); ++it ) { + OPimAlarm al = (*it); + al.setDateTime( al.dateTime().addDays( dayDiff ) ); + als.append( al ); + } + to2.notifiers().setAlarms( als ); + handleAlarms( OTodo(), todo ); + } to2.setCompletedDate( inval ); to2.setCompleted( false ); + updateTodo( to2 ); }else updateTodo( to ); }else updateTodo( to ); currentView()->updateView(); raiseCurrentView(); @@ -764,19 +835,20 @@ void MainWindow::flush() { } void MainWindow::reload() { slotReload(); } int MainWindow::create() { int uid = 0; if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), - QWidget::tr("Can not edit data, currently syncing")); + QWidget::tr("Data can not be edited, currently syncing")); return uid; } + m_todoMgr.load(); OTodo todo = currentEditor()->newTodo( currentCatId(), this ); if ( currentEditor()->accepted() ) { //todo.assignUid(); uid = todo.uid(); @@ -799,49 +871,60 @@ bool MainWindow::remove( int uid ) { if (m_syncing) return false; /* argh need to get the whole OEvent... to disable alarms -zecke */ handleAlarms( OTodo(), m_todoMgr.event( uid ) ); return m_todoMgr.remove( uid ); } void MainWindow::beam( int uid) { + if( uid == 0 ) return; + ::unlink( beamfile ); + m_todoMgr.load(); + OTodo todo = event( uid ); OTodoAccessVCal* cal = new OTodoAccessVCal(QString::fromLatin1(beamfile) ); OTodoAccess acc( cal ); acc.load(); acc.add( todo ); acc.save(); Ir* ir = new Ir(this ); connect(ir, SIGNAL(done(Ir*) ), this, SLOT(beamDone(Ir*) ) ); ir->send(beamfile, todo.summary(), "text/x-vCalendar" ); } void MainWindow::show( int uid ) { + m_todoMgr.load(); // might not be loaded yet + m_showing = true; slotShow( uid ); + raise(); + QPEApplication::setKeepRunning(); } void MainWindow::edit( int uid ) { + m_todoMgr.load(); slotEdit( uid ); } void MainWindow::add( const OPimRecord& rec) { if ( rec.rtti() != OTodo::rtti() ) return; + m_todoMgr.load(); // might not be loaded const OTodo& todo = static_cast<const OTodo&>(rec); m_todoMgr.add(todo ); currentView()->addEvent( todo ); // I'm afraid we must call this every time now, otherwise // spend expensive time comparing all these strings... // but only call if we changed something -zecke populateCategories(); } void MainWindow::slotReturnFromView() { + m_showing = false; raiseCurrentView(); } namespace { OPimNotifyManager::Alarms findNonMatching( const OPimNotifyManager::Alarms& oldAls, const OPimNotifyManager::Alarms& newAls ) { OPimNotifyManager::Alarms nonMatching; OPimNotifyManager::Alarms::ConstIterator oldIt = oldAls.begin(); @@ -927,26 +1010,27 @@ void MainWindow::doAlarm( const QDateTime& dt, int uid ) { QDialog dlg(this, 0, TRUE ); QVBoxLayout* lay = new QVBoxLayout( &dlg ); QTextView* view = new QTextView( &dlg ); lay->addWidget( view ); QPushButton* btnOk = new QPushButton( tr("Ok"), &dlg ); connect( btnOk, SIGNAL(clicked() ), &dlg, SLOT(accept() ) ); lay->addWidget( btnOk ); - QString text = tr("<h1>Alarm at %0</h1><br>").arg( TimeString::dateString( dt ) ); + QString text = tr("<h1>Alarm at %1</h1><br>").arg( TimeString::dateString( dt ) ); text += todo.toRichText(); view->setText( text ); dlg.showMaximized(); bool needToStay = dlg.exec(); if (loud) killAlarm(); if (needToStay) { - showMaximized(); - raise(); +// showMaximized(); +// raise(); QPEApplication::setKeepRunning(); - setActiveWindow(); +// setActiveWindow(); } } + diff --git a/core/pim/todo/mainwindow.h b/core/pim/todo/mainwindow.h index 02e2449..b04a958 100644 --- a/core/pim/todo/mainwindow.h +++ b/core/pim/todo/mainwindow.h @@ -113,16 +113,17 @@ private slots: void initConfig(); void initViews(); void initEditor(); void initShow(); void initTemplate(); void raiseCurrentView(); ViewBase* currentView(); ViewBase* m_curView; + bool m_showing : 1; // used to see if we show a todo in the cases we shouldn't change the table QuickEditBase* m_curQuick; Editor* m_curEdit; TodoShow* currentShow(); TodoShow* m_curShow; TemplateEditor* currentTemplateEditor(); TemplateEditor* m_curTempEd; QMenuBar* m_bar; @@ -162,16 +163,17 @@ private slots: void slotUpdate3( QWidget* ); void slotComplete( int uid ); void slotComplete( const OTodo& ev ); void slotNewFromTemplate(int id ); void slotNew(); void slotDuplicate(); void slotDelete(); + void slotDelete(int uid ); void slotDeleteAll(); void slotDeleteCompleted(); void slotEdit(); void slotFind(); void setCategory( int ); @@ -180,16 +182,18 @@ private slots: void slotShowQuickTask( bool ); void setDocument( const QString& ); void slotBeam(); void beamDone( Ir* ); void slotShowDetails(); + void slotShowNext(); + void slotShowPrev(); void slotShowDue( bool ); void slotReturnFromView(); // for TodoShow... /* reimplementation from opimmainwindow */ protected slots: void flush(); void reload(); int create(); bool remove( int uid ); diff --git a/core/pim/todo/opie-todo.control b/core/pim/todo/opie-todo.control index b579306..17a65a8 100644 --- a/core/pim/todo/opie-todo.control +++ b/core/pim/todo/opie-todo.control @@ -1,10 +1,10 @@ Package: opie-todo -Files: bin/todolist apps/1Pim/todo.desktop pics/todo +Files: bin/todolist apps/1Pim/todo.desktop Priority: optional Section: opie/applications Maintainer: Holger 'zecke' Freyther <zecke@handhelds.org> Architecture: arm -Version: $QPE_VERSION-$SUB_VERSION -Depends: task-opie-minimal, libopie1 +Depends: task-opie-minimal, libopie1, opie-pics Description: TODO-list manager A Todo-list manager for the Opie environment. +Version: $QPE_VERSION$EXTRAVERSION diff --git a/core/pim/todo/otaskeditor.cpp b/core/pim/todo/otaskeditor.cpp index 84f854f..1ed20b4 100644 --- a/core/pim/todo/otaskeditor.cpp +++ b/core/pim/todo/otaskeditor.cpp @@ -1,12 +1,9 @@ -#include <qdatetime.h> -#include <qlabel.h> #include <qlayout.h> -#include <qmultilineedit.h> #include <opie/orecurrancewidget.h> #include "taskeditoroverview.h" #include "taskeditorstatus.h" #include "taskeditoralarms.h" #include "otaskeditor.h" @@ -21,45 +18,44 @@ OTaskEditor::OTaskEditor( const OTodo& to) init(); init( to ); } OTaskEditor::~OTaskEditor() { } void OTaskEditor::init( int cur ) { OTodo to; + to.setUid( 1 ); // generate a new uid if ( cur != 0 ) to.setCategories( cur ); load(to); - m_uid = 1; // generate a new one } void OTaskEditor::init( const OTodo& to ) { load( to ); - m_uid = to.uid(); } OTodo OTaskEditor::todo()const{ qWarning("saving!"); - OTodo to; - to.setUid(m_uid ); + OTodo to ( m_todo ); m_overView->save( to ); m_stat->save( to ); to.setRecurrence( m_rec->recurrence() ); m_alarm->save( to ); return to; } void OTaskEditor::load(const OTodo& to) { m_overView->load( to ); m_stat->load( to ); m_rec->setRecurrence( to.recurrence(), to.hasDueDate() ? to.dueDate() : QDate::currentDate() ); - m_alarm->setEnabled( !to.hasRecurrence() ); m_alarm->load( to ); + + m_todo = to; } void OTaskEditor::init() { - setCaption("Task Editor"); + setCaption(tr("Task Editor") ); QVBoxLayout* layo = new QVBoxLayout( this ); m_tab = new OTabWidget( this ); layo->addWidget( m_tab ); /* * Add the Widgets */ diff --git a/core/pim/todo/otaskeditor.h b/core/pim/todo/otaskeditor.h index 795f333..2daae52 100644 --- a/core/pim/todo/otaskeditor.h +++ b/core/pim/todo/otaskeditor.h @@ -32,13 +32,12 @@ private: void init(); OTabWidget *m_tab; TaskEditorOverView *m_overView; TaskEditorStatus *m_stat; TaskEditorAlarms *m_alarm; TaskEditorAlarms *m_remind; ORecurranceWidget *m_rec; - int m_uid; - + OTodo m_todo; }; #endif diff --git a/core/pim/todo/quickedit.cpp b/core/pim/todo/quickedit.cpp index edcd48a..16fc53a 100644 --- a/core/pim/todo/quickedit.cpp +++ b/core/pim/todo/quickedit.cpp @@ -1,9 +1,8 @@ -#include "mainwindow.h" #include "quickedit.h" using namespace Todo; // not so interesting part base Implementation QuickEdit::QuickEdit(MainWindow* main ) : m_main( main ) { m_sig = new QSignal(); diff --git a/core/pim/todo/quickeditimpl.cpp b/core/pim/todo/quickeditimpl.cpp index f4c7c47..70e0582 100644 --- a/core/pim/todo/quickeditimpl.cpp +++ b/core/pim/todo/quickeditimpl.cpp @@ -26,22 +26,27 @@ QuickEditImpl::QuickEditImpl( QWidget* parent, bool visible ) m_lbl->setPixmap( priority3 ); connect(m_lbl, SIGNAL(clicked() ), this, SLOT(slotPrio()) ); QWhatsThis::add( m_lbl, QWidget::tr( "Click here to set the priority of new task.\n\nThis area is called the quick task bar.\n\nIt allows you to quickly add a new task to your list. This area can be shown or hidden by selecting Options->'Show quick task bar' from the menu above." ) ); m_edit = new QLineEdit( this ); setStretchableWidget( m_edit ); QWhatsThis::add( m_edit, QWidget::tr( "Enter description of new task here.\n\nThis area is called the quick task bar.\n\nIt allows you to quickly add a new task to your list. This area can be shown or hidden by selecting Options->'Show quick task bar' from the menu above." ) ); + /* + * it's not implemented and won't be implemented for 1.0 + */ +#if 0 QAction *a = new QAction( QWidget::tr( "More" ), Resource::loadPixmap( "todo/more" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( slotMore() ) ); a->addTo( this ); a->setWhatsThis( QWidget::tr( "Click here to enter additional information for new task.\n\nThis area is called the quick task bar.\n\nIt allows you to quickly add a new task to your list. This area can be shown or hidden by selecting Options->'Show quick task bar' from the menu above." ) ); +#endif - a = new QAction( QWidget::tr( "Enter" ), Resource::loadPixmap( "enter" ), QString::null, 0, this, 0 ); + QAction *a = new QAction( QWidget::tr( "Enter" ), Resource::loadPixmap( "enter" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( slotEnter() ) ); a->addTo( this ); a->setWhatsThis( QWidget::tr( "Click here to add new task.\n\nThis area is called the quick task bar.\n\nIt allows you to quickly add a new task to your list. This area can be shown or hidden by selecting Options->'Show quick task bar' from the menu above." ) ); a = new QAction( QWidget::tr( "Cancel" ), Resource::loadPixmap( "close" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( slotCancel() ) ); a->addTo( this ); a->setWhatsThis( QWidget::tr( "Click here to reset new task information.\n\nThis area is called the quick task bar.\n\nIt allows you to quickly add a new task to your list. This area can be shown or hidden by selecting Options->'Show quick task bar' from the menu above." ) ); diff --git a/core/pim/todo/smalltodo.cpp b/core/pim/todo/smalltodo.cpp index 412fe9e..504256d 100644 --- a/core/pim/todo/smalltodo.cpp +++ b/core/pim/todo/smalltodo.cpp @@ -20,17 +20,16 @@ -. .:....=;==+<; 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 <qshared.h> #include "smalltodo.h" using namespace Todo; struct SmallTodo::SmallTodoPrivate : public QShared{ SmallTodoPrivate() : QShared(), uid(-1) {}; diff --git a/core/pim/todo/tableview.cpp b/core/pim/todo/tableview.cpp index d9cda09..2e252d5 100644 --- a/core/pim/todo/tableview.cpp +++ b/core/pim/todo/tableview.cpp @@ -22,21 +22,21 @@ -- :-=` 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 <stdlib.h> #include <cmath> +#include <cctype> #include <qcombobox.h> #include <qlineedit.h> #include <qtimer.h> -#include <qpoint.h> #include <qpopupmenu.h> #include <qpe/config.h> #include <qpe/resource.h> #include <opie/orecur.h> #include "mainwindow.h" @@ -45,16 +45,37 @@ using namespace Todo; namespace { static const int BoxSize = 14; static const int RowHeight = 20; } +TableView::EditorWidget::EditorWidget() : m_wid(0l), m_row(-1), m_col(-1) { +} +void TableView::EditorWidget::setCellWidget(QWidget* wid, int row, int col ) { + m_wid = wid; + m_row = row; + m_col = col; +} +void TableView::EditorWidget::releaseCellWidget() { + m_wid = 0; + m_row = m_col = -1; +} +QWidget* TableView::EditorWidget::cellWidget()const { + return m_wid; +} +int TableView::EditorWidget::cellRow()const { + return m_row; +} +int TableView::EditorWidget::cellCol()const { + return m_col; +} + void TableView::initConfig() { Config config( "todo" ); config.setGroup( "Options" ); m_completeStrokeWidth = config.readNumEntry( "CompleteStrokeWidth", 8 ); for (int i = 0; i < numCols(); i++ ) { int width = config.readNumEntry("Width"+QString::number(i), -1 ); setColumnWidth(i, width == -1 ? columnWidth(i) : width ); @@ -138,21 +159,34 @@ void TableView::slotShowMenu() { QPopupMenu *menu = todoWindow()->contextMenu( current(), sorted()[currentRow()].recurrence().doesRecur() ); menu->exec(QCursor::pos() ); delete menu; } QString TableView::type() const { return QString::fromLatin1( tr("Table View") ); } int TableView::current() { - if (numRows() == 0 ) return 1; + if (numRows() == 0 ) return 0; int uid = sorted().uidAt(currentRow() ); return uid; } +int TableView::next() { + if ( numRows() == 0 ) return 0; + if ( currentRow() + 1 >= numRows() ) return 0; + setCurrentCell( currentRow() +1, currentColumn() ); + return sorted().uidAt( currentRow() ); +} +int TableView::prev() { + if ( numRows() == 0 ) return 0; + if ( currentRow() - 1 < 0 ) return 0; + setCurrentCell( currentRow() -1, currentColumn() ); + return sorted().uidAt( currentRow() ); + +} QString TableView::currentRepresentation() { OTodo to = sorted()[currentRow()]; return to.summary().isEmpty() ? to.description().left(20) : to.summary() ; } /* show overdue */ void TableView::showOverDue( bool ) { clear(); updateView(); @@ -214,21 +248,21 @@ void TableView::replaceEvent( const OTodo& ev) { * re aligning table can be slow too * FIXME: look what performs better * either this or the old align table */ void TableView::removeEvent( int ) { updateView(); } void TableView::setShowCompleted( bool b) { - qWarning("Show Completed %d" + b ); + qWarning("Show Completed %d" , b ); updateView(); } void TableView::setShowDeadline( bool b ) { - qWarning( "Show DeadLine %d" + b ); + qWarning( "Show DeadLine %d" , b ); if ( b ) showColumn( 3 ); else hideColumn( 3 ); // Try to intelligently size columns // TODO - would use width() below, but doesn't have valid value at time of c'tor int col2width = 238; @@ -254,16 +288,23 @@ void TableView::setShowCategory( const QString& str) { m_first = false; } void TableView::clear() { setNumRows(0); } void TableView::slotClicked(int row, int col, int, const QPoint& point) { + if ( m_editorWidget.cellWidget() ) { + //setCellContentFromEditor(m_editorWidget.cellRow(), m_editorWidget.cellCol() ); + endEdit(m_editorWidget.cellRow(), m_editorWidget.cellCol(), + true, true ); + m_editorWidget.releaseCellWidget(); + } + if ( !cellGeometry(row, col ).contains(point ) ) return; int ui= sorted().uidAt( row ); switch( col ) { case 0:{ @@ -275,17 +316,21 @@ void TableView::slotClicked(int row, int col, int, x <= ( w - BoxSize ) / 2 + BoxSize && y >= ( h - BoxSize ) / 2 && y <= ( h - BoxSize ) / 2 + BoxSize ) { TodoView::complete(sorted()[row] ); } } break; - case 1: + // Priority emit a double click... + case 1:{ + QWidget* wid = beginEdit( row, col, FALSE ); + m_editorWidget.setCellWidget( wid, row, col ); + } break; case 2: { m_menuTimer->stop(); showTodo( ui ); break; } case 3: { @@ -441,16 +486,17 @@ QWidget* TableView::createEditor(int row, int col, bool )const { return edit; } case 0: default: return 0l; } } void TableView::setCellContentFromEditor(int row, int col ) { + qWarning("set cell content from editor"); if ( col == 1 ) { QWidget* wid = cellWidget(row, 1 ); if ( wid->inherits("QComboBox") ) { int pri = ((QComboBox*)wid)->currentItem() + 1; OTodo todo = sorted()[row]; if ( todo.priority() != pri ) { todo.setPriority( pri ); TodoView::update( todo.uid(), todo ); @@ -537,18 +583,46 @@ void TableView::contentsMouseReleaseEvent( QMouseEvent* e) { } QTable::contentsMouseReleaseEvent( e ); } void TableView::contentsMouseMoveEvent( QMouseEvent* e ) { m_menuTimer->stop(); QTable::contentsMouseMoveEvent( e ); } void TableView::keyPressEvent( QKeyEvent* event) { + if ( m_editorWidget.cellWidget() ) { +// setCellContentFromEditor(m_editorWidget.cellRow(), m_editorWidget.cellCol() ); + endEdit(m_editorWidget.cellRow(), m_editorWidget.cellCol(), + true, true ); + m_editorWidget.releaseCellWidget(); + setFocus(); + } + int row = currentRow(); + int col = currentColumn(); + + char key = ::toupper( event->ascii() ); + /* let QTable also handle the d later */ + if ( key == 'D' ) + removeQuery( sorted().uidAt( row ) ); + + switch( event->key() ) { case Qt::Key_F33: case Qt::Key_Enter: case Qt::Key_Return: + case Qt::Key_Space: + if ( col == 0 ) { + TodoView::complete(sorted()[row]); + }else if ( col == 1 ) { + QWidget* wid = beginEdit(row, col, FALSE ); + m_editorWidget.setCellWidget( wid, row, col ); + }else if ( col == 2 ) { showTodo( sorted().uidAt( currentRow() ) ); + }else if ( col == 3 ) { + TodoView::edit( sorted().uidAt(row) ); + } + break; default: QTable::keyPressEvent( event ); } } + diff --git a/core/pim/todo/tableview.h b/core/pim/todo/tableview.h index 689c496..528ddc9 100644 --- a/core/pim/todo/tableview.h +++ b/core/pim/todo/tableview.h @@ -45,16 +45,18 @@ namespace Todo { public: TableView( MainWindow*, QWidget* parent ); ~TableView(); QString type()const; int current(); QString currentRepresentation(); + int next(); + int prev(); void clear(); void showOverDue( bool ); void updateView(); void setTodo( int uid, const OTodo& ); void addEvent( const OTodo& event ); void replaceEvent( const OTodo& ); void removeEvent( int uid ); @@ -86,16 +88,32 @@ namespace Todo { protected: void keyPressEvent( QKeyEvent* ); void contentsMouseReleaseEvent( QMouseEvent* ); void contentsMouseMoveEvent( QMouseEvent* ); void timerEvent( QTimerEvent* e ); QWidget* createEditor(int row, int col, bool initFromCell )const; void setCellContentFromEditor( int row, int col ); + /** + * for inline editing on single click and to work around some + * bug in qt2.3.5 + */ + struct EditorWidget { + EditorWidget(); + void setCellWidget(QWidget*, int row, int col ); + void releaseCellWidget(); + QWidget* cellWidget()const; + int cellRow()const; + int cellCol()const; + private: + QWidget* m_wid; + int m_row, m_col; + }; + EditorWidget m_editorWidget; private slots: void slotShowMenu(); void slotClicked(int, int, int, const QPoint& ); void slotPressed(int, int, int, const QPoint& ); void slotValueChanged(int, int); diff --git a/core/pim/todo/taskeditoralarms.cpp b/core/pim/todo/taskeditoralarms.cpp index bff3338..bcc40fe 100644 --- a/core/pim/todo/taskeditoralarms.cpp +++ b/core/pim/todo/taskeditoralarms.cpp @@ -29,24 +29,19 @@ #include "taskeditoralarms.h" #include <opie/otodo.h> #include <opie/opimnotifymanager.h> #include <opie/otimepicker.h> #include <qpe/datebookmonth.h> #include <qpe/resource.h> -#include <qpe/timestring.h> -#include <qdatetime.h> #include <qlistview.h> -#include <qpushbutton.h> -#include <qpopupmenu.h> #include <qlayout.h> -#include <qwhatsthis.h> class AlarmItem : public QListViewItem { public: AlarmItem( QListView*, const OPimAlarm& ); ~AlarmItem(); OPimAlarm alarm()const; diff --git a/core/pim/todo/taskeditoroverview.cpp b/core/pim/todo/taskeditoroverview.cpp index 9a8abea..415dcf2 100644 --- a/core/pim/todo/taskeditoroverview.cpp +++ b/core/pim/todo/taskeditoroverview.cpp @@ -28,20 +28,18 @@ #include "taskeditoroverview.h" #include <opie/orecur.h> #include <qpe/categoryselect.h> #include <qpe/datebookmonth.h> #include <qpe/resource.h> -#include <qpe/timestring.h> #include <qcheckbox.h> -#include <qcombobox.h> #include <qlabel.h> #include <qlayout.h> #include <qmultilineedit.h> #include <qwhatsthis.h> TaskEditorOverView::TaskEditorOverView( QWidget* parent, const char* name, WFlags fl ) : QWidget( parent, name, fl ) { @@ -63,17 +61,17 @@ TaskEditorOverView::TaskEditorOverView( QWidget* parent, const char* name, WFla sv->setFrameStyle( QFrame::NoFrame ); QWidget *container = new QWidget( sv->viewport() ); sv->addChild( container ); QGridLayout *layout = new QGridLayout( container, 7, 2, 4, 4 ); // Description - QLabel *label = new QLabel( tr( "Description:" ), container ); + QLabel *label = new QLabel( tr( "Summary:" ), container ); layout->addWidget( label, 0, 0 ); QWhatsThis::add( label, tr( "Enter brief description of the task here." ) ); cmbDesc = new QComboBox( TRUE, container ); cmbDesc->insertItem( tr( "Complete " ) ); cmbDesc->insertItem( tr( "Work on " ) ); cmbDesc->insertItem( tr( "Buy " ) ); cmbDesc->insertItem( tr( "Organize " ) ); cmbDesc->insertItem( tr( "Get " ) ); @@ -111,17 +109,17 @@ TaskEditorOverView::TaskEditorOverView( QWidget* parent, const char* name, WFla // Recurrence ckbRecurrence = new QCheckBox( tr( "Recurring task" ), container ); layout->addMultiCellWidget( ckbRecurrence, 4, 4, 0, 1 ); QWhatsThis::add( ckbRecurrence, tr( "Click here if task happens on a regular basis. If selected, frequency can be set on the Recurrence tab." ) ); connect( ckbRecurrence, SIGNAL(clicked() ), this, SLOT( slotRecClicked() ) ); // Notes - label = new QLabel( tr( "Notes:" ), container ); + label = new QLabel( tr( "Description:" ), container ); layout->addWidget( label, 5, 0 ); QWhatsThis::add( label, tr( "Enter any additional information about this task here." ) ); mleNotes = new QMultiLineEdit( container ); mleNotes->setWordWrap( QMultiLineEdit::WidgetWidth ); layout->addMultiCellWidget( mleNotes, 6, 6, 0, 1 ); QWhatsThis::add( mleNotes, tr( "Enter any additional information about this task here." ) ); } diff --git a/core/pim/todo/taskeditorstatus.cpp b/core/pim/todo/taskeditorstatus.cpp index 0ab4223..98e3cea 100644 --- a/core/pim/todo/taskeditorstatus.cpp +++ b/core/pim/todo/taskeditorstatus.cpp @@ -28,25 +28,21 @@ #include "taskeditorstatus.h" #include <opie/otodo.h> #include <opie/opimmaintainer.h> #include <opie/opimstate.h> #include <qpe/datebookmonth.h> -#include <qpe/resource.h> -#include <qpe/timestring.h> #include <qcheckbox.h> #include <qcombobox.h> #include <qlabel.h> #include <qlayout.h> -#include <qscrollview.h> -#include <qtoolbutton.h> #include <qwhatsthis.h> // FIXME add the hack slots instead of setPopup!!!! // drw you shouldn't have removed them TaskEditorStatus::TaskEditorStatus( QWidget* parent, const char* name, WFlags fl ) : QWidget( parent, name, fl ) { @@ -298,9 +294,10 @@ void TaskEditorStatus::slotCompChanged(int y, int m, int d) m_comp.setYMD( y, m, d ); btnComp->setText( TimeString::longDateString( m_comp ) ); } void TaskEditorStatus::slotDueChanged(int y, int m, int d) { m_due.setYMD( y, m, d ); btnDue->setText( TimeString::longDateString( m_due ) ); + emit dueDateChanged( m_due ); } diff --git a/core/pim/todo/templatedialogimpl.cpp b/core/pim/todo/templatedialogimpl.cpp index fed92f0..c2306ac 100644 --- a/core/pim/todo/templatedialogimpl.cpp +++ b/core/pim/todo/templatedialogimpl.cpp @@ -1,9 +1,8 @@ -#include <qlistview.h> #include <qlineedit.h> #include "mainwindow.h" #include "todoeditor.h" #include "todotemplatemanager.h" #include "templatedialogimpl.h" diff --git a/core/pim/todo/textviewshow.cpp b/core/pim/todo/textviewshow.cpp index fe8a9c8..35ea74b 100644 --- a/core/pim/todo/textviewshow.cpp +++ b/core/pim/todo/textviewshow.cpp @@ -1,9 +1,8 @@ -#include "mainwindow.h" #include "textviewshow.h" using namespace Todo; TextViewShow::TextViewShow( QWidget* parent, MainWindow* win) : QTextView( parent ), TodoShow(win) { } @@ -15,18 +14,35 @@ QString TextViewShow::type()const { void TextViewShow::slotShow( const OTodo& ev ) { setText( ev.toRichText() ); } QWidget* TextViewShow::widget() { return this; } void TextViewShow::keyPressEvent( QKeyEvent* event ) { switch( event->key() ) { + case Qt::Key_Up: + if ( ( visibleHeight() < contentsHeight() ) && + ( verticalScrollBar()->value() > verticalScrollBar()->minValue() ) ) + scrollBy( 0, -(visibleHeight()-20) ); + else + showPrev(); + break; + case Qt::Key_Down: + if ( ( visibleHeight() < contentsHeight() ) && + ( verticalScrollBar()->value() < verticalScrollBar()->maxValue() ) ) + scrollBy( 0, visibleHeight()-20 ); + else + showNext(); + break; + case Qt::Key_Left: + case Qt::Key_Right: case Qt::Key_F33: case Qt::Key_Enter: case Qt::Key_Return: + case Qt::Key_Space: escapeView(); break; default: QTextView::keyPressEvent( event ); break; } } diff --git a/core/pim/todo/todomanager.cpp b/core/pim/todo/todomanager.cpp index df2e711..501cca7 100644 --- a/core/pim/todo/todomanager.cpp +++ b/core/pim/todo/todomanager.cpp @@ -20,17 +20,16 @@ -. .:....=;==+<; 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 <qdatetime.h> #include <qpe/categoryselect.h> #include "todomanager.h" using namespace Todo; TodoManager::TodoManager( QObject *obj ) : QObject( obj ) { diff --git a/core/pim/todo/todoshow.cpp b/core/pim/todo/todoshow.cpp index 4dbc9aa..5962028 100644 --- a/core/pim/todo/todoshow.cpp +++ b/core/pim/todo/todoshow.cpp @@ -9,8 +9,16 @@ TodoShow::TodoShow(MainWindow* win) { } TodoShow::~TodoShow() { } void TodoShow::escapeView() { if (m_win ) m_win->slotReturnFromView(); } +void TodoShow::showNext() { + if (m_win) + m_win->slotShowNext(); +} +void TodoShow::showPrev() { + if (m_win) + m_win->slotShowPrev(); +} diff --git a/core/pim/todo/todoshow.h b/core/pim/todo/todoshow.h index 7267b13..2babe93 100644 --- a/core/pim/todo/todoshow.h +++ b/core/pim/todo/todoshow.h @@ -45,14 +45,16 @@ namespace Todo { public: TodoShow( MainWindow* win); virtual ~TodoShow(); virtual QString type()const = 0; virtual void slotShow( const OTodo& ev ) = 0; virtual QWidget* widget() = 0; protected: void escapeView(); + void showNext(); + void showPrev(); private: MainWindow *m_win; }; }; #endif diff --git a/core/pim/todo/todoview.cpp b/core/pim/todo/todoview.cpp index 3e808e7..31047cf 100644 --- a/core/pim/todo/todoview.cpp +++ b/core/pim/todo/todoview.cpp @@ -59,8 +59,11 @@ void TodoView::remove( int uid ) { m_main->m_todoMgr.remove( uid ); } void TodoView::complete( int uid ) { m_main->slotComplete( uid ); } void TodoView::complete( const OTodo& ev ) { m_main->slotComplete( ev ); } +void TodoView::removeQuery( int uid ) { + m_main->slotDelete( uid ); +} diff --git a/core/pim/todo/todoview.h b/core/pim/todo/todoview.h index e73e808..e5ed66f 100644 --- a/core/pim/todo/todoview.h +++ b/core/pim/todo/todoview.h @@ -48,16 +48,26 @@ namespace Todo { struct ViewBase { public: virtual QWidget* widget() = 0; virtual QString type()const = 0; virtual int current() = 0; virtual QString currentRepresentation() = 0; virtual void showOverDue( bool ) = 0; + /** + * the next record in the view or 0 if none is there + */ + virtual int next() = 0; + + /** + * the previous record or 0 if none is there.. + */ + virtual int prev() = 0; + /* * update the view */ virtual void updateView() = 0; virtual void addEvent( const OTodo& ) = 0; virtual void replaceEvent( const OTodo& ) = 0; virtual void removeEvent( int uid ) = 0; @@ -106,16 +116,18 @@ namespace Todo { * These things needs to be implemented * in a implementation */ void showTodo( int uid ); void edit( int uid ); void update(int uid, const SmallTodo& to ); void update(int uid, const OTodo& ev); void remove( int uid ); + /* will ask the user if the item should be deleted */ + void removeQuery(int uid ); void complete( int uid ); void complete( const OTodo& ev ); private: MainWindow *m_main; OTodoAccess::List m_sort; bool m_asc : 1; int m_sortOrder; }; |