kdeapp.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:67k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /***************************************************************************
  2.                           kdeapp.cpp  -  description
  3.                              -------------------
  4.     begin                : Tue Jul 16 22:28:19 CEST 2002
  5.     copyright            : (C) 2002 by Christophe Teyssier
  6.     email                : chris@teyssier.org
  7.  ***************************************************************************/
  8. /***************************************************************************
  9.  *                                                                         *
  10.  *   This program is free software; you can redistribute it and/or modify  *
  11.  *   it under the terms of the GNU General Public License as published by  *
  12.  *   the Free Software Foundation; either version 2 of the License, or     *
  13.  *   (at your option) any later version.                                   *
  14.  *                                                                         *
  15.  ***************************************************************************/
  16. #include <libintl.h>
  17. #include <fstream>
  18. #include <sstream>
  19. #include <qpushbutton.h>
  20. #include <qslider.h>
  21. #include <qlayout.h>
  22. #include <qframe.h>
  23. #include <qgrid.h>
  24. #include <qvbox.h>
  25. #include <qcheckbox.h>
  26. #include <qvgroupbox.h>
  27. #include <qlabel.h>
  28. #include <qclipboard.h>
  29. #include <qregexp.h>
  30. #include <qpalette.h>
  31. #include <qfont.h>
  32. #include <qlineedit.h>
  33. #include <qvalidator.h>
  34. #include <qurl.h>
  35. #include <qevent.h>
  36. #include <qmenubar.h>
  37. #include <qpopupmenu.h>
  38. #include <qapplication.h>
  39. #include <qkeycode.h>
  40. #include <qtimer.h>
  41. #include <qimage.h>
  42. #include <kaction.h>
  43. #include <kstdaction.h>
  44. #include <kmenubar.h>
  45. #include <kedittoolbar.h>
  46. #include <kkeydialog.h>
  47. #include <klocale.h>
  48. #include <kconfig.h>
  49. #include <qtextedit.h>
  50. #include <kinputdialog.h>
  51. #include <qdatetime.h>
  52. #include <kshortcut.h>
  53. #include <klocale.h>
  54. #include <kfiledialog.h>
  55. #include <kmessagebox.h>
  56. #include <kurl.h>
  57. #include <krun.h>
  58. #include <kurldrag.h>
  59. #include <kstdaccel.h>
  60. #include <kpopupmenu.h>
  61. #include <kcelbookmarkmenu.h>
  62. #include <kbookmarkbar.h>
  63. #include <kcelbookmarkmanager.h>
  64. #include <kdeversion.h>
  65. #if KDE_VERSION >= 0x030200
  66. #include <ksplashscreen.h>
  67. #endif
  68. #include "kdeglwidget.h"
  69. #include "kdeapp.h"
  70. #include "kdepreferencesdialog.h"
  71. #include "celengine/cmdparser.h"
  72. #include "url.h"
  73. #include "celestialbrowser.h"
  74. #include "eclipsefinderdlg.h"
  75. #include "selectionpopup.h"
  76. #include "celsplashscreen.h"
  77. #ifdef THEORA
  78. #include "videocapturedlg.h"
  79. #endif
  80. #include "celengine/glext.h"
  81. #define MENUMAXSIZE 100
  82. KdeApp* KdeApp::app=0;
  83. KBookmarkManager* KCelBookmarkManager::s_bookmarkManager;
  84. static uint32 FilterOtherLocations = ~(Location::City |
  85.                     Location::Observatory |
  86.                     Location::LandingSite |
  87.                     Location::Crater |
  88.                     Location::Mons |
  89.                     Location::Terra |
  90.                     Location::Vallis |
  91.                     Location::Mare);
  92. KdeApp::KdeApp(std::string config, std::string dir, std::vector<std::string> extrasDirs, bool fullscreen, bool disableSplash) : KMainWindow(0, 0)
  93. {
  94. #if KDE_VERSION >= 0x030200
  95.     CelSplashScreen *splash = NULL;
  96.     if (!disableSplash) {
  97.         QStringList splashDirs = KGlobal::dirs()->findDirs("appdata", "splash");
  98.         QStringList images;
  99.         srandom(time(NULL));
  100.         for(QStringList::iterator i = splashDirs.begin(); i != splashDirs.end(); ++i) {
  101.             QDir d(*i);
  102.             d.setFilter(QDir::Files);
  103.             QStringList splashImages = d.entryList().grep(QRegExp("\.(jpg|png)$", FALSE));
  104.             for(QStringList::iterator j = splashImages.begin(); j != splashImages.end(); ++j) {
  105.                 images.append(*i + *j);
  106.             }
  107.         }
  108.         if (images.size() > 0) {
  109.             int index = (int)(random()*1./RAND_MAX*images.size());
  110.             splash = new CelSplashScreen(images[index], this);
  111.         } else {
  112.             KMessageBox::queuedMessageBox(this, KMessageBox::Information, i18n("Something seems to be wrong with your installation of Celestia. The splash screen directory couldn't be found. nStart-up will continue, but Celestia will probably be missing some data files and may not work correctly, please check your installation."));
  113.         }
  114.     }
  115. #endif
  116.     appCore=new CelestiaCore();
  117.     if (appCore == NULL)
  118.     {
  119.         cerr << "Out of memory.n";
  120.         exit(1);
  121.     }
  122.     kdewatcher = new KdeWatcher(appCore, this);
  123.     renderer = appCore->getRenderer();
  124.     sim = appCore->getSimulation();
  125.     app=this;
  126.     appCore->setContextMenuCallback(&KdeApp::popupMenu);
  127.     appCore->setAlerter(new KdeAlerter(this));
  128.     setAcceptDrops(true);
  129.     // Create our OpenGL widget
  130.     startDir = QDir::current().path();
  131.     if ( (dir.length() > 1 ? chdir(dir.c_str()):chdir(CONFIG_DATA_DIR)) == -1)
  132.     {
  133.         ::std::cout << "Cannot chdir to '" << CONFIG_DATA_DIR << "', probably due to improper installation" << ::std::endl;
  134. exit(1);
  135.     }
  136.     glWidget = new KdeGlWidget( this, "kdeglwidget", appCore);
  137.     string* altConfig = config.length() > 0 ? &config : NULL;
  138. #if KDE_VERSION >= 0x030200
  139.     if (!appCore->initSimulation(altConfig, &extrasDirs, splash))
  140. #else
  141.     if (!appCore->initSimulation(altConfig, &extrasDirs))
  142. #endif
  143.     {
  144.         exit(1);
  145.     }
  146.     setCentralWidget(glWidget);
  147.     initActions();
  148.     glWidget->setFocus();
  149.     resize(640,480);
  150.     setAutoSaveSettings("MainWindow");
  151.     KConfig* conf = kapp->config();
  152.     applyMainWindowSettings(conf, "MainWindow");
  153.     conf->setGroup("MainWindow");
  154.     restoreWindowSize(conf);
  155.     conf->setGroup(0);
  156.     if (fullscreen) slotFullScreen();
  157.     KGlobal::config()->setGroup("Preferences");
  158.     if (KGlobal::config()->hasKey("DistanceToScreen"))
  159.     {
  160.         appCore->setDistanceToScreen(KGlobal::config()->readNumEntry("DistanceToScreen"));
  161.     }
  162.     if (conf->hasGroup("Shortcuts"))
  163.         actionCollection()->readShortcutSettings("Shortcuts", conf);
  164.     if (toolBar()->isHidden()) toggleToolbar->setChecked(false);
  165.     if (menuBar()->isHidden()) toggleMenubar->setChecked(false);
  166. #if KDE_VERSION >= 0x030200
  167.     if (splash != NULL) {
  168.         splash->finish(this);
  169.         delete splash;
  170.     }
  171. #endif
  172.     // We use a timer with a null timeout value
  173.     // to add appCore->tick to Qt's event loop
  174.     QTimer *t = new QTimer( dynamic_cast<QObject *>(this) );
  175.     QObject::connect( t, SIGNAL(timeout()), SLOT(celestia_tick()) );
  176.     t->start( 0, FALSE );
  177. }
  178. void KdeApp::setStartURL(KURL url) {
  179.     if (url.protocol() == "cel") {
  180.         appCore->setStartURL(url.url().latin1());
  181.     }
  182.     if (url.protocol() == "file") {
  183.         appCore->setStartURL(url.path().latin1());
  184.     }
  185. }
  186. void KdeApp::goToURL(const KURL& url) {
  187.     if (url.protocol() == "cel")  {
  188.         appCore->addToHistory();
  189.         appCore->goToUrl(url.prettyURL().latin1());
  190.     }
  191.     if (url.protocol() == "file") {
  192.         appCore->addToHistory();
  193.         slotOpenFileURL(url);
  194.     }
  195. }
  196. void KdeApp::openBookmarkURL(const QString& _url) {
  197.     KURL url(_url);
  198.     appCore->addToHistory();
  199.     appCore->goToUrl(url.prettyURL().latin1());
  200. }
  201. Url KdeApp::currentUrl(Url::UrlType type) const
  202. {
  203.     CelestiaState appState;
  204.     appState.captureState(appCore);
  205.     return Url(appState,
  206.                Url::CurrentVersion,
  207.                type == Url::Relative ? Url::UseSimulationTime : Url::UseUrlTime);
  208. }
  209. QString KdeApp::currentIcon() const {
  210.     QDateTime now = QDateTime::currentDateTime();
  211.     QString iconName = QString::fromLatin1("favicons/celestia_") + now.toString("yyyyMMddhhmmsszzz");
  212.     QString iconFilename = locateLocal("cache", iconName) + ".png";
  213.     QImage grabedImage = glWidget->grabFrameBuffer();
  214.     int width=grabedImage.width(), height=grabedImage.height();
  215.     if (width > height) {
  216.         grabedImage.copy((width - height)/2, 0, height, height).smoothScale(64,64).save(iconFilename, "PNG");
  217.     } else {
  218.         grabedImage.copy(0, (height - width)/2, width, width).smoothScale(64,64).save(iconFilename, "PNG");
  219.     }
  220.     return iconName;
  221. }
  222. void KdeWatcher::notifyChange(CelestiaCore*, int property)
  223. {
  224.     if ((property & (CelestiaCore::RenderFlagsChanged|
  225.                      CelestiaCore::LabelFlagsChanged|
  226.                      CelestiaCore::TimeZoneChanged)))
  227.         kdeapp->resyncMenus();
  228.     if (property & CelestiaCore::AmbientLightChanged)
  229.         kdeapp->resyncAmbient();
  230.     if (property & CelestiaCore::FaintestChanged)
  231.         kdeapp->resyncFaintest();
  232.     if (property & CelestiaCore::VerbosityLevelChanged)
  233.         kdeapp->resyncVerbosity();
  234.     if (property & CelestiaCore::HistoryChanged)
  235.         kdeapp->resyncHistory();
  236.     if (property == CelestiaCore::TextEnterModeChanged) {
  237.         static std::vector<KAction*> actions;
  238.         if (kdeapp->appCore->getTextEnterMode() != CelestiaCore::KbNormal) {
  239.             for (unsigned int n=0; n < kdeapp->getActionCollection()->count(); n++) {
  240.                 KAction* action = kdeapp->getActionCollection()->action(n);
  241.                 if (action->shortcut().count() > 0
  242.                     && (action->shortcut().seq(0).key(0).modFlags()
  243.                         & ( KKey::ALT | KKey::WIN )) == 0
  244.                     && action->isEnabled()) {
  245.                     actions.push_back(kdeapp->getActionCollection()->action(n));
  246.                     kdeapp->getActionCollection()->action(n)->setEnabled(false);
  247.                 }
  248.             }
  249.         } else {
  250.             for (std::vector<KAction*>::iterator n=actions.begin(); n<actions.end(); n++) {
  251.                 (*n)->setEnabled(true);
  252.             }
  253.             actions.clear();
  254.         }
  255.     }
  256. }
  257. void KdeApp::resyncHistory() {
  258.     std::vector<Url> history=appCore->getHistory();
  259.     std::vector<Url>::size_type i=appCore->getHistoryCurrent();
  260.     if (i >= history.size()-1) {
  261.         action("go_forward")->setEnabled(false);
  262.     } else {
  263.         action("go_forward")->setEnabled(true);
  264.     }
  265.     if (i == 0) {
  266.         action("go_back")->setEnabled(false);
  267.     } else {
  268.         action("go_back")->setEnabled(true);
  269.     }
  270. }
  271. void KdeApp::resyncMenus() {
  272.     int rFlags = renderer->getRenderFlags();
  273.     int orbitMask = renderer->getOrbitMask();
  274.     ((KToggleAction*)action("showStars"))->setChecked(rFlags & Renderer::ShowStars);
  275.     ((KToggleAction*)action("showPlanets"))->setChecked(rFlags & Renderer::ShowPlanets);
  276.     ((KToggleAction*)action("showGalaxies"))->setChecked(rFlags & Renderer::ShowGalaxies);
  277.     ((KToggleAction*)action("showGlobulars"))->setChecked(rFlags & Renderer::ShowGlobulars);
  278.     ((KToggleAction*)action("showPartialTrajectories"))->setChecked(rFlags & Renderer::ShowPartialTrajectories);
  279.     ((KToggleAction*)action("showNebulae"))->setChecked(rFlags & Renderer::ShowNebulae);
  280.     ((KToggleAction*)action("showOpenClusters"))->setChecked(rFlags & Renderer::ShowOpenClusters);
  281.     ((KToggleAction*)action("showDiagrams"))->setChecked(rFlags & Renderer::ShowDiagrams);
  282.     ((KToggleAction*)action("showCloudMaps"))->setChecked(rFlags & Renderer::ShowCloudMaps);
  283.     ((KToggleAction*)action("showCloudShadows"))->setChecked(rFlags & Renderer::ShowCloudShadows);
  284.     ((KToggleAction*)action("showOrbits"))->setChecked(rFlags & Renderer::ShowOrbits);
  285.     ((KToggleAction*)action("showAsteroidOrbits"))->setChecked(orbitMask & Body::Asteroid);
  286.     ((KToggleAction*)action("showCometOrbits"))->setChecked(orbitMask & Body::Comet);
  287.     ((KToggleAction*)action("showMoonOrbits"))->setChecked(orbitMask & Body::Moon);
  288.     ((KToggleAction*)action("showStarOrbits"))->setChecked(orbitMask & Body::Stellar);
  289.     ((KToggleAction*)action("showPlanetOrbits"))->setChecked(orbitMask & Body::Planet);
  290.     ((KToggleAction*)action("showSpacecraftOrbits"))->setChecked(orbitMask & Body::Spacecraft);
  291.     ((KToggleAction*)action("showCelestialSphere"))->setChecked(rFlags & Renderer::ShowCelestialSphere);
  292.     ((KToggleAction*)action("showNightMaps"))->setChecked(rFlags & Renderer::ShowNightMaps);
  293.     ((KToggleAction*)action("showMarkers"))->setChecked(rFlags & Renderer::ShowMarkers);
  294.     ((KToggleAction*)action("showAtmospheres"))->setChecked(rFlags & Renderer::ShowAtmospheres);
  295.     ((KToggleAction*)action("showSmoothLines"))->setChecked(rFlags & Renderer::ShowSmoothLines);
  296.     ((KToggleAction*)action("showEclipseShadows"))->setChecked(rFlags & Renderer::ShowEclipseShadows);
  297.     ((KToggleAction*)action("showRingShadows"))->setChecked(rFlags & Renderer::ShowRingShadows);
  298.     ((KToggleAction*)action("showBoundaries"))->setChecked(rFlags & Renderer::ShowBoundaries);
  299.     ((KToggleAction*)action("showAutoMag"))->setChecked(rFlags & Renderer::ShowAutoMag);
  300.     ((KToggleAction*)action("showCometTails"))->setChecked(rFlags & Renderer::ShowCometTails);
  301.     int lMode = renderer->getLabelMode();
  302.     ((KToggleAction*)action("showStarLabels"))->setChecked(lMode & Renderer::StarLabels);
  303.     ((KToggleAction*)action("showPlanetLabels"))->setChecked(lMode & Renderer::PlanetLabels);
  304.     ((KToggleAction*)action("showMoonLabels"))->setChecked(lMode & Renderer::MoonLabels);
  305.     ((KToggleAction*)action("showCometLabels"))->setChecked(lMode & Renderer::CometLabels);
  306.     ((KToggleAction*)action("showConstellationLabels"))->setChecked(lMode & Renderer::ConstellationLabels);
  307.     ((KToggleAction*)action("showI18nConstellationLabels"))->setChecked(!(lMode & Renderer::I18nConstellationLabels));
  308.     ((KToggleAction*)action("showGalaxyLabels"))->setChecked(lMode & Renderer::GalaxyLabels);
  309.     ((KToggleAction*)action("showGlobularLabels"))->setChecked(lMode & Renderer::GlobularLabels);
  310.     ((KToggleAction*)action("showNebulaLabels"))->setChecked(lMode & Renderer::NebulaLabels);
  311.     ((KToggleAction*)action("showOpenClusterLabels"))->setChecked(lMode & Renderer::OpenClusterLabels);
  312.     ((KToggleAction*)action("showAsteroidLabels"))->setChecked(lMode & Renderer::AsteroidLabels);
  313.     ((KToggleAction*)action("showSpacecraftLabels"))->setChecked(lMode & Renderer::SpacecraftLabels);
  314.     ((KToggleAction*)action("showLocationLabels"))->setChecked(lMode & Renderer::LocationLabels);
  315.     ((KToggleAction*)action("toggleVideoSync"))->setChecked(renderer->getVideoSync());
  316.     switch (renderer->getGLContext()->getRenderPath()) {
  317.     case GLContext::GLPath_Basic:
  318.         ((KToggleAction*)action("renderPathBasic"))->setChecked(true);
  319.         break;
  320.     case GLContext::GLPath_Multitexture:
  321.         ((KToggleAction*)action("renderPathMultitexture"))->setChecked(true);
  322.         break;
  323.     case GLContext::GLPath_NvCombiner:
  324.         ((KToggleAction*)action("renderPathNvCombiner"))->setChecked(true);
  325.         break;
  326.     case GLContext::GLPath_DOT3_ARBVP:
  327.         ((KToggleAction*)action("renderPathDOT3ARBVP"))->setChecked(true);
  328.         break;
  329.     case GLContext::GLPath_NvCombiner_NvVP:
  330.         ((KToggleAction*)action("renderPathNvCombinerNvVP"))->setChecked(true);
  331.         break;
  332.     case GLContext::GLPath_NvCombiner_ARBVP:
  333.         ((KToggleAction*)action("renderPathNvCombinerARBVP"))->setChecked(true);
  334.         break;
  335.     case GLContext::GLPath_ARBFP_ARBVP:
  336.         ((KToggleAction*)action("renderPathARBFPARBVP"))->setChecked(true);
  337.         break;
  338.     case GLContext::GLPath_NV30:
  339.         ((KToggleAction*)action("renderPathNV30"))->setChecked(true);
  340.         break;
  341.     case GLContext::GLPath_GLSL:
  342.         ((KToggleAction*)action("renderPathGLSL"))->setChecked(true);
  343.         break;
  344.     }
  345. }
  346. void KdeApp::resyncAmbient() {
  347. }
  348. void KdeApp::resyncFaintest() {
  349. }
  350. void KdeApp::resyncVerbosity() {
  351. }
  352. void KdeApp::initActions()
  353. {
  354.     KStdAction::open(this, SLOT(slotFileOpen()), actionCollection());
  355.     openRecent = KStdAction::openRecent(this, SLOT(slotFileOpenRecent(const KURL&)), actionCollection());
  356.     openRecent->loadEntries(KGlobal::config());
  357.     connect(openRecent, SIGNAL(urlSelected(const KURL&)), SLOT(slotOpenFileURL(const KURL&)));
  358.     KStdAction::quit(this, SLOT(slotClose()), actionCollection());
  359.     KStdAction::configureToolbars( this, SLOT( slotConfigureToolbars() ), actionCollection() );
  360.     new KAction(i18n("Go to &URL..."), 0, ALT + Key_G, this, SLOT(slotGoTo()), actionCollection(), "go_to");
  361.     new KAction(i18n("Go to &Long/Lat..."), 0, ALT + Key_L, this, SLOT(slotGoToLongLat()), actionCollection(), "go_to_long_lat");
  362.     backAction = new KToolBarPopupAction( i18n("&Back"), "back",
  363.                                            KStdAccel::shortcut(KStdAccel::Back), this, SLOT( slotBack() ),
  364.                                            actionCollection(), KStdAction::stdName( KStdAction::Back ) );
  365.     forwardAction = new KToolBarPopupAction( i18n("&Forward"), "forward",
  366.                                            KStdAccel::shortcut(KStdAccel::Forward), this, SLOT( slotForward() ),
  367.                                            actionCollection(), KStdAction::stdName( KStdAction::Forward ) );
  368.     connect( backAction->popupMenu(), SIGNAL( aboutToShow() ), SLOT( slotBackAboutToShow() ) );
  369.     connect( backAction->popupMenu(), SIGNAL( activated( int ) ), SLOT( slotBackActivated( int ) ) );
  370.     connect( forwardAction->popupMenu(), SIGNAL( aboutToShow() ), SLOT( slotForwardAboutToShow() ) );
  371.     connect( forwardAction->popupMenu(), SIGNAL( activated( int ) ), SLOT( slotForwardActivated( int ) ) );
  372.     new KAction(i18n("Home"), "gohome", CTRL + Key_Home, this, SLOT(slotHome()), actionCollection(), "home");
  373.     action("go_forward")->setEnabled(false);
  374.     action("go_back")->setEnabled(false);
  375.     KStdAction::zoomIn(this, SLOT(slotZoomIn()), actionCollection());
  376.     KStdAction::zoomOut(this, SLOT(slotZoomOut()), actionCollection());
  377.     KActionMenu *bookmarks = new KActionMenu( i18n("Bookmarks"), "bookmark", actionCollection(), "bookmarks" );
  378.     new KCelBookmarkMenu( KCelBookmarkManager::self(), this,
  379.                                      bookmarks->popupMenu(), actionCollection(), true, true );
  380.     KStdAction::preferences(this, SLOT(slotPreferences()), actionCollection());
  381.     KStdAction::configureToolbars(this, SLOT(slotConfigureToolbars()), actionCollection());
  382.     KStdAction::keyBindings(this, SLOT(slotKeyBindings()), actionCollection());
  383.     KShortcut fullscreen_shortcut(CTRL + Key_F);
  384.     fullscreen_shortcut.append(KKeySequence(QKeySequence(ALT + Key_Return)));
  385.     //fullscreen_shortcut.append(KShortcut(ALT + Key_Return));
  386.     new KAction(i18n("Full Screen"), "window_fullscreen", fullscreen_shortcut, this, SLOT(slotFullScreen()), actionCollection(), "fullScreen");
  387.     KShortcut copy_url_shortcut(CTRL + Key_C);
  388.     copy_url_shortcut.append(KKeySequence(QKeySequence(CTRL + Key_Insert)));
  389.     //copy_url_shortcut.append(KShortcut(CTRL + Key_Insert));
  390.     new KAction(i18n("Copy URL"), "edit_copy", copy_url_shortcut, this, SLOT(slotCopyUrl()), actionCollection(), "copyUrl");
  391.     new KAction(i18n("Set Time..."), "kalarm", ALT + Key_T, this, SLOT(slotSetTime()), actionCollection(), "setTime");
  392.     new KAction(i18n("Set Time to Now"), "player_eject", Key_Exclam, this, SLOT(slotSetTimeNow()), actionCollection(), "setTimeNow");
  393.     new KAction(i18n("Accelerate Time"), "1uparrow", Key_L, this, SLOT(slotAccelerateTime()), actionCollection(), "accelerateTime");
  394.     new KAction(i18n("Decelerate Time"), "1downarrow", Key_K, this, SLOT(slotSlowDownTime()), actionCollection(), "slowDownTime");
  395.     new KAction(i18n("Accelerate Time (x2)"), "1uparrow", SHIFT + Key_L, this, SLOT(slotAccelerateTimeFine()), actionCollection(), "accelerateTimeFine");
  396.     new KAction(i18n("Decelerate Time (/2)"), "1downarrow", SHIFT + Key_K, this, SLOT(slotSlowDownTimeFine()), actionCollection(), "slowDownTimeFine");
  397.     new KAction(i18n("Pause Time"), "player_pause", Key_Space, this, SLOT(slotPauseTime()), actionCollection(), "pauseTime");
  398.     new KAction(i18n("Reverse Time"), "reload", Key_J, this, SLOT(slotReverseTime()), actionCollection(), "reverseTime");
  399.     new KAction(i18n("Split View Vertically"), "view_top_bottom", CTRL + Key_R, this, SLOT(slotSplitH()), actionCollection(), "splitH");
  400.     new KAction(i18n("Split View Horizontally"), "view_left_right", CTRL + Key_U, this, SLOT(slotSplitV()), actionCollection(), "splitV");
  401.     new KAction(i18n("Cycle View"), "rotate_cw", Key_Tab, this, SLOT(slotCycleView()), actionCollection(), "cycleView");
  402.     new KAction(i18n("Single View"), "view_remove", CTRL + Key_D, this, SLOT(slotSingleView()), actionCollection(), "singleView");
  403.     new KAction(i18n("Delete View"), "view_remove", Key_Delete, this, SLOT(slotDeleteView()), actionCollection(), "deleteView");
  404.     KToggleAction* framesVisible = new KToggleAction(i18n("Frames Visible"), 0, 0, this, SLOT(slotToggleFramesVisible()), actionCollection(), "framesVisible");
  405.     KGlobal::config()->setGroup("Preferences");
  406.     if (KGlobal::config()->hasKey("FramesVisible"))
  407.     {
  408.         bool visible = KGlobal::config()->readBoolEntry("FramesVisible");
  409.         framesVisible->setChecked(visible);
  410.         appCore->setFramesVisible(visible);
  411.     }
  412.     else
  413.     {
  414.         framesVisible->setChecked(appCore->getFramesVisible());
  415.     }
  416.     KToggleAction* activeFrameVisible = new KToggleAction(i18n("Active Frame Visible"), 0, 0, this, SLOT(slotToggleActiveFrameVisible()), actionCollection(), "activeFrameVisible");
  417.     if (KGlobal::config()->hasKey("ActiveFrameVisible"))
  418.     {
  419.         bool visible = KGlobal::config()->readBoolEntry("ActiveFrameVisible");
  420.         activeFrameVisible->setChecked(visible);
  421.         appCore->setActiveFrameVisible(visible);
  422.     }
  423.     else
  424.     {
  425.         activeFrameVisible->setChecked(appCore->getActiveFrameVisible());
  426.     }
  427.     KToggleAction* timeSync = new KToggleAction(i18n("Synchronize Time"), 0, 0, this, SLOT(slotToggleSyncTime()), actionCollection(), "syncTime");
  428.     if (KGlobal::config()->hasKey("SyncTime"))
  429.     {
  430.         bool sync = KGlobal::config()->readBoolEntry("SyncTime");
  431.         timeSync->setChecked(sync);
  432.         appCore->getSimulation()->setSyncTime(sync);
  433.     }
  434.     else
  435.     {
  436.         timeSync->setChecked(appCore->getSimulation()->getSyncTime());
  437.     }
  438.     new KAction(i18n("Alt-Azimuth Mode"), 0, ALT + Key_F, this, SLOT(slotAltAzMode()), actionCollection(), "altAzMode");
  439.     new KAction(i18n("Go To Surface"), 0, CTRL + Key_G, this, SLOT(slotGoToSurface()), actionCollection(), "goToSurface");
  440.     new KAction(i18n("Celestial Browser"), 0, ALT + Key_C, this, SLOT(slotCelestialBrowser()), actionCollection(), "celestialBrowser");
  441.     new KAction(i18n("Eclipse Finder"), 0, ALT + Key_E, this, SLOT(slotEclipseFinder()), actionCollection(), "eclipseFinder");
  442.     int rFlags, lMode, oMask;
  443.     uint32 lFilter;
  444.     bool isLocal = true;
  445.     if (KGlobal::config()->hasKey("RendererFlags"))
  446.         rFlags = KGlobal::config()->readNumEntry("RendererFlags");
  447.     else rFlags = appCore->getRenderer()->getRenderFlags();
  448.     if (KGlobal::config()->hasKey("LabelMode"))
  449.         lMode = KGlobal::config()->readNumEntry("LabelMode");
  450.     else lMode = appCore->getRenderer()->getLabelMode();
  451.     if (KGlobal::config()->hasKey("LocationFilter"))
  452.         lFilter = KGlobal::config()->readUnsignedNumEntry("LocationFilter");
  453.     else lFilter = appCore->getSimulation()->getActiveObserver()->getLocationFilter();
  454.     appCore->getSimulation()->getActiveObserver()->setLocationFilter(lFilter);
  455.     oMask = appCore->getRenderer()->getOrbitMask();
  456.     if (KGlobal::config()->hasKey("TimeZoneBias"))
  457.         isLocal = (KGlobal::config()->readNumEntry("TimeZoneBias") != 0);
  458.     if (KGlobal::config()->hasKey("StarStyle")) 
  459.     {
  460.         int starStyle = KGlobal::config()->readNumEntry("StarStyle");
  461.         if (starStyle >= 0 && starStyle < Renderer::StarStyleCount)
  462.             appCore->getRenderer()->setStarStyle((Renderer::StarStyle)starStyle);
  463.     }
  464.     if (KGlobal::config()->hasKey("TextureResolution")) 
  465.     {
  466.         int textureResolution = KGlobal::config()->readNumEntry("TextureResolution");
  467.         appCore->getRenderer()->setResolution(textureResolution);
  468.     }
  469.     if (KGlobal::config()->hasKey("DateFormat")) 
  470.     {
  471.         astro::Date::Format dateFormat = (astro::Date::Format) KGlobal::config()->readNumEntry("DateFormat");
  472.         appCore->setDateFormat(dateFormat);
  473.     }
  474.     /////////////////////////////////////////
  475.     // Render Flags
  476.     KToggleAction* showStars = new KToggleAction(i18n("Show Stars"), 0, this, SLOT(slotShowStars()), actionCollection(), "showStars");
  477.     showStars->setChecked(rFlags & Renderer::ShowStars);
  478.     KToggleAction* showPlanets = new KToggleAction(i18n("Show Planets"), 0, this, SLOT(slotShowPlanets()), actionCollection(), "showPlanets");
  479.     showPlanets->setChecked(rFlags & Renderer::ShowPlanets);
  480.     KToggleAction* showGalaxies = new KToggleAction(i18n("Show Galaxies"), Key_U, this, SLOT(slotShowGalaxies()), actionCollection(), "showGalaxies");
  481.     showGalaxies->setChecked(rFlags & Renderer::ShowGalaxies);
  482.     KToggleAction* showGlobulars = new KToggleAction(i18n("Show Globulars"), SHIFT + Key_U, this, SLOT(slotShowGlobulars()), actionCollection(), "showGlobulars");
  483.     showGlobulars->setChecked(rFlags & Renderer::ShowGlobulars);
  484.     KToggleAction* showPartialTrajectories = new KToggleAction(i18n("Show Partial Trajectories"), 0, this, SLOT(slotShowPartialTrajectories()), actionCollection(), "showPartialTrajectories");
  485.     showPartialTrajectories->setChecked(rFlags & Renderer::ShowPartialTrajectories);
  486.     KToggleAction* showNebulae = new KToggleAction(i18n("Show Nebulae"), Key_AsciiCircum, this, SLOT(slotShowNebulae()), actionCollection(), "showNebulae");
  487.     showNebulae->setChecked(rFlags & Renderer::ShowNebulae);
  488.     KToggleAction* showOpenClusters = new KToggleAction(i18n("Show Open Clusters"), 0, this, SLOT(slotShowOpenClusters()), actionCollection(), "showOpenClusters");
  489.     showOpenClusters->setChecked(rFlags & Renderer::ShowOpenClusters);
  490.     KToggleAction* showDiagrams = new KToggleAction(i18n("Show Constellations"), Key_Slash, this, SLOT(slotShowDiagrams()), actionCollection(), "showDiagrams");
  491.     showDiagrams->setChecked(rFlags & Renderer::ShowDiagrams);
  492.     KToggleAction* showCloudMaps = new KToggleAction(i18n("Show CloudMaps"), Key_I, this, SLOT(slotShowCloudMaps()), actionCollection(), "showCloudMaps");
  493.     showCloudMaps->setChecked(rFlags & Renderer::ShowCloudMaps);
  494.     KToggleAction* showCloudShadows = new KToggleAction(i18n("Show Cloud Shadows"), 0, this, SLOT(slotShowCloudShadows()), actionCollection(), "showCloudShadows");
  495.     showCloudShadows->setChecked(rFlags & Renderer::ShowCloudShadows);
  496.     KToggleAction* showOrbits = new KToggleAction(i18n("Show Orbits"), Key_O, this, SLOT(slotShowOrbits()), actionCollection(), "showOrbits");
  497.     showOrbits->setChecked(rFlags & Renderer::ShowOrbits);
  498.     KToggleAction* showAsteroidOrbits = new KToggleAction(i18n("Show Asteroid Orbits"), 0, this, SLOT(slotShowAsteroidOrbits()), actionCollection(), "showAsteroidOrbits");
  499.     showAsteroidOrbits->setChecked(oMask & Body::Asteroid);
  500.     KToggleAction* showCometOrbits = new KToggleAction(i18n("Show Comet Orbits"), 0, this, SLOT(slotShowCometOrbits()), actionCollection(), "showCometOrbits");
  501.     showCometOrbits->setChecked(oMask & Body::Comet);
  502.     KToggleAction* showMoonOrbits = new KToggleAction(i18n("Show Moon Orbits"), 0, this, SLOT(slotShowMoonOrbits()), actionCollection(), "showMoonOrbits");
  503.     showMoonOrbits->setChecked(oMask & Body::Moon);
  504.     KToggleAction* showStarOrbits = new KToggleAction(i18n("Show Star Orbits"), 0, this, SLOT(slotShowStarOrbits()), actionCollection(), "showStarOrbits");
  505.     showStarOrbits->setChecked(oMask & Body::Stellar);
  506.     KToggleAction* showPlanetOrbits = new KToggleAction(i18n("Show Planet Orbits"), 0, this, SLOT(slotShowPlanetOrbits()), actionCollection(), "showPlanetOrbits");
  507.     showPlanetOrbits->setChecked(oMask & Body::Planet);
  508.     KToggleAction* showSpacecraftOrbits = new KToggleAction(i18n("Show Spacecraft Orbits"), 0, this, SLOT(slotShowSpacecraftOrbits()), actionCollection(), "showSpacecraftOrbits");
  509.     showSpacecraftOrbits->setChecked(oMask & Body::Spacecraft);
  510.     KToggleAction* showCelestialSphere = new KToggleAction(i18n("Show Celestial Grid"), Key_Semicolon, this, SLOT(slotShowCelestialSphere()), actionCollection(), "showCelestialSphere");
  511.     showCelestialSphere->setChecked(rFlags & Renderer::ShowCelestialSphere);
  512.     KToggleAction* showNightMaps = new KToggleAction(i18n("Show Night Side Lights"), CTRL + Key_L, this, SLOT(slotShowNightMaps()), actionCollection(), "showNightMaps");
  513.     showNightMaps->setChecked(rFlags & Renderer::ShowNightMaps);
  514.     KToggleAction* showMarkers = new KToggleAction(i18n("Show Markers"), CTRL + Key_K, this, SLOT(slotShowMarkers()), actionCollection(), "showMarkers");
  515.     showMarkers->setChecked(rFlags & Renderer::ShowMarkers);
  516.     KToggleAction* showAtmospheres = new KToggleAction(i18n("Show Atmospheres"), CTRL + Key_A, this, SLOT(slotShowAtmospheres()), actionCollection(), "showAtmospheres");
  517.     showAtmospheres->setChecked(rFlags & Renderer::ShowAtmospheres);
  518.     KToggleAction* showSmoothLines = new KToggleAction(i18n("Show Smooth Orbit Lines"), CTRL + Key_X, this, SLOT(slotShowSmoothLines()), actionCollection(), "showSmoothLines");
  519.     showSmoothLines->setChecked(rFlags & Renderer::ShowSmoothLines);
  520.     KToggleAction* showEclipseShadows = new KToggleAction(i18n("Show Eclipse Shadows"), CTRL + Key_E, this, SLOT(slotShowEclipseShadows()), actionCollection(), "showEclipseShadows");
  521.     showEclipseShadows->setChecked(rFlags & Renderer::ShowEclipseShadows);
  522.     new KAction(i18n("Cycle Star Mode"), CTRL + Key_S, this, SLOT(slotCycleStarMode()), actionCollection(), "cycleStarMode");
  523.     KToggleAction* showRingShadows = new KToggleAction(i18n("Show Ring Shadows"), 0, this, SLOT(slotShowRingShadows()), actionCollection(), "showRingShadows");
  524.     showRingShadows->setChecked(rFlags & Renderer::ShowRingShadows);
  525.     KToggleAction* showBoundaries = new KToggleAction(i18n("Show Boundaries"), CTRL + Key_B, this, SLOT(slotShowBoundaries()), actionCollection(), "showBoundaries");
  526.     showBoundaries->setChecked(rFlags & Renderer::ShowBoundaries);
  527.     KToggleAction* showAutoMag = new KToggleAction(i18n("Auto Magnitudes"), CTRL + Key_Y, this, SLOT(slotShowAutoMag()), actionCollection(), "showAutoMag");
  528.     showAutoMag->setChecked(rFlags & Renderer::ShowAutoMag);
  529.     KToggleAction* showCometTails = new KToggleAction(i18n("Show Comet Tails"), CTRL + Key_T, this, SLOT(slotShowCometTails()), actionCollection(), "showCometTails");
  530.     showCometTails->setChecked(rFlags & Renderer::ShowCometTails);
  531.     KToggleAction* showStarLabels = new KToggleAction(i18n("Show Star Labels"), Key_B, this, SLOT(slotShowStarLabels()), actionCollection(), "showStarLabels");
  532.     showStarLabels->setChecked(lMode & Renderer::StarLabels);
  533.     /////////////////////////////////////////
  534.     // Label Mode
  535.     KToggleAction* showPlanetLabels = new KToggleAction(i18n("Show Planet Labels"), Key_P, this, SLOT(slotShowPlanetLabels()), actionCollection(), "showPlanetLabels");
  536.     showPlanetLabels->setChecked(lMode & Renderer::PlanetLabels);
  537.     KToggleAction* showMoonLabels = new KToggleAction(i18n("Show Moon Labels"), Key_M, this, SLOT(slotShowMoonLabels()), actionCollection(), "showMoonLabels");
  538.     showMoonLabels->setChecked(lMode & Renderer::MoonLabels);
  539.     KToggleAction* showCometLabels = new KToggleAction(i18n("Show Comet Labels"), SHIFT + Key_W, this, SLOT(slotShowCometLabels()), actionCollection(), "showCometLabels");
  540.     showCometLabels->setChecked(lMode & Renderer::CometLabels);
  541.     KToggleAction* showConstellationLabels = new KToggleAction(i18n("Show Constellation Labels"), Key_Equal, this, SLOT(slotShowConstellationLabels()), actionCollection(), "showConstellationLabels");
  542.     showConstellationLabels->setChecked(lMode & Renderer::ConstellationLabels);
  543.     KToggleAction* showI18nConstellationLabels = new KToggleAction(i18n("Constellation Labels in Latin"), 0, this, SLOT(slotShowI18nConstellationLabels()), actionCollection(), "showI18nConstellationLabels");
  544.     showI18nConstellationLabels->setChecked(!(lMode & Renderer::I18nConstellationLabels));
  545.     KToggleAction* showGalaxyLabels = new KToggleAction(i18n("Show Galaxy Labels"), Key_E, this, SLOT(slotShowGalaxyLabels()), actionCollection(), "showGalaxyLabels");
  546.     showGalaxyLabels->setChecked(lMode & Renderer::GalaxyLabels);
  547.     KToggleAction* showGlobularLabels = new KToggleAction(i18n("Show Globular Labels"), SHIFT + Key_E, this, SLOT(slotShowGlobularLabels()), actionCollection(), "showGlobularLabels");
  548.     showGlobularLabels->setChecked(lMode & Renderer::GlobularLabels);
  549.     KToggleAction* showNebulaLabels = new KToggleAction(i18n("Show Nebula Labels"), 0, this, SLOT(slotShowNebulaLabels()), actionCollection(), "showNebulaLabels");
  550.     showNebulaLabels->setChecked(lMode & Renderer::NebulaLabels);
  551.     KToggleAction* showOpenClusterLabels = new KToggleAction(i18n("Show Open Cluster Labels"), 0, this, SLOT(slotShowOpenClusterLabels()), actionCollection(), "showOpenClusterLabels");
  552.     showOpenClusterLabels->setChecked(lMode & Renderer::OpenClusterLabels);
  553.     KToggleAction* showAsteroidLabels = new KToggleAction(i18n("Show Asteroid Labels"), Key_W, this, SLOT(slotShowAsteroidLabels()), actionCollection(), "showAsteroidLabels");
  554.     showAsteroidLabels->setChecked(lMode & Renderer::AsteroidLabels);
  555.     KToggleAction* showSpacecraftLabels = new KToggleAction(i18n("Show Spacecraft Labels"), Key_N, this, SLOT(slotShowSpacecraftLabels()), actionCollection(), "showSpacecraftLabels");
  556.     showSpacecraftLabels->setChecked(lMode & Renderer::SpacecraftLabels);
  557.     KToggleAction* showLocationLabels = new KToggleAction(i18n("Show Location Labels"), Key_Ampersand, this, SLOT(slotShowLocationLabels()), actionCollection(), "showLocationLabels");
  558.     showLocationLabels->setChecked(lMode & Renderer::LocationLabels);
  559.     KToggleAction* displayLocalTime = new KToggleAction(i18n("Display Local Time"), ALT + Key_U, this, SLOT(slotDisplayLocalTime()), actionCollection(), "displayLocalTime");
  560.     displayLocalTime->setChecked(isLocal);
  561.     /////////////////////////////////////////
  562.     // Location Filters
  563.     KToggleAction* showCityLocations = new KToggleAction(i18n("Show City Locations"), 0, this, SLOT(slotShowCityLocations()), actionCollection(), "showCityLocations");
  564.     showCityLocations->setChecked(lFilter & Location::City);
  565.     KToggleAction* showObservatoryLocations = new KToggleAction(i18n("Show Observatory Locations"), 0, this, SLOT(slotShowObservatoryLocations()), actionCollection(), "showObservatoryLocations");
  566.     showObservatoryLocations->setChecked(lFilter & Location::Observatory);
  567.     KToggleAction* showLandingSiteLocations = new KToggleAction(i18n("Show Landing Sites Locations"), 0, this, SLOT(slotShowLandingSiteLocations()), actionCollection(), "showLandingSiteLocations");
  568.     showLandingSiteLocations->setChecked(lFilter & Location::LandingSite);
  569.     KToggleAction* showCraterLocations = new KToggleAction(i18n("Show Crater Locations"), 0, this, SLOT(slotShowCraterLocations()), actionCollection(), "showCraterLocations");
  570.     showCraterLocations->setChecked(lFilter & Location::Crater);
  571.     KToggleAction* showMonsLocations = new KToggleAction(i18n("Show Mons Locations"), 0, this, SLOT(slotShowMonsLocations()), actionCollection(), "showMonsLocations");
  572.     showMonsLocations->setChecked(lFilter & Location::Mons);
  573.     KToggleAction* showTerraLocations = new KToggleAction(i18n("Show Terra Locations"), 0, this, SLOT(slotShowTerraLocations()), actionCollection(), "showTerraLocations");
  574.     showTerraLocations->setChecked(lFilter & Location::Terra);
  575.     KToggleAction* showVallisLocations = new KToggleAction(i18n("Show Vallis Locations"), 0, this, SLOT(slotShowVallisLocations()), actionCollection(), "showVallisLocations");
  576.     showVallisLocations->setChecked(lFilter & Location::Vallis);
  577.     KToggleAction* showMareLocations = new KToggleAction(i18n("Show Mare Locations"), 0, this, SLOT(slotShowMareLocations()), actionCollection(), "showMareLocations");
  578.     showMareLocations->setChecked(lFilter & Location::Mare);
  579.     KToggleAction* showOtherLocations = new KToggleAction(i18n("Show Other Locations"), 0, this, SLOT(slotShowOtherLocations()), actionCollection(), "showOtherLocations");
  580.     showOtherLocations->setChecked(lFilter & FilterOtherLocations);
  581.     /////////////////////////////////////////
  582.     new KToggleAction(i18n("Wireframe Mode"), CTRL + Key_W, this, SLOT(slotWireframeMode()), actionCollection(), "wireframeMode");
  583.     new KAction(i18n("Center on Orbit"), SHIFT + Key_C, this, SLOT(slotCenterCO()), actionCollection(), "centerCO");
  584.     KToggleAction *renderPath = 0;
  585.     renderPath = new KToggleAction(i18n("Basic"), 0, this, SLOT(slotSetRenderPathBasic()), actionCollection(), "renderPathBasic");
  586.     renderPath->setExclusiveGroup("renderPath");
  587.     renderPath = new KToggleAction(i18n("Multitexture"), 0, this, SLOT(slotSetRenderPathMultitexture()), actionCollection(), "renderPathMultitexture");
  588.     renderPath->setExclusiveGroup("renderPath");
  589.     renderPath = new KToggleAction(i18n("NvCombiners"), 0, this, SLOT(slotSetRenderPathNvCombiner()), actionCollection(), "renderPathNvCombiner");
  590.     renderPath->setExclusiveGroup("renderPath");
  591.     renderPath = new KToggleAction(i18n("DOT3 ARBVP"), 0, this, SLOT(slotSetRenderPathDOT3ARBVP()), actionCollection(), "renderPathDOT3ARBVP");
  592.     renderPath->setExclusiveGroup("renderPath");
  593.     renderPath = new KToggleAction(i18n("NvCombiner NvVP"), 0, this, SLOT(slotSetRenderPathNvCombinerNvVP()), actionCollection(), "renderPathNvCombinerNvVP");
  594.     renderPath->setExclusiveGroup("renderPath");
  595.     renderPath = new KToggleAction(i18n("NvCombiner ARBVP"), 0, this, SLOT(slotSetRenderPathNvCombinerARBVP()), actionCollection(), "renderPathNvCombinerARBVP");
  596.     renderPath->setExclusiveGroup("renderPath");
  597.     renderPath = new KToggleAction(i18n("ARBFP ARBVP"), 0, this, SLOT(slotSetRenderPathARBFPARBVP()), actionCollection(), "renderPathARBFPARBVP");
  598.     renderPath->setExclusiveGroup("renderPath");
  599.     renderPath = new KToggleAction(i18n("NV30"), 0, this, SLOT(slotSetRenderPathNV30()), actionCollection(), "renderPathNV30");
  600.     renderPath->setExclusiveGroup("renderPath");
  601.     renderPath = new KToggleAction(i18n("OpenGL 2.0"), 0, this, SLOT(slotSetRenderPathGLSL()), actionCollection(), "renderPathGLSL");
  602.     renderPath->setExclusiveGroup("renderPath");
  603.     new KAction(i18n("Cycle OpenGL Render Path"), "reload", CTRL + Key_V, this, SLOT(slotCycleRenderPath()), actionCollection(), "cycleRenderPath");
  604.     KToggleAction *videoSync = new KToggleAction(i18n("Sync framerate to video refresh rate"), 0, this, SLOT(slotToggleVideoSync()), actionCollection(), "toggleVideoSync");
  605.     if (KGlobal::config()->hasKey("VideoSync"))
  606.         appCore->getRenderer()->setVideoSync(KGlobal::config()->readBoolEntry("VideoSync"));
  607.     videoSync->setChecked(appCore->getRenderer()->getVideoSync());
  608.     new KAction(i18n("Grab Image"), "filesave", Key_F10, this, SLOT(slotGrabImage()), actionCollection(), "grabImage");
  609.     new KAction(i18n("Capture Video"), "filesave", Key_F11, this, SLOT(slotCaptureVideo()), actionCollection(), "captureVideo");
  610.     new KAction(i18n("OpenGL info"), 0, this, SLOT(slotOpenGLInfo()),
  611.                       actionCollection(), "opengl_info");
  612.     toggleMenubar=KStdAction::showMenubar(this, SLOT(slotToggleMenubar()), actionCollection());
  613.     //NOTE: this one is deprecated, but it looks nicer than the alternative:
  614.     toggleToolbar=KStdAction::showToolbar(this, SLOT(slotToggleToolbar()), actionCollection());
  615.     //setStandardToolBarMenuEnabled(true);
  616.     new KToggleAction(i18n("Show Bookmark Toolbar"), 0, this,
  617.         SLOT(slotShowBookmarkBar()), actionCollection(), "showBookmarkBar");
  618.     createGUI();
  619.     bookmarkBarActionCollection = new KActionCollection( this );
  620.     bookmarkBarActionCollection->setHighlightingEnabled( true );
  621.     bookmarkBar = 0;
  622.     initBookmarkBar();
  623. }
  624. void KdeApp::initBookmarkBar() {
  625.     KToolBar *bar = new KToolBar(this, QMainWindow::Top, true, "bookmarkBar");
  626.     if (bookmarkBar) delete bookmarkBar;
  627.     bookmarkBar = new KBookmarkBar( KCelBookmarkManager::self(), this, bar, bookmarkBarActionCollection, 0, "bookmarkBar");
  628.     if (bar->count() == 0) bar->hide();
  629.     applyMainWindowSettings( KGlobal::config(), "MainWindow" );
  630.     if (bar->isHidden()) ((KToggleAction*)actionCollection()->action("showBookmarkBar"))->setChecked(false);
  631.     else ((KToggleAction*)actionCollection()->action("showBookmarkBar"))->setChecked(true);
  632. }
  633. bool KdeApp::queryExit() {
  634.     KConfig* conf = kapp->config();
  635.     saveMainWindowSettings(conf, "MainWindow");
  636.     conf->setGroup("MainWindow");
  637.     saveWindowSize(conf);
  638.     conf->setGroup("Preferences");
  639.     conf->writeEntry("RendererFlags", appCore->getRenderer()->getRenderFlags());
  640.     conf->writeEntry("OrbitMask", appCore->getRenderer()->getOrbitMask());
  641.     conf->writeEntry("LabelMode", appCore->getRenderer()->getLabelMode());
  642.     conf->writeEntry("AmbientLightLevel", appCore->getRenderer()->getAmbientLightLevel());
  643.     conf->writeEntry("FaintestVisible", appCore->getSimulation()->getFaintestVisible());
  644.     conf->writeEntry("HudDetail", appCore->getHudDetail());
  645.     conf->writeEntry("TimeZoneBias", appCore->getTimeZoneBias());
  646.     conf->writeEntry("RenderPath", appCore->getRenderer()->getGLContext()->getRenderPath());
  647.     conf->writeEntry("FramesVisible", appCore->getFramesVisible());
  648.     conf->writeEntry("ActiveFrameVisible", appCore->getActiveFrameVisible());
  649.     conf->writeEntry("SyncTime", appCore->getSimulation()->getSyncTime());
  650.     conf->writeEntry("DistanceToScreen", appCore->getDistanceToScreen());
  651.     conf->writeEntry("LocationFilter", appCore->getSimulation()->getActiveObserver()->getLocationFilter());
  652.     conf->writeEntry("MinFeatureSize", appCore->getRenderer()->getMinimumFeatureSize());
  653.     conf->writeEntry("VideoSync", appCore->getRenderer()->getVideoSync());
  654.     conf->writeEntry("StarStyle", appCore->getRenderer()->getStarStyle());
  655.     conf->writeEntry("TextureResolution", appCore->getRenderer()->getResolution());
  656.     conf->writeEntry("DateFormat", appCore->getDateFormat());
  657.     conf->setGroup(0);
  658.     actionCollection()->writeShortcutSettings("Shortcuts", conf);
  659.     openRecent->saveEntries(KGlobal::config());
  660.     return true;
  661. }
  662. bool KdeApp::queryClose() {
  663.     KConfig* conf = kapp->config();
  664.     saveMainWindowSettings(conf, "MainWindow");
  665.     conf->setGroup("MainWindow");
  666.     saveWindowSize(conf);
  667.     conf->setGroup("Preferences");
  668.     conf->writeEntry("RendererFlags", appCore->getRenderer()->getRenderFlags());
  669.     conf->setGroup(0);
  670.     return true;
  671. }
  672. void KdeApp::slotNull() {
  673.     // dev only
  674. }
  675. void KdeApp::slotFullScreen() {
  676.     static bool isFullScreen=false;
  677.     if (isFullScreen) {
  678.         showNormal();
  679.         action("fullScreen")->setIcon("window_fullscreen");
  680.     } else {
  681.         showFullScreen();
  682.         action("fullScreen")->setIcon("window_nofullscreen");
  683.     }
  684.     isFullScreen = !isFullScreen;
  685. }
  686. void KdeApp::slotHome() {
  687.     appCore->charEntered('h');
  688.     appCore->charEntered('g');
  689. }
  690. void KdeApp::slotClose() {
  691.     close();
  692. }
  693. void KdeApp::slotZoomIn() {
  694.     appCore->charEntered(',');
  695. }
  696. void KdeApp::slotZoomOut() {
  697.     appCore->charEntered('.');
  698. }
  699. void KdeApp::slotToggleToolbar() {
  700.     if (toolBar()->isVisible()) toolBar()->hide();
  701.     else toolBar()->show();
  702. }
  703. void KdeApp::slotToggleMenubar() {
  704.     if (menuBar()->isVisible()) menuBar()->hide();
  705.     else menuBar()->show();
  706. }
  707. void KdeApp::slotToggleFramesVisible() {
  708.     appCore->setFramesVisible(!appCore->getFramesVisible());
  709. }
  710. void KdeApp::slotToggleActiveFrameVisible() {
  711.     appCore->setActiveFrameVisible(!appCore->getActiveFrameVisible());
  712. }
  713. void KdeApp::slotToggleSyncTime() {
  714.     appCore->getSimulation()->setSyncTime(!appCore->getSimulation()->getSyncTime());
  715. }
  716. void KdeApp::slotConfigureToolbars()
  717. {
  718.     saveMainWindowSettings( KGlobal::config(), "MainWindow" );
  719.     KEditToolbar dlg(actionCollection());
  720.     connect( &dlg, SIGNAL(newToolbarConfig()), this, SLOT(slotNewToolbarConfig()));
  721.     if (dlg.exec())
  722.     {
  723.         createGUI();
  724.         initBookmarkBar();
  725.     }
  726. }
  727. void KdeApp::slotNewToolbarConfig() // This is called when OK or Apply is clicked
  728. {
  729. //    ...if you use any action list, use plugActionList on each here...
  730.     applyMainWindowSettings( KGlobal::config(), "MainWindow" );
  731. }
  732. void KdeApp::slotKeyBindings()
  733. {
  734.     KKeyDialog dlg(false, this);
  735.     dlg.insert(actionCollection());
  736.     if (dlg.exec()) {
  737.         dlg.commitChanges();
  738.     }
  739. }
  740. void KdeApp::slotFileOpen()
  741. {
  742. #ifdef CELX
  743.     QString fileOpen = KFileDialog::getOpenFileName(0, "*.cel *.celx");
  744. #else
  745.     QString fileOpen = KFileDialog::getOpenFileName(0, "*.cel");
  746. #endif
  747.     if (fileOpen == "") return;
  748.     slotOpenFileURL(KURL(fileOpen));
  749. }
  750. void KdeApp::slotOpenFileURL(const KURL& url) {
  751.     QString file = url.directory(false) + url.fileName();
  752. #ifdef CELX
  753.     if (file.right(5).compare(QString(".celx")) == 0) {
  754.         openRecent->addURL(url);
  755.         appCore->cancelScript();
  756.         appCore->runScript(file.latin1());
  757.         return;
  758.     }
  759. #endif
  760.     ifstream scriptfile(file.latin1());
  761.     if (!scriptfile.good()) {
  762.         KMessageBox::error(this, "Error opening script file " + file);
  763.         return;
  764.     } else {
  765.         CommandParser parser(scriptfile);
  766.         CommandSequence* script = parser.parse();
  767.         if (script == NULL) {
  768.             const vector<string>* errors = parser.getErrors();
  769.             const char* errorMsg = "";
  770.             if (errors->size() > 0)
  771.                 errorMsg = (*errors)[0].c_str();
  772.             KMessageBox::error(this, "Errors in script file " + file + "n" + errorMsg);
  773.             return;
  774.         } else {
  775.             openRecent->addURL(url);
  776.             appCore->cancelScript();
  777.             appCore->runScript(script);
  778.         }
  779.     }
  780. }
  781. QString KdeApp::getOpenGLInfo() {
  782.     // Code grabbed from gtkmain.cpp
  783.     char* vendor = (char*) glGetString(GL_VENDOR);
  784.     char* render = (char*) glGetString(GL_RENDERER);
  785.     char* version = (char*) glGetString(GL_VERSION);
  786.     char* ext = (char*) glGetString(GL_EXTENSIONS);
  787.     QString s;
  788.     s = i18n("Vendor: ");
  789.     if (vendor != NULL)
  790.         s += vendor;
  791.     s += "n";
  792.     s += i18n("Renderer: ");
  793.     if (render != NULL)
  794.         s += render;
  795.     s += "n";
  796.     s += i18n("Version: ");
  797.     if (version != NULL)
  798.         s += version;
  799.     s += "n";
  800.     char buf[100];
  801.     GLint simTextures = 1;
  802.     if (ExtensionSupported("GL_ARB_multitexture"))
  803.         glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &simTextures);
  804.     sprintf(buf, "%s%dn", _("Max simultaneous textures: "), simTextures);
  805.     s += buf;
  806.     GLint maxTextureSize = 0;
  807.     glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
  808.     sprintf(buf, "%s%dnn", _("Max texture size: "), maxTextureSize);
  809.     s += buf;
  810.     GLfloat pointSizeRange[2];
  811.     glGetFloatv(GL_POINT_SIZE_RANGE, pointSizeRange);
  812.     sprintf(buf, "%s%f - %fn",
  813.             _("Point size range: "),
  814.             pointSizeRange[0], pointSizeRange[1]);
  815.     s += buf;
  816.     s += i18n("Supported Extensions:") + "n    ";
  817.     if (ext != NULL)
  818.     {
  819.         QString extString(ext);
  820.         unsigned int pos = extString.find(' ', 0);
  821.         while (pos != (unsigned int)string::npos)
  822.         {
  823.             extString.replace(pos, 1, "n    ");
  824.             pos = extString.find(' ', pos+5);
  825.         }
  826.         s += extString;
  827.     }
  828.     return s;
  829. }
  830. void KdeApp::slotOpenGLInfo() {
  831.     KDialogBase dlg(this, "openglinfo", true, i18n("OpenGL Info"), KDialogBase::Ok);
  832.     QTextEdit edit(&dlg);
  833.     edit.append(getOpenGLInfo());
  834.     edit.setFocusPolicy(QWidget::NoFocus);
  835.     edit.setCursorPosition(0, 0);
  836.     dlg.setMainWidget(&edit);
  837.     dlg.resize(400,430);
  838.     dlg.exec();
  839. }
  840. void KdeApp::slotPreferences() {
  841.     KdePreferencesDialog dlg(this, appCore);
  842.     dlg.exec();
  843.     resyncMenus();
  844. }
  845. void KdeApp::slotSetTime() {
  846.     KdePreferencesDialog dlg(this, appCore);
  847.     dlg.showPage(2);
  848.     dlg.exec();
  849. }
  850. void KdeApp::slotFileOpenRecent(const KURL&)
  851. {
  852. }
  853. void KdeApp::slotReverseTime() {
  854.     appCore->charEntered('j');
  855. }
  856. void KdeApp::slotAccelerateTime() {
  857.     appCore->charEntered('l');
  858. }
  859. void KdeApp::slotAccelerateTimeFine() {
  860.     appCore->charEntered('L');
  861. }
  862. void KdeApp::slotPauseTime() {
  863.     appCore->charEntered(' ');
  864. }
  865. void KdeApp::slotSlowDownTime() {
  866.     appCore->charEntered('k');
  867. }
  868. void KdeApp::slotSlowDownTimeFine() {
  869.     appCore->charEntered('K');
  870. }
  871. void KdeApp::slotSetTimeNow() {
  872.     time_t curtime=time(NULL);
  873.     appCore->getSimulation()->setTime(astro::UTCtoTDB((double) curtime / 86400.0 + (double) astro::Date(1970, 1, 1)));
  874.     appCore->getSimulation()->update(0.0);
  875. }
  876. void KdeApp::slotShowStars() {
  877.     appCore->getRenderer()->setRenderFlags(
  878.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowStars);
  879. }
  880. void KdeApp::slotShowPlanets() {
  881.      appCore->getRenderer()->setRenderFlags(
  882.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowPlanets);
  883. }
  884. void KdeApp::slotShowGalaxies() {
  885.      appCore->getRenderer()->setRenderFlags(
  886.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowGalaxies);
  887. }
  888. void KdeApp::slotShowGlobulars() {
  889.      appCore->getRenderer()->setRenderFlags(
  890.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowGlobulars);
  891. }
  892. void KdeApp::slotShowPartialTrajectories() {
  893.      appCore->getRenderer()->setRenderFlags(
  894.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowPartialTrajectories);
  895. }
  896. void KdeApp::slotShowNebulae() {
  897.      appCore->getRenderer()->setRenderFlags(
  898.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowNebulae);
  899. }
  900. void KdeApp::slotShowOpenClusters() {
  901.      appCore->getRenderer()->setRenderFlags(
  902.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowOpenClusters);
  903. }
  904. void KdeApp::slotShowDiagrams() {
  905.      appCore->getRenderer()->setRenderFlags(
  906.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowDiagrams);
  907. }
  908. void KdeApp::slotShowCloudMaps() {
  909.      appCore->getRenderer()->setRenderFlags(
  910.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowCloudMaps);
  911. }
  912. void KdeApp::slotShowCloudShadows() {
  913.      appCore->getRenderer()->setRenderFlags(
  914.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowCloudShadows);
  915. }
  916. void KdeApp::slotShowOrbits() {
  917.      appCore->getRenderer()->setRenderFlags(
  918.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowOrbits);
  919. }
  920. void KdeApp::slotShowAsteroidOrbits() {
  921.      appCore->getRenderer()->setOrbitMask(
  922.             appCore->getRenderer()->getOrbitMask() ^ Body::Asteroid);
  923. }
  924. void KdeApp::slotShowCometOrbits() {
  925.      appCore->getRenderer()->setOrbitMask(
  926.             appCore->getRenderer()->getOrbitMask() ^ Body::Comet);
  927. }
  928. void KdeApp::slotShowMoonOrbits() {
  929.      appCore->getRenderer()->setOrbitMask(
  930.             appCore->getRenderer()->getOrbitMask() ^ Body::Moon);
  931. }
  932. void KdeApp::slotShowStarOrbits() {
  933.      appCore->getRenderer()->setOrbitMask(
  934.             appCore->getRenderer()->getOrbitMask() ^ Body::Stellar);
  935. }
  936. void KdeApp::slotShowPlanetOrbits() {
  937.      appCore->getRenderer()->setOrbitMask(
  938.             appCore->getRenderer()->getOrbitMask() ^ Body::Planet);
  939. }
  940. void KdeApp::slotShowSpacecraftOrbits() {
  941.      appCore->getRenderer()->setOrbitMask(
  942.             appCore->getRenderer()->getOrbitMask() ^ Body::Spacecraft);
  943. }
  944. void KdeApp::slotShowCelestialSphere() {
  945.      appCore->getRenderer()->setRenderFlags(
  946.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowCelestialSphere);
  947. }
  948. void KdeApp::slotShowNightMaps() {
  949.      appCore->getRenderer()->setRenderFlags(
  950.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowNightMaps);
  951. }
  952. void KdeApp::slotShowMarkers() {
  953.      appCore->charEntered('13');
  954. }
  955. void KdeApp::slotShowAtmospheres() {
  956.      appCore->getRenderer()->setRenderFlags(
  957.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowAtmospheres);
  958. }
  959. void KdeApp::slotShowSmoothLines() {
  960.      appCore->getRenderer()->setRenderFlags(
  961.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowSmoothLines);
  962. }
  963. void KdeApp::slotShowEclipseShadows() {
  964.      appCore->getRenderer()->setRenderFlags(
  965.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowEclipseShadows);
  966. }
  967. void KdeApp::slotCycleStarMode() {
  968.     appCore->charEntered('23');
  969. }
  970. void KdeApp::slotShowRingShadows() {
  971.      appCore->getRenderer()->setRenderFlags(
  972.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowRingShadows);
  973. }
  974. void KdeApp::slotShowBoundaries() {
  975.      appCore->getRenderer()->setRenderFlags(
  976.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowBoundaries);
  977. }
  978. void KdeApp::slotShowAutoMag() {
  979.      appCore->charEntered('31');
  980. }
  981. void KdeApp::slotShowCometTails() {
  982.      appCore->getRenderer()->setRenderFlags(
  983.             appCore->getRenderer()->getRenderFlags() ^ Renderer::ShowCometTails);
  984. }
  985. void KdeApp::slotShowStarLabels() {
  986.      appCore->getRenderer()->setLabelMode(
  987.             appCore->getRenderer()->getLabelMode() ^ Renderer::StarLabels);
  988. }
  989. void KdeApp::slotShowPlanetLabels() {
  990.      appCore->getRenderer()->setLabelMode(
  991.             appCore->getRenderer()->getLabelMode() ^ Renderer::PlanetLabels);
  992. }
  993. void KdeApp::slotShowMoonLabels() {
  994.      appCore->getRenderer()->setLabelMode(
  995.             appCore->getRenderer()->getLabelMode() ^ Renderer::MoonLabels);
  996. }
  997. void KdeApp::slotShowCometLabels() {
  998.      appCore->getRenderer()->setLabelMode(
  999.             appCore->getRenderer()->getLabelMode() ^ Renderer::CometLabels);
  1000. }
  1001. void KdeApp::slotShowConstellationLabels() {
  1002.      appCore->getRenderer()->setLabelMode(
  1003.             appCore->getRenderer()->getLabelMode() ^ Renderer::ConstellationLabels);
  1004. }
  1005. void KdeApp::slotShowI18nConstellationLabels() {
  1006.      appCore->getRenderer()->setLabelMode(
  1007.             appCore->getRenderer()->getLabelMode() ^ Renderer::I18nConstellationLabels);
  1008. }
  1009. void KdeApp::slotShowGalaxyLabels() {
  1010.      appCore->getRenderer()->setLabelMode(
  1011.             appCore->getRenderer()->getLabelMode() ^ Renderer::GalaxyLabels);
  1012. }
  1013. void KdeApp::slotShowGlobularLabels() {
  1014.      appCore->getRenderer()->setLabelMode(
  1015.             appCore->getRenderer()->getLabelMode() ^ Renderer::GlobularLabels);
  1016. }
  1017. void KdeApp::slotShowNebulaLabels() {
  1018.      appCore->getRenderer()->setLabelMode(
  1019.             appCore->getRenderer()->getLabelMode() ^ Renderer::NebulaLabels);
  1020. }
  1021. void KdeApp::slotShowOpenClusterLabels() {
  1022.      appCore->getRenderer()->setLabelMode(
  1023.             appCore->getRenderer()->getLabelMode() ^ Renderer::OpenClusterLabels);
  1024. }
  1025. void KdeApp::slotShowAsteroidLabels() {
  1026.      appCore->getRenderer()->setLabelMode(
  1027.             appCore->getRenderer()->getLabelMode() ^ Renderer::AsteroidLabels);
  1028. }
  1029. void KdeApp::slotShowSpacecraftLabels() {
  1030.      appCore->getRenderer()->setLabelMode(
  1031.             appCore->getRenderer()->getLabelMode() ^ Renderer::SpacecraftLabels);
  1032. }
  1033. void KdeApp::slotShowLocationLabels() {
  1034.      appCore->getRenderer()->setLabelMode(
  1035.             appCore->getRenderer()->getLabelMode() ^ Renderer::LocationLabels);
  1036. }
  1037. void KdeApp::slotShowCityLocations() {
  1038.     Observer* obs = appCore->getSimulation()->getActiveObserver();
  1039.     int locationFilter = obs->getLocationFilter();
  1040.     obs->setLocationFilter(locationFilter ^ Location::City);
  1041. }
  1042. void KdeApp::slotShowObservatoryLocations() {
  1043.     Observer* obs = appCore->getSimulation()->getActiveObserver();
  1044.     int locationFilter = obs->getLocationFilter();
  1045.     obs->setLocationFilter(locationFilter ^ Location::Observatory);
  1046. }
  1047. void KdeApp::slotShowLandingSiteLocations() {
  1048.     Observer* obs = appCore->getSimulation()->getActiveObserver();
  1049.     int locationFilter = obs->getLocationFilter();
  1050.     obs->setLocationFilter(locationFilter ^ Location::LandingSite);
  1051. }
  1052. void KdeApp::slotShowCraterLocations() {
  1053.     Observer* obs = appCore->getSimulation()->getActiveObserver();
  1054.     int locationFilter = obs->getLocationFilter();
  1055.     obs->setLocationFilter(locationFilter ^ Location::Crater);
  1056. }
  1057. void KdeApp::slotShowMonsLocations() {
  1058.     Observer* obs = appCore->getSimulation()->getActiveObserver();
  1059.     int locationFilter = obs->getLocationFilter();
  1060.     obs->setLocationFilter(locationFilter ^ Location::Mons);
  1061. }
  1062. void KdeApp::slotShowTerraLocations() {
  1063.     Observer* obs = appCore->getSimulation()->getActiveObserver();
  1064.     int locationFilter = obs->getLocationFilter();
  1065.     obs->setLocationFilter(locationFilter ^ Location::Terra);
  1066. }
  1067. void KdeApp::slotShowVallisLocations() {
  1068.     Observer* obs = appCore->getSimulation()->getActiveObserver();
  1069.     int locationFilter = obs->getLocationFilter();
  1070.     obs->setLocationFilter(locationFilter ^ Location::Vallis);
  1071. }
  1072. void KdeApp::slotShowMareLocations() {
  1073.     Observer* obs = appCore->getSimulation()->getActiveObserver();
  1074.     int locationFilter = obs->getLocationFilter();
  1075.     obs->setLocationFilter(locationFilter ^ Location::Mare);
  1076. }
  1077. void KdeApp::slotShowOtherLocations() {
  1078.     Observer* obs = appCore->getSimulation()->getActiveObserver();
  1079.     int locationFilter = obs->getLocationFilter();
  1080.     obs->setLocationFilter(locationFilter ^ FilterOtherLocations);
  1081. }
  1082. void KdeApp::slotMinFeatureSize(int size) {
  1083.     appCore->getRenderer()->setMinimumFeatureSize((float)size);
  1084. }
  1085. void KdeApp::slotSplitH() {
  1086.     appCore->charEntered('22');
  1087. }
  1088. void KdeApp::slotSplitV() {
  1089.     appCore->charEntered('25');
  1090. }
  1091. void KdeApp::slotCycleView() {
  1092.     appCore->charEntered('11');
  1093. }
  1094. void KdeApp::slotAltAzMode() {
  1095.     appCore->charEntered('06');
  1096. }
  1097. void KdeApp::slotGoToSurface() {
  1098.     appCore->charEntered('07');
  1099. }
  1100. void KdeApp::slotSingleView() {
  1101.     appCore->charEntered('04');
  1102. }
  1103. void KdeApp::slotDeleteView() {
  1104.     appCore->charEntered(127);
  1105. }
  1106. void KdeApp::slotAmbientLightLevel(float l) {
  1107.     appCore->getRenderer()->setAmbientLightLevel(l);
  1108. }
  1109. void KdeApp::slotFaintestVisible(float m) {
  1110.     appCore->getSimulation()->setFaintestVisible(m);
  1111. }
  1112. void KdeApp::slotHudDetail(int l) {
  1113.     appCore->setHudDetail(l);
  1114. }
  1115. void KdeApp::slotDisplayLocalTime() {
  1116.     if (appCore->getTimeZoneBias()) {
  1117.         appCore->setTimeZoneBias(0);
  1118.         appCore->setTimeZoneName(i18n("UTC").latin1());
  1119.     } else {
  1120.         appCore->setTimeZoneBias(-timezone+3600*daylight);
  1121.         appCore->setTimeZoneName(tzname[daylight?0:1]);
  1122.     }
  1123. }
  1124. void KdeApp::slotWireframeMode() {
  1125. static bool mode = false;
  1126. mode = !mode;
  1127. renderer->setRenderMode(mode ? GL_LINE : GL_FILL);
  1128. }
  1129. void KdeApp::slotCenterCO() {
  1130. appCore->charEntered('C');
  1131. }
  1132. void KdeApp::slotSetRenderPathBasic() {
  1133.     if (appCore->getRenderer()->getGLContext()->getRenderPath() != GLContext::GLPath_Basic)
  1134.         appCore->getRenderer()->getGLContext()->setRenderPath(GLContext::GLPath_Basic);
  1135. }
  1136. void KdeApp::slotSetRenderPathMultitexture() {
  1137.     if (appCore->getRenderer()->getGLContext()->getRenderPath() != GLContext::GLPath_Multitexture)
  1138.         appCore->getRenderer()->getGLContext()->setRenderPath(GLContext::GLPath_Multitexture);
  1139. }
  1140. void KdeApp::slotSetRenderPathNvCombiner() {
  1141.     if (appCore->getRenderer()->getGLContext()->getRenderPath() != GLContext::GLPath_NvCombiner)
  1142.         appCore->getRenderer()->getGLContext()->setRenderPath(GLContext::GLPath_NvCombiner);
  1143. }
  1144. void KdeApp::slotSetRenderPathDOT3ARBVP() {
  1145.     if (appCore->getRenderer()->getGLContext()->getRenderPath() != GLContext::GLPath_DOT3_ARBVP)
  1146.         appCore->getRenderer()->getGLContext()->setRenderPath(GLContext::GLPath_DOT3_ARBVP);
  1147. }
  1148. void KdeApp::slotSetRenderPathNvCombinerNvVP() {
  1149.     if (appCore->getRenderer()->getGLContext()->getRenderPath() != GLContext::GLPath_NvCombiner_NvVP)
  1150.         appCore->getRenderer()->getGLContext()->setRenderPath(GLContext::GLPath_NvCombiner_NvVP);
  1151. }
  1152. void KdeApp::slotSetRenderPathNvCombinerARBVP() {
  1153.     if (appCore->getRenderer()->getGLContext()->getRenderPath() != GLContext::GLPath_NvCombiner_ARBVP)
  1154.         appCore->getRenderer()->getGLContext()->setRenderPath(GLContext::GLPath_NvCombiner_ARBVP);
  1155. }
  1156. void KdeApp::slotSetRenderPathARBFPARBVP() {
  1157.     if (appCore->getRenderer()->getGLContext()->getRenderPath() != GLContext::GLPath_ARBFP_ARBVP)
  1158.         appCore->getRenderer()->getGLContext()->setRenderPath(GLContext::GLPath_ARBFP_ARBVP);
  1159. }
  1160. void KdeApp::slotSetRenderPathNV30() {
  1161.     if (appCore->getRenderer()->getGLContext()->getRenderPath() != GLContext::GLPath_NV30)
  1162.         appCore->getRenderer()->getGLContext()->setRenderPath(GLContext::GLPath_NV30);
  1163. }
  1164. void KdeApp::slotSetRenderPathGLSL() {
  1165.     if (appCore->getRenderer()->getGLContext()->getRenderPath() != GLContext::GLPath_GLSL)
  1166.         appCore->getRenderer()->getGLContext()->setRenderPath(GLContext::GLPath_GLSL);
  1167. }
  1168. void KdeApp::slotToggleVideoSync() {
  1169.     appCore->getRenderer()->setVideoSync(!appCore->getRenderer()->getVideoSync());
  1170. }
  1171. void KdeApp::slotCycleRenderPath() {
  1172.     appCore->charEntered('26');
  1173. }
  1174. void KdeApp::slotGrabImage() {
  1175.     QString dir;
  1176.     KGlobal::config()->setGroup("Preferences");
  1177.     if (KGlobal::config()->hasKey("GrabImageDir")) {
  1178.         dir = KGlobal::config()->readEntry("GrabImageDir");
  1179.     } else {
  1180.         dir = startDir;
  1181.     }
  1182.     QString saveAsName = KFileDialog::getSaveFileName(dir, "*.png");
  1183.     if (saveAsName != "") {
  1184.         QImage grabedImage = glWidget->grabFrameBuffer();
  1185.         grabedImage.save(saveAsName, "PNG");
  1186.         QUrl file(saveAsName);
  1187.         KGlobal::config()->writeEntry("GrabImageDir", file.dirPath());
  1188.     }
  1189. }
  1190. void KdeApp::slotCaptureVideo() {
  1191. #ifdef THEORA
  1192.     QString dir;
  1193.     KGlobal::config()->setGroup("Preferences");
  1194.     if (KGlobal::config()->hasKey("CaptureVideoDir")) {
  1195.         dir = KGlobal::config()->readEntry("CaptureVideoDir");
  1196.     } else {
  1197.         dir = startDir;
  1198.     }
  1199.     VideoCaptureDlg *dialog = new VideoCaptureDlg(this, dir);
  1200.     if (dialog->exec() == QDialog::Accepted) {
  1201.         appCore->initMovieCapture(dialog);
  1202.         action("captureVideo")->setEnabled(false);
  1203.         KGlobal::config()->writeEntry("CaptureVideoDir", dialog->getDir());
  1204.     } else {
  1205.         delete dialog;
  1206.     }
  1207. #else
  1208.     KMessageBox::queuedMessageBox(this, KMessageBox::Sorry, i18n("This version of Celestia was not built with support for movie recording."));
  1209. #endif
  1210. }
  1211. void KdeApp::slotShowBookmarkBar() {
  1212.     KToolBar * bar = static_cast<KToolBar *>( child( "bookmarkBar", "KToolBar" ) );
  1213.     if (bar->isVisible()) bar->hide();
  1214.     else bar->show();
  1215. }
  1216. void KdeApp::slotBack() {
  1217.     appCore->back();
  1218. }
  1219. void KdeApp::slotForward() {
  1220.     appCore->forward();
  1221. }
  1222. void KdeApp::slotCopyUrl() {
  1223.     CelestiaState appState;
  1224.     appState.captureState(appCore);
  1225.     Url url(appState, 3);
  1226.     QApplication::clipboard()->setText(url.getAsString().c_str());
  1227. }
  1228. void KdeApp::slotGoTo() {
  1229.     bool ok;
  1230.     QString url = KInputDialog::getText(i18n("Go to URL"), i18n("Enter URL"), "", &ok, this);
  1231.     if (ok) {
  1232.         appCore->addToHistory();
  1233.         appCore->goToUrl(url.latin1());
  1234.     }
  1235. }
  1236. void KdeApp::slotGoToLongLat() {
  1237.     LongLatDialog dlg(this, appCore);
  1238.     dlg.exec();
  1239. }
  1240. void KdeApp::dragEnterEvent(QDragEnterEvent* event) {
  1241.     KURL::List urls;
  1242.     event->accept(KURLDrag::canDecode(event) && KURLDrag::decode(event, urls) && urls.first().protocol() == "cel");
  1243. }
  1244. void KdeApp::dropEvent(QDropEvent* event) {
  1245.     KURL::List urls;
  1246.     if (KURLDrag::decode(event, urls) && urls.first().protocol() == "cel") {
  1247.         appCore->addToHistory();
  1248.         appCore->goToUrl(urls.first().url().latin1());
  1249.     }
  1250. }
  1251. void KdeApp::slotBackAboutToShow() {
  1252.     int i;
  1253.     KPopupMenu* menu = backAction->popupMenu();
  1254.     std::vector<Url>::size_type current = appCore->getHistoryCurrent();
  1255.     int pos;
  1256.     std::vector<Url> history = appCore->getHistory();
  1257.     menu->clear();
  1258.     for (i=0, pos = current - 1 ; pos >= 0 && i < 15 ; pos--, i++) {
  1259.         menu->insertItem(QString(history[pos].getName().c_str()), pos);
  1260.     }
  1261. }
  1262. void KdeApp::slotBackActivated(int i) {
  1263.     appCore->setHistoryCurrent(i);
  1264. }
  1265. void KdeApp::slotForwardAboutToShow() {
  1266.     int i;
  1267.     KPopupMenu* menu = forwardAction->popupMenu();
  1268.     std::vector<Url>::size_type current = appCore->getHistoryCurrent();
  1269.     std::vector<Url>::size_type pos;
  1270.     std::vector<Url> history = appCore->getHistory();
  1271.     menu->clear();
  1272.     for (i=0, pos = current + 1 ; pos < history.size() && i < 15 ; pos++, i++) {
  1273.         menu->insertItem(QString(history[pos].getName().c_str()), pos);
  1274.     }
  1275. }
  1276. void KdeApp::slotForwardActivated(int i) {
  1277.     appCore->setHistoryCurrent(i);
  1278. }
  1279. void KdeApp::slotCelestialBrowser() {
  1280.     static CelestialBrowser *cb = new CelestialBrowser(this, appCore);
  1281.     cb->show();
  1282.     cb->showNormal();
  1283.     cb->setActiveWindow();
  1284.     cb->raise();
  1285. }
  1286. void KdeApp::slotEclipseFinder() {
  1287.     static EclipseFinderDlg *ef = new EclipseFinderDlg(this, appCore);
  1288.     ef->show();
  1289.     ef->showNormal();
  1290.     ef->setActiveWindow();
  1291.     ef->raise();
  1292. }
  1293. void KdeApp::popupMenu(float x, float y, Selection sel) {
  1294.     SelectionPopup popup(app, app->appCore, sel);
  1295.     popup.init();
  1296.     int id = popup.exec(app->glWidget->mapToGlobal(QPoint(int(x),int(y))));
  1297.     popup.process(id);
  1298. }
  1299. void KdeApp::resizeEvent(QResizeEvent* e) {
  1300.     emit resized(e->size().width(), e->size().height());
  1301. }
  1302. LongLatDialog::LongLatDialog(QWidget* parent, CelestiaCore* appCore) :
  1303.    KDialogBase(parent, "long_lat", true, "Go to Long/Lat"), appCore(appCore)
  1304. {
  1305.     QGrid* grid = makeGridMainWidget(3, Qt::Horizontal);
  1306.     QLabel* objLab = new QLabel(i18n("Object: "), grid);
  1307.     objLab->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
  1308.     objEdit = new QLineEdit(grid);
  1309.     new QLabel("", grid);
  1310.     QLabel* longLab = new QLabel(i18n("Longitude: "), grid);
  1311.     longLab->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
  1312.     longEdit = new QLineEdit(grid);
  1313.     longEdit->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
  1314.     longEdit->setValidator(new QDoubleValidator(0, 180, 3, longEdit));
  1315.     longSign = new QComboBox( grid );
  1316.     longSign->insertItem(i18n("East", "E"));
  1317.     longSign->insertItem(i18n("West", "W"));
  1318.     QLabel* latLab = new QLabel(i18n("Latitude: "), grid);
  1319.     latLab->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
  1320.     latEdit = new QLineEdit(grid);
  1321.     latEdit->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
  1322.     latEdit->setValidator(new QDoubleValidator(0, 90, 3, latEdit));
  1323.     latSign = new QComboBox( grid );
  1324.     latSign->insertItem(i18n("North", "N"));
  1325.     latSign->insertItem(i18n("South", "S"));
  1326.     QLabel* altLab = new QLabel(i18n("Altitude: "), grid);
  1327.     altLab->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
  1328.     altEdit = new QLineEdit(grid);
  1329.     altEdit->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
  1330.     altEdit->setValidator(new QDoubleValidator(altEdit));
  1331.     new QLabel(i18n("km"), grid);
  1332.     double distance, longitude, latitude;
  1333.     appCore->getSimulation()->getSelectionLongLat(distance, longitude, latitude);
  1334.     if (longitude < 0) {
  1335.         longitude = -longitude;
  1336.         longSign->setCurrentItem(1);
  1337.     }
  1338.     if (latitude < 0) {
  1339.         latitude = -latitude;
  1340.         latSign->setCurrentItem(1);
  1341.     }
  1342.     Selection selection = appCore->getSimulation()->getSelection();
  1343.     QString objName(selection.getName(true).c_str());
  1344.     objEdit->setText(objName.mid(objName.findRev('/') + 1));
  1345.     latEdit->setText(QString("%1").arg(latitude, 0, 'f', 3));
  1346.     longEdit->setText(QString("%1").arg(longitude, 0, 'f', 3));
  1347.     altEdit->setText(QString("%1").arg(distance - selection.radius(), 0, 'f', 0));
  1348. }
  1349. void LongLatDialog::slotCancel() {
  1350.     reject();
  1351. }
  1352. void LongLatDialog::slotOk() {
  1353.     slotApply();
  1354.     accept();
  1355. }KdeAlerter alerter;
  1356. void LongLatDialog::slotApply() {
  1357.     Simulation* appSim = appCore->getSimulation();
  1358.     Selection sel = appSim->findObjectFromPath((const char*)objEdit->text().utf8(), true);
  1359.     if (!sel.empty())
  1360.     {
  1361.         appSim->setSelection(sel);
  1362.         appSim->follow();
  1363.         double altitude = altEdit->text().toDouble();
  1364.         if (altitude < 0.020) altitude = .020;
  1365.         double distance = altitude + sel.radius();
  1366.         distance = astro::kilometersToLightYears(distance);
  1367.         double longitude = longEdit->text().toDouble();
  1368.         if (longSign->currentItem() == 1) {
  1369.             longitude = -longitude;
  1370.         }
  1371.         double latitude = latEdit->text().toDouble();
  1372.         if (latSign->currentItem() == 1) {
  1373.             latitude = -latitude;
  1374.         }
  1375.         appSim->gotoSelectionLongLat(5.0,
  1376.                                 distance,
  1377.                                 degToRad(longitude),
  1378.                                 degToRad(latitude),
  1379.                                 Vec3f(0, 1, 0));
  1380.     }
  1381. }
  1382. KdeAlerter::KdeAlerter(QWidget* _parent) : parent(_parent)
  1383. {}
  1384. void KdeAlerter::fatalError(const std::string& err)
  1385. {
  1386.     KMessageBox::detailedError(parent, i18n("Celestia encountered an error while processing your script"), QString(err.c_str()));
  1387. }