summaryrefslogtreecommitdiff
Side-by-side diff
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,33 +1,36 @@
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
placed verticaly or horizontally (configurable)
- Use advanced database functions in abtable to decrease
memory footprint and to make everything more easy !
(abtable should store Iterator for selected Category)
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
@@ -38,16 +38,53 @@ void AbLabel::init( const OContact &entry )
{
ent = 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
@@ -121,24 +121,25 @@ void AbPickItem::setContentFromEditor( QWidget *w )
AbTable::AbTable( const QValueList<int> *order, QWidget *parent, const char *name )
// #ifdef QT_QTABLE_NOHEADER_CONSTRUCTOR
// : QTable( 0, 0, parent, name, TRUE ),
// #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)) );
}
AbTable::~AbTable()
{
@@ -251,32 +252,58 @@ void AbTable::refresh()
static_cast<AbTableItem*>( item(r, 1) )->setItem( value, abi->text() );
}
resort();
}
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;
AbTableItem *abi;
int r;
if ( asc ) {
r = 0;
@@ -674,25 +701,25 @@ void AbTable::slotDoFind( const QString &findString, bool caseSensitive, bool us
}
}
if ( row >= rows || row < 0 ) {
if ( row < 0 )
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 */ );
wrapAround = true;
}
}
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
@@ -89,32 +89,37 @@ public:
void setShowCategory( const QString &b, const QString &c );
void setShowByLetter( char c );
QString showCategory() const;
QStringList categories();
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;
protected slots:
void moveTo( char );
virtual void columnClicked( int col );
@@ -139,16 +144,18 @@ private:
char showChar;
QMap<AbTableItem*, OContact> contactList;
const QValueList<int> *intFields;
int currFindRow;
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
@@ -69,31 +69,38 @@ static QString addressbookPersonalVCardName()
{
QString filename = Global::applicationFileName("addressbook",
"businesscard.vcf");
return filename;
}
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
QPEToolBar *bar = new QPEToolBar( this );
bar->setHorizontalStretchable( TRUE );
@@ -152,25 +159,25 @@ AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name,
// searchEdit->setFont( f );
searchBar->setStretchableWidget( searchEdit );
connect( searchEdit, SIGNAL( returnPressed( ) ),
this, SLOT( slotFind( ) ) );
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 );
if ( Ir::supported() ) {
a = new QAction( tr ("Beam Entry" ), Resource::loadPixmap( "beam" ), QString::null,
@@ -214,25 +221,31 @@ AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name,
a->addTo( edit );
// Create Views
listContainer = new QWidget( this );
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);
catMenu = new QPopupMenu( this );
catMenu->setCheckable( TRUE );
connect( catMenu, SIGNAL(activated(int)), this, SLOT(slotSetCategory(int)) );
populateCategories();
@@ -249,48 +262,41 @@ AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name,
fontMenu->insertItem(tr( "Large" ), 2);
defaultFont = new QFont( abList->font() );
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 ) {
if (size > 2 || size < 0)
size = 1;
startFontSize = size;
@@ -364,25 +370,25 @@ void AddressbookWindow::resizeEvent( QResizeEvent *e )
showView();
}
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() );
}
void AddressbookWindow::showList()
{
bool visiblemView;
@@ -647,27 +653,25 @@ void AddressbookWindow::editPersonal()
abView()->sync();
}
abEditor->setCaption( tr("Edit Address") );
}
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);
#ifndef MAKE_FOR_SHARP_ROM
actionFind->setEnabled(FALSE);
#endif
actionMail->setEnabled(FALSE);
@@ -919,55 +923,83 @@ AbLabel *AddressbookWindow::abView()
{
if ( !mView ) {
mView = new AbLabel( this, "viewer" );
mView->init( OContact() );
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;
// Set checkItem for selected one
for ( unsigned int i = 1; i < catMenu->count(); i++ )
catMenu->setItemChecked( i, c == (int)i );
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
@@ -53,24 +53,26 @@ protected:
void showView();
enum EntryMode { NewEntry=0, EditEntry };
void editPersonal();
void editEntry( EntryMode );
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();
void slotListDelete();
void slotViewBack();
void slotViewEdit();
void slotPersonalView();
@@ -78,50 +80,51 @@ private slots:
void slotSettings();
void writeMail();
void slotBeam();
void beamDone( Ir * );
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();
QPopupMenu *catMenu, *fontMenu;
QPEToolBar *listTools;
QToolButton *deleteButton;
QValueList<int> allFields, orderedFields;
QStringList slOrderedFields;
enum Panes { paneList=0, paneView, paneEdit };
ContactEditor *abEditor;
AbLabel *mView;
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;
QFont *defaultFont;
int startFontSize;
bool isLoading;
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
@@ -66,70 +66,79 @@ void PickerLabel::clearLetter()
tmpStr = "<qt>";
tmpStr += letter1;
tmpStr += letter2;
tmpStr += letter3;
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;
default:
clearLetter();
lastLetter = '\0';
emit selectedLetter( '\0' );
@@ -215,15 +224,16 @@ void LetterPicker::clear()
lblDEF->clearLetter();
lblGHI->clearLetter();
lblJKL->clearLetter();
lblMNO->clearLetter();
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
@@ -22,44 +22,47 @@ Q_OBJECT
void setLetters( char ch1, char ch2, char ch3 );
void clearLetter();
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:
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