📄 jointstreeview.cpp
字号:
/*********************************************************************************** In the name of Almighty ** ** JointTreeView.cpp : Robocup Soccer Simulator Developement Team: Zigorat ** ** Date: 07/08/2007 ** Author: Mahdi Hamdarsi ** Research Coordinator: Amin Mohammadi ** Comments: Joint specific operations and view interface ** ***********************************************************************************//*! \file JointTreeView.cpp<pre><b>File:</b> JointTreeView.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> Joint specific operations and view interface<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 <gtk/gtk.h>#include <iostream>using namespace std;#include "RubySceneGraph.h"extern TRubySceneGraph * RubySceneGraph;#include "Parse.h"#include "Editor.h"#include "support.h"GtkWidget *m_Joints_Treeview;GtkTreeModel *m_Joints_items_model;extern GtkWidget *m_MainWindow;enum{ COLUMN_JOINT_NUMBER, COLUMN_JOINT_TYPE, COLUMN_JOINT_PARENT, COLUMN_JOINT_CHILD, NUM_JOINTS_COLUMNS};enum{ COLUMN_NUMBER_TEXT, NUM_NUMBER_COLUMNS};gchar *getGtkString( TJoint joint ){ if( joint == JOINT_FIXED ) return g_strdup( "Fixed" ); if( joint == JOINT_HINGE ) return g_strdup( "Hinge" ); if( joint == JOINT_HINGE2 ) return g_strdup( "Hinge2" ); if( joint == JOINT_UNIVERSAL ) return g_strdup( "Universal" ); return g_strdup( "Illegal joint" );}void UpdateJointsList(){ GtkTreeIter iter; while( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_Joints_items_model), &iter) == TRUE ) gtk_list_store_remove(GTK_LIST_STORE(m_Joints_items_model), &iter); for( int i = 0; i < RubySceneGraph->getJointCount(); i++) { string par = RubySceneGraph->getJoint( i )->getParrent() == NULL ? "Unknown" : RubySceneGraph->getJoint( i )->getParrent()->getName(); string chd = RubySceneGraph->getJoint( i )->getChild() == NULL ? "Unknown" : RubySceneGraph->getJoint( i )->getChild()->getName(); gtk_list_store_append(GTK_LIST_STORE(m_Joints_items_model), &iter); gtk_list_store_set( GTK_LIST_STORE(m_Joints_items_model), &iter, COLUMN_JOINT_NUMBER,getGtkString( RubySceneGraph->getJoint( i )->getNumber() ), COLUMN_JOINT_TYPE, getGtkString( RubySceneGraph->getJoint( i )->getType() ), COLUMN_JOINT_PARENT, getGtkString( par ), COLUMN_JOINT_CHILD, getGtkString( chd ), -1); }}void create_joints_model(){ m_Joints_items_model = GTK_TREE_MODEL( gtk_list_store_new(NUM_JOINTS_COLUMNS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING ) );}GtkTreeModel * CreateTypeMenu(){ const char *str[] = { "Fixed", "Hinge", "Hinge2", "Universal" }; GtkListStore *model; GtkTreeIter iter; model = gtk_list_store_new(NUM_NUMBER_COLUMNS, G_TYPE_STRING, G_TYPE_INT); for( int i = 0; i < 4; i++) { gtk_list_store_append (model, &iter); gtk_list_store_set (model, &iter, COLUMN_NUMBER_TEXT, str[i], -1); } return GTK_TREE_MODEL(model);}void AddJoint(int type){ TMessage msg; msg.m_Command = CMD_JOINT_CREATE; msg.m_Shape = (TJoint)type; msg.m_Position = VecPosition(0,0,0); UpdateLists( msg );}int GetCurrentJointIndex(){ GtkTreeIter iter; GtkTreeView *tree = (GtkTreeView *)m_Joints_Treeview; GtkTreeModel *model = gtk_tree_view_get_model(tree); GtkTreeSelection *selection = gtk_tree_view_get_selection(tree); if(!gtk_tree_selection_get_selected(selection, NULL, &iter)) return -1; gint i; GtkTreePath *path; path = gtk_tree_model_get_path (model, &iter); i = gtk_tree_path_get_indices(path)[0]; gtk_tree_path_free (path); return i;}void RemoveCurrentJoint(){ int index = GetCurrentJointIndex(); if( index == -1 ) return; TMessage msg; msg.m_Command = CMD_JOINT_DELETE; msg.m_Index = index; UpdateLists( msg );}void OnJointCellEdited(GtkCellRendererText *cell, const gchar *path_string,const gchar *new_text,gpointer data){ GtkTreeModel *model = (GtkTreeModel *)data; GtkTreePath *path = gtk_tree_path_new_from_string (path_string); GtkTreeIter iter; gint column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column")); gtk_tree_model_get_iter (model, &iter, path); gchar *old_text; gtk_tree_model_get (model, &iter, column, &old_text, -1); gtk_tree_path_free(path); if( column != COLUMN_JOINT_TYPE ) return; if( strcmp(old_text, new_text) == 0 ) return; TMessage msg; msg.m_Index = GetCurrentNodeIndex(); if( column == COLUMN_JOINT_TYPE ) { msg.m_Command = CMD_JOINT_RETYPE; if( strcmp( new_text, "Fixed" ) == 0 ) msg.m_Shape = JOINT_FIXED; else if( strcmp( new_text, "Hinge" ) == 0 ) msg.m_Shape = JOINT_HINGE; else if( strcmp( new_text, "Universal" ) == 0 ) msg.m_Shape = JOINT_UNIVERSAL; } UpdateLists( msg );}void UpdateJointInfo(){ int index = GetCurrentJointIndex(); if( index == -1 ) return; const TSceneJoint *joint = RubySceneGraph->getJoint(index); if(joint == NULL) return; GtkWidget *temp; temp = lookup_widget(m_MainWindow, "txtJointParent"); if( temp && joint->getParrent() ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getParrent()->getName()) ); temp = lookup_widget(m_MainWindow, "txtJointChild"); if( temp && joint->getChild() ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getChild()->getName()) ); temp = lookup_widget(m_MainWindow, "txtJointAnchorX"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getAnchor().getX()) ); temp = lookup_widget(m_MainWindow, "txtJointAnchorY"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getAnchor().getY()) ); temp = lookup_widget(m_MainWindow, "txtJointAnchorZ"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getAnchor().getZ()) ); temp = lookup_widget(m_MainWindow, "txtJointMotor1"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getMaxMotorForce(0)) ); temp = lookup_widget(m_MainWindow, "txtJointMotor2"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getMaxMotorForce(1)) ); temp = lookup_widget(m_MainWindow, "txtJointPerceptor"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getPerceptorName()) ); temp = lookup_widget(m_MainWindow, "txtJointEffector"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getEffectorName()) ); temp = lookup_widget(m_MainWindow, "txtJointAxis1X"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getAxis(0).getX()) ); temp = lookup_widget(m_MainWindow, "txtJointAxis1Y"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getAxis(0).getY()) ); temp = lookup_widget(m_MainWindow, "txtJointAxis1Z"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getAxis(0).getZ()) ); temp = lookup_widget(m_MainWindow, "txtJointAxis2X"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getAxis(1).getX()) ); temp = lookup_widget(m_MainWindow, "txtJointAxis2Y"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getAxis(1).getY()) ); temp = lookup_widget(m_MainWindow, "txtJointAxis2Z"); if( temp ) gtk_entry_set_text(GTK_ENTRY(temp), getGtkString(joint->getAxis(1).getZ()) );}void InitializeJointsColoumns(GtkTreeView *treeview, GtkTreeModel *items_model, GtkTreeModel *types_model){ GtkCellRenderer *renderer; renderer = gtk_cell_renderer_combo_new (); g_object_set(renderer, "model", types_model, "text-column", COLUMN_NUMBER_TEXT, "has-entry", FALSE, "editable", TRUE, NULL); g_signal_connect(renderer, "edited", G_CALLBACK (OnJointCellEdited), items_model); g_object_set_data(G_OBJECT (renderer), "column", GINT_TO_POINTER(COLUMN_JOINT_TYPE)); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1, "Type", renderer, "text", COLUMN_JOINT_TYPE, NULL); /* parent column */ renderer = gtk_cell_renderer_text_new (); g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (COLUMN_JOINT_PARENT)); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1, "Parrent", renderer, "text", COLUMN_JOINT_PARENT, NULL); /* child column */ renderer = gtk_cell_renderer_text_new (); g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER(COLUMN_JOINT_CHILD)); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1, "Child", renderer, "text", COLUMN_JOINT_CHILD, NULL);}void OnJointsCursorChange(GtkTreeView *treeview, gpointer user_data){ UpdateJointInfo();}GtkWidget* InitJointsTreeView(){ GtkTreeModel *type_menu; GtkWidget *sw; /* create models */ create_joints_model(); type_menu = CreateTypeMenu(); /* create tree view */ m_Joints_Treeview = gtk_tree_view_new_with_model (m_Joints_items_model); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (m_Joints_Treeview), TRUE); gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (m_Joints_Treeview)), GTK_SELECTION_SINGLE); InitializeJointsColoumns(GTK_TREE_VIEW (m_Joints_Treeview), m_Joints_items_model, type_menu); g_object_unref (type_menu); g_object_unref (m_Joints_items_model); g_signal_connect ((gpointer) m_Joints_Treeview, "cursor_changed", G_CALLBACK(OnJointsCursorChange), NULL); sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER (sw), m_Joints_Treeview); return sw;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -