00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <qcheckbox.h>
00018 #include <qlabel.h>
00019 #include <qlayout.h>
00020 #include <qwidgetstack.h>
00021 #include <knuminput.h>
00022 #include <klistbox.h>
00023 #include <klistview.h>
00024 #include <kpushbutton.h>
00025
00026 #include "dmsbox.h"
00027 #include "kstars.h"
00028 #include "kstarsdata.h"
00029 #include "locationdialog.h"
00030 #include "magnitudespinbox.h"
00031 #include "skyobject.h"
00032 #include "starobject.h"
00033
00034
00035 #include "obslistwizard.h"
00036
00037 ObsListWizard::ObsListWizard( QWidget *parent, const char *name )
00038 : KDialogBase( KDialogBase::Plain, i18n("Observing List Wizard"), Ok|Cancel, Ok, parent, name )
00039 {
00040 ksw = (KStars*)parent;
00041 QFrame *page = plainPage();
00042 QVBoxLayout *vlay = new QVBoxLayout( page, 0, 0 );
00043
00044 olw = new ObsListWizardUI( page );
00045 vlay->addWidget( olw );
00046
00047 connect( olw->AllButton, SIGNAL( clicked() ), this, SLOT( slotAllButton() ) );
00048 connect( olw->NoneButton, SIGNAL( clicked() ), this, SLOT( slotNoneButton() ) );
00049 connect( olw->DeepSkyButton, SIGNAL( clicked() ), this, SLOT( slotDeepSkyButton() ) );
00050 connect( olw->SolarSystemButton, SIGNAL( clicked() ), this, SLOT( slotSolarSystemButton() ) );
00051 connect( olw->LocationButton, SIGNAL( clicked() ), this, SLOT( slotChangeLocation() ) );
00052
00053 connect( olw->FilterList, SIGNAL( clicked(QListViewItem*) ), this, SLOT( slotShowStackWidget(QListViewItem*) ) );
00054
00055
00056 connect( olw->TypeList, SIGNAL( selectionChanged() ), this, SLOT( slotUpdateObjectCount() ) );
00057 connect( olw->ConstellationList, SIGNAL( selectionChanged() ), this, SLOT( slotUpdateObjectCount() ) );
00058 connect( olw->RAMin, SIGNAL( lostFocus() ), this, SLOT( slotUpdateObjectCount() ) );
00059 connect( olw->RAMax, SIGNAL( lostFocus() ), this, SLOT( slotUpdateObjectCount() ) );
00060 connect( olw->DecMin, SIGNAL( lostFocus() ), this, SLOT( slotUpdateObjectCount() ) );
00061 connect( olw->DecMax, SIGNAL( lostFocus() ), this, SLOT( slotUpdateObjectCount() ) );
00062 connect( olw->RA, SIGNAL( lostFocus() ), this, SLOT( slotUpdateObjectCount() ) );
00063 connect( olw->Dec, SIGNAL( lostFocus() ), this, SLOT( slotUpdateObjectCount() ) );
00064 connect( olw->Radius, SIGNAL( valueChanged(double) ), this, SLOT( slotUpdateObjectCount() ) );
00065
00066 connect( olw->Mag, SIGNAL( valueChanged( double ) ), this, SLOT( slotUpdateObjectCount() ) );
00067 connect( olw->ExcludeNoMag, SIGNAL( clicked() ), this, SLOT( slotUpdateObjectCount() ) );
00068
00069 connect( olw->SelectByConstellation, SIGNAL( toggled(bool) ), this, SLOT( slotEnableConstellationPage(bool) ) );
00070 connect( olw->SelectByRect, SIGNAL( toggled(bool) ), this, SLOT( slotEnableRectPage(bool) ) );
00071 connect( olw->SelectByCirc, SIGNAL( toggled(bool) ), this, SLOT( slotEnableCircPage(bool) ) );
00072
00073 connect( olw->SelectByMag, SIGNAL( toggled(bool) ), this, SLOT( slotEnableMagPage(bool) ) );
00074
00075 connect( this, SIGNAL( okClicked() ), this, SLOT( slotApplyFilters() ) );
00076
00077 initialize();
00078 }
00079
00080 ObsListWizard::~ObsListWizard()
00081 {
00082 }
00083
00084 void ObsListWizard::initialize()
00085 {
00086
00087 for ( SkyObject *p = ksw->data()->cnameList.first(); p; p = ksw->data()->cnameList.next() ) {
00088 olw->ConstellationList->insertItem( p->name() );
00089 }
00090
00091
00092
00093
00094
00095 olw->TypeList->selectAll( false );
00096
00097 olw->Mag->setMinValue( -5.0 );
00098 olw->Mag->setMaxValue( 20.0 );
00099 olw->Mag->setValue( 6.0 );
00100
00101 olw->FilterList->setSelected( olw->FilterList->firstChild(), true );
00102
00103 olw->RA->setDegType( false );
00104 olw->RAMin->setDegType( false );
00105 olw->RAMax->setDegType( false );
00106
00107
00108 ObjectCount = 0;
00109 StarCount = ksw->data()->starList.count();
00110 PlanetCount = 10;
00111 AsteroidCount = ksw->data()->asteroidList.count();
00112 CometCount = ksw->data()->cometList.count();
00113
00114 OpenClusterCount = 0;
00115 GlobClusterCount = 0;
00116 GasNebCount = 0;
00117 PlanNebCount = 0;
00118 GalaxyCount = 0;
00119 for ( SkyObject *o = (SkyObject*)(ksw->data()->deepSkyList.first()); o; o = (SkyObject*)(ksw->data()->deepSkyList.next()) ) {
00120 if ( o->type() == SkyObject::GALAXY ) ++GalaxyCount;
00121 else if ( o->type() == SkyObject::STAR || o->type() == SkyObject::CATALOG_STAR ) ++StarCount;
00122 else if ( o->type() == SkyObject::OPEN_CLUSTER ) ++OpenClusterCount;
00123 else if ( o->type() == SkyObject::GLOBULAR_CLUSTER ) ++GlobClusterCount;
00124 else if ( o->type() == SkyObject::GASEOUS_NEBULA || o->type() == SkyObject::SUPERNOVA_REMNANT ) ++GasNebCount;
00125 else if ( o->type() == SkyObject::PLANETARY_NEBULA ) ++PlanNebCount;
00126 }
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 }
00137
00138 void ObsListWizard::slotAllButton() { olw->TypeList->selectAll( true ); }
00139 void ObsListWizard::slotNoneButton() { olw->TypeList->selectAll( false ); }
00140
00141 void ObsListWizard::slotEnableConstellationPage( bool t ) {
00142 olw->ConstellationList->setEnabled(t);
00143
00144
00145 if ( t ) {
00146 olw->SelectByRect->setChecked( false );
00147 olw->SelectByCirc->setChecked( false );
00148 }
00149
00150 slotUpdateObjectCount();
00151 }
00152
00153 void ObsListWizard::slotEnableRectPage( bool t ) {
00154 olw->RAMin->setEnabled(t);
00155 olw->RAMax->setEnabled(t);
00156 olw->DecMin->setEnabled(t);
00157 olw->DecMax->setEnabled(t);
00158
00159
00160 if ( t ) {
00161 olw->SelectByConstellation->setChecked( false );
00162 olw->SelectByCirc->setChecked( false );
00163 }
00164
00165 slotUpdateObjectCount();
00166 }
00167
00168 void ObsListWizard::slotEnableCircPage( bool t ) {
00169 olw->RA->setEnabled(t);
00170 olw->Dec->setEnabled(t);
00171 olw->Radius->setEnabled(t);
00172
00173
00174 if ( t ) {
00175 olw->SelectByConstellation->setChecked( false );
00176 olw->SelectByRect->setChecked( false );
00177 }
00178
00179 slotUpdateObjectCount();
00180 }
00181
00182
00183
00184
00185
00186
00187 void ObsListWizard::slotEnableMagPage( bool t ) {
00188 olw->Mag->setEnabled(t);
00189 olw->ExcludeNoMag->setEnabled(t);
00190 slotUpdateObjectCount();
00191 }
00192
00193 void ObsListWizard::slotShowStackWidget( QListViewItem *i )
00194 {
00195 if ( i ) {
00196 QString t = i->text(0);
00197
00198 if ( t.contains( i18n( "Object type(s)" ) ) ) olw->FilterStack->raiseWidget( olw->ObjTypePage );
00199 if ( t.contains( i18n( "Region" ) ) ) olw->FilterStack->raiseWidget( olw->RegionPage );
00200 if ( t.contains( i18n( "In constellation(s)" ) ) ) olw->FilterStack->raiseWidget( olw->ConstellationPage );
00201 if ( t.contains( i18n( "Circular" ) ) ) olw->FilterStack->raiseWidget( olw->CircRegionPage );
00202 if ( t.contains( i18n( "Rectangular" ) ) ) olw->FilterStack->raiseWidget( olw->RectRegionPage );
00203
00204 if ( t.contains( i18n( "Magnitude limit" ) ) ) olw->FilterStack->raiseWidget( olw->MagLimitPage );
00205 }
00206 }
00207
00208 void ObsListWizard::slotDeepSkyButton()
00209 {
00210 olw->TypeList->selectAll( false );
00211 olw->TypeList->setSelected( olw->TypeList->findItem( i18n( "Open Clusters" ) ), true );
00212 olw->TypeList->setSelected( olw->TypeList->findItem( i18n( "Globular Clusters" ) ), true );
00213 olw->TypeList->setSelected( olw->TypeList->findItem( i18n( "Gaseous Nebulae" ) ), true );
00214 olw->TypeList->setSelected( olw->TypeList->findItem( i18n( "Planetary Nebulae" ) ), true );
00215 olw->TypeList->setSelected( olw->TypeList->findItem( i18n( "Galaxies" ) ), true );
00216 }
00217
00218 void ObsListWizard::slotSolarSystemButton()
00219 {
00220 olw->TypeList->selectAll( false );
00221 olw->TypeList->setSelected( olw->TypeList->findItem( i18n( "Sun, Moon, Planets" ) ), true );
00222 olw->TypeList->setSelected( olw->TypeList->findItem( i18n( "Comets" ) ), true );
00223 olw->TypeList->setSelected( olw->TypeList->findItem( i18n( "Asteroids" ) ), true );
00224 }
00225
00226 void ObsListWizard::slotChangeLocation()
00227 {
00228 LocationDialog ld( ksw );
00229
00230 if ( ld.exec() == QDialog::Accepted ) {
00231
00232 }
00233 }
00234
00235 void ObsListWizard::slotUpdateObjectCount()
00236 {
00237 ObjectCount = 0;
00238 if ( olw->TypeList->findItem( i18n( "Stars" ) )->isSelected() )
00239 ObjectCount += StarCount;
00240 if ( olw->TypeList->findItem( i18n( "Sun, Moon, Planets" ) )->isSelected() )
00241 ObjectCount += PlanetCount;
00242 if ( olw->TypeList->findItem( i18n( "Comets" ) )->isSelected() )
00243 ObjectCount += CometCount;
00244 if ( olw->TypeList->findItem( i18n( "Asteroids" ) )->isSelected() )
00245 ObjectCount += AsteroidCount;
00246 if ( olw->TypeList->findItem( i18n( "Galaxies" ) )->isSelected() )
00247 ObjectCount += GalaxyCount;
00248 if ( olw->TypeList->findItem( i18n( "Open Clusters" ) )->isSelected() )
00249 ObjectCount += OpenClusterCount;
00250 if ( olw->TypeList->findItem( i18n( "Globular Clusters" ) )->isSelected() )
00251 ObjectCount += GlobClusterCount;
00252 if ( olw->TypeList->findItem( i18n( "Gaseous Nebulae" ) )->isSelected() )
00253 ObjectCount += GasNebCount;
00254 if ( olw->TypeList->findItem( i18n( "Planetary Nebulae" ) )->isSelected() )
00255 ObjectCount += PlanNebCount;
00256
00257 applyFilters( false );
00258 }
00259
00260 void ObsListWizard::applyFilters( bool doBuildList )
00261 {
00262 if ( doBuildList )
00263 obsList().clear();
00264
00265
00266 rectOk = false;
00267 if ( olw->SelectByRect->isChecked() ) {
00268 ra1 = olw->RAMin->createDms( false, &rectOk ).Hours();
00269 if ( rectOk ) ra2 = olw->RAMax->createDms( false, &rectOk ).Hours();
00270 if ( rectOk ) dc1 = olw->DecMin->createDms( true, &rectOk ).Degrees();
00271 if ( rectOk ) dc2 = olw->DecMax->createDms( true, &rectOk ).Degrees();
00272 if ( ra2 == 0.0 ) ra2 = 24.0;
00273
00274
00275 if ( dc1 > dc2 ) {
00276 double temp = dc2;
00277 dc2 = dc1;
00278 dc1 = temp;
00279 }
00280
00281
00282 if ( ra1 > ra2 ) {
00283 if ( ra1 - ra2 > 12.0 ) {
00284 ra1 -= 24.0;
00285 } else {
00286 double temp = ra2;
00287 ra2 = ra1;
00288 ra1 = temp;
00289 }
00290 }
00291 }
00292
00293
00294 circOk = false;
00295 if ( olw->SelectByCirc->isChecked() ) {
00296 double ra = olw->RA->createDms( false, &circOk ).Hours();
00297 double dc(0.0);
00298 if ( circOk ) dc = olw->Dec->createDms( true, &circOk ).Degrees();
00299 if ( circOk ) {
00300 pCirc.set( ra, dc );
00301 rCirc = olw->Radius->value();
00302 }
00303 }
00304
00305 double maglimit = 100.;
00306 if ( olw->SelectByMag->isChecked() ) maglimit = olw->Mag->value();
00307
00308
00309 int starIndex(ksw->data()->starList.count());
00310 if ( olw->TypeList->findItem( i18n( "Stars" ) )->isSelected() ) {
00311 if ( maglimit < 100. ) {
00312
00313 int low(0), high(ksw->data()->starList.count()-1), middle;
00314 while ( low < high ) {
00315 middle = (low + high)/2;
00316 if ( maglimit == ksw->data()->starList.at(middle)->mag() ) break;
00317 if ( maglimit < ksw->data()->starList.at(middle)->mag() ) high = middle - 1;
00318 if ( maglimit > ksw->data()->starList.at(middle)->mag() ) low = middle + 1;
00319 }
00320
00321 for ( starIndex=middle+1; starIndex<ksw->data()->starList.count(); ++starIndex ) {
00322 if ( ksw->data()->starList.at(starIndex)->mag() > maglimit ) break;
00323 }
00324 }
00325
00326 if ( doBuildList ) {
00327 for ( uint i=0; i < starIndex; ++i ) {
00328 SkyObject *o = (SkyObject*)(ksw->data()->starList.at(i));
00329 applyRegionFilter( o, doBuildList, false );
00330 }
00331 } else {
00332 ObjectCount -= (ksw->data()->starList.count() - starIndex);
00333 for ( uint i=0; i < starIndex; ++i ) {
00334 SkyObject *o = (SkyObject*)(ksw->data()->starList.at(i));
00335 applyRegionFilter( o, doBuildList );
00336 }
00337 }
00338 }
00339
00340
00341 if ( olw->TypeList->findItem( i18n( "Sun, Moon, Planets" ) )->isSelected() ) {
00342 applyRegionFilter( (SkyObject*)ksw->data()->PCat->planetSun(), doBuildList );
00343 applyRegionFilter( (SkyObject*)ksw->data()->Moon, doBuildList );
00344 applyRegionFilter( (SkyObject*)ksw->data()->PCat->findByName("Mercury"), doBuildList );
00345 applyRegionFilter( (SkyObject*)ksw->data()->PCat->findByName("Venus"), doBuildList );
00346 applyRegionFilter( (SkyObject*)ksw->data()->PCat->findByName("Mars"), doBuildList );
00347 applyRegionFilter( (SkyObject*)ksw->data()->PCat->findByName("Jupiter"), doBuildList );
00348 applyRegionFilter( (SkyObject*)ksw->data()->PCat->findByName("Saturn"), doBuildList );
00349 applyRegionFilter( (SkyObject*)ksw->data()->PCat->findByName("Uranus"), doBuildList );
00350 applyRegionFilter( (SkyObject*)ksw->data()->PCat->findByName("Neptune"), doBuildList );
00351 applyRegionFilter( (SkyObject*)ksw->data()->PCat->findByName("Pluto"), doBuildList );
00352 }
00353
00354
00355 for ( SkyObject *o = (SkyObject*)(ksw->data()->deepSkyList.first()); o; o = (SkyObject*)(ksw->data()->deepSkyList.next()) ) {
00356
00357 if ( (o->type() == SkyObject::STAR || o->type() == SkyObject::CATALOG_STAR) && ! olw->TypeList->findItem( i18n( "Stars" ) )->isSelected() ) continue;
00358 if ( o->type() == SkyObject::OPEN_CLUSTER && ! olw->TypeList->findItem( i18n( "Open Clusters" ) )->isSelected() ) continue;
00359 if ( o->type() == SkyObject::GLOBULAR_CLUSTER && ! olw->TypeList->findItem( i18n( "Globular Clusters" ) )->isSelected() ) continue;
00360 if ( (o->type() == SkyObject::GASEOUS_NEBULA || o->type() == SkyObject::SUPERNOVA_REMNANT) && ! olw->TypeList->findItem( i18n( "Gaseous Nebulae" ) )->isSelected() ) continue;
00361 if ( o->type() == SkyObject::PLANETARY_NEBULA && ! olw->TypeList->findItem( i18n( "Planetary Nebulae" ) )->isSelected() ) continue;
00362 if ( o->type() == SkyObject::GALAXY && ! olw->TypeList->findItem( i18n( "Galaxies" ) )->isSelected() ) continue;
00363 if ( o->type() == SkyObject::TYPE_UNKNOWN ) continue;
00364
00365 if ( olw->SelectByMag->isChecked() ) {
00366 if ( o->mag() > 90. ) {
00367 if ( ! olw->ExcludeNoMag->isChecked() )
00368 applyRegionFilter( o, doBuildList );
00369 else if ( ! doBuildList )
00370 --ObjectCount;
00371 } else {
00372 if ( o->mag() <= maglimit )
00373 applyRegionFilter( o, doBuildList );
00374 else if ( ! doBuildList )
00375 --ObjectCount;
00376 }
00377 } else {
00378 applyRegionFilter( o, doBuildList );
00379 }
00380 }
00381
00382
00383 if ( olw->TypeList->findItem( i18n( "Comets" ) )->isSelected() ) {
00384 for ( SkyObject *o = (SkyObject*)(ksw->data()->cometList.first()); o; o = (SkyObject*)(ksw->data()->cometList.next()) ) {
00385
00386 applyRegionFilter( o, doBuildList );
00387 }
00388 }
00389
00390
00391 if ( olw->TypeList->findItem( i18n( "Asteroids" ) )->isSelected() ) {
00392 for ( SkyObject *o = (SkyObject*)(ksw->data()->asteroidList.first()); o; o = (SkyObject*)(ksw->data()->asteroidList.next()) ) {
00393
00394 if ( olw->SelectByMag->isChecked() ) {
00395 if ( o->mag() > 90. ) {
00396 if ( ! olw->ExcludeNoMag->isChecked() )
00397 applyRegionFilter( o, doBuildList );
00398 else if ( ! doBuildList )
00399 --ObjectCount;
00400 } else {
00401 if ( o->mag() <= maglimit )
00402 applyRegionFilter( o, doBuildList );
00403 else if ( ! doBuildList )
00404 --ObjectCount;
00405 }
00406 } else {
00407 applyRegionFilter( o, doBuildList );
00408 }
00409 }
00410 }
00411
00412
00413 if ( doBuildList ) ObjectCount = obsList().count();
00414 olw->CountLabel->setText( i18n("Current selection: %1 objects").arg( ObjectCount ) );
00415 }
00416
00417 void ObsListWizard::applyRegionFilter( SkyObject *o, bool doBuildList, bool doAdjustCount ) {
00418
00419 if ( olw->SelectByConstellation->isChecked() ) {
00420 QString c( o->constellation( ksw->data()->csegmentList, ksw->data()->cnameList ) );
00421 QListBoxItem *it = olw->ConstellationList->findItem( c );
00422
00423 if ( it && it->isSelected() ) {
00424 if ( doBuildList ) obsList().append ( o );
00425 } else if ( doAdjustCount ) --ObjectCount;
00426 }
00427
00428
00429 else if ( rectOk ) {
00430 double ra = o->ra()->Hours();
00431 double dec = o->dec()->Degrees();
00432 bool addObject = false;
00433 if ( dec >= dc1 && dec <= dc2 ) {
00434 if ( ra1 < 0.0 ) {
00435 if (ra >= ra1 + 24.0 || ra <= ra2 ) { addObject = true; }
00436 } else {
00437 if ( ra >= ra1 && ra <= ra2 ) { addObject = true; }
00438 }
00439 }
00440
00441 if ( addObject && doBuildList ) obsList().append( o );
00442 if ( ! addObject && doAdjustCount ) --ObjectCount;
00443 }
00444
00445
00446 else if ( circOk ) {
00447 if ( o->angularDistanceTo( &pCirc ).Degrees() < rCirc ) {
00448 if ( doBuildList ) obsList().append( o );
00449 } else if ( doAdjustCount ) --ObjectCount;
00450 }
00451
00452
00453 else if ( doBuildList ) {
00454 obsList().append( o );
00455 }
00456 }
00457
00458 #include "obslistwizard.moc"