author | eilers <eilers> | 2002-10-21 16:29:20 (UTC) |
---|---|---|
committer | eilers <eilers> | 2002-10-21 16:29:20 (UTC) |
commit | 507afe645a86191815a2f85380a452ab6797e383 (patch) (side-by-side diff) | |
tree | e69293f25af3d6d8e2125b0f92a097615ddb0a38 | |
parent | 71c7800e8ae5dc2d701242828ceb8c11bcd96fbe (diff) | |
download | opie-507afe645a86191815a2f85380a452ab6797e383.zip opie-507afe645a86191815a2f85380a452ab6797e383.tar.gz opie-507afe645a86191815a2f85380a452ab6797e383.tar.bz2 |
Some usability updates in picker and find..
-rw-r--r-- | core/pim/addressbook/TODO | 7 | ||||
-rw-r--r-- | core/pim/addressbook/ablabel.cpp | 43 | ||||
-rw-r--r-- | core/pim/addressbook/abtable.cpp | 45 | ||||
-rw-r--r-- | core/pim/addressbook/abtable.h | 7 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.cpp | 70 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.h | 7 | ||||
-rw-r--r-- | core/pim/addressbook/picker.cpp | 24 | ||||
-rw-r--r-- | core/pim/addressbook/picker.h | 3 |
8 files changed, 164 insertions, 42 deletions
diff --git a/core/pim/addressbook/TODO b/core/pim/addressbook/TODO index 4daa2a8..796dc49 100644 --- a/core/pim/addressbook/TODO +++ b/core/pim/addressbook/TODO @@ -1,20 +1,21 @@ Stuff todo until OPIE 1.0 : Urgent: - Font menu is invisible using german translation Important: -- Picker: Activated letter schould be more visible +- Cursor keys should work in detail-view (ablabel) - "What's this" should be added - Store last settings of combo-boxes - Mail-Icon is missing +- Overview window cleanup needed.. - Finishing of new View functions (List, Phonebook...) - The names of the countries are sorted by there english names, only.. Even if they are translated.. :S - Reload if contacts were changed externally Less important: - The picker (alphabetical sort widget) should be @@ -25,9 +26,11 @@ Less important: Should be Fixed (not absolute sure, need further validation): - "Nonenglish" translation bug has to be fixed. Fixed: - Syncing: abtable not reloaded after sync. - Find widget should be replaced by something like qpdf has. -- Adding a configuration dialog
\ No newline at end of file +- Adding a configuration dialog +- Picker: Activated letter schould be more visible +- Advanced handling of cursor keys (search..) diff --git a/core/pim/addressbook/ablabel.cpp b/core/pim/addressbook/ablabel.cpp index cf1e39f..ea80700 100644 --- a/core/pim/addressbook/ablabel.cpp +++ b/core/pim/addressbook/ablabel.cpp @@ -42,12 +42,49 @@ void AbLabel::init( const OContact &entry ) void AbLabel::sync() { QString text = ent.toRichText(); setText( text ); } void AbLabel::keyPressEvent( QKeyEvent *e ) { - if ( e->key() == Qt::Key_F33 ) { - emit okPressed(); - } + // Commonly handled keys + switch( e->key() ) { + case Qt::Key_Left: + qWarning( "Left.."); + case Qt::Key_F33: + qWarning( "OK.."); + emit okPressed(); + break; + } + + + if ( /* m_inSearch */ false ) { + // Running in seach-mode, therefore we will interprete + // some key differently + qWarning("Received key in search mode"); + switch( e->key() ) { + case Qt::Key_Up: + qWarning("a"); + // emit signalSearchBackward(); + break; + case Qt::Key_Down: + qWarning("b"); + // emit signalSearchNext(); + break; + } + + } else { + qWarning("Received key in NON search mode"); + + switch( e->key() ) { + case Qt::Key_Up: + qWarning("a"); + // emit signalSearchBackward(); + break; + case Qt::Key_Down: + qWarning("b"); + // emit signalSearchNext(); + break; + } + } } diff --git a/core/pim/addressbook/abtable.cpp b/core/pim/addressbook/abtable.cpp index d4dcf7b..97b26db 100644 --- a/core/pim/addressbook/abtable.cpp +++ b/core/pim/addressbook/abtable.cpp @@ -125,16 +125,17 @@ AbTable::AbTable( const QValueList<int> *order, QWidget *parent, const char *nam // #else : QTable( parent, name ), // #endif lastSortCol( -1 ), asc( TRUE ), intFields( order ), currFindRow( -1 ), mCat( 0 ), + m_inSearch (false), m_contactdb ("addressbook", 0l, 0l, false) // Handle syncing myself.. ! { mCat.load( categoryFileName() ); setSelectionMode( NoSelection ); init(); setSorting( TRUE ); connect( this, SIGNAL(clicked(int,int,int,const QPoint &)), this, SLOT(itemClicked(int,int)) ); @@ -255,24 +256,50 @@ void AbTable::refresh() void AbTable::keyPressEvent( QKeyEvent *e ) { char key = toupper( e->ascii() ); if ( key >= 'A' && key <= 'Z' ) moveTo( key ); - switch( e->key() ) { - case Qt::Key_Space: - case Qt::Key_Return: - case Qt::Key_Enter: - emit details(); - break; - default: - QTable::keyPressEvent( e ); + if ( m_inSearch ) { + // Running in seach-mode, therefore we will interprete + // some key differently + qWarning("Received key in search mode"); + switch( e->key() ) { + case Qt::Key_Space: + case Qt::Key_Return: + case Qt::Key_Enter: + emit details(); + break; + case Qt::Key_Up: + qWarning("a"); + emit signalSearchBackward(); + break; + case Qt::Key_Down: + qWarning("b"); + emit signalSearchNext(); + break; + default: + QTable::keyPressEvent( e ); + } + + } else { + qWarning("Received key in NON search mode"); + + switch( e->key() ) { + case Qt::Key_Space: + case Qt::Key_Return: + case Qt::Key_Enter: + emit details(); + break; + default: + QTable::keyPressEvent( e ); + } } } void AbTable::moveTo( char c ) { int rows = numRows(); QString value; @@ -678,17 +705,17 @@ void AbTable::slotDoFind( const QString &findString, bool caseSensitive, bool us currFindRow = rows; else currFindRow = -1; if ( wrapAround ) emit signalWrapAround(); else emit signalNotFound(); - + wrapAround = !wrapAround; } else { currFindRow = row; QTableSelection foundSelection; foundSelection.init( currFindRow, 0 ); foundSelection.expandTo( currFindRow, numCols() - 1 ); addSelection( foundSelection ); setCurrentCell( currFindRow, 0 /* numCols() - 1 */ ); diff --git a/core/pim/addressbook/abtable.h b/core/pim/addressbook/abtable.h index b445874..35a1e9e 100644 --- a/core/pim/addressbook/abtable.h +++ b/core/pim/addressbook/abtable.h @@ -93,24 +93,29 @@ public: void resizeRows(); void show(); void setPaintingEnabled( bool e ); QString showBook() const; + void inSearch() { m_inSearch = true; } + void offSearch() { m_inSearch = false; } + public slots: void slotDoFind( const QString &str, bool caseSensitive, bool useRegExp, bool backwards, QString category = QString::null ); signals: void empty( bool ); void details(); void signalNotFound(); void signalWrapAround(); + void signalSearchBackward(); // Signalled if backward search is requested + void signalSearchNext(); // Singalled if forward search is requested protected: virtual void keyPressEvent( QKeyEvent *e ); // int rowHeight( int ) const; // int rowPos( int row ) const; // virtual int rowAt( int pos ) const; @@ -143,12 +148,14 @@ private: QString showCat; QStringList choicenames; bool enablePainting; Categories mCat; QString showBk; bool columnVisible; + bool m_inSearch; + OContactAccess m_contactdb; }; #endif // ABTABLE_H diff --git a/core/pim/addressbook/addressbook.cpp b/core/pim/addressbook/addressbook.cpp index f7e4c95..3466801 100644 --- a/core/pim/addressbook/addressbook.cpp +++ b/core/pim/addressbook/addressbook.cpp @@ -73,23 +73,30 @@ static QString addressbookPersonalVCardName() } AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, WFlags f ) : QMainWindow( parent, name, f ), abEditor(0), useRegExp(false), - DoSignalWrapAround(false), + doNotifyWrapAround(true), caseSensitive(false), bAbEditFirstTime(TRUE), syncing(FALSE) { isLoading = true; + // Read Config settings + Config cfg("AddressBook"); + cfg.setGroup("Search"); + useRegExp = cfg.readBoolEntry( "useRegExp" ); + caseSensitive = cfg.readBoolEntry( "caseSensitive" ); + doNotifyWrapAround = cfg.readBoolEntry( "doNotifyWrapAround" ); + initFields(); setCaption( tr("Contacts") ); setIcon( Resource::loadPixmap( "AddressBook" ) ); setToolBarsMovable( FALSE ); // Create Toolbars @@ -156,17 +163,17 @@ AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, a = new QAction( tr( "Find Next" ), Resource::loadPixmap( "next" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( slotFindNext() ) ); a->addTo( searchBar ); a = new QAction( tr( "Close Find" ), Resource::loadPixmap( "close" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( slotFindClose() ) ); a->addTo( searchBar ); - + a = new QAction( tr( "Write Mail To" ), Resource::loadPixmap( "qtmail/reply" ), QString::null, 0, this, 0 ); //a->setEnabled( FALSE ); we got support for it now :) zecke actionMail = a; connect( a, SIGNAL( activated() ), this, SLOT( writeMail() ) ); a->addTo( edit ); a->addTo( listTools ); @@ -218,17 +225,23 @@ AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, QVBoxLayout *vb = new QVBoxLayout( listContainer ); abList = new AbTable( &orderedFields, listContainer, "table" ); vb->addWidget(abList); // abList->setHScrollBarMode( QScrollView::AlwaysOff ); connect( abList, SIGNAL( empty( bool ) ), this, SLOT( listIsEmpty( bool ) ) ); connect( abList, SIGNAL( details() ), this, SLOT( slotListView() ) ); - connect( abList, SIGNAL(currentChanged(int,int)), this, SLOT(slotUpdateToolbar()) ); + connect( abList, SIGNAL( currentChanged(int,int) ), this, SLOT( slotUpdateToolbar() ) ); + connect( abList, SIGNAL( signalSearchNext() ), this, SLOT( slotFindNext() ) ); + connect( abList, SIGNAL( signalSearchBackward() ), this, SLOT( slotFindPrevious() ) ); + + // Maybe we should react on Wraparound and notfound ? + QObject::connect( abList, SIGNAL(signalNotFound()), this, SLOT(slotNotFound()) ); + QObject::connect( abList, SIGNAL(signalWrapAround()), this, SLOT(slotWrapAround()) ); mView = 0; abList->load(); pLabel = new LetterPicker( listContainer ); connect(pLabel, SIGNAL(letterClicked(char)), this, SLOT(slotSetLetter(char))); vb->addWidget(pLabel); @@ -253,40 +266,33 @@ AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, slotSetFont(startFontSize); mbList->insertItem( tr("Font"), fontMenu); setCentralWidget(listContainer); // qDebug("adressbook contrsuction: t=%d", t.elapsed() ); abList->setCurrentCell( 0, 0 ); - - // Read Config settings - Config cfg("AddressBook"); - cfg.setGroup("Search"); - useRegExp = cfg.readBoolEntry( "useRegExp" ); - caseSensitive = cfg.readBoolEntry( "caseSensitive" ); - DoSignalWrapAround = cfg.readBoolEntry( "signalWrapAround" ); isLoading = false; } void AddressbookWindow::slotConfig() { ConfigDlg* dlg = new ConfigDlg( this, "Config" ); dlg -> setUseRegExp ( useRegExp ); dlg -> setBeCaseSensitive( caseSensitive ); - dlg -> setSignalWrapAround( DoSignalWrapAround ); + dlg -> setSignalWrapAround( doNotifyWrapAround ); dlg -> showMaximized(); if ( dlg -> exec() ) { qWarning ("Config Dialog accepted !"); useRegExp = dlg -> useRegExp(); caseSensitive = dlg -> beCaseSensitive(); - DoSignalWrapAround = dlg -> signalWrapAround(); + doNotifyWrapAround = dlg -> signalWrapAround(); } delete dlg; } void AddressbookWindow::slotSetFont( int size ) { @@ -368,17 +374,17 @@ AddressbookWindow::~AddressbookWindow() { Config cfg("AddressBook"); cfg.setGroup("Font"); cfg.writeEntry("fontSize", startFontSize); cfg.setGroup("Search"); cfg.writeEntry("useRegExp", useRegExp); cfg.writeEntry("caseSensitive", caseSensitive); - cfg.writeEntry("signalWrapAround", DoSignalWrapAround); + cfg.writeEntry("doNotifyWrapAround", doNotifyWrapAround); } void AddressbookWindow::slotUpdateToolbar() { OContact ce = abList->currentEntry(); actionMail->setEnabled( !ce.defaultEmail().isEmpty() ); } @@ -651,19 +657,17 @@ void AddressbookWindow::editPersonal() void AddressbookWindow::slotPersonalView() { if (!actionPersonal->isOn()) { // we just turned it off setCaption( tr("Contacts") ); actionNew->setEnabled(TRUE); actionTrash->setEnabled(TRUE); -#ifndef MAKE_FOR_SHARP_ROM actionFind->setEnabled(TRUE); -#endif slotUpdateToolbar(); // maybe some of the above could be moved there showList(); return; } // XXX need to disable some QActions. actionNew->setEnabled(FALSE); actionTrash->setEnabled(FALSE); @@ -923,47 +927,75 @@ AbLabel *AddressbookWindow::abView() connect( mView, SIGNAL( okPressed() ), this, SLOT( slotListView() ) ); } return mView; } void AddressbookWindow::slotFindOpen() { searchBar->show(); + abList -> inSearch(); searchEdit->setFocus(); } void AddressbookWindow::slotFindClose() { searchBar->hide(); + abList -> offSearch(); abList->setFocus(); } void AddressbookWindow::slotFindNext() { if ( centralWidget() == abView() ) showList(); - // Maybe we should react on Wraparound and notfound ? -// QObject::connect( abList, SIGNAL(signalNotFound()), &frmFind, SLOT(slotNotFound()) ); -// QObject::connect( abList, SIGNAL(signalWrapAround()), &frmFind, SLOT(slotWrapAround()) ); - abList->slotDoFind( searchEdit->text(), caseSensitive, useRegExp, false); + searchEdit->clearFocus(); + abList->setFocus(); + if ( abList->numSelections() ) + abList->clearSelection(); + +} +void AddressbookWindow::slotFindPrevious() +{ + if ( centralWidget() == abView() ) + showList(); + + abList->slotDoFind( searchEdit->text(), caseSensitive, useRegExp, true); if ( abList->numSelections() ) abList->clearSelection(); } void AddressbookWindow::slotFind() { abList->clearFindRow(); slotFindNext(); } +void AddressbookWindow::slotNotFound() +{ + qWarning("Got notfound signal !"); + QMessageBox::information( this, tr( "Not Found" ), + tr( "Unable to find a contact for this" ) + "\n" + + tr( "search pattern !" ) ); + + +} +void AddressbookWindow::slotWrapAround() +{ + qWarning("Got wrap signal !"); + if ( doNotifyWrapAround ) + QMessageBox::information( this, tr( "End of list" ), + tr( "End of list. Wrap around now.. !" ) + "\n" ); + +} + void AddressbookWindow::slotSetCategory( int c ) { QString cat, book; if ( c <= 0 ) return; diff --git a/core/pim/addressbook/addressbook.h b/core/pim/addressbook/addressbook.h index 18b083f..299ed70 100644 --- a/core/pim/addressbook/addressbook.h +++ b/core/pim/addressbook/addressbook.h @@ -57,16 +57,18 @@ protected: void closeEvent( QCloseEvent *e ); bool save(); public slots: void flush(); void reload(); void appMessage(const QCString &, const QByteArray &); void setDocument( const QString & ); + void slotFindNext(); + void slotFindPrevious(); #ifdef __DEBUG_RELEASE void slotSave(); #endif private slots: void importvCard(); void slotListNew(); void slotListView(); @@ -82,17 +84,18 @@ private slots: void slotSetCategory( int ); void slotSetLetter( char ); void slotUpdateToolbar(); void slotSetFont(int); void slotFindOpen(); void slotFindClose(); void slotFind(); - void slotFindNext(); + void slotNotFound(); + void slotWrapAround(); void slotConfig(); private: void initFields(); // inititialize our fields... AbLabel *abView(); void populateCategories(); @@ -107,17 +110,17 @@ private: LetterPicker *pLabel; AbTable *abList; QWidget *listContainer; // Searching stuff OFloatBar* searchBar; QLineEdit* searchEdit; bool useRegExp; - bool DoSignalWrapAround; + bool doNotifyWrapAround; bool caseSensitive; QAction *actionNew, *actionEdit, *actionTrash, *actionFind, *actionBeam, *actionPersonal, *actionMail; bool bAbEditFirstTime; int viewMargin; bool syncing; diff --git a/core/pim/addressbook/picker.cpp b/core/pim/addressbook/picker.cpp index a165451..7f4acb0 100644 --- a/core/pim/addressbook/picker.cpp +++ b/core/pim/addressbook/picker.cpp @@ -70,62 +70,71 @@ void PickerLabel::clearLetter() tmpStr += "</qt>"; setText(tmpStr); currentLetter = 0; } -void PickerLabel::mouseReleaseEvent( QMouseEvent *e ) +void PickerLabel::mousePressEvent( QMouseEvent* e ) +{ + // If one pickerlabel is was, and an other is now selected, we + // have to simulate the releaseevent.. Otherwise the new label + // will not get a highlighted letter.. + // Maybe there is a more intelligent solution, but this works and I am tired.. (se) + if ( ( currentLetter == 0 ) && ( lastLetter != '\0' ) ) mouseReleaseEvent( e ); +} + +void PickerLabel::mouseReleaseEvent( QMouseEvent* /* e */ ) { QString tmpStr; if (lastLetter != letter1 && lastLetter != letter2 && lastLetter != letter3 && lastLetter != '\0') QTimer::singleShot( 0, this, SLOT(emitClearSignal()) ); switch (currentLetter) { case 0: - tmpStr = "<qt><font color=\"#7F0000\">"; + tmpStr = "<qt><u><font color=\"#7F0000\">"; tmpStr += letter1; - tmpStr += "</font>"; + tmpStr += "</font></u>"; tmpStr += letter2; tmpStr += letter3; tmpStr += "</qt>"; setText(tmpStr); currentLetter++; lastLetter = letter1; emit selectedLetter( letter1 ); break; case 1: tmpStr = "<qt>"; tmpStr += letter1; - tmpStr += "<font color=\"#7F0000\">"; + tmpStr += "<u><font color=\"#7F0000\">"; tmpStr += letter2; - tmpStr += "</font>"; + tmpStr += "</font></u>"; tmpStr += letter3; tmpStr += "</qt>"; setText(tmpStr); currentLetter++; lastLetter = letter2; emit selectedLetter( letter2 ); break; case 2: tmpStr = "<qt>"; tmpStr += letter1; tmpStr += letter2; - tmpStr += "<font color=\"#7F0000\">"; + tmpStr += "<u><font color=\"#7F0000\">"; tmpStr += letter3; - tmpStr += "</font></qt>"; + tmpStr += "</font></u></qt>"; setText(tmpStr); currentLetter++; lastLetter = letter3; emit selectedLetter( letter3 ); break; @@ -219,11 +228,12 @@ void LetterPicker::clear() lblPQR->clearLetter(); lblSTU->clearLetter(); lblVWX->clearLetter(); lblYZ->clearLetter(); } void LetterPicker::newLetter( char letter ) { + qWarning("LetterClicked"); emit letterClicked( letter ); } diff --git a/core/pim/addressbook/picker.h b/core/pim/addressbook/picker.h index de5bd9d..d76d582 100644 --- a/core/pim/addressbook/picker.h +++ b/core/pim/addressbook/picker.h @@ -26,16 +26,17 @@ Q_OBJECT signals: void selectedLetter( char ); void clearAll(); protected: void mouseReleaseEvent( QMouseEvent *e ); + void mousePressEvent( QMouseEvent *e ); private: int currentLetter; static char lastLetter; char letter1, letter2, letter3; private slots: @@ -43,23 +44,25 @@ Q_OBJECT void emitClearSignal(); }; class LetterPicker: public QFrame { Q_OBJECT public: LetterPicker( QWidget *parent = 0, const char *name = 0 ); ~LetterPicker(); + public slots: void clear(); signals: void letterClicked( char ); private: PickerLabel *lblABC, *lblDEF, *lblGHI, *lblJKL, *lblMNO, *lblPQR, *lblSTU, *lblVWX, *lblYZ; + PickerLabel *lastLabel; private slots: void newLetter( char letter ); }; #endif |