[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