00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <gtk/gtk.h>
00014 #include <gconf/gconf-client.h>
00015
00016 #include <celengine/body.h>
00017 #include <celengine/galaxy.h>
00018 #include <celengine/render.h>
00019
00020 #include "settings-gconf.h"
00021 #include "common.h"
00022
00023
00024
00025 static void confLabels(GConfClient*, guint, GConfEntry*, AppData* app);
00026 static void confRender(GConfClient*, guint, GConfEntry*, AppData* app);
00027 static void confOrbits(GConfClient*, guint, GConfEntry*, AppData* app);
00028 static void confWinWidth(GConfClient*, guint, GConfEntry* e, AppData* app);
00029 static void confWinHeight(GConfClient*, guint, GConfEntry* e, AppData* app);
00030 static void confWinX(GConfClient*, guint, GConfEntry* e, AppData* app);
00031 static void confWinY(GConfClient*, guint, GConfEntry* e, AppData* app);
00032 static void confAmbientLight(GConfClient*, guint, GConfEntry* e, AppData* app);
00033 static void confVisualMagnitude(GConfClient*, guint, GConfEntry* e, AppData* app);
00034 static void confGalaxyLightGain(GConfClient*, guint, GConfEntry* e, AppData*);
00035 static void confShowLocalTime(GConfClient*, guint, GConfEntry* e, AppData* app);
00036 static void confVerbosity(GConfClient*, guint, GConfEntry* e, AppData* app);
00037 static void confFullScreen(GConfClient*, guint, GConfEntry* e, AppData* app);
00038 static void confStarStyle(GConfClient*, guint, GConfEntry* e, AppData* app);
00039 static void confAltSurfaceName(GConfClient*, guint, GConfEntry* e, AppData* app);
00040
00041
00042 static int readGConfRender(GConfClient* client);
00043 static int readGConfOrbits(GConfClient* client);
00044 static int readGConfLabels(GConfClient* client);
00045 static void gcSetFlag(int type, const char* name, gboolean value, GConfClient* client);
00046
00047
00048
00049 void initSettingsGConf(AppData* app)
00050 {
00051 app->client = gconf_client_get_default();
00052 gconf_client_add_dir(app->client, "/apps/celestia", GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);
00053 }
00054
00055
00056
00057 void initSettingsGConfNotifiers(AppData* app)
00058 {
00059
00060 gconf_client_notify_add (app->client, "/apps/celestia/labels", (GConfClientNotifyFunc)confLabels, app, NULL, NULL);
00061 gconf_client_notify_add (app->client, "/apps/celestia/render", (GConfClientNotifyFunc)confRender, app, NULL, NULL);
00062 gconf_client_notify_add (app->client, "/apps/celestia/orbits", (GConfClientNotifyFunc)confOrbits, app, NULL, NULL);
00063 gconf_client_notify_add (app->client, "/apps/celestia/winWidth", (GConfClientNotifyFunc)confWinWidth, app, NULL, NULL);
00064 gconf_client_notify_add (app->client, "/apps/celestia/winHeight", (GConfClientNotifyFunc)confWinHeight, app, NULL, NULL);
00065 gconf_client_notify_add (app->client, "/apps/celestia/winX", (GConfClientNotifyFunc)confWinX, app, NULL, NULL);
00066 gconf_client_notify_add (app->client, "/apps/celestia/winY", (GConfClientNotifyFunc)confWinY, app, NULL, NULL);
00067 gconf_client_notify_add (app->client, "/apps/celestia/ambientLight", (GConfClientNotifyFunc)confAmbientLight, app, NULL, NULL);
00068 gconf_client_notify_add (app->client, "/apps/celestia/visualMagnitude", (GConfClientNotifyFunc)confVisualMagnitude, app, NULL, NULL);
00069 gconf_client_notify_add (app->client, "/apps/celestia/galaxyLightGain", (GConfClientNotifyFunc)confGalaxyLightGain, app, NULL, NULL);
00070 gconf_client_notify_add (app->client, "/apps/celestia/showLocalTime", (GConfClientNotifyFunc)confShowLocalTime, app, NULL, NULL);
00071 gconf_client_notify_add (app->client, "/apps/celestia/verbosity", (GConfClientNotifyFunc)confVerbosity, app, NULL, NULL);
00072 gconf_client_notify_add (app->client, "/apps/celestia/fullScreen", (GConfClientNotifyFunc)confFullScreen, app, NULL, NULL);
00073 gconf_client_notify_add (app->client, "/apps/celestia/starStyle", (GConfClientNotifyFunc)confStarStyle, app, NULL, NULL);
00074 gconf_client_notify_add (app->client, "/apps/celestia/altSurfaceName", (GConfClientNotifyFunc)confAltSurfaceName, app, NULL, NULL);
00075 }
00076
00077
00078
00079 void applySettingsGConfPre(AppData* app, GConfClient* client)
00080 {
00081 int sizeX, sizeY, positionX, positionY;
00082
00083
00084 sizeX = gconf_client_get_int(client, "/apps/celestia/winWidth", NULL);
00085 sizeY = gconf_client_get_int(client, "/apps/celestia/winHeight", NULL);
00086 positionX = gconf_client_get_int(client, "/apps/celestia/winX", NULL);
00087 positionY = gconf_client_get_int(client, "/apps/celestia/winY", NULL);
00088 app->fullScreen = gconf_client_get_bool(client, "/apps/celestia/fullScreen", NULL);
00089
00090 setSaneWinSize(app, sizeX, sizeY);
00091 setSaneWinPosition(app, positionX, positionY);
00092 }
00093
00094
00095
00096 void applySettingsGConfMain(AppData* app, GConfClient* client)
00097 {
00098 int rf, om, lm;
00099
00100
00101 setSaneAmbientLight(app, gconf_client_get_float(client, "/apps/celestia/ambientLight", NULL));
00102 setSaneVisualMagnitude(app, gconf_client_get_float(client, "/apps/celestia/visualMagnitude", NULL));
00103 setSaneGalaxyLightGain(gconf_client_get_float(client, "/apps/celestia/galaxyLightGain", NULL));
00104 setSaneVerbosity(app, gconf_client_get_int(client, "/apps/celestia/verbosity", NULL));
00105 setSaneStarStyle(app, (Renderer::StarStyle)gconf_client_get_int(client, "/apps/celestia/starStyle", NULL));
00106 setSaneAltSurface(app, gconf_client_get_string(client, "/apps/celestia/altSurfaceName", NULL));
00107
00108 app->showLocalTime = gconf_client_get_bool(client, "/apps/celestia/showLocalTime", NULL);
00109
00110
00111 rf = readGConfRender(app->client);
00112 app->renderer->setRenderFlags(rf);
00113
00114
00115 om = readGConfOrbits(app->client);
00116 app->renderer->setOrbitMask(om);
00117
00118
00119 lm = readGConfLabels(app->client);
00120 app->renderer->setLabelMode(lm);
00121 }
00122
00123
00124
00125 void saveSettingsGConf(AppData* app)
00126 {
00127
00128 gconf_client_set_int(app->client, "/apps/celestia/winX", getWinX(app), NULL);
00129 gconf_client_set_int(app->client, "/apps/celestia/winY", getWinY(app), NULL);
00130
00131
00132 gconf_client_set_int(app->client, "/apps/celestia/winWidth", getWinWidth(app), NULL);
00133 gconf_client_set_int(app->client, "/apps/celestia/winHeight", getWinHeight(app), NULL);
00134
00135 g_object_unref (G_OBJECT (app->client));
00136 }
00137
00138
00139
00140 void gcSetRenderFlag(int flag, gboolean state, GConfClient* client)
00141 {
00142 switch (flag)
00143 {
00144 case Renderer::ShowStars: gcSetFlag(Render, "stars", state, client); break;
00145 case Renderer::ShowPlanets: gcSetFlag(Render, "planets", state, client); break;
00146 case Renderer::ShowGalaxies: gcSetFlag(Render, "galaxies", state, client); break;
00147 case Renderer::ShowDiagrams: gcSetFlag(Render, "diagrams", state, client); break;
00148 case Renderer::ShowCloudMaps: gcSetFlag(Render, "cloudMaps", state, client); break;
00149 case Renderer::ShowOrbits: gcSetFlag(Render, "orbits", state, client); break;
00150 case Renderer::ShowCelestialSphere: gcSetFlag(Render, "celestialSphere", state, client); break;
00151 case Renderer::ShowNightMaps: gcSetFlag(Render, "nightMaps", state, client); break;
00152 case Renderer::ShowAtmospheres: gcSetFlag(Render, "atmospheres", state, client); break;
00153 case Renderer::ShowSmoothLines: gcSetFlag(Render, "smoothLines", state, client); break;
00154 case Renderer::ShowEclipseShadows: gcSetFlag(Render, "eclipseShadows", state, client); break;
00155 case Renderer::ShowRingShadows: gcSetFlag(Render, "ringShadows", state, client); break;
00156 case Renderer::ShowBoundaries: gcSetFlag(Render, "boundaries", state, client); break;
00157 case Renderer::ShowAutoMag: gcSetFlag(Render, "autoMag", state, client); break;
00158 case Renderer::ShowCometTails: gcSetFlag(Render, "cometTails", state, client); break;
00159 case Renderer::ShowMarkers: gcSetFlag(Render, "markers", state, client); break;
00160 case Renderer::ShowPartialTrajectories: gcSetFlag(Render, "partialTrajectories", state, client); break;
00161 case Renderer::ShowNebulae: gcSetFlag(Render, "nebulae", state, client); break;
00162 case Renderer::ShowOpenClusters: gcSetFlag(Render, "openClusters", state, client); break;
00163 }
00164 }
00165
00166
00167
00168 void gcSetOrbitMask(int flag, gboolean state, GConfClient* client)
00169 {
00170 switch (flag)
00171 {
00172 case Body::Planet: gcSetFlag(Orbit, "planet", state, client); break;
00173 case Body::Moon: gcSetFlag(Orbit, "moon", state, client); break;
00174 case Body::Asteroid: gcSetFlag(Orbit, "asteroid", state, client); break;
00175 case Body::Spacecraft: gcSetFlag(Orbit, "spacecraft", state, client); break;
00176 case Body::Comet: gcSetFlag(Orbit, "comet", state, client); break;
00177 case Body::Invisible: gcSetFlag(Orbit, "invisible", state, client); break;
00178 case Body::Unknown: gcSetFlag(Orbit, "unknown", state, client); break;
00179 }
00180 }
00181
00182
00183
00184 void gcSetLabelMode(int flag, gboolean state, GConfClient* client)
00185 {
00186 switch (flag)
00187 {
00188 case Renderer::StarLabels: gcSetFlag(Label, "star", state, client); break;
00189 case Renderer::PlanetLabels: gcSetFlag(Label, "planet", state, client); break;
00190 case Renderer::MoonLabels: gcSetFlag(Label, "moon", state, client); break;
00191 case Renderer::ConstellationLabels: gcSetFlag(Label, "constellation", state, client); break;
00192 case Renderer::GalaxyLabels: gcSetFlag(Label, "galaxy", state, client); break;
00193 case Renderer::AsteroidLabels: gcSetFlag(Label, "asteroid", state, client); break;
00194 case Renderer::SpacecraftLabels: gcSetFlag(Label, "spacecraft", state, client); break;
00195 case Renderer::LocationLabels: gcSetFlag(Label, "location", state, client); break;
00196 case Renderer::CometLabels: gcSetFlag(Label, "comet", state, client); break;
00197 case Renderer::NebulaLabels: gcSetFlag(Label, "nebula", state, client); break;
00198 case Renderer::OpenClusterLabels: gcSetFlag(Label, "openCluster", state, client); break;
00199 case Renderer::I18nConstellationLabels: gcSetFlag(Label, "i18n", state, client); break;
00200 }
00201 }
00202
00203
00204
00205 static void confLabels(GConfClient*, guint, GConfEntry*, AppData* app)
00206 {
00207 int oldLabels = app->renderer->getLabelMode();
00208
00209
00210 int newLabels = readGConfLabels(app->client);
00211
00212
00213 if (newLabels != oldLabels)
00214 app->renderer->setLabelMode(newLabels);
00215 }
00216
00217
00218
00219 static void confRender(GConfClient*, guint, GConfEntry*, AppData* app)
00220 {
00221 int oldRender = app->renderer->getRenderFlags();
00222
00223
00224 int newRender = readGConfRender(app->client);
00225
00226
00227 if (newRender != oldRender)
00228 app->renderer->setRenderFlags(newRender);
00229 }
00230
00231
00232
00233 static void confOrbits(GConfClient*, guint, GConfEntry*, AppData* app)
00234 {
00235 int oldOrbit = app->renderer->getOrbitMask();
00236
00237
00238 int newOrbit = readGConfOrbits(app->client);
00239
00240
00241 if (newOrbit != oldOrbit)
00242 app->renderer->setOrbitMask(newOrbit);
00243 }
00244
00245
00246
00247 static void confWinWidth(GConfClient*, guint, GConfEntry* e, AppData* app)
00248 {
00249 int w = gconf_value_get_int(e->value);
00250
00251 if (w != getWinWidth(app))
00252 setSaneWinSize(app, w, getWinHeight(app));
00253 }
00254
00255
00256
00257 static void confWinHeight(GConfClient*, guint, GConfEntry* e, AppData* app)
00258 {
00259 int h = gconf_value_get_int(e->value);
00260
00261 if (h != getWinHeight(app))
00262 setSaneWinSize(app, getWinWidth(app), h);
00263 }
00264
00265
00266
00267 static void confWinX(GConfClient*, guint, GConfEntry* e, AppData* app)
00268 {
00269 int x = gconf_value_get_int(e->value);
00270
00271 if (x != getWinX(app))
00272 setSaneWinPosition(app, x, getWinY(app));
00273 }
00274
00275
00276
00277 static void confWinY(GConfClient*, guint, GConfEntry* e, AppData* app)
00278 {
00279 int y = gconf_value_get_int(e->value);
00280
00281 if (y != getWinY(app))
00282 setSaneWinPosition(app, getWinX(app), y);
00283 }
00284
00285
00286
00287 static void confAmbientLight(GConfClient*, guint, GConfEntry* e, AppData* app)
00288 {
00289 float value = gconf_value_get_float(e->value);
00290
00291
00292 if (abs(value - app->renderer->getAmbientLightLevel()) < 0.001)
00293 return;
00294
00295 setSaneAmbientLight(app, value);
00296 }
00297
00298
00299
00300 static void confVisualMagnitude(GConfClient*, guint, GConfEntry* e, AppData* app)
00301 {
00302 float value = gconf_value_get_float(e->value);
00303
00304 if (abs(value - app->simulation->getFaintestVisible()) < 0.001)
00305 return;
00306
00307 setSaneVisualMagnitude(app, value);
00308 }
00309
00310
00311
00312 static void confGalaxyLightGain(GConfClient*, guint, GConfEntry* e, AppData*)
00313 {
00314 float value = gconf_value_get_float(e->value);
00315
00316 if (abs(value - Galaxy::getLightGain()) < 0.001)
00317 return;
00318
00319 setSaneGalaxyLightGain(value);
00320 }
00321
00322
00323
00324 static void confShowLocalTime(GConfClient*, guint, GConfEntry* e, AppData* app)
00325 {
00326 gboolean value = gconf_value_get_bool(e->value);
00327
00328 if (value == app->showLocalTime)
00329 return;
00330
00331 app->showLocalTime = value;
00332 updateTimeZone(app, app->showLocalTime);
00333 }
00334
00335
00336
00337 static void confVerbosity(GConfClient*, guint, GConfEntry* e, AppData* app)
00338 {
00339 int value = gconf_value_get_int(e->value);
00340
00341 if (value == app->core->getHudDetail())
00342 return;
00343
00344 setSaneVerbosity(app, value);
00345 }
00346
00347
00348
00349 static void confFullScreen(GConfClient*, guint, GConfEntry* e, AppData* app)
00350 {
00351 gboolean value = gconf_value_get_bool(e->value);
00352
00353
00354 if (value == app->fullScreen)
00355 return;
00356
00357
00358
00359 app->fullScreen = !value;
00360
00361
00362 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(gtk_action_group_get_action(app->agMain, "FullScreen")), value);
00363 }
00364
00365
00366
00367 static void confStarStyle(GConfClient*, guint, GConfEntry* e, AppData* app)
00368 {
00369 int value = gconf_value_get_int(e->value);
00370
00371 if (value == app->renderer->getStarStyle())
00372 return;
00373
00374 setSaneStarStyle(app, (Renderer::StarStyle)value);
00375 }
00376
00377
00378
00379 static void confAltSurfaceName(GConfClient*, guint, GConfEntry* e, AppData* app)
00380 {
00381 const char* value = gconf_value_get_string(e->value);
00382
00383 if (string(value) == app->simulation->getActiveObserver()->getDisplayedSurface())
00384 return;
00385
00386 setSaneAltSurface(app, (char*)value);
00387 }
00388
00389
00390
00391 static int readGConfRender(GConfClient* client)
00392 {
00393 int rf = Renderer::ShowNothing;
00394 rf |= Renderer::ShowStars * gconf_client_get_bool(client, "/apps/celestia/render/stars", NULL);
00395 rf |= Renderer::ShowPlanets * gconf_client_get_bool(client, "/apps/celestia/render/planets", NULL);
00396 rf |= Renderer::ShowGalaxies * gconf_client_get_bool(client, "/apps/celestia/render/galaxies", NULL);
00397 rf |= Renderer::ShowDiagrams * gconf_client_get_bool(client, "/apps/celestia/render/diagrams", NULL);
00398 rf |= Renderer::ShowCloudMaps * gconf_client_get_bool(client, "/apps/celestia/render/cloudMaps", NULL);
00399 rf |= Renderer::ShowOrbits * gconf_client_get_bool(client, "/apps/celestia/render/orbits", NULL);
00400 rf |= Renderer::ShowCelestialSphere * gconf_client_get_bool(client, "/apps/celestia/render/celestialSphere", NULL);
00401 rf |= Renderer::ShowNightMaps * gconf_client_get_bool(client, "/apps/celestia/render/nightMaps", NULL);
00402 rf |= Renderer::ShowAtmospheres * gconf_client_get_bool(client, "/apps/celestia/render/atmospheres", NULL);
00403 rf |= Renderer::ShowSmoothLines * gconf_client_get_bool(client, "/apps/celestia/render/smoothLines", NULL);
00404 rf |= Renderer::ShowEclipseShadows * gconf_client_get_bool(client, "/apps/celestia/render/eclipseShadows", NULL);
00405 rf |= Renderer::ShowRingShadows * gconf_client_get_bool(client, "/apps/celestia/render/ringShadows", NULL);
00406 rf |= Renderer::ShowBoundaries * gconf_client_get_bool(client, "/apps/celestia/render/boundaries", NULL);
00407 rf |= Renderer::ShowAutoMag * gconf_client_get_bool(client, "/apps/celestia/render/autoMag", NULL);
00408 rf |= Renderer::ShowCometTails * gconf_client_get_bool(client, "/apps/celestia/render/cometTails", NULL);
00409 rf |= Renderer::ShowMarkers * gconf_client_get_bool(client, "/apps/celestia/render/markers", NULL);
00410 rf |= Renderer::ShowPartialTrajectories * gconf_client_get_bool(client, "/apps/celestia/render/partialTrajectories", NULL);
00411 rf |= Renderer::ShowNebulae * gconf_client_get_bool(client, "/apps/celestia/render/nebulae", NULL);
00412 rf |= Renderer::ShowOpenClusters * gconf_client_get_bool(client, "/apps/celestia/render/openClusters", NULL);
00413
00414 return rf;
00415 }
00416
00417
00418
00419 static int readGConfOrbits(GConfClient* client)
00420 {
00421 int om = 0;
00422 om |= Body::Planet * gconf_client_get_bool(client, "/apps/celestia/orbits/planet", NULL);
00423 om |= Body::Moon * gconf_client_get_bool(client, "/apps/celestia/orbits/moon", NULL);
00424 om |= Body::Asteroid * gconf_client_get_bool(client, "/apps/celestia/orbits/asteroid", NULL);
00425 om |= Body::Comet * gconf_client_get_bool(client, "/apps/celestia/orbits/comet", NULL);
00426 om |= Body::Spacecraft * gconf_client_get_bool(client, "/apps/celestia/orbits/spacecraft", NULL);
00427 om |= Body::Invisible * gconf_client_get_bool(client, "/apps/celestia/orbits/invisible", NULL);
00428 om |= Body::Unknown * gconf_client_get_bool(client, "/apps/celestia/orbits/unknown", NULL);
00429
00430 return om;
00431 }
00432
00433
00434
00435 static int readGConfLabels(GConfClient* client)
00436 {
00437 int lm = Renderer::NoLabels;
00438 lm |= Renderer::StarLabels * gconf_client_get_bool(client, "/apps/celestia/labels/star", NULL);
00439 lm |= Renderer::PlanetLabels * gconf_client_get_bool(client, "/apps/celestia/labels/planet", NULL);
00440 lm |= Renderer::MoonLabels * gconf_client_get_bool(client, "/apps/celestia/labels/moon", NULL);
00441 lm |= Renderer::ConstellationLabels * gconf_client_get_bool(client, "/apps/celestia/labels/constellation", NULL);
00442 lm |= Renderer::GalaxyLabels * gconf_client_get_bool(client, "/apps/celestia/labels/galaxy", NULL);
00443 lm |= Renderer::AsteroidLabels * gconf_client_get_bool(client, "/apps/celestia/labels/asteroid", NULL);
00444 lm |= Renderer::SpacecraftLabels * gconf_client_get_bool(client, "/apps/celestia/labels/spacecraft", NULL);
00445 lm |= Renderer::LocationLabels * gconf_client_get_bool(client, "/apps/celestia/labels/location", NULL);
00446 lm |= Renderer::CometLabels * gconf_client_get_bool(client, "/apps/celestia/labels/comet", NULL);
00447 lm |= Renderer::NebulaLabels * gconf_client_get_bool(client, "/apps/celestia/labels/nebula", NULL);
00448 lm |= Renderer::OpenClusterLabels * gconf_client_get_bool(client, "/apps/celestia/labels/openCluster", NULL);
00449 lm |= Renderer::I18nConstellationLabels * gconf_client_get_bool(client, "/apps/celestia/labels/i18n", NULL);
00450
00451 return lm;
00452 }
00453
00454
00455
00456 static void gcSetFlag(int type, const char* name, gboolean value, GConfClient* client)
00457 {
00458 gchar key[60];
00459 switch (type)
00460 {
00461 case Render: sprintf(key, "%s%s", "/apps/celestia/render/", name); break;
00462 case Orbit: sprintf(key, "%s%s", "/apps/celestia/orbits/", name); break;
00463 case Label: sprintf(key, "%s%s", "/apps/celestia/labels/", name); break;
00464 }
00465
00466 gconf_client_set_bool(client, key, value, NULL);
00467 }