dialog-tour.cpp

来自「celestia源代码」· C++ 代码 · 共 171 行

CPP
171
字号
/* *  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-tour.cpp,v 1.1 2005/12/06 03:19:35 suwalski Exp $ */#include <glib.h>#include <gtk/gtk.h>#include <celestia/destination.h>#include <celmath/vecmath.h>#include "dialog-tour.h"#include "common.h"/* Declarations: Callbacks */static gint TourGuideSelect(GtkWidget* w, TourData* td);static gint TourGuideGoto(GtkWidget*, TourData* td);static void TourGuideDestroy(GtkWidget* w, gint, TourData* td);/* ENTRY: Navigation->Tour Guide... */void dialogTourGuide(AppData* app){	TourData* td = g_new0(TourData, 1);	td->app = app;	GtkWidget* dialog = gtk_dialog_new_with_buttons("Tour Guide...",	                                                GTK_WINDOW(app->mainWindow),	                                                GTK_DIALOG_DESTROY_WITH_PARENT,	                                                GTK_STOCK_CLOSE,	                                                GTK_RESPONSE_CLOSE,	                                                NULL);	GtkWidget* hbox = gtk_hbox_new(FALSE, CELSPACING); 	gtk_container_set_border_width(GTK_CONTAINER(hbox), CELSPACING);	GtkWidget* label = gtk_label_new("Select your destination:");	gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);	GtkWidget* menubox = gtk_option_menu_new();	gtk_box_pack_start(GTK_BOX(hbox), menubox, TRUE, TRUE, 0);	GtkWidget* gotoButton = gtk_button_new_with_label("Go To");	gtk_box_pack_start(GTK_BOX(hbox), gotoButton, TRUE, TRUE, 0);	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, TRUE, 0);	gtk_widget_show(hbox);	td->descLabel = gtk_label_new("");	gtk_label_set_line_wrap(GTK_LABEL(td->descLabel), TRUE);	gtk_label_set_justify(GTK_LABEL(td->descLabel), GTK_JUSTIFY_FILL);	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), td->descLabel, TRUE, TRUE, 0);	GtkWidget* menu = gtk_menu_new();	const DestinationList* destinations = app->core->getDestinations();	if (destinations != NULL)	{		for (DestinationList::const_iterator iter = destinations->begin();		     iter != destinations->end(); iter++)		{			Destination* dest = *iter;			if (dest != NULL)			{				GtkWidget* item = gtk_menu_item_new_with_label(dest->name.c_str());				gtk_menu_append(GTK_MENU(menu), item);				gtk_widget_show(item);			}		}	}	g_signal_connect(GTK_OBJECT(menu),	                 "selection-done",	                 G_CALLBACK(TourGuideSelect),	                 td);	g_signal_connect(GTK_OBJECT(gotoButton),	                 "pressed",	                 G_CALLBACK(TourGuideGoto),	                 td);	g_signal_connect(dialog,	                 "response",	                 G_CALLBACK(TourGuideDestroy),	                 td);	gtk_option_menu_set_menu(GTK_OPTION_MENU(menubox), menu);	gtk_widget_set_usize(dialog, 440, 300);	gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);	gtk_widget_show_all(dialog);}/* CALLBACK: tour list object selected */static gint TourGuideSelect(GtkWidget* w, TourData* td){	GtkMenu* menu = GTK_MENU(w);	if (menu == NULL)		return FALSE;	GtkWidget* item = gtk_menu_get_active(GTK_MENU(menu));	if (item == NULL)		return FALSE;	GList* list = gtk_container_children(GTK_CONTAINER(menu));	int itemIndex = g_list_index(list, item);	const DestinationList* destinations = td->app->core->getDestinations();	if (destinations != NULL &&	    itemIndex >= 0 && itemIndex < (int) destinations->size())	{		td->selected = (*destinations)[itemIndex];	}	if (td->descLabel != NULL && td->selected != NULL)	{		gtk_label_set_text(GTK_LABEL(td->descLabel), td->selected->description.c_str());	}	return TRUE;}/* CALLBACK: Goto button clicked */static gint TourGuideGoto(GtkWidget*, TourData* td){	Simulation* simulation = td->app->simulation;		if (td->selected != NULL && simulation != NULL)	{		Selection sel = simulation->findObjectFromPath(td->selected->target);		if (!sel.empty())		{			simulation->follow();			simulation->setSelection(sel);			if (td->selected->distance <= 0)			{				/* Use the default distance */				simulation->gotoSelection(5.0,				                          Vec3f(0, 1, 0),				                          astro::ObserverLocal);			}			else			{				simulation->gotoSelection(5.0,				                          td->selected->distance,				                          Vec3f(0, 1, 0),				                          astro::ObserverLocal);			}		}	}	return TRUE;}/* CALLBACK: Destroy Window */static void TourGuideDestroy(GtkWidget* w, gint, TourData* td){	gtk_widget_destroy(GTK_WIDGET(w));	g_free(td);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?