summaryrefslogtreecommitdiff
authoreilers <eilers>2002-10-21 16:29:20 (UTC)
committer eilers <eilers>2002-10-21 16:29:20 (UTC)
commit507afe645a86191815a2f85380a452ab6797e383 (patch) (side-by-side diff)
treee69293f25af3d6d8e2125b0f92a097615ddb0a38
parent71c7800e8ae5dc2d701242828ceb8c11bcd96fbe (diff)
downloadopie-507afe645a86191815a2f85380a452ab6797e383.zip
opie-507afe645a86191815a2f85380a452ab6797e383.tar.gz
opie-507afe645a86191815a2f85380a452ab6797e383.tar.bz2
Some usability updates in picker and find..
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/addressbook/TODO7
-rw-r--r--core/pim/addressbook/ablabel.cpp43
-rw-r--r--core/pim/addressbook/abtable.cpp45
-rw-r--r--core/pim/addressbook/abtable.h7
-rw-r--r--core/pim/addressbook/addressbook.cpp70
-rw-r--r--core/pim/addressbook/addressbook.h7
-rw-r--r--core/pim/addressbook/picker.cpp24
-rw-r--r--core/pim/addressbook/picker.h3
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