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

OpenGL

开发平台:

Visual C++

  1. /*
  2.  *  Celestia GTK+ Front-End
  3.  *  Copyright (C) 2005 Pat Suwalski <pat@suwalski.net>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  $Id: dialog-goto.cpp,v 1.1 2005-12-06 03:19:35 suwalski Exp $
  11.  */
  12. #include <gtk/gtk.h>
  13. #include <celengine/selection.h>
  14. #include <celengine/simulation.h>
  15. #include <celmath/vecmath.h>
  16. #include "dialog-goto.h"
  17. #include "common.h"
  18. /* Declarations: Callbacks */
  19. static int changeGotoUnits(GtkButton* w, gpointer choice);
  20. static void responseGotoObject(GtkDialog* w, gint response, gotoObjectData* d);
  21. /* Declarations: Helpers */
  22. static gboolean GetEntryFloat(GtkWidget* w, float& f);
  23. static void GotoObject(gotoObjectData* gotoObjectDlg);
  24. /* ENTRY: Navigation->Goto Object */
  25. void dialogGotoObject(AppData* app)
  26. {
  27. gotoObjectData *data = g_new0(gotoObjectData, 1);
  28. data->app = app;
  29. data->dialog = gtk_dialog_new_with_buttons("Goto Object",
  30.                                            GTK_WINDOW(app->mainWindow),
  31.                                            GTK_DIALOG_DESTROY_WITH_PARENT,
  32.                                            "Go To",
  33.                                            GTK_RESPONSE_OK,
  34.                                            GTK_STOCK_CLOSE,
  35.                                            GTK_RESPONSE_CLOSE,
  36.                                            NULL);
  37. data->nameEntry = gtk_entry_new();
  38. data->latEntry = gtk_entry_new();
  39. data->longEntry = gtk_entry_new();
  40. data->distEntry = gtk_entry_new();
  41. if (data->dialog == NULL ||
  42.     data->nameEntry == NULL ||
  43.     data->latEntry == NULL ||
  44.     data->longEntry == NULL ||
  45.     data->distEntry == NULL)
  46. {
  47. /* Potential memory leak here ... */
  48. return;
  49. }
  50. /* Set up the values (from windows cpp file) */
  51. double distance, longitude, latitude;
  52. app->simulation->getSelectionLongLat(distance, longitude, latitude);
  53. /* Display information in format appropriate for object */
  54. if (app->simulation->getSelection().body() != NULL)
  55. {
  56. char temp[20];
  57. distance = distance - (double) app->simulation->getSelection().body()->getRadius();
  58. sprintf(temp, "%.1f", (float)distance);
  59. gtk_entry_set_text(GTK_ENTRY(data->distEntry), temp);
  60. sprintf(temp, "%.5f", (float)longitude);
  61. gtk_entry_set_text(GTK_ENTRY(data->longEntry), temp);
  62. sprintf(temp, "%.5f", (float)latitude);
  63. gtk_entry_set_text(GTK_ENTRY(data->latEntry), temp);
  64. gtk_entry_set_text(GTK_ENTRY(data->nameEntry), (char*) app->simulation->getSelection().body()->getName().c_str());
  65. }
  66. GtkWidget* vbox = gtk_vbox_new(TRUE, CELSPACING);
  67. gtk_container_set_border_width(GTK_CONTAINER(vbox), CELSPACING);
  68. gtk_box_pack_start(GTK_BOX(GTK_DIALOG(data->dialog)->vbox), vbox, TRUE, TRUE, 0);
  69. GtkWidget* align = NULL;
  70. GtkWidget* hbox = NULL;
  71. GtkWidget* label = NULL;
  72. /* Object name label and entry */
  73. align = gtk_alignment_new(1, 0, 0, 0);
  74. hbox = gtk_hbox_new(FALSE, CELSPACING);
  75. label = gtk_label_new("Object name:");
  76. gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
  77. gtk_box_pack_start(GTK_BOX(hbox), data->nameEntry, FALSE, TRUE, 0);
  78. gtk_container_add(GTK_CONTAINER(align), hbox);
  79. gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, TRUE, 0);
  80. /* Latitude and longitude */
  81. align = gtk_alignment_new(1, 0, 0, 0);
  82. hbox = gtk_hbox_new(FALSE, CELSPACING);
  83. label = gtk_label_new("Latitude:");
  84. gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
  85. gtk_box_pack_start(GTK_BOX(hbox), data->latEntry, FALSE, TRUE, 0);
  86. gtk_container_add(GTK_CONTAINER(align), hbox);
  87. gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, TRUE, 0);
  88. align = gtk_alignment_new(1, 0, 0, 0);
  89. hbox = gtk_hbox_new(FALSE, CELSPACING);
  90. label = gtk_label_new("Longitude:");
  91. gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
  92. gtk_box_pack_start(GTK_BOX(hbox), data->longEntry, FALSE, TRUE, 0);
  93. gtk_container_add(GTK_CONTAINER(align), hbox);
  94. gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, TRUE, 0);
  95. /* Distance */
  96. align = gtk_alignment_new(1, 0, 0, 0);
  97. hbox = gtk_hbox_new(FALSE, CELSPACING);
  98. label = gtk_label_new("Distance:");
  99. gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
  100. gtk_box_pack_start(GTK_BOX(hbox), data->distEntry, FALSE, TRUE, 0);
  101. gtk_container_add(GTK_CONTAINER(align), hbox);
  102. gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, TRUE, 0);
  103. /* Distance Options */
  104. data->units = 0;
  105. hbox = gtk_hbox_new(FALSE, CELSPACING);
  106. makeRadioItems(unitLabels, hbox, GTK_SIGNAL_FUNC(changeGotoUnits), NULL, data);
  107. gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
  108. g_signal_connect(data->dialog, "response",
  109.                  G_CALLBACK(responseGotoObject), data);
  110. gtk_widget_show_all(data->dialog);
  111. }
  112. /* CALLBACK: for km|radii|au in Goto Object dialog */
  113. static int changeGotoUnits(GtkButton* w, gpointer choice)
  114. {
  115. gotoObjectData* data = (gotoObjectData *)g_object_get_data(G_OBJECT(w), "data");
  116. gint selection = GPOINTER_TO_INT(choice);
  117. data->units = selection;
  118. return TRUE;
  119. }
  120. /* CALLBACK: response from this dialog.
  121.  * Need this because gtk_dialog_run produces a modal window. */
  122. static void responseGotoObject(GtkDialog* w, gint response, gotoObjectData* d)
  123. {
  124. switch (response) {
  125. case GTK_RESPONSE_OK:
  126. GotoObject(d);
  127. break;
  128. case GTK_RESPONSE_CLOSE:
  129. gtk_widget_destroy(GTK_WIDGET(w));
  130. g_free(d);
  131. }
  132. }
  133. /* HELPER: Get the float value from one of the GtkEntrys */
  134. static gboolean GetEntryFloat(GtkWidget* w, float& f)
  135. {
  136. GtkEntry* entry = GTK_ENTRY(w);
  137. bool tmp;
  138. if (entry == NULL)
  139. return false;
  140. gchar* text = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
  141. f = 0.0;
  142. if (text == NULL)
  143. return false;
  144. tmp = sscanf(text, " %f", &f) == 1;
  145. g_free(text);
  146. return tmp;
  147. }
  148. /* HELPER: Goes to the object specified by gotoObjectData */
  149. static void GotoObject(gotoObjectData* gotoObjectDlg)
  150. {
  151. const gchar* objectName = gtk_entry_get_text(GTK_ENTRY(gotoObjectDlg->nameEntry));
  152. if (objectName != NULL)
  153. {
  154. Simulation* simulation = gotoObjectDlg->app->simulation;
  155. Selection sel = simulation->findObjectFromPath(objectName);
  156. if (!sel.empty())
  157. {
  158. simulation->setSelection(sel);
  159. simulation->follow();
  160. float distance = (float) (sel.radius() * 5.0f);
  161. if (GetEntryFloat(gotoObjectDlg->distEntry, distance))
  162. {
  163. /* Adjust for km (0), radii (1), au (2) */
  164. if (gotoObjectDlg->units == 2)
  165. distance = astro::AUtoKilometers(distance);
  166. else if (gotoObjectDlg->units == 1)
  167. distance = distance * (float) sel.radius();
  168. distance += (float) sel.radius();
  169. }
  170. distance = astro::kilometersToLightYears(distance);
  171. float longitude, latitude;
  172. if (GetEntryFloat(gotoObjectDlg->latEntry, latitude) &&
  173.     GetEntryFloat(gotoObjectDlg->longEntry, longitude))
  174. {
  175. simulation->gotoSelectionLongLat(5.0,
  176.                                  distance,
  177.                                  degToRad(longitude),
  178.                                  degToRad(latitude),
  179.                                  Vec3f(0, 1, 0));
  180. }
  181. else
  182. {
  183. simulation->gotoSelection(5.0,
  184.                           distance,
  185.                           Vec3f(0, 1, 0),
  186.                           ObserverFrame::ObserverLocal);
  187. }
  188. }
  189. }
  190. }