diff options
Diffstat (limited to 'kstars/kstars/finddialog.cpp')
-rw-r--r-- | kstars/kstars/finddialog.cpp | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/kstars/kstars/finddialog.cpp b/kstars/kstars/finddialog.cpp new file mode 100644 index 00000000..cf203e34 --- /dev/null +++ b/kstars/kstars/finddialog.cpp @@ -0,0 +1,227 @@ +/*************************************************************************** + finddialog.cpp - K Desktop Planetarium + ------------------- + begin : Wed Jul 4 2001 + copyright : (C) 2001 by Jason Harris + email : jharris@30doradus.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include <qlayout.h> +#include <qlineedit.h> +#include <qlabel.h> +#include <qcombobox.h> +#include <qlistbox.h> +#include <qtimer.h> + +#include <kmessagebox.h> + +#include "finddialog.h" +#include "kstars.h" +#include "kstarsdata.h" +#include "Options.h" +#include "skyobject.h" +#include "skyobjectname.h" +#include "objectnamelist.h" + + +FindDialog::FindDialog( QWidget* parent ) : + KDialogBase( KDialogBase::Plain, i18n( "Find Object" ), Ok|Cancel, Ok, parent ), + vlay(0), hlay(0), SearchList(0), SearchBox(0), filterTypeLabel(0), filterType(0), + currentitem(0) +{ + QFrame *page = plainPage(); + +//Create Layout managers + vlay = new QVBoxLayout( page, 2, 2 ); + hlay = new QHBoxLayout( 2 ); //this mgr will be added to vlay + +//Create Widgets + SearchBox = new QLineEdit( page, "SearchBox" ); + + filterTypeLabel = new QLabel( page, "filterTypeLabel" ); + filterTypeLabel->setAlignment( AlignRight ); + filterTypeLabel->setText( i18n( "Filter by type: " ) ); + + filterType = new QComboBox( page, "filterType" ); + filterType->setEditable( false ); + filterType->insertItem( i18n ("Any") ); + filterType->insertItem( i18n ("Stars") ); + // filterType->insertItem( i18n ("Double Stars") ); + filterType->insertItem( i18n ("Solar System") ); + filterType->insertItem( i18n ("Open Clusters") ); + filterType->insertItem( i18n ("Glob. Clusters") ); + filterType->insertItem( i18n ("Gas. Nebulae") ); + filterType->insertItem( i18n ("Plan. Nebulae") ); + // filterType->insertItem( i18n ("SN Remnants") ); + filterType->insertItem( i18n ("Galaxies") ); + filterType->insertItem( i18n ("Comets") ); + filterType->insertItem( i18n ("Asteroids") ); + filterType->insertItem( i18n ("Constellations") ); + + SearchList = new QListBox( page, "SearchList" ); + SearchList->setMinimumWidth( 256 ); + SearchList->setMinimumHeight( 320 ); + SearchList->setVScrollBarMode( QListBox::AlwaysOn ); + SearchList->setHScrollBarMode( QListBox::AlwaysOff ); + +//Pack Widgets into layout manager + hlay->addWidget( filterTypeLabel, 0, 0 ); + hlay->addWidget( filterType, 0, 0 ); + + vlay->addWidget( SearchBox, 0, 0 ); + vlay->addSpacing( 12 ); + vlay->addWidget( SearchList, 0, 0 ); + vlay->addLayout( hlay, 0 ); + + vlay->activate(); + +// no item currently set + currentitem = 0; + +// no filters set + Filter = 0; + +//Connect signals to slots +// connect( this, SIGNAL( okClicked() ), this, SLOT( accept() ) ) ; + connect( this, SIGNAL( cancelClicked() ), this, SLOT( reject() ) ); + connect( SearchBox, SIGNAL( textChanged( const QString & ) ), SLOT( filter() ) ); + connect( SearchBox, SIGNAL( returnPressed() ), SLOT( slotOk() ) ); + connect( filterType, SIGNAL( activated( int ) ), this, SLOT( setFilter( int ) ) ); + connect( SearchList, SIGNAL (selectionChanged (QListBoxItem *)), SLOT (updateSelection (QListBoxItem *))); + connect( SearchList, SIGNAL( doubleClicked ( QListBoxItem * ) ), SLOT( slotOk() ) ); + + // first create and paint dialog and then load list + QTimer::singleShot(0, this, SLOT( init() )); +} + +FindDialog::~FindDialog() { + delete SearchList; +} + +void FindDialog::init() { + SearchBox->clear(); // QLineEdit + filterType->setCurrentItem(0); // show all types of objects + filter(); +} + +void FindDialog::filter() { //Filter the list of names with the string in the SearchBox + KStars *p = (KStars *)parent(); + + SearchList->clear(); + ObjectNameList &ObjNames = p->data()->ObjNames; + // check if latin names are used + ObjNames.setLanguage( Options::useLatinConstellNames() ); + + QString searchFor = SearchBox->text().lower(); + for ( SkyObjectName *name = ObjNames.first( searchFor ); name; name = ObjNames.next() ) { + if ( name->text().lower().startsWith( searchFor ) ) { + new SkyObjectNameListItem ( SearchList, name ); +/* if ( i++ >= 5000 ) { //Every 5000 name insertions, + kapp->processEvents ( 50 ); //spend 50 msec processing KApplication events + i = 0; + }*/ + } + } + setListItemEnabled(); // Automatically highlight first item + SearchBox->setFocus(); // set cursor to QLineEdit +} + +void FindDialog::filterByType() { + KStars *p = (KStars *)parent(); + + SearchList->clear(); // QListBox + QString searchFor = SearchBox->text().lower(); // search string + + ObjectNameList &ObjNames = p->data()->ObjNames; + // check if latin names are used + ObjNames.setLanguage( Options::useLatinConstellNames() ); + + for ( SkyObjectName *name = ObjNames.first( searchFor ); name; name = ObjNames.next() ) { + //Special case: match SkyObject Type 0 with Filter==1 (stars) + if ( name->skyObject()->type() == Filter || (name->skyObject()->type() == 0 && Filter == 1 ) ) { + if ( name->text().lower().startsWith( searchFor ) ) { + // for stars, don't show the ones below the faint limit + if (Filter!=1 || name->skyObject()->mag() <= Options::magLimitDrawStar() ) { + new SkyObjectNameListItem ( SearchList, name ); + } + } + } + } + + setListItemEnabled(); // Automatically highlight first item + SearchBox->setFocus(); // set cursor to QLineEdit +} + +void FindDialog::setListItemEnabled() { + SearchList->setSelected (0, true); + if (!SearchList->isSelected (0)) + updateSelection (0); +} + +void FindDialog::updateSelection (QListBoxItem *it) { + currentitem = (SkyObjectNameListItem *) it; + SearchBox->setFocus(); // set cursor to QLineEdit +} + +void FindDialog::setFilter( int f ) { + // Translate the Listbox index to the correct SkyObject Type ID + int f2( f ); // in most cases, they are the same number + if ( f >= 7 ) f2 = f + 1; //need to skip unused "Supernova Remnant" Type at position 7 + + // check if filter was changed or if filter is still the same + if ( Filter != f2 ) { + Filter = f2; + if ( Filter == 0 ) { // any type will shown + // delete old connections and create new connections + disconnect( SearchBox, SIGNAL( textChanged( const QString & ) ), this, SLOT( filterByType() ) ); + connect( SearchBox, SIGNAL( textChanged( const QString & ) ), SLOT( filter() ) ); + filter(); + } + else { + // delete old connections and create new connections + disconnect( SearchBox, SIGNAL( textChanged( const QString & ) ), this, SLOT( filter() ) ); + connect( SearchBox, SIGNAL( textChanged( const QString & ) ), SLOT( filterByType() ) ); + filterByType(); + } + } +} + +void FindDialog::slotOk() { + //If no valid object selected, show a sorry-box. Otherwise, emit accept() + if ( currentItem() == 0 ) { + QString message = i18n( "No object named %1 found." ).arg( SearchBox->text() ); + KMessageBox::sorry( 0, message, i18n( "Bad object name" ) ); + } else { + accept(); + } +} + +void FindDialog::keyPressEvent( QKeyEvent *e ) { + switch( e->key() ) { + case Key_Down : + if ( SearchList->currentItem() < ((int) SearchList->count()) - 1 ) + SearchList->setCurrentItem( SearchList->currentItem() + 1 ); + break; + + case Key_Up : + if ( SearchList->currentItem() ) + SearchList->setCurrentItem( SearchList->currentItem() - 1 ); + break; + + case Key_Escape : + reject(); + break; + + } +} + +#include "finddialog.moc" |