#include <gtk/gtkscrolledwindow.h>
#include <gtk/gtkentry.h>
#include <gtk/gtkcombobox.h>
+#include <gtk/gtkstock.h>
#include "os/path.h"
#include "textureentry.h"
#include "groupdialog.h"
+#include "select.h"
+
GtkEntry* numeric_entry_new(){
GtkEntry* entry = GTK_ENTRY( gtk_entry_new() );
gtk_widget_show( GTK_WIDGET( entry ) );
delete this;
}
void apply(){
- Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( m_check ) ) ? "1" : "0" );
+ Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( m_check ) ) ? "1" : "" );
}
typedef MemberCaller<BooleanAttribute, &BooleanAttribute::apply> ApplyCaller;
};
+class ColorAttribute : public EntityAttribute
+{
+CopiedString m_key;
+BrowsedPathEntry m_entry;
+NonModalEntry m_nonModal;
+public:
+ColorAttribute( const char* key ) :
+ m_key( key ),
+ m_entry( BrowseCaller( *this ) ),
+ m_nonModal( ApplyCaller( *this ), UpdateCaller( *this ) ){
+ m_nonModal.connect( m_entry.m_entry.m_entry );
+}
+void release(){
+ delete this;
+}
+GtkWidget* getWidget() const {
+ return GTK_WIDGET( m_entry.m_entry.m_frame );
+}
+void apply(){
+ StringOutputStream value( 64 );
+ value << gtk_entry_get_text( GTK_ENTRY( m_entry.m_entry.m_entry ) );
+ Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), value.c_str() );
+}
+typedef MemberCaller<ColorAttribute, &ColorAttribute::apply> ApplyCaller;
+void update(){
+ StringOutputStream value( 64 );
+ value << SelectedEntity_getValueForKey( m_key.c_str() );
+ gtk_entry_set_text( GTK_ENTRY( m_entry.m_entry.m_entry ), value.c_str() );
+}
+typedef MemberCaller<ColorAttribute, &ColorAttribute::update> UpdateCaller;
+void browse( const BrowsedPathEntry::SetPathCallback& setPath ){
+ //const char *filename = misc_model_dialog( gtk_widget_get_toplevel( GTK_WIDGET( m_entry.m_entry.m_frame ) ) );
+
+ /* hijack BrowsedPathEntry to call colour chooser */
+ Entity_setColour();
+
+// if ( filename != 0 ) {
+// setPath( filename );
+// apply();
+// }
+ update();
+}
+typedef MemberCaller1<ColorAttribute, const BrowsedPathEntry::SetPathCallback&, &ColorAttribute::browse> BrowseCaller;
+};
+
+
class ModelAttribute : public EntityAttribute
{
CopiedString m_key;
namespace
{
+GtkWidget* g_entity_split0 = 0;
GtkWidget* g_entity_split1 = 0;
GtkWidget* g_entity_split2 = 0;
+int g_entitysplit0_position;
int g_entitysplit1_position;
int g_entitysplit2_position;
GtkEntry* g_entityKeyEntry;
GtkEntry* g_entityValueEntry;
+GtkToggleButton* g_focusToggleButton;
+
GtkListStore* g_entlist_store;
GtkListStore* g_entprops_store;
const EntityClass* g_current_flags = 0;
g_current_comment = eclass;
GtkTextBuffer* buffer = gtk_text_view_get_buffer( g_entityClassComment );
- gtk_text_buffer_set_text( buffer, eclass->comments(), -1 );
+ //gtk_text_buffer_set_text( buffer, eclass->comments(), -1 );
+ const char* comment = eclass->comments(), *c;
+ int offset = 0, pattern_start = -1, spaces = 0;
+
+ gtk_text_buffer_set_text( buffer, comment, -1 );
+
+ // Catch patterns like "\nstuff :" used to describe keys and spawnflags, and make them bold for readability.
+
+ for( c = comment; *c; ++c, ++offset ) {
+ if( *c == '\n' ) {
+ pattern_start = offset;
+ spaces = 0;
+ }
+ else if( pattern_start >= 0 && ( *c < 'a' || *c > 'z' ) && ( *c < 'A' || *c > 'Z' ) && ( *c < '0' || *c > '9' ) && ( *c != '_' ) ) {
+ if( *c == ':' && spaces <= 1 ) {
+ GtkTextIter iter_start, iter_end;
+
+ gtk_text_buffer_get_iter_at_offset( buffer, &iter_start, pattern_start );
+ gtk_text_buffer_get_iter_at_offset( buffer, &iter_end, offset );
+ gtk_text_buffer_apply_tag_by_name( buffer, "bold", &iter_start, &iter_end );
+ }
+
+ if( *c == ' ' )
+ ++spaces;
+ else
+ pattern_start = -1;
+ }
+ }
}
void SurfaceFlags_setEntityClass( EntityClass* eclass ){
public:
EntityAttributeFactory(){
m_creators.insert( Creators::value_type( "string", &StatelessAttributeCreator<StringAttribute>::create ) );
- m_creators.insert( Creators::value_type( "color", &StatelessAttributeCreator<StringAttribute>::create ) );
+ m_creators.insert( Creators::value_type( "color", &StatelessAttributeCreator<ColorAttribute>::create ) );
m_creators.insert( Creators::value_type( "integer", &StatelessAttributeCreator<StringAttribute>::create ) );
m_creators.insert( Creators::value_type( "real", &StatelessAttributeCreator<StringAttribute>::create ) );
m_creators.insert( Creators::value_type( "shader", &StatelessAttributeCreator<ShaderAttribute>::create ) );
}
}
+static gint EntityInspector_clearKeyValueKB( GtkEntry* widget, GdkEventKey* event, gpointer data ){
+ if ( event->keyval == GDK_Delete ) {
+ EntityInspector_clearKeyValue();
+ return TRUE;
+ }
+ return FALSE;
+}
+
void EntityInspector_clearAllKeyValues(){
UndoableCommand undo( "entityClear" );
}
static gint EntityClassList_keypress( GtkWidget* widget, GdkEventKey* event, gpointer data ){
- unsigned int code = gdk_keyval_to_upper( event->keyval );
-
if ( event->keyval == GDK_Return ) {
EntityClassList_createEntity();
return TRUE;
}
// select the entity that starts with the key pressed
- if ( code <= 'Z' && code >= 'A' ) {
+/*
+ unsigned int code = gdk_keyval_to_upper( event->keyval );
+ if ( code <= 'Z' && code >= 'A' && event->state == 0 ) {
GtkTreeView* view = g_entityClassList;
GtkTreeModel* model;
GtkTreeIter iter;
return TRUE;
}
+*/
return FALSE;
}
static gint EntityEntry_keypress( GtkEntry* widget, GdkEventKey* event, gpointer data ){
if ( event->keyval == GDK_Return ) {
if ( widget == g_entityKeyEntry ) {
- gtk_entry_set_text( g_entityValueEntry, "" );
+ //gtk_entry_set_text( g_entityValueEntry, "" );
gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( widget ) ) ), GTK_WIDGET( g_entityValueEntry ) );
}
else
}
return TRUE;
}
+ if ( event->keyval == GDK_Tab ) {
+ if ( widget == g_entityKeyEntry ) {
+ gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( widget ) ) ), GTK_WIDGET( g_entityValueEntry ) );
+ }
+ else
+ {
+ gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( widget ) ) ), GTK_WIDGET( g_entityKeyEntry ) );
+ }
+ return TRUE;
+ }
if ( event->keyval == GDK_Escape ) {
- gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( widget ) ) ), NULL );
+ //gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( widget ) ) ), NULL );
+ GroupDialog_showPage( g_page_entity );
return TRUE;
}
}
void EntityInspector_destroyWindow( GtkWidget* widget, gpointer data ){
+ g_entitysplit0_position = gtk_paned_get_position( GTK_PANED( g_entity_split0 ) );
g_entitysplit1_position = gtk_paned_get_position( GTK_PANED( g_entity_split1 ) );
g_entitysplit2_position = gtk_paned_get_position( GTK_PANED( g_entity_split2 ) );
-
g_entityInspector_windowConstructed = false;
GlobalEntityAttributes_clear();
}
+static gint EntityInspector_hideWindowKB( GtkWidget* widget, GdkEventKey* event, gpointer data ){
+ //if ( event->keyval == GDK_Escape && GTK_WIDGET_VISIBLE( GTK_WIDGET( widget ) ) ) {
+ if ( event->keyval == GDK_Escape ) {
+ //GroupDialog_showPage( g_page_entity );
+ gtk_widget_hide( GTK_WIDGET( GroupDialog_getWindow() ) );
+ return TRUE;
+ }
+ /* this doesn't work, if tab is bound (func is not called then) */
+ if ( event->keyval == GDK_Tab ) {
+ gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( widget ) ) ), GTK_WIDGET( g_entityKeyEntry ) );
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void EntityInspector_selectTargeting( GtkButton *button, gpointer user_data ){
+ bool focus = gtk_toggle_button_get_active( g_focusToggleButton );
+ Select_ConnectedEntities( true, false, focus );
+}
+
+void EntityInspector_selectTargets( GtkButton *button, gpointer user_data ){
+ bool focus = gtk_toggle_button_get_active( g_focusToggleButton );
+ Select_ConnectedEntities( false, true, focus );
+}
+
+void EntityInspector_selectConnected( GtkButton *button, gpointer user_data ){
+ bool focus = gtk_toggle_button_get_active( g_focusToggleButton );
+ Select_ConnectedEntities( true, true, focus );
+}
+
GtkWidget* EntityInspector_constructWindow( GtkWindow* toplevel ){
GtkWidget* vbox = gtk_vbox_new( FALSE, 2 );
gtk_widget_show( vbox );
gtk_container_set_border_width( GTK_CONTAINER( vbox ), 2 );
+ g_signal_connect( G_OBJECT( toplevel ), "key_press_event", G_CALLBACK( EntityInspector_hideWindowKB ), 0 );
g_signal_connect( G_OBJECT( vbox ), "destroy", G_CALLBACK( EntityInspector_destroyWindow ), 0 );
{
{
GtkWidget* split2 = gtk_vpaned_new();
- gtk_paned_add1( GTK_PANED( split1 ), split2 );
+ //gtk_paned_add1( GTK_PANED( split1 ), split2 );
+ gtk_paned_pack1( GTK_PANED( split1 ), split2, FALSE, FALSE );
gtk_widget_show( split2 );
g_entity_split2 = split2;
// class list
GtkWidget* scr = gtk_scrolled_window_new( 0, 0 );
gtk_widget_show( scr );
- gtk_paned_add1( GTK_PANED( split2 ), scr );
+ //gtk_paned_add1( GTK_PANED( split2 ), scr );
+ gtk_paned_pack1( GTK_PANED( split2 ), scr, FALSE, FALSE );
gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scr ), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS );
gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
GtkListStore* store = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_POINTER );
GtkTreeView* view = GTK_TREE_VIEW( gtk_tree_view_new_with_model( GTK_TREE_MODEL( store ) ) );
- gtk_tree_view_set_enable_search( GTK_TREE_VIEW( view ), FALSE );
+ //gtk_tree_view_set_enable_search( GTK_TREE_VIEW( view ), FALSE );
gtk_tree_view_set_headers_visible( view, FALSE );
g_signal_connect( G_OBJECT( view ), "button_press_event", G_CALLBACK( EntityClassList_button_press ), 0 );
g_signal_connect( G_OBJECT( view ), "key_press_event", G_CALLBACK( EntityClassList_keypress ), 0 );
{
GtkWidget* scr = gtk_scrolled_window_new( 0, 0 );
gtk_widget_show( scr );
- gtk_paned_add2( GTK_PANED( split2 ), scr );
+ //gtk_paned_add2( GTK_PANED( split2 ), scr );
+ gtk_paned_pack2( GTK_PANED( split2 ), scr, FALSE, FALSE );
gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scr ), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS );
gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
gtk_widget_show( GTK_WIDGET( text ) );
gtk_container_add( GTK_CONTAINER( scr ), GTK_WIDGET( text ) );
g_entityClassComment = text;
+ {
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer( text );
+ gtk_text_buffer_create_tag( buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL );
+ }
}
}
}
{
- GtkWidget* split2 = gtk_vpaned_new();
- gtk_paned_add2( GTK_PANED( split1 ), split2 );
- gtk_widget_show( split2 );
+ GtkWidget* split0 = gtk_vpaned_new();
+ //gtk_paned_add2( GTK_PANED( split1 ), split0 );
+ gtk_paned_pack2( GTK_PANED( split1 ), split0, FALSE, FALSE );
+ gtk_widget_show( split0 );
+ g_entity_split0 = split0;
{
GtkWidget* vbox2 = gtk_vbox_new( FALSE, 2 );
gtk_widget_show( vbox2 );
- gtk_paned_pack1( GTK_PANED( split2 ), vbox2, FALSE, FALSE );
+ gtk_paned_pack1( GTK_PANED( split0 ), vbox2, FALSE, FALSE );
{
// Spawnflags (4 colums wide max, or window gets too wide.)
GtkWidget* view = gtk_tree_view_new_with_model( GTK_TREE_MODEL( store ) );
gtk_tree_view_set_enable_search( GTK_TREE_VIEW( view ), FALSE );
gtk_tree_view_set_headers_visible( GTK_TREE_VIEW( view ), FALSE );
+ g_signal_connect( G_OBJECT( view ), "key_press_event", G_CALLBACK( EntityInspector_clearKeyValueKB ), 0 );
{
GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
}
{
- GtkBox* hbox = GTK_BOX( gtk_hbox_new( TRUE, 4 ) );
+ GtkBox* hbox = GTK_BOX( gtk_hbox_new( FALSE, 4 ) );
gtk_widget_show( GTK_WIDGET( hbox ) );
gtk_box_pack_start( GTK_BOX( vbox2 ), GTK_WIDGET( hbox ), FALSE, TRUE, 0 );
{
GtkButton* button = GTK_BUTTON( gtk_button_new_with_label( "Clear All" ) );
+ GTK_WIDGET_UNSET_FLAGS( GTK_WIDGET( button ), GTK_CAN_FOCUS );
gtk_widget_show( GTK_WIDGET( button ) );
g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( EntityInspector_clearAllKeyValues ), 0 );
gtk_box_pack_start( hbox, GTK_WIDGET( button ), TRUE, TRUE, 0 );
}
{
GtkButton* button = GTK_BUTTON( gtk_button_new_with_label( "Delete Key" ) );
+ GTK_WIDGET_UNSET_FLAGS( GTK_WIDGET( button ), GTK_CAN_FOCUS );
gtk_widget_show( GTK_WIDGET( button ) );
g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( EntityInspector_clearKeyValue ), 0 );
gtk_box_pack_start( hbox, GTK_WIDGET( button ), TRUE, TRUE, 0 );
}
+ {
+ GtkButton* button = GTK_BUTTON( gtk_button_new_with_label( "<" ) );
+ gtk_widget_set_tooltip_text( GTK_WIDGET( button ), "Select targeting entities" );
+ GTK_WIDGET_UNSET_FLAGS( GTK_WIDGET( button ), GTK_CAN_FOCUS );
+ gtk_widget_show( GTK_WIDGET( button ) );
+ g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( EntityInspector_selectTargeting ), 0 );
+ gtk_box_pack_start( hbox, GTK_WIDGET( button ), FALSE, FALSE, 0 );
+ }
+ {
+ GtkButton* button = GTK_BUTTON( gtk_button_new_with_label( ">" ) );
+ gtk_widget_set_tooltip_text( GTK_WIDGET( button ), "Select targets" );
+ GTK_WIDGET_UNSET_FLAGS( GTK_WIDGET( button ), GTK_CAN_FOCUS );
+ gtk_widget_show( GTK_WIDGET( button ) );
+ g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( EntityInspector_selectTargets ), 0 );
+ gtk_box_pack_start( hbox, GTK_WIDGET( button ), FALSE, FALSE, 0 );
+ }
+ {
+ GtkButton* button = GTK_BUTTON( gtk_button_new_with_label( "<->" ) );
+ gtk_widget_set_tooltip_text( GTK_WIDGET( button ), "Select connected entities" );
+ GTK_WIDGET_UNSET_FLAGS( GTK_WIDGET( button ), GTK_CAN_FOCUS );
+ gtk_widget_show( GTK_WIDGET( button ) );
+ g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( EntityInspector_selectConnected ), 0 );
+ gtk_box_pack_start( hbox, GTK_WIDGET( button ), FALSE, FALSE, 0 );
+ }
+ {
+ GtkWidget* button = gtk_toggle_button_new();
+ GtkImage* image = GTK_IMAGE( gtk_image_new_from_stock( GTK_STOCK_ZOOM_IN, GTK_ICON_SIZE_SMALL_TOOLBAR ) );
+ gtk_widget_show( GTK_WIDGET( image ) );
+ gtk_container_add( GTK_CONTAINER( button ), GTK_WIDGET( image ) );
+ gtk_button_set_relief( GTK_BUTTON( button ), GTK_RELIEF_NONE );
+ GTK_WIDGET_UNSET_FLAGS( button, GTK_CAN_FOCUS );
+ gtk_box_pack_start( hbox, button, FALSE, FALSE, 0 );
+ gtk_widget_set_tooltip_text( button, "Focus on Selected" );
+ gtk_widget_show( button );
+ g_focusToggleButton = GTK_TOGGLE_BUTTON( button );
+ }
}
}
gtk_container_add( GTK_CONTAINER( viewport ), GTK_WIDGET( g_attributeBox ) );
gtk_container_add( GTK_CONTAINER( scr ), viewport );
- gtk_paned_pack2( GTK_PANED( split2 ), scr, FALSE, FALSE );
+ gtk_paned_pack2( GTK_PANED( split0 ), scr, FALSE, FALSE );
}
}
}
{
- // show the sliders in any case
- if ( g_entitysplit2_position > 22 ) {
- gtk_paned_set_position( GTK_PANED( g_entity_split2 ), g_entitysplit2_position );
- }
- else {
+ // show the sliders in any case //no need, gtk can care
+ /*if ( g_entitysplit2_position < 22 ) {
g_entitysplit2_position = 22;
- gtk_paned_set_position( GTK_PANED( g_entity_split2 ), 22 );
- }
- if ( ( g_entitysplit1_position - g_entitysplit2_position ) > 27 ) {
- gtk_paned_set_position( GTK_PANED( g_entity_split1 ), g_entitysplit1_position );
- }
- else {
- gtk_paned_set_position( GTK_PANED( g_entity_split1 ), g_entitysplit2_position + 27 );
- }
+ }*/
+ gtk_paned_set_position( GTK_PANED( g_entity_split2 ), g_entitysplit2_position );
+ /*if ( ( g_entitysplit1_position - g_entitysplit2_position ) < 27 ) {
+ g_entitysplit1_position = g_entitysplit2_position + 27;
+ }*/
+ gtk_paned_set_position( GTK_PANED( g_entity_split1 ), g_entitysplit1_position );
+ gtk_paned_set_position( GTK_PANED( g_entity_split0 ), g_entitysplit0_position );
}
g_entityInspector_windowConstructed = true;
void EntityInspector_construct(){
GlobalEntityClassManager().attach( g_EntityInspector );
+ GlobalPreferenceSystem().registerPreference( "EntitySplit0", IntImportStringCaller( g_entitysplit0_position ), IntExportStringCaller( g_entitysplit0_position ) );
GlobalPreferenceSystem().registerPreference( "EntitySplit1", IntImportStringCaller( g_entitysplit1_position ), IntExportStringCaller( g_entitysplit1_position ) );
GlobalPreferenceSystem().registerPreference( "EntitySplit2", IntImportStringCaller( g_entitysplit2_position ), IntExportStringCaller( g_entitysplit2_position ) );