[Kstars-devel] branches/kstars/unfrozen/kstars/kstars
Jason Harris
kstars at 30doradus.org
Tue Jul 1 06:28:07 CEST 2008
SVN commit 826605 by harris:
porting fix from trunk, revision 825333. Quoting original commit message:
Improve combined use of the "by name" and "by type" filtering in the
Find Object tool. Prior to this commit, changing the object-type
selection would clear the name filter edit box.
CCMAIL: kstars-devel at kde.org
M +85 -90 finddialog.cpp
M +43 -39 finddialog.h
--- branches/kstars/unfrozen/kstars/kstars/finddialog.cpp #826604:826605
@@ -68,7 +68,7 @@
connect( this, SIGNAL( cancelClicked() ), this, SLOT( reject() ) );
connect( ui->SearchBox, SIGNAL( textChanged( const QString & ) ), SLOT( enqueueSearch() ) );
connect( ui->SearchBox, SIGNAL( returnPressed() ), SLOT( slotOk() ) );
- connect( ui->FilterType, SIGNAL( activated( int ) ), this, SLOT( filterByType( int ) ) );
+ connect( ui->FilterType, SIGNAL( activated( int ) ), this, SLOT( enqueueSearch() ) );
connect( ui->SearchList, SIGNAL( doubleClicked( const QModelIndex & ) ), SLOT( slotOk() ) );
@@ -83,7 +83,61 @@
void FindDialog::init() {
ui->SearchBox->clear();
+ filterByType();
+ sortModel->sort( 0 );
+ initSelection();
+}
+void FindDialog::initSelection() {
+ if ( sortModel->rowCount() <= 0 ) {
+ button( Ok )->setEnabled( false );
+ return;
+ }
+
+ if ( ui->SearchBox->text().isEmpty() ) {
+ //Pre-select the first item
+ QModelIndex selectItem = sortModel->index( 0, sortModel->filterKeyColumn(), QModelIndex() );
+ switch ( ui->FilterType->currentIndex() ) {
+ case 0: //All objects, choose Andromeda galaxy
+ {
+ QModelIndex qmi = fModel->index( fModel->stringList().indexOf( i18n("Andromeda Galaxy") ) );
+ selectItem = sortModel->mapFromSource( qmi );
+ break;
+ }
+ case 1: //Stars, choose Aldebaran
+ {
+ QModelIndex qmi = fModel->index( fModel->stringList().indexOf( i18n("Aldebaran") ) );
+ selectItem = sortModel->mapFromSource( qmi );
+ break;
+ }
+ case 2: //Solar system or Asteroids, choose Aaltje
+ case 9:
+ {
+ QModelIndex qmi = fModel->index( fModel->stringList().indexOf( i18n("Aaltje") ) );
+ selectItem = sortModel->mapFromSource( qmi );
+ break;
+ }
+ case 8: //Comets, choose 'Aarseth-Brewington (1989 W1)'
+ {
+ QModelIndex qmi = fModel->index( fModel->stringList().indexOf( i18n("Aarseth-Brewington (1989 W1)") ) );
+ selectItem = sortModel->mapFromSource( qmi );
+ break;
+ }
+
+ }
+
+ if ( selectItem.isValid() ) {
+ ui->SearchList->selectionModel()->select( selectItem, QItemSelectionModel::ClearAndSelect );
+ ui->SearchList->scrollTo( selectItem );
+ ui->SearchList->setCurrentIndex( selectItem );
+ button( Ok )->setEnabled( true );
+ }
+ }
+
+ listFiltered = true;
+}
+
+void FindDialog::filterByType() {
KStars *p = (KStars *)parent();
switch ( ui->FilterType->currentIndex() ) {
@@ -140,87 +194,28 @@
fModel->setStringList( p->data()->skyComposite()->objectNames( SkyObject::CONSTELLATION ) );
break;
}
-
- sortModel->sort( 0 );
-
- initSelection();
}
-void FindDialog::initSelection() {
- if ( sortModel->rowCount() <= 0 ) {
- button( Ok )->setEnabled( false );
- return;
- }
-
- if ( ui->SearchBox->text().isEmpty() ) {
- //Pre-select the first item
- QModelIndex selectItem = sortModel->index( 0, sortModel->filterKeyColumn(), QModelIndex() );
- switch ( ui->FilterType->currentIndex() ) {
- case 0: //All objects, choose Andromeda galaxy
- {
- QModelIndex qmi = fModel->index( fModel->stringList().indexOf( i18n("Andromeda Galaxy") ) );
- selectItem = sortModel->mapFromSource( qmi );
- break;
- }
- case 1: //Stars, choose Aldebaran
- {
- QModelIndex qmi = fModel->index( fModel->stringList().indexOf( i18n("Aldebaran") ) );
- selectItem = sortModel->mapFromSource( qmi );
- break;
- }
- case 2: //Solar system or Asteroids, choose Aaltje
- case 9:
- {
- QModelIndex qmi = fModel->index( fModel->stringList().indexOf( i18n("Aaltje") ) );
- selectItem = sortModel->mapFromSource( qmi );
- break;
- }
- case 8: //Comets, choose 'Aarseth-Brewington (1989 W1)'
- {
- QModelIndex qmi = fModel->index( fModel->stringList().indexOf( i18n("Aarseth-Brewington (1989 W1)") ) );
- selectItem = sortModel->mapFromSource( qmi );
- break;
- }
-
- }
-
- if ( selectItem.isValid() ) {
- ui->SearchList->selectionModel()->select( selectItem, QItemSelectionModel::ClearAndSelect );
- ui->SearchList->scrollTo( selectItem );
- ui->SearchList->setCurrentIndex( selectItem );
- button( Ok )->setEnabled( true );
- }
- }
-
- listFiltered = true;
-}
-
-void FindDialog::filterByType( int /*f*/ ) {
- if ( timer ) {
- timer->stop();
- }
-
- init();
- ui->SearchList->QWidget::setFocus();
-}
-
-void FindDialog::filterByName() { //Filter the list of names with the string in the SearchBox
+void FindDialog::filterList() {
sortModel->setFilterFixedString( ui->SearchBox->text() );
+ filterByType();
initSelection();
//Select the first item in the list that begins with the filter string
- QStringList mItems = fModel->stringList().filter( QRegExp( '^'+ui->SearchBox->text(), Qt::CaseInsensitive ) );
- mItems.sort();
-
- if ( mItems.size() ) {
- QModelIndex qmi = fModel->index( fModel->stringList().indexOf( mItems[0] ) );
- QModelIndex selectItem = sortModel->mapFromSource( qmi );
-
- if ( selectItem.isValid() ) {
- ui->SearchList->selectionModel()->select( selectItem, QItemSelectionModel::ClearAndSelect );
- ui->SearchList->scrollTo( selectItem );
- ui->SearchList->setCurrentIndex( selectItem );
- button( Ok )->setEnabled( true );
+ if ( ! ui->SearchBox->text().isEmpty() ) {
+ QStringList mItems = fModel->stringList().filter( QRegExp( '^'+ui->SearchBox->text(), Qt::CaseInsensitive ) );
+ mItems.sort();
+
+ if ( mItems.size() ) {
+ QModelIndex qmi = fModel->index( fModel->stringList().indexOf( mItems[0] ) );
+ QModelIndex selectItem = sortModel->mapFromSource( qmi );
+
+ if ( selectItem.isValid() ) {
+ ui->SearchList->selectionModel()->select( selectItem, QItemSelectionModel::ClearAndSelect );
+ ui->SearchList->scrollTo( selectItem );
+ ui->SearchList->setCurrentIndex( selectItem );
+ button( Ok )->setEnabled( true );
+ }
}
}
@@ -246,7 +241,7 @@
} else {
timer = new QTimer( this );
timer->setSingleShot( true );
- connect( timer, SIGNAL( timeout() ), this, SLOT( filterByName() ) );
+ connect( timer, SIGNAL( timeout() ), this, SLOT( filterList() ) );
}
timer->start( 500 );
}
@@ -261,15 +256,15 @@
// If it is an NGC/IC/M catalog number, as in "M 76" or "NGC 5139", check for absence of the space
re.setPattern("^(m|ngc|ic)\\s*\\d*$");
if(ui->SearchBox->text().contains(re)) {
- QString searchtext = ui->SearchBox->text();
- re.setPattern("\\s*(\\d+)");
- searchtext.replace( re, " \\1" );
- re.setPattern("\\s*$");
- searchtext.replace(re, "");
- re.setPattern("^\\s*");
- searchtext.replace(re, "");
- ui->SearchBox->setText(searchtext);
- return;
+ QString searchtext = ui->SearchBox->text();
+ re.setPattern("\\s*(\\d+)");
+ searchtext.replace( re, " \\1" );
+ re.setPattern("\\s*$");
+ searchtext.replace(re, "");
+ re.setPattern("^\\s*");
+ searchtext.replace(re, "");
+ ui->SearchBox->setText(searchtext);
+ return;
}
// TODO after KDE 4.1 release:
@@ -280,12 +275,12 @@
void FindDialog::slotOk() {
//If no valid object selected, show a sorry-box. Otherwise, emit accept()
if(!listFiltered) {
- processSearchText();
- filterByName();
+ processSearchText();
+ filterList();
}
if(!selectedObject()) {
- processSearchText();
- filterByName();
+ processSearchText();
+ filterList();
}
if ( selectedObject() == 0 ) {
QString message = i18n( "No object named %1 found.", ui->SearchBox->text() );
--- branches/kstars/unfrozen/kstars/kstars/finddialog.h #826604:826605
@@ -39,71 +39,69 @@
};
/**@class FindDialog
- *Dialog window for finding SkyObjects by name. The dialog contains
- *a QListBox showing the list of named objects, a QLineEdit for filtering
- *the list by name, and a QCombobox for filtering the list by object type.
- *
- *@short Find Object Dialog
- *@author Jason Harris
- *@version 1.0
- */
+ *Dialog window for finding SkyObjects by name. The dialog contains
+ *a QListBox showing the list of named objects, a QLineEdit for filtering
+ *the list by name, and a QCombobox for filtering the list by object type.
+ *
+ *@short Find Object Dialog
+ *@author Jason Harris
+ *@version 1.0
+ */
class FindDialog : public KDialog {
Q_OBJECT
public:
- /**Constructor. Creates all widgets and packs them in QLayouts. Connects
- *Signals and Slots. Runs initObjectList().
- */
+ /**
+ *Constructor. Creates all widgets and packs them in QLayouts. Connects
+ *Signals and Slots. Runs initObjectList().
+ */
FindDialog( QWidget* parent = 0 );
- /**Destructor
- */
+ /**
+ *Destructor
+ */
~FindDialog();
- /**@return the currently-selected item from the listbox of named objects
- */
+ /**
+ *@return the currently-selected item from the listbox of named objects
+ */
SkyObject* selectedObject() const;
public slots:
- /**When Text is entered in the QLineEdit, filter the List of objects
- *so that only objects which start with the filter text are shown.
- */
- void filterByName();
+ /**
+ *When Text is entered in the QLineEdit, filter the List of objects
+ *so that only objects which start with the filter text are shown.
+ */
+ void filterList();
//FIXME: Still valid for KDialog? i.e., does KDialog have a slotOk() ?
- /**Overloading the Standard KDialogBase slotOk() to show a "sorry" message
- *box if no object is selected when the user presses Ok. The window is
- *not closed in this case.
- */
+ /**
+ *Overloading the Standard KDialogBase slotOk() to show a "sorry" message
+ *box if no object is selected when the user presses Ok. The window is
+ *not closed in this case.
+ */
void slotOk();
private slots:
/**
- *Init object list after opening dialog.
- */
+ *Init object list after opening dialog.
+ */
void init();
/**
- *Set the selected item to the first item in the list
- */
+ *Set the selected item to the first item in the list
+ */
void initSelection();
void enqueueSearch();
- /**
- *Filter the list of named objects according to the given object type
- *@param f The integer representation of the object type
- *@see SkyObject
- */
- void filterByType( int f );
-
protected:
/**
- *Process Keystrokes. The Up and Down arrow keys are used to select the
- *Previous/Next item in the listbox of named objects. The Esc key closes
- *the window with no selection, using reject().
- *@param e The QKeyEvent pointer
- */
+ *Process Keystrokes. The Up and Down arrow keys are used to select the
+ *Previous/Next item in the listbox of named objects. The Esc key closes
+ *the window with no selection, using reject().
+ *@param e The QKeyEvent pointer
+ */
void keyPressEvent( QKeyEvent *e );
private:
@@ -116,6 +114,12 @@
*/
void processSearchText();
+ /**
+ *@short pre-filter the list of objects according to
+ *the selected object type.
+ */
+ void filterByType();
+
FindDialogUI* ui;
SkyObject* currentitem;
QStringListModel *fModel;
More information about the Kstars-devel
mailing list