00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <qvbox.h>
00019 #include <kmainwindow.h>
00020 #include <kpushbutton.h>
00021 #include <qtextedit.h>
00022 #include <qcombobox.h>
00023 #include <klocale.h>
00024 #include <kconfig.h>
00025 #include <kiconloader.h>
00026 #include <qframe.h>
00027 #include <qgrid.h>
00028 #include <qcheckbox.h>
00029 #include <qvgroupbox.h>
00030 #include <qslider.h>
00031 #include <kkeydialog.h>
00032 #include <qspinbox.h>
00033 #include <qlabel.h>
00034 #include <qlayout.h>
00035
00036
00037 #include "kdeapp.h"
00038 #include "kdepreferencesdialog.h"
00039 #include "celengine/render.h"
00040 #include "celengine/glcontext.h"
00041
00042 static uint32 FilterOtherLocations = ~(Location::City |
00043 Location::Observatory |
00044 Location::LandingSite |
00045 Location::Crater |
00046 Location::Mons |
00047 Location::Terra |
00048 Location::Vallis |
00049 Location::Mare);
00050
00051 KdePreferencesDialog::KdePreferencesDialog(QWidget* parent, CelestiaCore* core) :
00052 KDialogBase (KDialogBase::IconList, "",
00053 KDialogBase::Ok | KDialogBase::Apply | KDialogBase::Cancel, KDialogBase::Ok,parent)
00054 {
00055
00056 setCaption(i18n("Celestia Preferences"));
00057 appCore=core;
00058
00059 this->parent = (KdeApp*)parent;
00060
00061
00062 QGrid* renderFrame = addGridPage(2, Qt::Horizontal, i18n("Rendering"), i18n("Rendering"),
00063 KGlobal::iconLoader()->loadIcon("configure", KIcon::NoGroup));
00064
00065 int renderFlags = appCore->getRenderer()->getRenderFlags();
00066 savedRendererFlags = renderFlags;
00067
00068 KActionCollection* actionColl = ((KdeApp*)parent)->actionCollection();
00069
00070 QGroupBox* showGroup = new QGroupBox(1, Qt::Horizontal, i18n("Show"), renderFrame);
00071
00072 QCheckBox* showStarsCheck = new QCheckBox(i18n("Stars"), showGroup);
00073 actionColl->action("showStars")->connect(showStarsCheck, SIGNAL(clicked()), SLOT(activate()));
00074 showStarsCheck->setChecked(renderFlags & Renderer::ShowStars);
00075
00076 QCheckBox* showAutoMagCheck = new QCheckBox(i18n("Auto Magnitudes"), showGroup);
00077 actionColl->action("showAutoMag")->connect(showAutoMagCheck, SIGNAL(clicked()), SLOT(activate()));
00078 showAutoMagCheck->setChecked(renderFlags & Renderer::ShowAutoMag);
00079
00080 QCheckBox* showPlanetsCheck = new QCheckBox(i18n("Planets"), showGroup);
00081 actionColl->action("showPlanets")->connect(showPlanetsCheck, SIGNAL(clicked()), SLOT(activate()));
00082 showPlanetsCheck->setChecked(renderFlags & Renderer::ShowPlanets);
00083
00084 QCheckBox* showGalaxiesCheck = new QCheckBox(i18n("Galaxies"), showGroup);
00085 actionColl->action("showGalaxies")->connect(showGalaxiesCheck, SIGNAL(clicked()), SLOT(activate()));
00086 showGalaxiesCheck->setChecked(renderFlags & Renderer::ShowGalaxies);
00087
00088 QCheckBox* showNebulaeCheck = new QCheckBox(i18n("Nebulae"), showGroup);
00089 actionColl->action("showNebulae")->connect(showNebulaeCheck, SIGNAL(clicked()), SLOT(activate()));
00090 showNebulaeCheck->setChecked(renderFlags & Renderer::ShowNebulae);
00091
00092 QCheckBox* showOpenClustersCheck = new QCheckBox(i18n("Open Clusters"), showGroup);
00093 actionColl->action("showOpenClusters")->connect(showOpenClustersCheck, SIGNAL(clicked()), SLOT(activate()));
00094 showOpenClustersCheck->setChecked(renderFlags & Renderer::ShowOpenClusters);
00095
00096 QCheckBox* showAtmospheresCheck = new QCheckBox(i18n("Atmospheres"), showGroup);
00097 actionColl->action("showAtmospheres")->connect(showAtmospheresCheck, SIGNAL(clicked()), SLOT(activate()));
00098 showAtmospheresCheck->setChecked(renderFlags & Renderer::ShowAtmospheres);
00099
00100 QCheckBox* showCloudMapsCheck = new QCheckBox(i18n("Clouds"), showGroup);
00101 actionColl->action("showCloudMaps")->connect(showCloudMapsCheck, SIGNAL(clicked()), SLOT(activate()));
00102 showCloudMapsCheck->setChecked(renderFlags & Renderer::ShowCloudMaps);
00103
00104 QCheckBox* showNightMapsCheck = new QCheckBox(i18n("Night Side Lights"), showGroup);
00105 actionColl->action("showNightMaps")->connect(showNightMapsCheck, SIGNAL(clicked()), SLOT(activate()));
00106 showNightMapsCheck->setChecked(renderFlags & Renderer::ShowNightMaps);
00107
00108 QCheckBox* showEclipseShadowsCheck = new QCheckBox(i18n("Eclipse Shadows"), showGroup);
00109 actionColl->action("showEclipseShadows")->connect(showEclipseShadowsCheck, SIGNAL(clicked()), SLOT(activate()));
00110 showEclipseShadowsCheck->setChecked(renderFlags & Renderer::ShowEclipseShadows);
00111
00112 QCheckBox* showCometTailsCheck = new QCheckBox(i18n("Comet Tails"), showGroup);
00113 actionColl->action("showCometTails")->connect(showCometTailsCheck, SIGNAL(clicked()), SLOT(activate()));
00114 showCometTailsCheck->setChecked(renderFlags & Renderer::ShowCometTails);
00115
00116 QCheckBox* showOrbitsCheck = new QCheckBox(i18n("Orbits"), showGroup);
00117 actionColl->action("showOrbits")->connect(showOrbitsCheck, SIGNAL(clicked()), SLOT(activate()));
00118 showOrbitsCheck->setChecked(renderFlags & Renderer::ShowOrbits);
00119
00120 QCheckBox* showPartialTrajectoriesCheck = new QCheckBox(i18n("Partial Trajectories"), showGroup);
00121 actionColl->action("showPartialTrajectories")->connect(showPartialTrajectoriesCheck, SIGNAL(clicked()), SLOT(activate()));
00122 showPartialTrajectoriesCheck->setChecked(renderFlags & Renderer::ShowPartialTrajectories);
00123
00124 QCheckBox* showSmoothLinesCheck = new QCheckBox(i18n("Smooth Orbit Lines"), showGroup);
00125 actionColl->action("showSmoothLines")->connect(showSmoothLinesCheck, SIGNAL(clicked()), SLOT(activate()));
00126 showSmoothLinesCheck->setChecked(renderFlags & Renderer::ShowSmoothLines);
00127
00128 QCheckBox* showCelestialSphereCheck = new QCheckBox(i18n("Celestial Grid"), showGroup);
00129 actionColl->action("showCelestialSphere")->connect(showCelestialSphereCheck, SIGNAL(clicked()), SLOT(activate()));
00130 showCelestialSphereCheck->setChecked(renderFlags & Renderer::ShowCelestialSphere);
00131
00132 QCheckBox* showDiagramsCheck = new QCheckBox(i18n("Constellations"), showGroup);
00133 actionColl->action("showDiagrams")->connect(showDiagramsCheck, SIGNAL(clicked()), SLOT(activate()));
00134 showDiagramsCheck->setChecked(renderFlags & Renderer::ShowDiagrams);
00135
00136 QCheckBox* showMarkersCheck = new QCheckBox(i18n("Markers"), showGroup);
00137 actionColl->action("showMarkers")->connect(showMarkersCheck, SIGNAL(clicked()), SLOT(activate()));
00138 showMarkersCheck->setChecked(renderFlags & Renderer::ShowMarkers);
00139
00140 QCheckBox* showRingShadowsCheck = new QCheckBox(i18n("Ring Shadows"), showGroup);
00141 actionColl->action("showRingShadows")->connect(showRingShadowsCheck, SIGNAL(clicked()), SLOT(activate()));
00142 showRingShadowsCheck->setChecked(renderFlags & Renderer::ShowRingShadows);
00143
00144 QCheckBox* showBoundariesCheck = new QCheckBox(i18n("Constellation Boundaries"), showGroup);
00145 actionColl->action("showBoundaries")->connect(showBoundariesCheck, SIGNAL(clicked()), SLOT(activate()));
00146 showBoundariesCheck->setChecked(renderFlags & Renderer::ShowBoundaries);
00147
00148
00149 QVBox* vbox1 = new QVBox(renderFrame);
00150 int labelMode = appCore->getRenderer()->getLabelMode();
00151 savedLabelMode = labelMode;
00152 int orbitMask = appCore->getRenderer()->getOrbitMask();
00153 savedOrbitMask = orbitMask;
00154
00155 QGroupBox* labelGroup = new QGroupBox(0, Qt::Horizontal, i18n("Orbits / Labels"), vbox1);
00156 QGridLayout* labelGroupLayout = new QGridLayout( labelGroup->layout() );
00157 labelGroupLayout->setAlignment( Qt::AlignTop );
00158
00159 QLabel* orbitsLabel = new QLabel(i18n("Orbits"), labelGroup);
00160 labelGroupLayout->addWidget(orbitsLabel, 0, 0);
00161 QLabel* labelsLabel = new QLabel(i18n("Labels"), labelGroup);
00162 labelGroupLayout->addWidget(labelsLabel, 0, 1);
00163
00164 QCheckBox* showStarLabelsCheck = new QCheckBox(i18n("Stars"), labelGroup);
00165 actionColl->action("showStarLabels")->connect(showStarLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00166 showStarLabelsCheck->setChecked(labelMode & Renderer::StarLabels);
00167 labelGroupLayout->addWidget(showStarLabelsCheck, 1, 1);
00168
00169
00170 QCheckBox* showPlanetOrbitsCheck = new QCheckBox("", labelGroup);
00171 actionColl->action("showPlanetOrbits")->connect(showPlanetOrbitsCheck, SIGNAL(clicked()), SLOT(activate()));
00172 showPlanetOrbitsCheck->setChecked(orbitMask & Body::Planet);
00173 labelGroupLayout->addWidget(showPlanetOrbitsCheck, 3, 0, Qt::AlignHCenter);
00174 QCheckBox* showPlanetLabelsCheck = new QCheckBox(i18n("Planets"), labelGroup);
00175 actionColl->action("showPlanetLabels")->connect(showPlanetLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00176 showPlanetLabelsCheck->setChecked(labelMode & Renderer::PlanetLabels);
00177 labelGroupLayout->addWidget(showPlanetLabelsCheck, 3, 1);
00178
00179 QCheckBox* showMoonOrbitsCheck = new QCheckBox("", labelGroup);
00180 actionColl->action("showMoonOrbits")->connect(showMoonOrbitsCheck, SIGNAL(clicked()), SLOT(activate()));
00181 showMoonOrbitsCheck->setChecked(orbitMask & Body::Moon);
00182 labelGroupLayout->addWidget(showMoonOrbitsCheck, 4, 0, Qt::AlignHCenter);
00183 QCheckBox* showMoonLabelsCheck = new QCheckBox(i18n("Moons"), labelGroup);
00184 actionColl->action("showMoonLabels")->connect(showMoonLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00185 showMoonLabelsCheck->setChecked(labelMode & Renderer::MoonLabels);
00186 labelGroupLayout->addWidget(showMoonLabelsCheck, 4, 1);
00187
00188 QCheckBox* showCometOrbitsCheck = new QCheckBox("", labelGroup);
00189 actionColl->action("showCometOrbits")->connect(showCometOrbitsCheck, SIGNAL(clicked()), SLOT(activate()));
00190 showCometOrbitsCheck->setChecked(orbitMask & Body::Comet);
00191 labelGroupLayout->addWidget(showCometOrbitsCheck, 5, 0, Qt::AlignHCenter);
00192 QCheckBox* showCometLabelsCheck = new QCheckBox(i18n("Comets"), labelGroup);
00193 actionColl->action("showCometLabels")->connect(showCometLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00194 showCometLabelsCheck->setChecked(labelMode & Renderer::CometLabels);
00195 labelGroupLayout->addWidget(showCometLabelsCheck, 5, 1);
00196
00197 QCheckBox* showConstellationLabelsCheck = new QCheckBox(i18n("Constellations"), labelGroup);
00198 actionColl->action("showConstellationLabels")->connect(showConstellationLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00199 showConstellationLabelsCheck->setChecked(labelMode & Renderer::ConstellationLabels);
00200 labelGroupLayout->addWidget(showConstellationLabelsCheck, 6, 1);
00201
00202 QCheckBox* showI18nConstellationLabelsCheck = new QCheckBox(i18n("Constellations in Latin"), labelGroup);
00203 actionColl->action("showI18nConstellationLabels")->connect(showI18nConstellationLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00204 showI18nConstellationLabelsCheck->setChecked(!(labelMode & Renderer::I18nConstellationLabels));
00205 labelGroupLayout->addWidget(showI18nConstellationLabelsCheck, 7, 1);
00206
00207 QCheckBox* showGalaxyLabelsCheck = new QCheckBox(i18n("Galaxies"), labelGroup);
00208 actionColl->action("showGalaxyLabels")->connect(showGalaxyLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00209 showGalaxyLabelsCheck->setChecked(labelMode & Renderer::GalaxyLabels);
00210 labelGroupLayout->addWidget(showGalaxyLabelsCheck, 8, 1);
00211
00212 QCheckBox* showNebulaLabelsCheck = new QCheckBox(i18n("Nebulae"), labelGroup);
00213 actionColl->action("showNebulaLabels")->connect(showNebulaLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00214 showNebulaLabelsCheck->setChecked(labelMode & Renderer::NebulaLabels);
00215 labelGroupLayout->addWidget(showNebulaLabelsCheck, 9, 1);
00216
00217 QCheckBox* showOpenClusterLabelsCheck = new QCheckBox(i18n("Open Clusters"), labelGroup);
00218 actionColl->action("showOpenClusterLabels")->connect(showOpenClusterLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00219 showOpenClusterLabelsCheck->setChecked(labelMode & Renderer::OpenClusterLabels);
00220 labelGroupLayout->addWidget(showOpenClusterLabelsCheck, 10, 1);
00221
00222 QCheckBox* showAsteroidOrbitsCheck = new QCheckBox("", labelGroup);
00223 actionColl->action("showAsteroidOrbits")->connect(showAsteroidOrbitsCheck, SIGNAL(clicked()), SLOT(activate()));
00224 showAsteroidOrbitsCheck->setChecked(orbitMask & Body::Asteroid);
00225 labelGroupLayout->addWidget(showAsteroidOrbitsCheck, 11, 0, Qt::AlignHCenter);
00226 QCheckBox* showAsteroidLabelsCheck = new QCheckBox(i18n("Asteroids"), labelGroup);
00227 actionColl->action("showAsteroidLabels")->connect(showAsteroidLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00228 showAsteroidLabelsCheck->setChecked(labelMode & Renderer::AsteroidLabels);
00229 labelGroupLayout->addWidget(showAsteroidLabelsCheck, 11, 1);
00230
00231 QCheckBox* showSpacecraftOrbitsCheck = new QCheckBox("", labelGroup);
00232 actionColl->action("showSpacecraftOrbits")->connect(showSpacecraftOrbitsCheck, SIGNAL(clicked()), SLOT(activate()));
00233 showSpacecraftOrbitsCheck->setChecked(orbitMask & Body::Spacecraft);
00234 labelGroupLayout->addWidget(showSpacecraftOrbitsCheck, 12, 0, Qt::AlignHCenter);
00235 QCheckBox* showSpacecraftLabelsCheck = new QCheckBox(i18n("Spacecrafts"), labelGroup);
00236 actionColl->action("showSpacecraftLabels")->connect(showSpacecraftLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00237 showSpacecraftLabelsCheck->setChecked(labelMode & Renderer::SpacecraftLabels);
00238 labelGroupLayout->addWidget(showSpacecraftLabelsCheck, 12, 1);
00239
00240 QCheckBox* showLocationLabelsCheck = new QCheckBox(i18n("Locations"), labelGroup);
00241 actionColl->action("showLocationLabels")->connect(showLocationLabelsCheck, SIGNAL(clicked()), SLOT(activate()));
00242 showLocationLabelsCheck->setChecked(labelMode & Renderer::LocationLabels);
00243 labelGroupLayout->addWidget(showLocationLabelsCheck, 13, 1);
00244
00245 QSpacerItem* spacer = new QSpacerItem( 151, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
00246 labelGroupLayout->addItem( spacer, 0, 2 );
00247
00248 savedAmbientLightLevel = int(appCore->getRenderer()->getAmbientLightLevel() * 100);
00249 QGroupBox* ambientLightGroup = new QGroupBox(1, Qt::Vertical, i18n("Ambient Light"), vbox1);
00250 QSlider* ambientLightSlider = new QSlider(0, 25, 1, savedAmbientLightLevel, Qt::Horizontal, ambientLightGroup);
00251 connect(ambientLightSlider, SIGNAL(valueChanged(int)), SLOT(slotAmbientLightLevel(int)));
00252 ambientLabel = new QLabel(ambientLightGroup);
00253 ambientLabel->setMinimumWidth(40);
00254 ambientLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
00255 char buff[20];
00256 sprintf(buff, "%.2f", savedAmbientLightLevel / 100.);
00257 ambientLabel->setText(buff);
00258
00259 savedFaintestVisible = int(appCore->getSimulation()->getFaintestVisible() * 100);
00260 QGroupBox* faintestVisibleGroup = new QGroupBox(1, Qt::Vertical, i18n("Limiting Magnitude"), vbox1);
00261 QSlider* faintestVisibleSlider = new QSlider(1, 1200, 1, savedFaintestVisible, Qt::Horizontal, faintestVisibleGroup);
00262 connect(faintestVisibleSlider, SIGNAL(valueChanged(int)), SLOT(slotFaintestVisible(int)));
00263 faintestLabel = new QLabel(faintestVisibleGroup);
00264 faintestLabel->setMinimumWidth(40);
00265 faintestLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
00266 sprintf(buff, "%.2f", savedFaintestVisible / 100.);
00267 faintestLabel->setText(buff);
00268
00269 QGroupBox* infoTextGroup = new QGroupBox(1, Qt::Vertical, i18n("Info Text"), vbox1);
00270 new QLabel(i18n("Level: "), infoTextGroup);
00271 QComboBox* infoTextCombo = new QComboBox(infoTextGroup);
00272 infoTextCombo->insertItem(i18n("None"));
00273 infoTextCombo->insertItem(i18n("Terse"));
00274 infoTextCombo->insertItem(i18n("Verbose"));
00275 savedHudDetail = appCore->getHudDetail();
00276 infoTextCombo->setCurrentItem(savedHudDetail);
00277 ((KdeApp*)parent)->connect(infoTextCombo, SIGNAL(activated(int)), SLOT(slotHudDetail(int)));
00278
00279 QGroupBox* fovGroup = new QGroupBox(2, Qt::Horizontal, i18n("Automatic FOV"), vbox1);
00280 new QLabel(i18n("Screen DPI: "), fovGroup);
00281 new QLabel(QString::number(appCore->getScreenDpi(), 10), fovGroup);
00282 new QLabel(i18n("Viewing Distance (cm): "), fovGroup);
00283 dtsSpin = new QSpinBox(10, 300, 1, fovGroup);
00284 savedDistanceToScreen = appCore->getDistanceToScreen();
00285 dtsSpin->setValue(savedDistanceToScreen / 10);
00286 connect(dtsSpin, SIGNAL(valueChanged(int)), SLOT(slotDistanceToScreen(int)));
00287
00288
00289 Observer* obs = appCore->getSimulation()->getActiveObserver();
00290 savedLocationFilter = obs->getLocationFilter();
00291
00292 QFrame* locationsFrame = addPage(i18n("Locations"), i18n("Locations"),
00293 KGlobal::iconLoader()->loadIcon("package_network", KIcon::NoGroup));
00294 QVBoxLayout* locationsLayout = new QVBoxLayout( locationsFrame );
00295 locationsLayout->setAutoAdd(TRUE);
00296 locationsLayout->setAlignment(Qt::AlignTop);
00297
00298 QCheckBox* showCityLocationsCheck = new QCheckBox(i18n("Cities"), locationsFrame);
00299 actionColl->action("showCityLocations")->connect(showCityLocationsCheck, SIGNAL(clicked()), SLOT(activate()));
00300 showCityLocationsCheck->setChecked(savedLocationFilter & Location::City);
00301
00302 QCheckBox* showObservatoryLocationsCheck = new QCheckBox(i18n("Observatories"), locationsFrame);
00303 actionColl->action("showObservatoryLocations")->connect(showObservatoryLocationsCheck, SIGNAL(clicked()), SLOT(activate()));
00304 showObservatoryLocationsCheck->setChecked(savedLocationFilter & Location::Observatory);
00305
00306 QCheckBox* showLandingSiteLocationsCheck = new QCheckBox(i18n("Landing Sites"), locationsFrame);
00307 actionColl->action("showLandingSiteLocations")->connect(showLandingSiteLocationsCheck, SIGNAL(clicked()), SLOT(activate()));
00308 showLandingSiteLocationsCheck->setChecked(savedLocationFilter & Location::LandingSite);
00309
00310 QCheckBox* showCraterLocationsCheck = new QCheckBox(i18n("Craters"), locationsFrame);
00311 actionColl->action("showCraterLocations")->connect(showCraterLocationsCheck, SIGNAL(clicked()), SLOT(activate()));
00312 showCraterLocationsCheck->setChecked(savedLocationFilter & Location::Crater);
00313
00314 QCheckBox* showMonsLocationsCheck = new QCheckBox(i18n("Mons"), locationsFrame);
00315 actionColl->action("showMonsLocations")->connect(showMonsLocationsCheck, SIGNAL(clicked()), SLOT(activate()));
00316 showMonsLocationsCheck->setChecked(savedLocationFilter & Location::Mons);
00317
00318 QCheckBox* showTerraLocationsCheck = new QCheckBox(i18n("Terra"), locationsFrame);
00319 actionColl->action("showTerraLocations")->connect(showTerraLocationsCheck, SIGNAL(clicked()), SLOT(activate()));
00320 showTerraLocationsCheck->setChecked(savedLocationFilter & Location::Terra);
00321
00322 QCheckBox* showVallisLocationsCheck = new QCheckBox(i18n("Vallis"), locationsFrame);
00323 actionColl->action("showVallisLocations")->connect(showVallisLocationsCheck, SIGNAL(clicked()), SLOT(activate()));
00324 showVallisLocationsCheck->setChecked(savedLocationFilter & Location::Vallis);
00325
00326 QCheckBox* showMareLocationsCheck = new QCheckBox(i18n("Mare"), locationsFrame);
00327 actionColl->action("showMareLocations")->connect(showMareLocationsCheck, SIGNAL(clicked()), SLOT(activate()));
00328 showMareLocationsCheck->setChecked(savedLocationFilter & Location::Mare);
00329
00330 QCheckBox* showOtherLocationsCheck = new QCheckBox(i18n("Other"), locationsFrame);
00331 actionColl->action("showOtherLocations")->connect(showOtherLocationsCheck, SIGNAL(clicked()), SLOT(activate()));
00332 showOtherLocationsCheck->setChecked(savedLocationFilter & FilterOtherLocations);
00333
00334 QGroupBox* minFeatureSizeGroup = new QGroupBox(1, Qt::Vertical, i18n("Minimum Feature Size"), locationsFrame);
00335 minFeatureSizeGroup->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum));
00336 savedMinFeatureSize = (int)appCore->getRenderer()->getMinimumFeatureSize();
00337 QSlider* minFeatureSizeSlider = new QSlider(1, 1000, 1, savedMinFeatureSize, Qt::Horizontal, minFeatureSizeGroup);
00338 connect(minFeatureSizeSlider, SIGNAL(valueChanged(int)), SLOT(slotMinFeatureSize(int)));
00339 minFeatureSizeLabel = new QLabel(minFeatureSizeGroup);
00340 minFeatureSizeLabel->setMinimumWidth(40);
00341 minFeatureSizeLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
00342 sprintf(buff, "%d", savedMinFeatureSize);
00343 minFeatureSizeLabel->setText(buff);
00344
00345
00346
00347 timeHasChanged = false;
00348 QVBox* timeFrame = addVBoxPage(i18n("Date/Time"), i18n("Date/Time"),
00349 KGlobal::iconLoader()->loadIcon("clock", KIcon::NoGroup));
00350
00351 savedDisplayLocalTime = appCore->getTimeZoneBias();
00352 QGroupBox* displayTimezoneGroup = new QGroupBox(1, Qt::Vertical, i18n("Display"), timeFrame);
00353 new QLabel(i18n("Timezone: "), displayTimezoneGroup);
00354 displayTimezoneCombo = new QComboBox(displayTimezoneGroup);
00355 displayTimezoneCombo->insertItem(i18n("UTC"));
00356 displayTimezoneCombo->insertItem(i18n("Local Time"));
00357 displayTimezoneCombo->setCurrentItem((appCore->getTimeZoneBias()==0)?0:1);
00358 ((KdeApp*)parent)->connect(displayTimezoneCombo, SIGNAL(activated(int)), SLOT(slotDisplayLocalTime()));
00359 displayTimezoneGroup->addSpace(0);
00360
00361 QGroupBox* setTimezoneGroup = new QGroupBox(1, Qt::Horizontal, i18n("Set"), timeFrame);
00362 new QLabel(i18n("Local Time is only supported for dates between 1902 and 2037.\n"), setTimezoneGroup);
00363 QHBox *hbox2 = new QHBox(setTimezoneGroup);
00364 new QLabel(i18n("Timezone: "), hbox2);
00365 setTimezoneCombo = new QComboBox(hbox2);
00366 setTimezoneCombo->insertItem(i18n("UTC"));
00367 setTimezoneCombo->insertItem(i18n("Local Time"));
00368
00369 KGlobal::config()->setGroup("ConfigureDialog");
00370 if (KGlobal::config()->hasKey("SetTimeTimeZoneLocal"))
00371 setTimezoneCombo->setCurrentItem(KGlobal::config()->readNumEntry("SetTimeTimeZoneLocal"));
00372 KGlobal::config()->setGroup(0);
00373 connect(setTimezoneCombo, SIGNAL(activated(int)), SLOT(slotTimeHasChanged()));
00374
00375
00376 QHBox *hboxdate = new QHBox(setTimezoneGroup);
00377 QLabel* spacerdate1 = new QLabel(" ", hboxdate);
00378 timeFrame->setStretchFactor(spacerdate1, 2);
00379 YSpin = new QSpinBox(-1000000000, 1000000000, 1, hboxdate);
00380 YSpin->setWrapping(true);
00381 MSpin = new QSpinBox(1, 12, 1, hboxdate);
00382 MSpin->setWrapping(true);
00383 DSpin = new QSpinBox(1, 31, 1, hboxdate);
00384 DSpin->setWrapping(true);
00385 QLabel* spacerdate2 = new QLabel(" ", hboxdate);
00386 timeFrame->setStretchFactor(spacerdate2, 2);
00387
00388 QVBox *vbox3 = new QVBox(setTimezoneGroup);
00389 QHBox *hbox3 = new QHBox(vbox3);
00390 QLabel* spacer1 = new QLabel(" ", hbox3);
00391 hbox3->setStretchFactor(spacer1, 10);
00392 hSpin = new QSpinBox(0, 23, 1, hbox3);
00393 hSpin->setWrapping(true);
00394 new QLabel(":", hbox3);
00395 mSpin = new QSpinBox(0, 59, 1, hbox3);
00396 mSpin->setWrapping(true);
00397 new QLabel(":", hbox3);
00398 sSpin = new QSpinBox(0, 59, 1, hbox3);
00399 sSpin->setWrapping(true);
00400 QLabel* spacer2 = new QLabel(" ", hbox3);
00401 hbox3->setStretchFactor(spacer2, 10);
00402
00403 QLabel* spacer3 = new QLabel(" ", timeFrame);
00404 timeFrame->setStretchFactor(spacer3, 2);
00405
00406 setTime(appCore->getSimulation()->getTime());
00407 connect(YSpin, SIGNAL(valueChanged(int)), SLOT(slotTimeHasChanged()));
00408 connect(MSpin, SIGNAL(valueChanged(int)), SLOT(slotTimeHasChanged()));
00409 connect(DSpin, SIGNAL(valueChanged(int)), SLOT(slotTimeHasChanged()));
00410 connect(hSpin, SIGNAL(valueChanged(int)), SLOT(slotTimeHasChanged()));
00411 connect(mSpin, SIGNAL(valueChanged(int)), SLOT(slotTimeHasChanged()));
00412 connect(sSpin, SIGNAL(valueChanged(int)), SLOT(slotTimeHasChanged()));
00413
00414 KPushButton *nowButton = new KPushButton(setTimezoneGroup);
00415 nowButton->setText(i18n("Now"));
00416 QSizePolicy nowButtonSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
00417 nowButton->setSizePolicy(nowButtonSizePolicy);
00418 connect(nowButton, SIGNAL(clicked()), SLOT(setNow()));
00419
00420 Selection selection = appCore->getSimulation()->getSelection();
00421 std::string sel_name;
00422 if (selection.body() != 0) {
00423 QHBox* ltBox = new QHBox(setTimezoneGroup);
00424 char time[50];
00425 sel_name = selection.body()->getName();
00426 Vec3d v = selection.getPosition(appCore->getSimulation()->getTime()) -
00427 appCore->getSimulation()->getObserver().getPosition();
00428 double dist = astro::lightYearsToKilometers(v.length()*1e-6);
00429 double lt = dist / astro::speedOfLight;
00430 long lt_h = (long)(lt / 3600);
00431 int lt_m = (int)((lt - lt_h * 3600) / 60);
00432 double lt_s = (lt - lt_h * 3600 - lt_m * 60);
00433 if (lt_h == 0) snprintf(time, 50, "%d min %02.1f s", lt_m, lt_s);
00434 else snprintf(time, 50, "%ld h %02d min %02.1f s", lt_h, lt_m, lt_s);
00435
00436 new QLabel(i18n("\nSelection: " + QString(sel_name.c_str())
00437 + QString("\nLight Travel Time: %2").arg(time)), ltBox);
00438
00439 KPushButton *ltButton = new KPushButton(ltBox);
00440 ltButton->setToggleButton(true);
00441
00442 if (!appCore->getLightDelayActive())
00443 ltButton->setText(i18n("Include Light Travel Time"));
00444 else
00445 ltButton->setText(i18n("Ignore Light Travel Time "));
00446
00447 ltButton->setSizePolicy(nowButtonSizePolicy);
00448 connect(ltButton, SIGNAL(clicked()), SLOT(ltSubstract()));
00449 }
00450
00451
00452 QVBox* openGL = addVBoxPage(i18n("OpenGL"), i18n("OpenGL"),
00453 KGlobal::iconLoader()->loadIcon("misc", KIcon::NoGroup));
00454
00455 renderPathCombo = new QComboBox(openGL);
00456 savedRenderPath = (int)appCore->getRenderer()->getGLContext()->getRenderPath();
00457 if (appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_Basic))
00458 renderPathCombo->insertItem(i18n("Basic"));
00459 if (appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_Multitexture))
00460 renderPathCombo->insertItem(i18n("Multitexture"));
00461 if (appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_NvCombiner))
00462 renderPathCombo->insertItem(i18n("NvCombiners"));
00463 if (appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_DOT3_ARBVP))
00464 renderPathCombo->insertItem(i18n("DOT3 ARBVP"));
00465 if (appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_NvCombiner_NvVP))
00466 renderPathCombo->insertItem(i18n("NvCombiner NvVP"));
00467 if (appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_NvCombiner_ARBVP))
00468 renderPathCombo->insertItem(i18n("NvCombiner ARBVP"));
00469 if (appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_ARBFP_ARBVP))
00470 renderPathCombo->insertItem(i18n("ARBFP ARBVP"));
00471 if (appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_NV30))
00472 renderPathCombo->insertItem(i18n("NV30"));
00473 if (appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_GLSL))
00474 renderPathCombo->insertItem(i18n("OpenGL 2.0"));
00475
00476 connect(renderPathCombo, SIGNAL(activated(int)), SLOT(slotRenderPath(int)));
00477
00478 {
00479 int path=0, ipathIdx=0;
00480 while (path != appCore->getRenderer()->getGLContext()->getRenderPath()) {
00481 ipathIdx++;
00482 do {
00483 path++;
00484 } while (!appCore->getRenderer()->getGLContext()->renderPathSupported((GLContext::GLRenderPath)path));
00485 }
00486 renderPathCombo->setCurrentItem(ipathIdx);
00487 }
00488
00489 renderPathLabel = new QLabel(openGL);
00490 renderPathLabel->setTextFormat(Qt::RichText);
00491 setRenderPathLabel();
00492
00493 QTextEdit* edit = new QTextEdit(openGL);
00494 edit->append(((KdeApp*)parent)->getOpenGLInfo());
00495 edit->setFocusPolicy(QWidget::NoFocus);
00496
00497
00498
00499 QVBox* keyBindings = addVBoxPage(i18n("Key Bindings"), i18n("Key Bindings"),
00500 KGlobal::iconLoader()->loadIcon("key_bindings", KIcon::NoGroup));
00501
00502 keyChooser = new KKeyChooser(((KMainWindow*)parent)->actionCollection(), keyBindings, false);
00503
00504 resize(550,400);
00505 }
00506
00507 KdePreferencesDialog::~KdePreferencesDialog() {
00508 }
00509
00510
00511 void KdePreferencesDialog::setNow() {
00512 time_t date_t;
00513 time(&date_t);
00514 struct tm* tm;
00515 if (setTimezoneCombo->currentItem() != 0) {
00516 tm = localtime ( &date_t);
00517 } else {
00518 tm = gmtime ( &date_t);
00519 }
00520 YSpin->setValue(tm->tm_year + 1900);
00521 MSpin->setValue(tm->tm_mon + 1);
00522 DSpin->setValue(tm->tm_mday);
00523 hSpin->setValue(tm->tm_hour);
00524 mSpin->setValue(tm->tm_min);
00525 sSpin->setValue(tm->tm_sec);
00526 }
00527
00528 void KdePreferencesDialog::ltSubstract() {
00529 double d;
00530
00531 d = getTime();
00532
00533 Selection selection = appCore->getSimulation()->getSelection();
00534 std::string sel_name;
00535
00536
00537
00538 if (selection.body() != 0 &&
00539 (appCore->getSimulation()->getTargetSpeed() < 0.99 *
00540 astro::kilometersToMicroLightYears(astro::speedOfLight))) {
00541 sel_name = selection.body()->getName();
00542 Vec3d v = selection.getPosition(d) -
00543 appCore->getSimulation()->getObserver().getPosition();
00544 appCore->setLightDelayActive(!appCore->getLightDelayActive());
00545 double dist = astro::lightYearsToKilometers(v.length()*1e-6);
00546 double lt = dist / astro::speedOfLight;
00547 if (appCore->getLightDelayActive())
00548 d -= lt / 86400.;
00549 else
00550 d += lt / 86400.;
00551 setTime(d);
00552 }
00553 }
00554
00555 void KdePreferencesDialog::setTime(double d) {
00556 if (setTimezoneCombo->currentItem() != 0 && d < 2465442 && d > 2415733) {
00557 time_t date_t = (int) astro::julianDateToSeconds( d - (float)astro::Date(1970, 1, 1) );
00558
00559 struct tm* tm;
00560 tm = localtime ( &date_t);
00561 YSpin->setValue(tm->tm_year + 1900);
00562 MSpin->setValue(tm->tm_mon + 1);
00563 DSpin->setValue(tm->tm_mday);
00564 hSpin->setValue(tm->tm_hour);
00565 mSpin->setValue(tm->tm_min);
00566 sSpin->setValue(tm->tm_sec);
00567 } else {
00568 astro::Date date(d);
00569 YSpin->setValue(date.year);
00570 MSpin->setValue(date.month);
00571 DSpin->setValue(date.day);
00572 hSpin->setValue(date.hour);
00573 mSpin->setValue(date.minute);
00574 sSpin->setValue(int(date.seconds));
00575 }
00576 }
00577
00578 double KdePreferencesDialog::getTime() const {
00579 double d;
00580
00581 if (setTimezoneCombo->currentItem() == 0 || YSpin->value() < 1902 || YSpin->value() > 2037) {
00582 astro::Date date(0.0);
00583 date.year=YSpin->value();
00584 date.month=MSpin->value();
00585 date.day=DSpin->value();
00586 date.hour=hSpin->value();
00587 date.minute=mSpin->value();
00588 date.seconds=float(sSpin->value());
00589 d = (double) date;
00590 } else {
00591 struct tm time;
00592 time.tm_year = YSpin->value() - 1900;
00593 time.tm_mon = MSpin->value() - 1;
00594 time.tm_mday = DSpin->value();
00595 time.tm_hour = hSpin->value();
00596 time.tm_min = mSpin->value();
00597 time.tm_sec = sSpin->value();
00598 d = astro::secondsToJulianDate(mktime(&time)) + (double) astro::Date(1970, 1, 1);
00599 }
00600 return d;
00601 }
00602
00603 void KdePreferencesDialog::slotOk() {
00604 slotApply();
00605 accept();
00606 }
00607
00608 void KdePreferencesDialog::slotCancel() {
00609 appCore->getRenderer()->setRenderFlags(savedRendererFlags);
00610 appCore->getRenderer()->setLabelMode(savedLabelMode);
00611 appCore->getRenderer()->setOrbitMask(savedOrbitMask);
00612 appCore->getRenderer()->setAmbientLightLevel(savedAmbientLightLevel/100.);
00613 appCore->getSimulation()->setFaintestVisible(savedFaintestVisible/100.);
00614 appCore->setHudDetail(savedHudDetail);
00615 appCore->getRenderer()->getGLContext()->setRenderPath((GLContext::GLRenderPath)savedRenderPath);
00616 appCore->setDistanceToScreen(savedDistanceToScreen);
00617 appCore->getSimulation()->getActiveObserver()->setLocationFilter(savedLocationFilter);
00618 appCore->getRenderer()->setMinimumFeatureSize(savedMinFeatureSize);
00619 reject();
00620 }
00621
00622 void KdePreferencesDialog::slotApply() {
00623 savedRendererFlags = appCore->getRenderer()->getRenderFlags();
00624 savedLabelMode = appCore->getRenderer()->getLabelMode();
00625 savedAmbientLightLevel = int(appCore->getRenderer()->getAmbientLightLevel() * 100);
00626 savedFaintestVisible = int(appCore->getSimulation()->getFaintestVisible() * 100);
00627 savedHudDetail = appCore->getHudDetail();
00628 savedDisplayLocalTime = appCore->getTimeZoneBias();
00629 savedRenderPath = (int)appCore->getRenderer()->getGLContext()->getRenderPath();
00630 savedDistanceToScreen = appCore->getDistanceToScreen();
00631 savedLocationFilter = appCore->getSimulation()->getActiveObserver()->getLocationFilter();
00632 savedMinFeatureSize = appCore->getRenderer()->getMinimumFeatureSize();
00633
00634 keyChooser->commitChanges();
00635
00636 KGlobal::config()->setGroup("ConfigureDialog");
00637 KGlobal::config()->writeEntry("SetTimeTimeZoneLocal", setTimezoneCombo->currentItem());
00638 KGlobal::config()->setGroup(0);
00639
00640 if (timeHasChanged) {
00641 if (setTimezoneCombo->currentItem() == 0 || YSpin->value() < 1902 || YSpin->value() > 2037) {
00642 astro::Date date(0.0);
00643 date.year=YSpin->value();
00644 date.month=MSpin->value();
00645 date.day=DSpin->value();
00646 date.hour=hSpin->value();
00647 date.minute=mSpin->value();
00648 date.seconds=float(sSpin->value());
00649 appCore->getSimulation()->setTime((double) date);
00650 appCore->getSimulation()->update(0.0);
00651 } else {
00652 struct tm time;
00653 time.tm_year = YSpin->value() - 1900;
00654 time.tm_mon = MSpin->value() - 1;
00655 time.tm_mday = DSpin->value();
00656 time.tm_hour = hSpin->value();
00657 time.tm_min = mSpin->value();
00658 time.tm_sec = sSpin->value();
00659 appCore->getSimulation()->setTime(astro::secondsToJulianDate(mktime(&time)) + (double) astro::Date(1970, 1, 1));
00660 appCore->getSimulation()->update(0.0);
00661 }
00662 }
00663 }
00664
00665 void KdePreferencesDialog::slotTimeHasChanged() {
00666 timeHasChanged = true;
00667 }
00668
00669 void KdePreferencesDialog::slotFaintestVisible(int m) {
00670 char buff[20];
00671
00672 parent->slotFaintestVisible(m / 100.);
00673 sprintf(buff, "%.2f", m / 100.);
00674 faintestLabel->setText(buff);
00675 }
00676
00677 void KdePreferencesDialog::slotMinFeatureSize(int s) {
00678 char buff[20];
00679
00680 parent->slotMinFeatureSize(s);
00681 sprintf(buff, "%d", s);
00682 minFeatureSizeLabel->setText(buff);
00683 }
00684
00685 void KdePreferencesDialog::slotAmbientLightLevel(int l) {
00686 char buff[20];
00687
00688 parent->slotAmbientLightLevel(l / 100.);
00689 sprintf(buff, "%.2f", l / 100.);
00690 ambientLabel->setText(buff);
00691 }
00692
00693 void KdePreferencesDialog::slotRenderPath(int pathIdx) {
00694 int path=0, ipathIdx=0;
00695 while (ipathIdx != pathIdx) {
00696 ipathIdx++;
00697 do {
00698 path++;
00699 } while (!appCore->getRenderer()->getGLContext()->renderPathSupported((GLContext::GLRenderPath)path));
00700 }
00701
00702 appCore->getRenderer()->getGLContext()->setRenderPath((GLContext::GLRenderPath)path);
00703 setRenderPathLabel();
00704 }
00705
00706 void KdePreferencesDialog::slotDistanceToScreen(int dts) {
00707 appCore->setDistanceToScreen(dts * 10);
00708 }
00709
00710 void KdePreferencesDialog::setRenderPathLabel() {
00711 switch(appCore->getRenderer()->getGLContext()->getRenderPath()) {
00712 case GLContext::GLPath_Basic:
00713 renderPathLabel->setText(i18n("<b>Unextended OpenGL 1.1</b>"));
00714 break;
00715 case GLContext::GLPath_Multitexture:
00716 renderPathLabel->setText(i18n("<b>Multiple textures and the ARB_texenv_combine extension</b>"));
00717 break;
00718 case GLContext::GLPath_NvCombiner:
00719 renderPathLabel->setText(i18n("<b>NVIDIA combiners, no vertex programs</b>"));
00720 break;
00721 case GLContext::GLPath_DOT3_ARBVP:
00722 renderPathLabel->setText(i18n("<b>ARB_texenv_DOT3 extension, ARB_vertex_program extension</b>"));
00723 break;
00724 case GLContext::GLPath_NvCombiner_NvVP:
00725 renderPathLabel->setText(i18n("<b>NVIDIA Combiners, NV_vertex_program extension</b><br> "
00726 "provide bump mapping, ring shadows, and specular "
00727 "highlights on any Geforce or ATI Radeon graphics card, though "
00728 "NvCombiner ARBVP is a slightly better option for Geforce users"));
00729 break;
00730 case GLContext::GLPath_NvCombiner_ARBVP:
00731 renderPathLabel->setText(i18n("<b>NVIDIA Combiners, ARB_vertex_program extension</b>"));
00732 break;
00733 case GLContext::GLPath_ARBFP_ARBVP:
00734 renderPathLabel->setText(i18n("<b>ARB_fragment_program and ARB_vertex_program extensions</b><br>"
00735 "provide advanced effects on Geforce FX and Radeon 9700 cards"));
00736 break;
00737 case GLContext::GLPath_NV30:
00738 renderPathLabel->setText(i18n("<b>NV_fragment_program and ARB_vertex_program extensions</b>"));
00739 break;
00740 case GLContext::GLPath_GLSL:
00741 renderPathLabel->setText(i18n("<b>OpenGL 2.0 Shading Language</b>"));
00742 break;
00743 }
00744 }
00745