author | eilers <eilers> | 2003-08-30 15:32:34 (UTC) |
---|---|---|
committer | eilers <eilers> | 2003-08-30 15:32:34 (UTC) |
commit | cfb97af8f45087e58d4b82689df22191bd657c34 (patch) (side-by-side diff) | |
tree | 9e01e85787092abb0d8c6733bbe3091eaf6a892a | |
parent | 9f07321949f8baf1a64db0e4caec58041d3f775f (diff) | |
download | opie-cfb97af8f45087e58d4b82689df22191bd657c34.zip opie-cfb97af8f45087e58d4b82689df22191bd657c34.tar.gz opie-cfb97af8f45087e58d4b82689df22191bd657c34.tar.bz2 |
Speed optimization fix:
Startup and usability improved if a lot of contacts are stored. Left speed bootleneck is the xml
file..
-rw-r--r-- | core/pim/addressbook/ablabel.cpp | 7 | ||||
-rw-r--r-- | core/pim/addressbook/abtable.cpp | 113 | ||||
-rw-r--r-- | core/pim/addressbook/abtable.h | 16 | ||||
-rw-r--r-- | core/pim/addressbook/abview.cpp | 31 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.cpp | 2 | ||||
-rw-r--r-- | core/pim/addressbook/version.h | 2 |
6 files changed, 105 insertions, 66 deletions
diff --git a/core/pim/addressbook/ablabel.cpp b/core/pim/addressbook/ablabel.cpp index 6d8de91..1914f71 100644 --- a/core/pim/addressbook/ablabel.cpp +++ b/core/pim/addressbook/ablabel.cpp @@ -66,20 +66,23 @@ OContact AbLabel::currentEntry() else return OContact(); } bool AbLabel::selectContact( int UID ) { - for ( m_itCurContact = m_viewList.begin(); m_itCurContact != m_viewList.end(); ++m_itCurContact){ - if ( (*m_itCurContact).uid() == UID ) + for ( int r = 0; r < m_viewList.count(); ++r ) { + if ( m_viewList.uidAt( r ) == UID ){ + m_itCurContact.setCurrent( r ); break; + } } + sync(); return true; } void AbLabel::sync() diff --git a/core/pim/addressbook/abtable.cpp b/core/pim/addressbook/abtable.cpp index a2617fa..4705c78 100644 --- a/core/pim/addressbook/abtable.cpp +++ b/core/pim/addressbook/abtable.cpp @@ -39,16 +39,18 @@ #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <ctype.h> //toupper() for key hack +#if 0 + /*! \class AbTableItem abtable.h \brief QTableItem based class for showing a field of an entry */ AbTableItem::AbTableItem( QTable *t, EditType et, const QString &s, const QString &secondSortKey) @@ -107,16 +109,18 @@ QWidget *AbPickItem::createEditor() const void AbPickItem::setContentFromEditor( QWidget *w ) { if ( w->inherits("QComboBox") ) setText( ( (QComboBox*)w )->currentText() ); else QTableItem::setContentFromEditor( w ); } +#endif + /*! \class AbTable abtable.h \brief QTable based class for showing a list of entries */ AbTable::AbTable( const QValueList<int> order, QWidget *parent, const char *name ) : QTable( parent, name ), @@ -130,17 +134,17 @@ AbTable::AbTable( const QValueList<int> order, QWidget *parent, const char *name // qWarning("C'tor start"); setSelectionMode( NoSelection ); init(); setSorting( TRUE ); connect( this, SIGNAL(clicked(int,int,int,const QPoint &)), this, SLOT(itemClicked(int,int)) ); - contactList.clear(); + // contactList.clear(); // qWarning("C'tor end"); } AbTable::~AbTable() { } void AbTable::init() @@ -153,79 +157,79 @@ void AbTable::init() horizontalHeader()->setLabel( 1, tr( "Contact" )); setLeftMargin( 0 ); verticalHeader()->hide(); columnVisible = true; } void AbTable::setContacts( const OContactAccess::List& viewList ) { - // qWarning("AbTable::setContacts()"); + qWarning("AbTable::setContacts()"); clear(); m_viewList = viewList; setSorting( false ); setPaintingEnabled( FALSE ); OContactAccess::List::Iterator it; setNumRows( m_viewList.count() ); - int row = 0; - for ( it = m_viewList.begin(); it != m_viewList.end(); ++it ) - insertIntoTable( *it, row++ ); +// int row = 0; +// for ( it = m_viewList.begin(); it != m_viewList.end(); ++it ) +// insertIntoTable( *it, row++ ); - setSorting( true ); +// setSorting( true ); - resort(); +// resort(); updateVisible(); setPaintingEnabled( TRUE ); } void AbTable::setOrderedList( const QValueList<int> ordered ) { intFields = ordered; } bool AbTable::selectContact( int UID ) { - // qWarning( "AbTable::selectContact( %d )", UID ); + qWarning( "AbTable::selectContact( %d )", UID ); int rows = numRows(); - AbTableItem *abi; OContact* foundContact = 0l; bool found = false; setPaintingEnabled( FALSE ); + qWarning( "search start" ); for ( int r = 0; r < rows; ++r ) { - abi = static_cast<AbTableItem*>( item(r, 0) ); - foundContact = &contactList[abi]; - if ( foundContact -> uid() == UID ){ + if ( m_viewList.uidAt( r ) == UID ){ ensureCellVisible( r, 0 ); setCurrentCell( r, 0 ); found = true; break; } } + qWarning( "search end" ); if ( !found ){ ensureCellVisible( 0,0 ); setCurrentCell( 0, 0 ); } setPaintingEnabled( TRUE ); return true; } +#if 0 void AbTable::insertIntoTable( const OContact& cnt, int row ) { - // qWarning( "void AbTable::insertIntoTable( const OContact& cnt, %d )", row ); + qWarning( "void AbTable::insertIntoTable( const OContact& cnt, %d )", row ); QString strName; ContactItem contactItem; strName = findContactName( cnt ); contactItem = findContactContact( cnt, row ); AbTableItem *ati; ati = new AbTableItem( this, QTableItem::Never, strName, contactItem.value ); @@ -235,17 +239,17 @@ void AbTable::insertIntoTable( const OContact& cnt, int row ) if ( !contactItem.icon.isNull() ) ati->setPixmap( contactItem.icon ); setItem( row, 1, ati ); //### cannot do this; table only has two columns at this point // setItem( row, 2, new AbPickItem( this ) ); } - +#endif void AbTable::columnClicked( int col ) { if ( !sorting() ) return; if ( lastSortCol == -1 ) @@ -258,67 +262,63 @@ void AbTable::columnClicked( int col ) asc = TRUE; } //QMessageBox::information( this, "resort", "columnClicked" ); resort(); } void AbTable::resort() { - // qWarning( "void AbTable::resort()" ); + qWarning( "void AbTable::resort() NOT POSSIBLE !!" ); +#if 0 setPaintingEnabled( FALSE ); if ( sorting() ) { if ( lastSortCol == -1 ) lastSortCol = 0; sortColumn( lastSortCol, asc, TRUE ); //QMessageBox::information( this, "resort", "resort" ); updateVisible(); } setPaintingEnabled( TRUE ); +#endif } OContact AbTable::currentEntry() -{ - // qWarning( "OContact AbTable::currentEntry()" ); - OContact cnt; - AbTableItem *abItem; - abItem = static_cast<AbTableItem*>(item( currentRow(), 0 )); - if ( abItem ) { - cnt = contactList[abItem]; - //cnt = contactList[currentRow()]; - } - return cnt; +{ + return m_viewList[currentRow()]; } int AbTable::currentEntry_UID() { return ( currentEntry().uid() ); } void AbTable::clear() { - // qWarning( "void AbTable::clear()" ); - contactList.clear(); + qWarning( "void AbTable::clear()" ); + // contactList.clear(); setPaintingEnabled( FALSE ); for ( int r = 0; r < numRows(); ++r ) { for ( int c = 0; c < numCols(); ++c ) { if ( cellWidget( r, c ) ) clearCellWidget( r, c ); clearCell( r, c ); } } setNumRows( 0 ); setPaintingEnabled( TRUE ); } // Refresh updates column 2 if the contactsettings changed void AbTable::refresh() { - // qWarning( "void AbTable::refresh()" ); + qWarning( "void AbTable::refresh() NOT IMPLEMENTED !!" ); + +#if 0 int rows = numRows(); AbTableItem *abi; ContactItem contactItem; setPaintingEnabled( FALSE ); for ( int r = 0; r < rows; ++r ) { abi = static_cast<AbTableItem*>( item(r, 0) ); contactItem = findContactContact( contactList[abi], r ); @@ -328,16 +328,18 @@ void AbTable::refresh() setPixmap( contactItem.icon ); }else{ static_cast<AbTableItem*>( item(r, 1) )-> setPixmap( QPixmap() ); } } resort(); setPaintingEnabled( TRUE ); + +#endif } void AbTable::keyPressEvent( QKeyEvent *e ) { char key = toupper( e->ascii() ); if ( key >= 'A' && key <= 'Z' ) moveTo( key ); @@ -360,18 +362,19 @@ void AbTable::keyPressEvent( QKeyEvent *e ) default: QTable::keyPressEvent( e ); } } void AbTable::moveTo( char c ) { - qWarning( "void AbTable::moveTo( char c )" ); + qWarning( "void AbTable::moveTo( char c ) NOT IMPLEMENTED !!" ); +#if 0 int rows = numRows(); QString value; AbTableItem *abi; int r; if ( asc ) { r = 0; while ( r < rows-1) { abi = static_cast<AbTableItem*>( item(r, 0) ); @@ -389,33 +392,36 @@ void AbTable::moveTo( char c ) QChar first = abi->key()[0]; //### is there a bug in QChar to char comparison??? if ( first.row() || first.cell() >= c ) break; r--; } } setCurrentCell( r, currentColumn() ); -} +#endif +} +#if 0 +// Useless.. Nobody uses it .. (se) QString AbTable::findContactName( const OContact &entry ) { // We use the fileAs, then company, defaultEmail QString str; str = entry.fileAs(); if ( str.isEmpty() ) { str = entry.company(); if ( str.isEmpty() ) { str = entry.defaultEmail(); } } return str; } - +#endif void AbTable::resizeRows() { /* if (numRows()) { for (int i = 0; i < numRows(); i++) { setRowHeight( i, size ); } @@ -501,47 +507,51 @@ void AbTable::fitColumns() void AbTable::show() { // qWarning( "void AbTable::show()" ); realignTable(); QTable::show(); } +#if 0 void AbTable::setChoiceNames( const QStringList& list) { choicenames = list; if ( choicenames.isEmpty() ) { // hide pick column setNumCols( 2 ); } else { // show pick column setNumCols( 3 ); setColumnWidth( 2, fontMetrics().width(tr( "Pick" ))+8 ); horizontalHeader()->setLabel( 2, tr( "Pick" )); } fitColumns(); } +#endif void AbTable::itemClicked(int,int col) { // qWarning( "AbTable::itemClicked(int, col:%d)", col); if ( col == 2 ) { return; } else { // qWarning ("Emitting signalSwitch()"); emit signalSwitch(); } } +#if 0 QStringList AbTable::choiceNames() const { return choicenames; } +#endif void AbTable::setChoiceSelection( const QValueList<int>& list ) { intFields = list; } QStringList AbTable::choiceSelection(int /*index*/) const { QStringList r; @@ -555,18 +565,16 @@ QStringList AbTable::choiceSelection(int /*index*/) const } } */ return r; } - - void AbTable::updateVisible() { // qWarning("void AbTable::updateVisible()"); int visible, totalRows, row, selectedRow = 0; @@ -625,16 +633,20 @@ void AbTable::viewportPaintEvent( QPaintEvent* e ) { QTable::viewportPaintEvent( e ); } void AbTable::paintCell(QPainter* p, int row, int col, const QRect& cr, bool ) { const QColorGroup &cg = colorGroup(); p->save(); + //qWarning( "Paint row: %d", row ); + + OContact act_contact = m_viewList[row]; + // Paint alternating background bars if ( (row % 2 ) == 0 ) { p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) ); p->setPen( QPen( cg.text() ) ); } else { p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Background ) ); p->setPen( QPen( cg.buttonText() ) ); @@ -642,27 +654,42 @@ void AbTable::paintCell(QPainter* p, int row, int col, const QRect& cr, bool ) QFont f = p->font(); QFontMetrics fm(f); int marg = 2; int x = 0; int y = ( cr.height() - 14 ) / 2; - QPixmap pic = pixmap( row, col ); - if ( !pic.isNull() ) - { - p->drawPixmap( x + marg, y, pixmap( row, col ) ); - p->drawText( x + marg + pixmap( row, col ).width() + 4,2 + fm.ascent(), text( row, col ) ); - } - else - { - p->drawText( x + marg,2 + fm.ascent(), text( row, col ) ); - } + QString nameText = act_contact.fileAs(); + + switch( col ){ + case 0: + p->drawText( x + marg,2 + fm.ascent(), nameText ); + break; + case 1:{ + + ContactItem contactItem = findContactContact( act_contact, 0 ); + QPixmap contactPic = contactItem.icon; /* pixmap( row, col ); */ + QString contactText = contactItem.value; + + if ( !contactPic.isNull() ) + { + p->drawPixmap( x + marg, y, contactPic ); + p->drawText( x + marg + contactPic.width() + + 4,2 + fm.ascent(), contactText ); + } + else + { + p->drawText( x + marg,2 + fm.ascent(), contactText ); + } + } + break; + } p->restore(); } void AbTable::rowHeightChanged( int row ) { if ( enablePainting ) QTable::rowHeightChanged( row ); } diff --git a/core/pim/addressbook/abtable.h b/core/pim/addressbook/abtable.h index 0f7bc29..b9ebe27 100644 --- a/core/pim/addressbook/abtable.h +++ b/core/pim/addressbook/abtable.h @@ -27,52 +27,58 @@ #include <opie/ocontactaccess.h> #include <qmap.h> #include <qtable.h> #include <qstringlist.h> #include <qcombobox.h> #include <qpixmap.h> +#if 0 class AbTableItem : public QTableItem { public: AbTableItem( QTable *t, EditType et, const QString &s, const QString &secondSortKey); QString entryKey() const; void setEntryKey( const QString & k ); virtual int alignment() const; virtual QString key() const; void setItem( const QString &txt, const QString &secondKey ); private: QString sortKey; }; +#endif + // This is a simple container, storing all contact // information class ContactItem { public: QPixmap icon; QString value; }; +#if 0 class AbPickItem : public QTableItem { public: AbPickItem( QTable *t ); QWidget *createEditor() const; void setContentFromEditor( QWidget *w ); private: QGuardedPtr<QComboBox> cb; }; +#endif + class AbTable : public QTable { Q_OBJECT public: AbTable( const QValueList<int> ordered, QWidget *parent, const char *name=0 ); ~AbTable(); @@ -86,30 +92,30 @@ public: bool selectContact( int UID ); // Get the current selected entry OContact currentEntry(); // Get the UID of the current selected Entry int currentEntry_UID(); - QString findContactName( const OContact &entry ); + // QString findContactName( const OContact &entry ); void init(); void clear(); void refresh(); void show(); void setPaintingEnabled( bool e ); void viewportPaintEvent( QPaintEvent* e); void paintCell(QPainter* p, int row, int col, const QRect&, bool ); // addresspicker mode (What's that ? se) - void setChoiceNames( const QStringList& list); - QStringList choiceNames() const; + // void setChoiceNames( const QStringList& list); + // QStringList choiceNames() const; void setChoiceSelection( const QValueList<int>& list ); QStringList choiceSelection(int index) const; signals: void signalSwitch(); void signalEditor(); void signalKeyDown(); void signalKeyUp(); @@ -124,27 +130,27 @@ protected: protected slots: void moveTo( char ); virtual void columnClicked( int col ); void itemClicked(int,int col); void rowHeightChanged( int row ); private: - void insertIntoTable( const OContact &cnt, int row ); + // void insertIntoTable( const OContact &cnt, int row ); ContactItem findContactContact( const OContact &entry, int row ); void fitColumns(); void resizeRows(); void realignTable(); void resort(); void updateVisible(); int lastSortCol; bool asc; - QMap<AbTableItem*, OContact> contactList; + // QMap<AbTableItem*, OContact> contactList; QValueList<int> intFields; QStringList choicenames; bool enablePainting; bool columnVisible; int countNested; OContactAccess::List m_viewList; diff --git a/core/pim/addressbook/abview.cpp b/core/pim/addressbook/abview.cpp index 477f85b..6cbd556 100644 --- a/core/pim/addressbook/abview.cpp +++ b/core/pim/addressbook/abview.cpp @@ -46,16 +46,17 @@ AbView::AbView ( QWidget* parent, const QValueList<int>& ordered ): m_prev_View( TableView ), m_curr_Contact ( 0 ), m_contactdb ( 0l ), m_storedDB ( 0l ), m_viewStack( 0l ), m_abTable( 0l ), m_orderedFields( ordered ) { + qWarning("AbView::c'tor"); // Load default database and handle syncing myself.. ! m_contactdb = new OContactAccess ( "addressbook", 0l, 0l, false ), mCat.load( categoryFileName() ); // Create Layout and put WidgetStack into it. QVBoxLayout *vb = new QVBoxLayout( this ); m_viewStack = new QWidgetStack( this ); vb->addWidget( m_viewStack ); @@ -92,38 +93,38 @@ AbView::~AbView() m_storedDB -> save(); delete m_storedDB; } } void AbView::setView( Views view ) { - // qWarning("AbView::setView( Views view )"); + qWarning("AbView::setView( Views view )"); m_curr_View = view; load(); } void AbView::addEntry( const OContact &newContact ) { - // qWarning("abview:AddContact"); + qWarning("abview:AddContact"); m_contactdb->add ( newContact ); load(); } void AbView::removeEntry( const int UID ) { - // qWarning("abview:RemoveContact"); + qWarning("abview:RemoveContact"); m_contactdb->remove( UID ); load(); } void AbView::replaceEntry( const OContact &contact ) { - // qWarning("abview:ReplaceContact"); + qWarning("abview:ReplaceContact"); m_contactdb->replace( contact ); load(); } OContact AbView::currentEntry() { OContact currentContact; @@ -144,51 +145,52 @@ bool AbView::save() { // qWarning("abView:Save data"); return m_contactdb->save(); } void AbView::load() { - // qWarning("abView:Load data"); + qWarning("abView:Load data"); // Letter Search is stopped at this place emit signalClearLetterPicker(); if ( m_inPersonal ) // VCard Backend does not sort.. m_list = m_contactdb->allRecords(); else{ m_list = m_contactdb->sorted( true, 0, 0, 0 ); - clearForCategory(); + if ( m_curr_category != -1 ) + clearForCategory(); } qWarning ("Number of contacts: %d", m_list.count()); updateView( true ); } void AbView::reload() { - // qWarning( "void AbView::reload()" ); + qWarning( "void AbView::reload()" ); m_contactdb->reload(); load(); } void AbView::clear() { // :SX } void AbView::setShowByCategory( const QString& cat ) { - // qWarning("AbView::setShowCategory( const QString& cat )"); + qWarning("AbView::setShowCategory( const QString& cat )"); int intCat = 0; // All (cat == NULL) will be stored as -1 if ( cat.isNull() ) intCat = -1; else intCat = mCat.id("Contacts", cat ); @@ -202,21 +204,20 @@ void AbView::setShowByCategory( const QString& cat ) load(); } } void AbView::setShowToView( Views view ) { - // qWarning("void AbView::setShowToView( View %d )", view); - - // qWarning ("Change the View (Category is: %d)", m_curr_category); + qWarning("void AbView::setShowToView( View %d )", view); if ( m_curr_View != view ){ + qWarning ("Change the View (Category is: %d)", m_curr_category); m_prev_View = m_curr_View; m_curr_View = view; updateView(); } } @@ -245,17 +246,18 @@ void AbView::setShowByLetter( char c, AbConfig::LPSearchMode mode ) query.setFileAs( QString("%1*").arg(c) ); break; default: qWarning( "Unknown Searchmode for AbView::setShowByLetter ! -> %d", mode ); qWarning( "I will ignore it.." ); return; } m_list = m_contactdb->queryByExample( query, OContactAccess::WildCards | OContactAccess::IgnoreCase ); - clearForCategory(); + if ( m_curr_category != -1 ) + clearForCategory(); m_curr_Contact = 0; } updateView( true ); } void AbView::setListOrder( const QValueList<int>& ordered ) { m_orderedFields = ordered; @@ -269,17 +271,17 @@ void AbView::setListOrder( const QValueList<int>& ordered ) QString AbView::showCategory() const { return mCat.label( "Contacts", m_curr_category ); } void AbView::showPersonal( bool personal ) { - // qWarning ("void AbView::showPersonal( %d )", personal); + qWarning ("void AbView::showPersonal( %d )", personal); if ( personal ){ if ( m_inPersonal ) return; // Now switch to vCard Backend and load data. // The current default backend will be stored @@ -357,17 +359,18 @@ void AbView::slotDoFind( const QString &str, bool caseSensitive, bool useRegExp, if ( m_list.count() == 0 ){ emit signalNotFound(); return; } // Now remove all contacts with wrong category (if any selected) // This algorithm is a litte bit ineffective, but // we will not have a lot of matching entries.. - clearForCategory(); + if ( m_curr_category != -1 ) + clearForCategory(); // Now show all found entries updateView( true ); } void AbView::offSearch() { m_inSearch = false; diff --git a/core/pim/addressbook/addressbook.cpp b/core/pim/addressbook/addressbook.cpp index 03c96c8..0ba024e 100644 --- a/core/pim/addressbook/addressbook.cpp +++ b/core/pim/addressbook/addressbook.cpp @@ -243,17 +243,17 @@ AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, vb->addWidget( m_abView ); // abList->setHScrollBarMode( QScrollView::AlwaysOff ); connect( m_abView, SIGNAL( signalViewSwitched ( int ) ), this, SLOT( slotViewSwitched( int ) ) ); QObject::connect( m_abView, SIGNAL(signalNotFound()), this, SLOT(slotNotFound()) ); - m_abView->load(); + // m_abView->load(); // Already done by c'tor . // Letter Picker pLabel = new LetterPicker( listContainer ); connect(pLabel, SIGNAL(letterClicked(char)), this, SLOT(slotSetLetter(char))); connect(m_abView, SIGNAL( signalClearLetterPicker() ), pLabel, SLOT( clear() ) ); vb->addWidget( pLabel ); diff --git a/core/pim/addressbook/version.h b/core/pim/addressbook/version.h index 9621826..790aa95 100644 --- a/core/pim/addressbook/version.h +++ b/core/pim/addressbook/version.h @@ -1,10 +1,10 @@ #ifndef _VERSION_H_ #define _VERSION_H_ #define MAINVERSION "1" -#define SUBVERSION "0" +#define SUBVERSION "1" #define PATCHVERSION "0" #define APPNAME "OPIE_ADDRESSBOOK" #endif |