📄 editor.cpp
字号:
/*********************************************************************************** In the name of Almighty ** ** Editor.cpp : Robocup Soccer Simulator Developement Team: Zigorat ** ** Date: 07/08/2007 ** Author: Mahdi Hamdarsi ** Research Coordinator: Amin Mohammadi ** Comments: Generic edit routines like adding node and joint ** ***********************************************************************************//*! \file Editor.cpp<pre><b>File:</b> Editor.cpp<b>Project:</b> Robocup Soccer Simulator Developement Team: Zigorat<b>Authors:</b> Mahdi Hamdarsi, Amin Mohammadi<b>Created:</b> 12/02/2001<b>Last Revision:</b> $ID$<b>Contents:</b> Generic edit routines like adding node and joint<hr size=2><h2><b>Changes</b></h2><b>Date</b> <b>Author</b> <b>Comment</b>07/08/2007 Mahdi Hamdarsi Initial version created</pre>*/#include "Editor.h"#include "interface.h"#include "RubySceneGraph.h"#include "support.h"#include <gtk/gtk.h>extern GtkWidget *m_AboutWin;extern GtkWidget *m_MainWindow;extern GtkWidget *m_SaveDialog;extern TRubySceneGraph * RubySceneGraph;extern GtkWidget *m_MyEventHandlerButton;GtkWidget *m_FileOpen = NULL;GtkWidget *m_FileSave = NULL;/** * JobT is an enumeration to handle different kinds of things that * application can do like saving, quiting, opening */enum JobT{ JT_ILLEGAL, JT_OPEN, JT_SAVE, JT_NEW, JT_QUIT};/** * Job is a structure to handle different kinds of things that this application does */struct Job{ JobT m_Job; string m_FileName;} e_Job;/** * This method clears information window of the properties */void ClearGTKWindow(){ GtkWidget *temp; temp = lookup_widget(m_MainWindow, "txtNodeName"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtNodeX"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtNodeY"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtNodeZ"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtNodeLength"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtNodeWidth"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtNodeHeight"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtNodeParent"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtNodeMass"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointParent"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointChild"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointAnchorX"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointAnchorY"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointAnchorZ"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointMotor1"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointMotor2"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointPerceptor"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointEffector"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointAxis1X"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointAxis1Y"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointAxis1Z"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointAxis2X"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointAxis2Y"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" ); temp = lookup_widget(m_MainWindow, "txtJointAxis2Z"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), "" );}/** * This method updates treeview of nodes and joints to reflect the changes done internal * @param message Message to update scene graph with */void UpdateLists( TMessage message ){ if( message.m_Command != CMD_ILLEGAL && !RubySceneGraph->respondToCommand( message ) ) cerr << "UpdateLists: Scene update failed" << endl; ClearGTKWindow(); UpdateNodesTree(); UpdateJointsList();}/** * This method returns a string known by gtk internals from the values given * @param value Value to change to gtk string * @return String that can be used in gtk framework */gchar * getGtkString( double value ){ char str[128]; sprintf( str, "%2.3f", value ); return g_strdup( str );}/** * This method returns a string known by gtk internals from the values given * @param value Value to change to gtk string * @return String that can be used in gtk framework */gchar * getGtkString( string value ){ return g_strdup( value.c_str() );}/** * This method checks for scene changes and prompts user to save scene if changed * @return indicates that scene has been changed or not */bool SceneChanged(){ if( !RubySceneGraph->changed() ) return false; m_SaveDialog = create_dlgSaveChanges(); gtk_widget_show( m_SaveDialog ); return true;}/** * This method resumes what was going to be done */void ResumeJob(){ g_signal_emit_by_name( m_MyEventHandlerButton, "clicked", NULL );}/** * This method resumes what was going to be done for scene, wheather * it was a new action or an open or save action. * @param button Button that emitted this signal * @param user_data Data associated with this signal */void onMyEvent(GtkButton *button, gpointer user_data){ if( e_Job.m_Job == JT_ILLEGAL ) return; TMessage msg; if( e_Job.m_Job == JT_OPEN ) { RubySceneGraph->LoadScene( e_Job.m_FileName.c_str() ); UpdateLists( msg ); } else if( e_Job.m_Job == JT_SAVE ) { RubySceneGraph->SaveScene( e_Job.m_FileName.c_str() ); UpdateLists( msg ); } else if( e_Job.m_Job == JT_NEW ) { RubySceneGraph->clearScene(); UpdateLists( msg ); } else if( e_Job.m_Job == JT_QUIT ) gtk_main_quit();}/** * This method opens a file chosen with the opendialog * @param button Button which is pressed * @param user_data Data associated with button */void OpenFile(GtkButton *button, gpointer user_data){ e_Job.m_FileName = gtk_file_selection_get_filename(GTK_FILE_SELECTION(m_FileOpen) ); e_Job.m_Job = JT_OPEN; if( !SceneChanged() ) ResumeJob(); gtk_widget_destroy( m_FileOpen );}/** * This method saves a file chosen with the savedialog * @param button Button which is pressed * @param user_data Data associated with button */void SaveFile(){ if( RubySceneGraph->getSceneName() == "" ) { ShowFileSaveAs(); return; } e_Job.m_FileName = RubySceneGraph->getSceneName(); e_Job.m_Job = JT_SAVE; ResumeJob();}/** * This method saves a file chosen with the savedialog * @param button Button which is pressed * @param user_data Data associated with button */void SaveFileAs(GtkButton *button, gpointer user_data){ e_Job.m_FileName = gtk_file_selection_get_filename(GTK_FILE_SELECTION(m_FileSave) ); e_Job.m_Job = JT_SAVE; ResumeJob(); gtk_widget_destroy( m_FileSave );}/** * This method cancels the fileopen dialog * @param button Button which is pressed * @param user_data Data associated with button */void CancelFileOpen(GtkButton *button, gpointer user_data){ gtk_widget_destroy( m_FileOpen );}/** * This method cancels the filesave dialog * @param button Button which is pressed * @param user_data Data associated with button */void CancelFileSave(GtkButton *button, gpointer user_data){ gtk_widget_destroy( m_FileSave );}/** * This method show a fileopen dialog on screen to choose a scene */void ShowFileOpen(){ m_FileOpen = gtk_file_selection_new("select scene to load"); g_signal_connect (G_OBJECT (GTK_FILE_SELECTION(m_FileOpen)->ok_button), "clicked", G_CALLBACK(OpenFile), (gpointer)m_FileOpen); g_signal_connect_swapped (G_OBJECT (GTK_FILE_SELECTION(m_FileOpen)->cancel_button), "clicked", G_CALLBACK(CancelFileOpen), G_OBJECT(m_FileOpen)); gtk_file_selection_set_filename(GTK_FILE_SELECTION(m_FileOpen), "*.rsg"); gtk_widget_show(m_FileOpen);}/** * This method show a fileopen dialog on screen to choose a scene */void ShowFileSaveAs(){ m_FileSave = gtk_file_selection_new("select scene name to save"); g_signal_connect (G_OBJECT (GTK_FILE_SELECTION(m_FileSave)->ok_button), "clicked", G_CALLBACK(SaveFileAs), (gpointer)m_FileSave); g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(m_FileSave)->cancel_button), "clicked", G_CALLBACK(CancelFileSave), G_OBJECT(m_FileSave)); gtk_file_selection_set_filename(GTK_FILE_SELECTION(m_FileSave), "*.rsg"); gtk_widget_show(m_FileSave);}/** * This method is called when 'no' button is clicked on checkscene dialog */void onSaveNoClicked(){ gtk_widget_destroy( m_SaveDialog ); ResumeJob();}/** * This method is called when 'yes' button is clicked on checkscene dialog */void onSaveYesClicked(){ gtk_widget_destroy( m_SaveDialog ); Job t_Job = e_Job; SaveFile(); e_Job = t_Job; ResumeJob();}/** * This method is called whenever menu "open project" or "toolOpenProject" is clicked */void CreateNewProject(){ e_Job.m_FileName = ""; e_Job.m_Job = JT_NEW; if( !SceneChanged() ) ResumeJob();}/** * This method checks for scene changes and prompts to save, then exists application */void Quit(){/* e_Job.m_FileName = ""; e_Job.m_Job = JT_QUIT; if( !SceneChanged() ) ResumeJob();*/ gtk_main_quit();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -