From 38240090027bd68d8dd15d7d46ecf17792edb732 Mon Sep 17 00:00:00 2001 From: zecke Date: Wed, 25 Sep 2002 11:59:24 +0000 Subject: Add a sort function and filter function to TodoAccess This would allow us todo a paint hack in QTable --- diff --git a/libopie/pim/orecordlist.h b/libopie/pim/orecordlist.h index c63d813..1fd0741 100644 --- a/libopie/pim/orecordlist.h +++ b/libopie/pim/orecordlist.h @@ -46,17 +46,17 @@ public: bool operator==( const ORecordListIterator& it ); bool operator!=( const ORecordListIterator& it ); - + /** * the current item */ uint current()const; - + /** * the number of items */ uint count()const; - + /** * sets the current item */ @@ -101,12 +101,13 @@ public: * the end */ Iterator end(); - + /** * the number of items in the list */ uint count()const; - + + T operator[]( uint i ); // FIXME implemenent remove /* ConstIterator begin()const; @@ -146,7 +147,7 @@ ORecordListIterator &ORecordListIterator::operator=( const ORecordListIter m_current = it.m_current; m_temp = it.m_temp; m_end = it.m_end; -// m_record = it.m_record; + m_record = it.m_record; return *this; } @@ -252,4 +253,8 @@ template uint ORecordList::count()const { return m_ids.count(); } +template +T ORecordList::operator[]( uint i ) { + return m_acc->find( m_ids[i] ); +} #endif diff --git a/libopie/pim/otodo.cpp b/libopie/pim/otodo.cpp index 6dd4c0e..eb9dad3 100644 --- a/libopie/pim/otodo.cpp +++ b/libopie/pim/otodo.cpp @@ -172,6 +172,7 @@ void OTodo::setSummary( const QString& sum ) } void OTodo::setPriority(int prio ) { + qWarning("set priority %d", prio); changeOrModify(); data->priority = prio; } diff --git a/libopie/pim/otodoaccess.cpp b/libopie/pim/otodoaccess.cpp index 8ec09bc..f51da29 100644 --- a/libopie/pim/otodoaccess.cpp +++ b/libopie/pim/otodoaccess.cpp @@ -68,4 +68,10 @@ void OTodoAccess::delAlarm( int uid) { "QPE/Application/todolist", "alarm(QDateTime,int)", uid ); } - +/* sort order */ +OTodoAccess::List OTodoAccess::sorted( bool ascending, int sort,int filter, int cat ) { + QArray ints = m_todoBackEnd->sorted( ascending, sort, + filter, cat ); + OTodoAccess::List list( ints, this ); + return list; +} diff --git a/libopie/pim/otodoaccess.h b/libopie/pim/otodoaccess.h index c43efe9..12997aa 100644 --- a/libopie/pim/otodoaccess.h +++ b/libopie/pim/otodoaccess.h @@ -17,10 +17,17 @@ class OTodoAccess : public QObject, public OPimAccessTemplate { Q_OBJECT public: + enum SortOrder { Completed = 0, + Priority, + Description, + Deadline }; + enum SortFilter{ ShowOverdue = 0, + Category =1, + OnlyOverDue= 2 }; /** * if you use 0l * the default resource will be - * icked up + * picked up */ OTodoAccess( OTodoAccessBackend* = 0l); ~OTodoAccess(); @@ -48,6 +55,12 @@ public: * return overdue OTodos */ List overDue(); + + /** + * + */ + List sorted( bool ascending, int sortOrder, int sortFilter, int cat ); + /** * merge a list of OTodos into * the resource @@ -71,6 +84,7 @@ signals: */ void signalChanged( const OTodoAccess* ); private: + int m_cat; OTodoAccessBackend* m_todoBackEnd; class OTodoAccessPrivate; OTodoAccessPrivate* d; diff --git a/libopie/pim/otodoaccessbackend.h b/libopie/pim/otodoaccessbackend.h index ebe2189..3bad6b7 100644 --- a/libopie/pim/otodoaccessbackend.h +++ b/libopie/pim/otodoaccessbackend.h @@ -12,6 +12,8 @@ public: const QDate& end, bool includeNoDates ) = 0; virtual QArray overDue() = 0; + virtual QArray sorted( bool asc, int sortOrder, int sortFilter, + int cat ) = 0; }; diff --git a/libopie/pim/otodoaccessxml.cpp b/libopie/pim/otodoaccessxml.cpp index 5fe733c..692483e 100644 --- a/libopie/pim/otodoaccessxml.cpp +++ b/libopie/pim/otodoaccessxml.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -256,6 +257,7 @@ OTodo OTodoAccessXML::todo( QAsciiDict* dict, Opie::XMLElement* element)con ev.setSummary( it.data() ); break; case OTodo::Priority: + qWarning("ParsePriority " + it.data() ); ev.setPriority( it.data().toInt() ); break; case OTodo::DateDay: @@ -364,3 +366,146 @@ QString OTodoAccessXML::toString( const OTodo& ev )const { QString OTodoAccessXML::toString( const QArray& ints ) const { return Qtopia::Record::idsToString( ints ); } + +/* internal class for sorting */ + +struct OTodoXMLContainer { + OTodo todo; +}; + /* + * Returns: + * 0 if item1 == item2 + * + * non-zero if item1 != item2 + * + * This function returns int rather than bool so that reimplementations + * can return one of three values and use it to sort by: + * + * 0 if item1 == item2 + * + * > 0 (positive integer) if item1 > item2 + * + * < 0 (negative integer) if item1 < item2 + * + */ +class OTodoXMLVector : public QVector { +public: + OTodoXMLVector(int size, bool asc, int sort) + : QVector( size ) + { + setAutoDelete( true ); + m_asc = asc; + m_sort = sort; + } + /* return the summary/description */ + QString string( const OTodo& todo) { + return todo.summary().isEmpty() ? + todo.description().left(20 ) : + todo.summary(); + } + /** + * we take the sortorder( switch on it ) + * + */ + int compareItems( Item d1, Item d2 ) { + qWarning("compare items"); + int ret =0; + OTodoXMLContainer* con1 = (OTodoXMLContainer*)d1; + OTodoXMLContainer* con2 = (OTodoXMLContainer*)d2; + + /* same item */ + if ( con1->todo.uid() == con2->todo.uid() ) + return 0; + qWarning("m_sort %d", m_sort ); + + switch ( m_sort ) { + /* completed */ + case 0: { + ret = 0; + if ( con1->todo.isCompleted() ) ret++; + if ( con2->todo.isCompleted() ) ret--; + break; + } + /* priority */ + case 1: { + ret = con1->todo.priority() - con2->todo.priority(); + qWarning(" priority %d %d %d", ret, + con1->todo.priority(), + con2->todo.priority() + ); + break; + } + /* description */ + case 2: { + QString str1 = string( con1->todo ); + QString str2 = string( con2->todo ); + ret = QString::compare( str1, str2 ); + break; + } + /* deadline */ + case 3: { + /* either bot got a dueDate + * or one of them got one + */ + if ( con1->todo.hasDueDate() && + con2->todo.hasDueDate() ) + ret = con1->todo.dueDate().daysTo( con2->todo.dueDate() ); + else if ( con1->todo.hasDueDate() ) + ret = -1; + else if ( con2->todo.hasDueDate() ) + ret = 0; + break; + } + default: + ret = 0; + break; + }; + + /* twist it we're not ascending*/ + if (!m_asc) + ret = ret * -1; + return ret; + } + private: + bool m_asc; + int m_sort; + +}; + +QArray OTodoAccessXML::sorted( bool asc, int sortOrder, + int sortFilter, int cat ) { + OTodoXMLVector vector(m_events.count(), asc,sortOrder ); + QMap::Iterator it; + int item = 0; + + bool bCat = sortFilter & 1 ? true : false; + bool bOver = sortFilter & 0 ? true : false; + bool bOnly = split & 2 ? true : false; + for ( it = m_events.begin(); it != m_events.end(); ++it ) { + + /* show category */ + if ( bCat ) + if (!(*it).categories().contains( cat ) ) + continue; + /* isOverdue but we should not show overdue */ + if ( (*it).isOverdue() && ( !bOver || !bOnly ) ) + continue; + if ( !(*it).isOverdue() && bOnly ) + continue; + + + OTodoXMLContainer* con = new OTodoXMLContainer(); + con->todo = (*it); + vector.insert(item, con ); + item++; + } + vector.resize( item ); + /* sort it now */ + vector.sort(); + /* now get the uids */ + QArray array( vector.count() ); + for (uint i= 0; i < vector.count(); i++ ) { + array[i] = ( vector.at(i) )->todo.uid(); + } + return array; +}; diff --git a/libopie/pim/otodoaccessxml.h b/libopie/pim/otodoaccessxml.h index be9109d..6886bab 100644 --- a/libopie/pim/otodoaccessxml.h +++ b/libopie/pim/otodoaccessxml.h @@ -36,6 +36,8 @@ public: const QDate& end, bool includeNoDates ); QArray overDue(); + QArray sorted( bool asc, int sortOrder, + int sortFilter, int cat ); private: OTodo todo( QAsciiDict*, Opie::XMLElement* )const; QString toString( const OTodo& )const; diff --git a/libopie2/opiepim/backend/otodoaccessbackend.h b/libopie2/opiepim/backend/otodoaccessbackend.h index ebe2189..3bad6b7 100644 --- a/libopie2/opiepim/backend/otodoaccessbackend.h +++ b/libopie2/opiepim/backend/otodoaccessbackend.h @@ -12,6 +12,8 @@ public: const QDate& end, bool includeNoDates ) = 0; virtual QArray overDue() = 0; + virtual QArray sorted( bool asc, int sortOrder, int sortFilter, + int cat ) = 0; }; diff --git a/libopie2/opiepim/backend/otodoaccessxml.cpp b/libopie2/opiepim/backend/otodoaccessxml.cpp index 5fe733c..692483e 100644 --- a/libopie2/opiepim/backend/otodoaccessxml.cpp +++ b/libopie2/opiepim/backend/otodoaccessxml.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -256,6 +257,7 @@ OTodo OTodoAccessXML::todo( QAsciiDict* dict, Opie::XMLElement* element)con ev.setSummary( it.data() ); break; case OTodo::Priority: + qWarning("ParsePriority " + it.data() ); ev.setPriority( it.data().toInt() ); break; case OTodo::DateDay: @@ -364,3 +366,146 @@ QString OTodoAccessXML::toString( const OTodo& ev )const { QString OTodoAccessXML::toString( const QArray& ints ) const { return Qtopia::Record::idsToString( ints ); } + +/* internal class for sorting */ + +struct OTodoXMLContainer { + OTodo todo; +}; + /* + * Returns: + * 0 if item1 == item2 + * + * non-zero if item1 != item2 + * + * This function returns int rather than bool so that reimplementations + * can return one of three values and use it to sort by: + * + * 0 if item1 == item2 + * + * > 0 (positive integer) if item1 > item2 + * + * < 0 (negative integer) if item1 < item2 + * + */ +class OTodoXMLVector : public QVector { +public: + OTodoXMLVector(int size, bool asc, int sort) + : QVector( size ) + { + setAutoDelete( true ); + m_asc = asc; + m_sort = sort; + } + /* return the summary/description */ + QString string( const OTodo& todo) { + return todo.summary().isEmpty() ? + todo.description().left(20 ) : + todo.summary(); + } + /** + * we take the sortorder( switch on it ) + * + */ + int compareItems( Item d1, Item d2 ) { + qWarning("compare items"); + int ret =0; + OTodoXMLContainer* con1 = (OTodoXMLContainer*)d1; + OTodoXMLContainer* con2 = (OTodoXMLContainer*)d2; + + /* same item */ + if ( con1->todo.uid() == con2->todo.uid() ) + return 0; + qWarning("m_sort %d", m_sort ); + + switch ( m_sort ) { + /* completed */ + case 0: { + ret = 0; + if ( con1->todo.isCompleted() ) ret++; + if ( con2->todo.isCompleted() ) ret--; + break; + } + /* priority */ + case 1: { + ret = con1->todo.priority() - con2->todo.priority(); + qWarning(" priority %d %d %d", ret, + con1->todo.priority(), + con2->todo.priority() + ); + break; + } + /* description */ + case 2: { + QString str1 = string( con1->todo ); + QString str2 = string( con2->todo ); + ret = QString::compare( str1, str2 ); + break; + } + /* deadline */ + case 3: { + /* either bot got a dueDate + * or one of them got one + */ + if ( con1->todo.hasDueDate() && + con2->todo.hasDueDate() ) + ret = con1->todo.dueDate().daysTo( con2->todo.dueDate() ); + else if ( con1->todo.hasDueDate() ) + ret = -1; + else if ( con2->todo.hasDueDate() ) + ret = 0; + break; + } + default: + ret = 0; + break; + }; + + /* twist it we're not ascending*/ + if (!m_asc) + ret = ret * -1; + return ret; + } + private: + bool m_asc; + int m_sort; + +}; + +QArray OTodoAccessXML::sorted( bool asc, int sortOrder, + int sortFilter, int cat ) { + OTodoXMLVector vector(m_events.count(), asc,sortOrder ); + QMap::Iterator it; + int item = 0; + + bool bCat = sortFilter & 1 ? true : false; + bool bOver = sortFilter & 0 ? true : false; + bool bOnly = split & 2 ? true : false; + for ( it = m_events.begin(); it != m_events.end(); ++it ) { + + /* show category */ + if ( bCat ) + if (!(*it).categories().contains( cat ) ) + continue; + /* isOverdue but we should not show overdue */ + if ( (*it).isOverdue() && ( !bOver || !bOnly ) ) + continue; + if ( !(*it).isOverdue() && bOnly ) + continue; + + + OTodoXMLContainer* con = new OTodoXMLContainer(); + con->todo = (*it); + vector.insert(item, con ); + item++; + } + vector.resize( item ); + /* sort it now */ + vector.sort(); + /* now get the uids */ + QArray array( vector.count() ); + for (uint i= 0; i < vector.count(); i++ ) { + array[i] = ( vector.at(i) )->todo.uid(); + } + return array; +}; diff --git a/libopie2/opiepim/backend/otodoaccessxml.h b/libopie2/opiepim/backend/otodoaccessxml.h index be9109d..6886bab 100644 --- a/libopie2/opiepim/backend/otodoaccessxml.h +++ b/libopie2/opiepim/backend/otodoaccessxml.h @@ -36,6 +36,8 @@ public: const QDate& end, bool includeNoDates ); QArray overDue(); + QArray sorted( bool asc, int sortOrder, + int sortFilter, int cat ); private: OTodo todo( QAsciiDict*, Opie::XMLElement* )const; QString toString( const OTodo& )const; diff --git a/libopie2/opiepim/core/otodoaccess.cpp b/libopie2/opiepim/core/otodoaccess.cpp index 8ec09bc..f51da29 100644 --- a/libopie2/opiepim/core/otodoaccess.cpp +++ b/libopie2/opiepim/core/otodoaccess.cpp @@ -68,4 +68,10 @@ void OTodoAccess::delAlarm( int uid) { "QPE/Application/todolist", "alarm(QDateTime,int)", uid ); } - +/* sort order */ +OTodoAccess::List OTodoAccess::sorted( bool ascending, int sort,int filter, int cat ) { + QArray ints = m_todoBackEnd->sorted( ascending, sort, + filter, cat ); + OTodoAccess::List list( ints, this ); + return list; +} diff --git a/libopie2/opiepim/core/otodoaccess.h b/libopie2/opiepim/core/otodoaccess.h index c43efe9..12997aa 100644 --- a/libopie2/opiepim/core/otodoaccess.h +++ b/libopie2/opiepim/core/otodoaccess.h @@ -17,10 +17,17 @@ class OTodoAccess : public QObject, public OPimAccessTemplate { Q_OBJECT public: + enum SortOrder { Completed = 0, + Priority, + Description, + Deadline }; + enum SortFilter{ ShowOverdue = 0, + Category =1, + OnlyOverDue= 2 }; /** * if you use 0l * the default resource will be - * icked up + * picked up */ OTodoAccess( OTodoAccessBackend* = 0l); ~OTodoAccess(); @@ -48,6 +55,12 @@ public: * return overdue OTodos */ List overDue(); + + /** + * + */ + List sorted( bool ascending, int sortOrder, int sortFilter, int cat ); + /** * merge a list of OTodos into * the resource @@ -71,6 +84,7 @@ signals: */ void signalChanged( const OTodoAccess* ); private: + int m_cat; OTodoAccessBackend* m_todoBackEnd; class OTodoAccessPrivate; OTodoAccessPrivate* d; diff --git a/libopie2/opiepim/orecordlist.h b/libopie2/opiepim/orecordlist.h index c63d813..1fd0741 100644 --- a/libopie2/opiepim/orecordlist.h +++ b/libopie2/opiepim/orecordlist.h @@ -46,17 +46,17 @@ public: bool operator==( const ORecordListIterator& it ); bool operator!=( const ORecordListIterator& it ); - + /** * the current item */ uint current()const; - + /** * the number of items */ uint count()const; - + /** * sets the current item */ @@ -101,12 +101,13 @@ public: * the end */ Iterator end(); - + /** * the number of items in the list */ uint count()const; - + + T operator[]( uint i ); // FIXME implemenent remove /* ConstIterator begin()const; @@ -146,7 +147,7 @@ ORecordListIterator &ORecordListIterator::operator=( const ORecordListIter m_current = it.m_current; m_temp = it.m_temp; m_end = it.m_end; -// m_record = it.m_record; + m_record = it.m_record; return *this; } @@ -252,4 +253,8 @@ template uint ORecordList::count()const { return m_ids.count(); } +template +T ORecordList::operator[]( uint i ) { + return m_acc->find( m_ids[i] ); +} #endif diff --git a/libopie2/opiepim/otodo.cpp b/libopie2/opiepim/otodo.cpp index 6dd4c0e..eb9dad3 100644 --- a/libopie2/opiepim/otodo.cpp +++ b/libopie2/opiepim/otodo.cpp @@ -172,6 +172,7 @@ void OTodo::setSummary( const QString& sum ) } void OTodo::setPriority(int prio ) { + qWarning("set priority %d", prio); changeOrModify(); data->priority = prio; } -- cgit v0.9.0.2