Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

dialog-solar.cpp File Reference

#include <gtk/gtk.h>
#include <celengine/body.h>
#include <celengine/selection.h>
#include <celengine/simulation.h>
#include <celengine/solarsys.h>
#include <celengine/star.h>
#include <celengine/stardb.h>
#include "dialog-solar.h"
#include "actions.h"
#include "common.h"

Include dependency graph for dialog-solar.cpp:

Go to the source code of this file.

Functions

static void addPlanetarySystemToTree (const PlanetarySystem *sys, GtkTreeStore *solarTreeStore, GtkTreeIter *parent)
void dialogSolarBrowser (AppData *app)
static void loadNearestStarSystem (AppData *data, GtkWidget *solarTree, GtkTreeStore *solarTreeStore)
static void treeSolarSelect (GtkTreeSelection *sel, AppData *app)


Function Documentation

static void addPlanetarySystemToTree const PlanetarySystem sys,
GtkTreeStore *  solarTreeStore,
GtkTreeIter *  parent
[static]
 

Definition at line 134 of file dialog-solar.cpp.

References Body::getClassification(), Body::getName(), and Body::getSatellites().

Referenced by loadNearestStarSystem().

00135 {
00136         const char *name;
00137         const char *type;
00138         
00139         Body* world;
00140         const PlanetarySystem* satellites;
00141         GtkTreeIter child;
00142         
00143         for (int i = 0; i < sys->getSystemSize(); i++)
00144         {
00145                 world = sys->getBody(i);
00146                 name = g_strdup(world->getName().c_str());
00147                 
00148                 switch(world->getClassification())
00149                 {
00150                         case Body::Planet:
00151                                 type = "Planet";
00152                                 break;
00153                         case Body::Moon:
00154                                 type = "Moon";
00155                                 break;
00156                         case Body::Asteroid:
00157                                 type = "Asteroid";
00158                                 break;
00159                         case Body::Comet:
00160                                 type = "Comet";
00161                                 break;
00162                         case Body::Spacecraft:
00163                                 type = "Spacecraft";
00164                                 break;
00165                         case Body::Unknown:
00166                         default:
00167                                 type = "-";
00168                                 break;
00169                 }
00170 
00171                 satellites = world->getSatellites();
00172 
00173                 /* Add child */
00174                 gtk_tree_store_append(solarTreeStore, &child, parent);
00175                 gtk_tree_store_set(solarTreeStore, &child,
00176                                    0, name,
00177                                    1, type,
00178                                    2, (gpointer)world,
00179                                    3, Selection::Type_Body, /* not Star */
00180                                    -1);
00181 
00182                 /* Recurse */
00183                 if (satellites != NULL)
00184                         addPlanetarySystemToTree(satellites, solarTreeStore, &child);
00185         }
00186 }

void dialogSolarBrowser AppData app  ) 
 

Definition at line 39 of file dialog-solar.cpp.

References actionCenterSelection(), actionGotoSelection(), buttonMake(), CELSPACING, loadNearestStarSystem(), and treeSolarSelect().

Referenced by actionSystemBrowser().

00040 {
00041         GtkWidget *solarTree = NULL;
00042         GtkTreeStore *solarTreeStore = NULL;
00043         
00044         GtkWidget *browser = gtk_dialog_new_with_buttons("Solar System Browser",
00045                                                          GTK_WINDOW(app->mainWindow),
00046                                                          GTK_DIALOG_DESTROY_WITH_PARENT,
00047                                                          GTK_STOCK_CLOSE,
00048                                                          GTK_RESPONSE_CLOSE,
00049                                                          NULL);
00050         app->simulation->setSelection(Selection((Star *) NULL));
00051  
00052         /* Solar System Browser */
00053         GtkWidget *mainbox = gtk_vbox_new(FALSE, CELSPACING);
00054         gtk_container_set_border_width(GTK_CONTAINER(mainbox), CELSPACING);
00055         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(browser)->vbox), mainbox, TRUE, TRUE, 0);
00056         
00057         GtkWidget *scrolled_win = gtk_scrolled_window_new (NULL, NULL);
00058 
00059         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
00060                                         GTK_POLICY_AUTOMATIC,
00061                                         GTK_POLICY_ALWAYS);
00062         gtk_box_pack_start(GTK_BOX(mainbox), scrolled_win, TRUE, TRUE, 0);
00063 
00064         /* Set the tree store to have 2 visible cols, two hidden. The hidden ones
00065          * store pointer to the row's object and its Selection::Type. */
00066         solarTreeStore = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_INT);
00067         solarTree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(solarTreeStore));
00068 
00069         gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(solarTree), TRUE);
00070         gtk_container_add(GTK_CONTAINER(scrolled_win), solarTree);
00071 
00072         GtkCellRenderer *renderer;
00073         GtkTreeViewColumn *column;
00074 
00075         for (int i = 0; i < 2; i++) {
00076                 renderer = gtk_cell_renderer_text_new();
00077                 column = gtk_tree_view_column_new_with_attributes (ssTitles[i], renderer, "text", i, NULL);
00078                 gtk_tree_view_append_column(GTK_TREE_VIEW(solarTree), column);
00079                 gtk_tree_view_column_set_min_width(column, 200);
00080         }
00081                                                                                                                                                                                          
00082         loadNearestStarSystem(app, solarTree, solarTreeStore);
00083 
00084         GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(solarTree));
00085         g_signal_connect(selection, "changed", G_CALLBACK(treeSolarSelect), app);
00086 
00087         /* Common Buttons */
00088         GtkWidget *hbox = gtk_hbox_new(TRUE, CELSPACING);
00089         if (buttonMake(hbox, "Center", (GtkSignalFunc)actionCenterSelection, app))
00090                 return;
00091         if (buttonMake(hbox, "Go To", (GtkSignalFunc)actionGotoSelection, app))
00092                 return;
00093         gtk_box_pack_start(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0);
00094         
00095         g_signal_connect(browser, "response", G_CALLBACK(gtk_widget_destroy), browser);
00096 
00097         gtk_widget_set_usize(browser, 500, 400); /* Absolute Size, urghhh */
00098         gtk_widget_show_all(browser);
00099 }

static void loadNearestStarSystem AppData data,
GtkWidget *  solarTree,
GtkTreeStore *  solarTreeStore
[static]
 

Definition at line 191 of file dialog-solar.cpp.

References addPlanetarySystemToTree(), SolarSystem::getPlanets(), Star::getSpectralType(), SolarSystem::getStar(), and StarDatabase::getStarName().

Referenced by dialogSolarBrowser().

00192 {
00193         const char* name;
00194         char type[30];
00195         
00196         const Star* nearestStar;
00197         
00198         const SolarSystem* solarSys = app->simulation->getNearestSolarSystem();
00199         StarDatabase *stardb = app->simulation->getUniverse()->getStarCatalog();
00200         g_assert(stardb);
00201 
00202         GtkTreeIter top;
00203         gtk_tree_store_clear(solarTreeStore);
00204         gtk_tree_store_append(solarTreeStore, &top, NULL);
00205 
00206         if (solarSys != NULL)
00207         {
00208                 nearestStar = solarSys->getStar();
00209 
00210                 name = g_strdup(stardb->getStarName(*nearestStar).c_str());
00211 
00212                 sprintf(type, "%s Star", nearestStar->getSpectralType());
00213         
00214                 /* Set up the top-level node. */
00215                 gtk_tree_store_set(solarTreeStore, &top,
00216                                    0, name,
00217                                    1, &type,
00218                                    2, (gpointer)nearestStar,
00219                                    3, Selection::Type_Star, /* Is Star */
00220                                    -1);
00221 
00222                 const PlanetarySystem* planets = solarSys->getPlanets();
00223                 if (planets != NULL)
00224                         addPlanetarySystemToTree(planets, solarTreeStore, &top);
00225 
00226                 /* Open up the top node */
00227                 GtkTreePath* path = gtk_tree_model_get_path(GTK_TREE_MODEL(solarTreeStore), &top);
00228                 gtk_tree_view_expand_row(GTK_TREE_VIEW(solarTree), path, FALSE);
00229         }
00230         else
00231                 gtk_tree_store_set(solarTreeStore, &top, 0, "No Planetary Bodies", -1);
00232 }

static void treeSolarSelect GtkTreeSelection *  sel,
AppData app
[static]
 

Definition at line 103 of file dialog-solar.cpp.

Referenced by dialogSolarBrowser().

00104 {
00105         gpointer item;
00106         gint type;
00107         
00108         GValue value = { 0, 0 }; /* Initialize empty GValue */
00109         GtkTreeIter iter;
00110         GtkTreeModel* model;
00111         
00112         gtk_tree_selection_get_selected(sel, &model, &iter);
00113 
00114         /* Retrieve the item (Body/Star) */
00115         gtk_tree_model_get_value(model, &iter, 2, &value);
00116         item = g_value_get_pointer(&value);
00117         g_value_unset(&value);
00118         
00119         /* Retrieve if isStar */
00120         gtk_tree_model_get_value(model, &iter, 3, &value);
00121         type = g_value_get_int(&value);
00122         g_value_unset(&value);
00123         
00124         if (type == Selection::Type_Star)
00125                 app->simulation->setSelection(Selection((Star *)item));
00126         else if (type == Selection::Type_Body)
00127                 app->simulation->setSelection(Selection((Body *)item));
00128         else
00129                 g_warning("Unexpected selection type selected.");
00130 }


Generated on Sat Jan 14 22:31:52 2006 for Celestia by  doxygen 1.4.1