summaryrefslogtreecommitdiffstats
path: root/kstars/kstars/kspopupmenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kstars/kstars/kspopupmenu.cpp')
-rw-r--r--kstars/kstars/kspopupmenu.cpp392
1 files changed, 392 insertions, 0 deletions
diff --git a/kstars/kstars/kspopupmenu.cpp b/kstars/kstars/kspopupmenu.cpp
new file mode 100644
index 00000000..53804035
--- /dev/null
+++ b/kstars/kstars/kspopupmenu.cpp
@@ -0,0 +1,392 @@
+/***************************************************************************
+ kspopupmenu.cpp - K Desktop Planetarium
+ -------------------
+ begin : Sat Feb 27 2003
+ 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 <qlabel.h>
+
+#include "kspopupmenu.h"
+#include "kstars.h"
+#include "kstarsdata.h"
+#include "starobject.h"
+#include "ksmoon.h"
+#include "skyobject.h"
+#include "ksplanetbase.h"
+#include "skymap.h"
+
+#include "indimenu.h"
+#include "devicemanager.h"
+#include "indidevice.h"
+#include "indigroup.h"
+#include "indiproperty.h"
+
+KSPopupMenu::KSPopupMenu( QWidget *parent, const char *name )
+ : KPopupMenu( parent, name )
+{
+ ksw = ( KStars* )parent;
+}
+
+KSPopupMenu::~KSPopupMenu()
+{
+}
+
+void KSPopupMenu::createEmptyMenu( SkyObject *nullObj ) {
+ initPopupMenu( nullObj, i18n( "Empty sky" ), QString::null, QString::null, true, true, false, false, false, true, false );
+
+ insertItem( i18n( "First Generation Digitized Sky Survey", "Show 1st-Gen DSS Image" ), ksw->map(), SLOT( slotDSS() ) );
+ insertItem( i18n( "Second Generation Digitized Sky Survey", "Show 2nd-Gen DSS Image" ), ksw->map(), SLOT( slotDSS2() ) );
+}
+
+void KSPopupMenu::createStarMenu( StarObject *star ) {
+ //Add name, rise/set time, center/track, and detail-window items
+ initPopupMenu( star, star->translatedLongName(), i18n( "Spectral type: %1" ).arg(star->sptype()),
+ i18n( "star" ) );
+
+//If the star is named, add custom items to popup menu based on object's ImageList and InfoList
+ if ( star->name() != "star" ) {
+ addLinksToMenu( star );
+ } else {
+ insertItem( i18n( "First Generation Digitized Sky Survey", "Show 1st-Gen DSS Image" ), ksw->map(), SLOT( slotDSS() ) );
+ insertItem( i18n( "Second Generation Digitized Sky Survey", "Show 2nd-Gen DSS Image" ), ksw->map(), SLOT( slotDSS2() ) );
+ }
+}
+
+void KSPopupMenu::createDeepSkyObjectMenu( SkyObject *obj ) {
+ QString TypeName = ksw->data()->TypeName[ obj->type() ];
+ QString secondName = obj->translatedName2();
+ if ( obj->longname() != obj->name() ) secondName = obj->translatedLongName();
+
+ initPopupMenu( obj, obj->translatedName(), secondName, TypeName );
+ addLinksToMenu( obj );
+}
+
+void KSPopupMenu::createCustomObjectMenu( SkyObject *obj ) {
+ QString TypeName = ksw->data()->TypeName[ obj->type() ];
+ QString secondName = obj->translatedName2();
+ if ( obj->longname() != obj->name() ) secondName = obj->translatedLongName();
+
+ initPopupMenu( obj, obj->translatedName(), secondName, TypeName );
+
+ addLinksToMenu( obj, true, false ); //don't allow user to add more links (temporary)
+}
+
+void KSPopupMenu::createPlanetMenu( SkyObject *p ) {
+ bool addTrail( ! ((KSPlanetBase*)p)->hasTrail() );
+ QString oname = "";
+ if ( p->name() == "Moon" ) {
+ oname = ((KSMoon *)p)->phaseName();
+ }
+ initPopupMenu( p, p->translatedName(), oname, i18n("Solar System"), true, true, true, true, addTrail );
+ addLinksToMenu( p, false ); //don't offer DSS images for planets
+}
+
+void KSPopupMenu::addLinksToMenu( SkyObject *obj, bool showDSS, bool allowCustom ) {
+ QString sURL;
+ QStringList::Iterator itList, itTitle, itListEnd;
+
+ itList = obj->ImageList.begin();
+ itTitle = obj->ImageTitle.begin();
+ itListEnd = obj->ImageList.end();
+
+ int id = 100;
+ for ( ; itList != itListEnd; ++itList ) {
+ QString t = QString(*itTitle);
+ sURL = QString(*itList);
+ insertItem( i18n( "Image/info menu item (should be translated)", t.local8Bit() ), ksw->map(), SLOT( slotImage( int ) ), 0, id++ );
+ ++itTitle;
+ }
+
+ if ( showDSS ) {
+ insertItem( i18n( "First Generation Digitized Sky Survey", "Show 1st-Gen DSS Image" ), ksw->map(), SLOT( slotDSS() ) );
+ insertItem( i18n( "Second Generation Digitized Sky Survey", "Show 2nd-Gen DSS Image" ), ksw->map(), SLOT( slotDSS2() ) );
+ insertSeparator();
+ }
+ else if ( obj->ImageList.count() ) insertSeparator();
+
+ itList = obj->InfoList.begin();
+ itTitle = obj->InfoTitle.begin();
+ itListEnd = obj->InfoList.end();
+
+ id = 200;
+ for ( ; itList != itListEnd; ++itList ) {
+ QString t = QString(*itTitle);
+ sURL = QString(*itList);
+ insertItem( i18n( "Image/info menu item (should be translated)", t.local8Bit() ), ksw->map(), SLOT( slotInfo( int ) ), 0, id++ );
+ ++itTitle;
+ }
+
+ if ( allowCustom ) {
+ insertSeparator();
+ insertItem( i18n( "Add Link..." ), ksw->map(), SLOT( addLink() ), 0, id++ );
+ }
+}
+
+bool KSPopupMenu::addINDI(void)
+{
+
+ INDIMenu *indiMenu = ksw->getINDIMenu();
+ DeviceManager *mgr;
+ INDI_D *dev;
+ INDI_G *grp;
+ INDI_P *prop(NULL);
+ INDI_E *element;
+ int id=0;
+
+ if (indiMenu->mgr.count() == 0)
+ return false;
+
+ for (mgr = indiMenu->mgr.first(); mgr != NULL; mgr = indiMenu->mgr.next())
+ {
+ for (dev = mgr->indi_dev.first(), id = 0; dev != NULL; dev = mgr->indi_dev.next())
+ {
+ if (!dev->INDIStdSupport)
+ continue;
+
+ KPopupMenu *menuDevice = new KPopupMenu();
+
+ insertItem(dev->label, menuDevice);
+
+ for (grp = dev->gl.first(); grp != NULL; grp = dev->gl.next())
+ {
+ for (prop = grp->pl.first(); prop != NULL; prop = grp->pl.next())
+ {
+ /* Only std are allowed to show. Movement is somewhat problematic due to an issue with the LX200 telescopes (the telescope does not update RA/DEC while moving N/W/E/S) so it's better off the skymap. It's avaiable in the INDI control panel nonetheless.
+ CCD_EXPOSE_DURATION is an INumber property, but it's so common that it's better to include in the context menu */
+
+ if (prop->stdID == -1 || prop->stdID == MOVEMENT) continue;
+ // Only switches are shown
+ if (prop->guitype != PG_BUTTONS && prop->guitype != PG_RADIO && prop->stdID !=CCD_EXPOSE_DURATION) continue;
+
+ menuDevice->insertSeparator();
+
+ prop->assosiatedPopup = menuDevice;
+
+ if (prop->stdID == CCD_EXPOSE_DURATION)
+ {
+ menuDevice->insertItem (prop->label, id);
+ menuDevice->setItemChecked(id, false);
+ //kdDebug() << "Expose ID: " << id << endl;
+ id++;
+ }
+ else
+ {
+ for (element = prop->el.first(); element != NULL; element = prop->el.next(), id++)
+ {
+ menuDevice->insertItem (element->label, id);
+ if (element->state == PS_ON)
+ {
+ // Slew, Track, Sync, Exppse are never checked in the skymap
+ if ((element->name != "SLEW") && (element->name != "TRACK") &&
+ (element->name != "SYNC"))
+ menuDevice->setItemChecked(id, true);
+ else
+ menuDevice->setItemChecked(id, false);
+ }
+ else
+ menuDevice->setItemChecked(id, false);
+
+ //kdDebug() << element->name << " ID is " << id << endl;
+ }
+ }
+
+ QObject::connect(menuDevice, SIGNAL(activated(int)), prop, SLOT (convertSwitch(int)));
+
+ } // end property
+ } // end group
+
+ // For telescopes, add option to center the telescope position
+ if ( dev->findElem("RA") || dev->findElem("ALT"))
+ {
+ menuDevice->insertSeparator();
+ menuDevice->insertItem(i18n("Center && Track Crosshair"), id++);
+ if (dev->findElem("RA"))
+ prop = dev->findElem("RA")->pp;
+ else
+ prop = dev->findElem("ALT")->pp;
+
+ prop->assosiatedPopup = menuDevice;
+ QObject::connect(menuDevice, SIGNAL(activated(int)), prop, SLOT(convertSwitch(int)));
+ }
+ } // end device
+
+ } // end device manager
+
+ return true;
+}
+
+void KSPopupMenu::initPopupMenu( SkyObject *obj, QString s1, QString s2, QString s3,
+ bool showRiseSet, bool showCenterTrack, bool showDetails, bool showTrail, bool addTrail,
+ bool showAngularDistance, bool showObsList ) {
+
+ clear();
+ if ( s1.isEmpty() ) s1 = i18n( "Empty sky" );
+
+ bool showLabel( true );
+ if ( s1 == i18n( "star" ) || s1 == i18n( "Empty sky" ) ) showLabel = false;
+
+ pmTitle = new QLabel( s1, this );
+ pmTitle->setAlignment( AlignCenter );
+ QPalette pal( pmTitle->palette() );
+ pal.setColor( QPalette::Normal, QColorGroup::Background, pal.color( QPalette::Normal, QColorGroup::Base ) );
+ pal.setColor( QPalette::Normal, QColorGroup::Foreground, pal.color( QPalette::Normal, QColorGroup::Text ) );
+ pmTitle->setPalette( pal );
+ insertItem( pmTitle );
+
+ if ( ! s2.isEmpty() ) {
+ pmTitle2 = new QLabel( s2, this );
+ pmTitle2->setAlignment( AlignCenter );
+ pmTitle2->setPalette( pal );
+ insertItem( pmTitle2 );
+ }
+
+ if ( ! s3.isEmpty() ) {
+ pmType = new QLabel( s3, this );
+ pmType->setAlignment( AlignCenter );
+ pmType->setPalette( pal );
+ insertItem( pmType );
+ }
+
+ QString c = obj->constellation( ksw->data()->csegmentList, ksw->data()->cnameList );
+ pmConstellation = new QLabel( c, this );
+ pmConstellation->setAlignment( AlignCenter );
+ pmConstellation->setPalette( pal );
+ insertItem( pmConstellation );
+
+ //Insert Rise/Set/Transit labels
+ if ( showRiseSet && obj ) {
+ pmRiseTime = new QLabel( i18n( "Rise time: 00:00" ), this );
+ pmRiseTime->setAlignment( AlignCenter );
+ pmRiseTime->setPalette( pal );
+ QFont rsFont = pmRiseTime->font();
+ rsFont.setPointSize( rsFont.pointSize() - 2 );
+ pmRiseTime->setFont( rsFont );
+ pmSetTime = new QLabel( i18n( "the time at which an object falls below the horizon", "Set time:" ) + " 00:00", this );
+ pmSetTime->setAlignment( AlignCenter );
+ pmSetTime->setPalette( pal );
+ pmSetTime->setFont( rsFont );
+ pmTransitTime = new QLabel( i18n( "Transit time: 00:00" ), this );
+ pmTransitTime->setAlignment( AlignCenter );
+ pmTransitTime->setPalette( pal );
+ pmTransitTime->setFont( rsFont );
+ insertSeparator();
+ insertItem( pmRiseTime );
+ insertItem( pmTransitTime );
+ insertItem( pmSetTime );
+
+ setRiseSetLabels( obj );
+ }
+
+ //Insert item for centering on object
+ if ( showCenterTrack && obj ) {
+ insertSeparator();
+ insertItem( i18n( "Center && Track" ), ksw->map(), SLOT( slotCenter() ) );
+ }
+
+ //Insert item for measuring distances
+ if ( showAngularDistance && obj ) {
+ if (! (ksw->map()->isAngleMode()) ) {
+ insertItem( i18n( "Angular Distance To... [" ), ksw->map(), SLOT( slotBeginAngularDistance() ) );
+ } else {
+ insertItem( i18n( "Compute Angular Distance ]" ), ksw->map(), SLOT( slotEndAngularDistance() ) );
+ }
+
+ }
+
+
+ //Insert item for Showing details dialog
+ if ( showDetails && obj ) {
+ insertItem( i18n( "Show Detailed Information Dialog", "Details" ), ksw->map(), SLOT( slotDetail() ) );
+ }
+
+ //Insert "Add/Remove Label" item
+ if ( showLabel && obj ) {
+ if ( ksw->map()->isObjectLabeled( obj ) ) {
+ insertItem( i18n( "Remove Label" ), ksw->map(), SLOT( slotRemoveObjectLabel() ) );
+ } else {
+ insertItem( i18n( "Attach Label" ), ksw->map(), SLOT( slotAddObjectLabel() ) );
+ }
+ }
+
+ if ( showObsList && obj ) {
+ if ( ksw->observingList()->contains( obj ) )
+ insertItem( i18n("Remove From List"), ksw->observingList(), SLOT( slotRemoveObject() ) );
+ else
+ insertItem( i18n("Add to List"), ksw->observingList(), SLOT( slotAddObject() ) );
+ }
+
+ if ( showTrail && obj && obj->isSolarSystem() ) {
+ if ( addTrail ) {
+ insertItem( i18n( "Add Trail" ), ksw->map(), SLOT( slotAddPlanetTrail() ) );
+ } else {
+ insertItem( i18n( "Remove Trail" ), ksw->map(), SLOT( slotRemovePlanetTrail() ) );
+ }
+ }
+
+ insertSeparator();
+
+ if (addINDI())
+ insertSeparator();
+}
+
+void KSPopupMenu::setRiseSetLabels( SkyObject *obj ) {
+ if ( ! obj ) return;
+
+ QString rt, rt2, rt3;
+ QTime rtime = obj->riseSetTime( ksw->data()->ut(), ksw->geo(), true );
+ dms rAz = obj->riseSetTimeAz( ksw->data()->ut(), ksw->geo(), true );
+
+ if ( rtime.isValid() ) {
+ //We can round to the nearest minute by simply adding 30 seconds to the time.
+ rt = i18n( "Rise time: %1" ).arg( rtime.addSecs(30).toString( "hh:mm" ) );
+
+ } else if ( obj->alt()->Degrees() > 0 ) {
+ rt = i18n( "No rise time: Circumpolar" );
+ } else {
+ rt = i18n( "No rise time: Never rises" );
+ }
+
+ KStarsDateTime dt = ksw->data()->ut();
+ QTime stime = obj->riseSetTime( dt, ksw->geo(), false );
+
+ QString st, st2, st3;
+ dms sAz = obj->riseSetTimeAz( dt, ksw->geo(), false );
+
+ if ( stime.isValid() ) {
+ //We can round to the nearest minute by simply adding 30 seconds to the time.
+ st = i18n( "the time at which an object falls below the horizon", "Set time: %1" ).arg( stime.addSecs(30).toString( "hh:mm" ) );
+
+ } else if ( obj->alt()->Degrees() > 0 ) {
+ st = i18n( "No set time: Circumpolar" );
+ } else {
+ st = i18n( "No set time: Never rises" );
+ }
+
+ QTime ttime = obj->transitTime( dt, ksw->geo() );
+ dms trAlt = obj->transitAltitude( dt, ksw->geo() );
+ QString tt, tt2, tt3;
+
+ if ( ttime.isValid() ) {
+ //We can round to the nearest minute by simply adding 30 seconds to the time.
+ tt = i18n( "Transit time: %1" ).arg( ttime.addSecs(30).toString( "hh:mm" ) );
+ } else {
+ tt = "--:--";
+ }
+
+ pmRiseTime->setText( rt );
+ pmSetTime->setText( st );
+ pmTransitTime->setText( tt ) ;
+}
+
+#include "kspopupmenu.moc"