dialog-eclipse.cpp
来自「celestia源代码」· C++ 代码 · 共 479 行 · 第 1/2 页
CPP
479 行
/* * Celestia GTK+ Front-End * Copyright (C) 2005 Pat Suwalski <pat@suwalski.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * $Id: dialog-eclipse.cpp,v 1.2 2005/12/10 06:34:21 suwalski Exp $ */#include <gtk/gtk.h>#include <celengine/astro.h>#include <celengine/simulation.h>#include <celestia/eclipsefinder.h>#include "dialog-eclipse.h"#include "common.h"/* Definitions: Callbacks */static void calDateSelect(GtkCalendar *calendar, GtkToggleButton *button);static void showCalPopup(GtkToggleButton *button, EclipseData *ed);static gint eclipseGoto(GtkButton*, EclipseData* ed);static gint eclipse2Click(GtkWidget*, GdkEventButton* event, EclipseData* ed);static void eclipseCompute(GtkButton* button, EclipseData* ed);static void eclipseBodySelect(GtkMenuShell* menu, EclipseData* ed);static void eclipseTypeSelect(GtkMenuShell* menu, EclipseData* ed);static void listEclipseSelect(GtkTreeSelection* sel, EclipseData* ed);static void eclipseDestroy(GtkWidget* w, gint, EclipseData* ed);/* Definitions: Helpers */static void setButtonDateString(GtkToggleButton *button, int year, int month, int day);/* ENTRY: Navigation -> Eclipse Finder */void dialogEclipseFinder(AppData* app){ EclipseData* ed = g_new0(EclipseData, 1); selDate* d1 = g_new0(selDate, 1); selDate* d2 = g_new0(selDate, 1); ed->d1 = d1; ed->d2 = d2; ed->app = app; ed->eclipseList = NULL; ed->eclipseListStore = NULL; ed->bSolar = TRUE; sprintf(ed->body, "%s", eclipsePlanetTitles[0]); ed->sel = NULL; ed->window = GTK_DIALOG(gtk_dialog_new_with_buttons("Eclipse Finder", GTK_WINDOW(app->mainWindow), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL)); gtk_window_set_modal(GTK_WINDOW(ed->window), FALSE); GtkWidget *mainbox = gtk_vbox_new(FALSE, CELSPACING); gtk_container_set_border_width(GTK_CONTAINER(mainbox), CELSPACING); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ed->window)->vbox), mainbox, TRUE, TRUE, 0); GtkWidget *scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_box_pack_start(GTK_BOX(mainbox), scrolled_win, TRUE, TRUE, 0); /* Create listbox list. * Six invisible ints at the end to hold actual time. * This will save string parsing like in KDE version. * Last field holds pointer to selected Body. */ ed->eclipseListStore = gtk_list_store_new(12, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_POINTER); ed->eclipseList = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ed->eclipseListStore)); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(ed->eclipseList), TRUE); gtk_container_add(GTK_CONTAINER(scrolled_win), ed->eclipseList); GtkCellRenderer *renderer; GtkTreeViewColumn *column; /* Add the columns */ for (int i=0; i<5; i++) { renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes (eclipseTitles[i], renderer, "text", i, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(ed->eclipseList), column); } /* Set up callback for when an eclipse is selected */ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(ed->eclipseList)); g_signal_connect(selection, "changed", G_CALLBACK(listEclipseSelect), ed); /* From now on, it's the bottom-of-the-window controls */ GtkWidget *label; GtkWidget *hbox; /* -------------------------------- */ hbox = gtk_hbox_new(FALSE, CELSPACING); label = gtk_label_new("Find"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); GtkWidget* menuTypeBox = gtk_option_menu_new(); gtk_box_pack_start(GTK_BOX(hbox), menuTypeBox, FALSE, FALSE, 0); label = gtk_label_new("eclipse on"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); GtkWidget* menuBodyBox = gtk_option_menu_new(); gtk_box_pack_start(GTK_BOX(hbox), menuBodyBox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0); /* -------------------------------- */ hbox = gtk_hbox_new(FALSE, CELSPACING); label = gtk_label_new("From"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); /* Get current date */ astro::Date datenow(app->simulation->getTime()); /* Set current time */ ed->d1->year = datenow.year - 1; ed->d1->month = datenow.month; ed->d1->day = datenow.day; /* Set time a year from now */ ed->d2->year = ed->d1->year + 2; ed->d2->month = ed->d1->month; ed->d2->day = ed->d1->day; GtkWidget* date1Button = gtk_toggle_button_new(); setButtonDateString(GTK_TOGGLE_BUTTON(date1Button), ed->d1->year, ed->d1->month, ed->d1->day); g_object_set_data(G_OBJECT(date1Button), "eclipsedata", ed->d1); gtk_box_pack_start(GTK_BOX(hbox), date1Button, FALSE, FALSE, 0); label = gtk_label_new("to"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); GtkWidget* date2Button = gtk_toggle_button_new(); setButtonDateString(GTK_TOGGLE_BUTTON(date2Button), ed->d2->year, ed->d2->month, ed->d2->day); g_object_set_data(G_OBJECT(date2Button), "eclipsedata", ed->d2); gtk_box_pack_start(GTK_BOX(hbox), date2Button, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0); /* -------------------------------- */ /* Common Buttons */ hbox = gtk_hbox_new(TRUE, CELSPACING); if (buttonMake(hbox, "Compute", (GtkSignalFunc)eclipseCompute, ed)) return; if (buttonMake(hbox, "Set Date and Go to Planet", (GtkSignalFunc)eclipseGoto, ed)) return; gtk_box_pack_start(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0); /* Set up the drop-down boxes */ GtkWidget *item; GtkWidget* menuType = gtk_menu_new(); for (int i = 0; eclipseTypeTitles[i] != NULL; i++) { item = gtk_menu_item_new_with_label(eclipseTypeTitles[i]); gtk_menu_append(GTK_MENU(menuType), item); gtk_widget_show(item); } gtk_option_menu_set_menu(GTK_OPTION_MENU(menuTypeBox), menuType); GtkWidget* menuBody = gtk_menu_new(); for (int i = 0; eclipsePlanetTitles[i] != NULL; i++) { item = gtk_menu_item_new_with_label(eclipsePlanetTitles[i]); gtk_menu_append(GTK_MENU(menuBody), item); gtk_widget_show(item); } gtk_option_menu_set_menu(GTK_OPTION_MENU(menuBodyBox), menuBody); /* Hook up all the signals */ g_signal_connect(GTK_OBJECT(menuType), "selection-done", G_CALLBACK(eclipseTypeSelect), ed); g_signal_connect(GTK_OBJECT(menuBody), "selection-done", G_CALLBACK(eclipseBodySelect), ed); /* Double-click handler */ g_signal_connect(GTK_OBJECT(ed->eclipseList), "button-press-event", G_CALLBACK(eclipse2Click), ed); g_signal_connect(GTK_OBJECT(date1Button), "toggled", G_CALLBACK(showCalPopup), ed); g_signal_connect(GTK_OBJECT(date2Button), "toggled", G_CALLBACK(showCalPopup), ed); g_signal_connect(ed->window, "response", G_CALLBACK(eclipseDestroy), ed); gtk_widget_set_usize(GTK_WIDGET(ed->window), 400, 400); /* Absolute Size, urghhh */ gtk_widget_show_all(GTK_WIDGET(ed->window));}/* CALLBACK: When the GtkCalendar date is selected */static void calDateSelect(GtkCalendar *calendar, GtkToggleButton *button){ /* Set the selected date */ guint year, month, day; gtk_calendar_get_date(calendar, &year, &month, &day); /* A button stores its own date */ selDate* date = (selDate *)g_object_get_data(G_OBJECT(button), "eclipsedata"); date->year = year; date->month = month + 1; date->day = day; /* Update the button text */ setButtonDateString(button, year, month + 1, day); /* Close the calendar window */ gtk_toggle_button_set_active(button, !gtk_toggle_button_get_active(button));}/* CALLBACK: When a button is clicked to show a GtkCalendar */static void showCalPopup(GtkToggleButton *button, EclipseData *ed){ GtkWidget* calwindow = GTK_WIDGET(g_object_get_data(G_OBJECT(button), "calendar")); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) { /* Pushed in */ if (!calwindow) { calwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?