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 + -
显示快捷键?