]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/entityinspector.cpp
Introduce Property<T> to simplify preferences system
[xonotic/netradiant.git] / radiant / entityinspector.cpp
index 2aefe7d1f548115de7ace0efdd1b2944800aa14a..65b69327090c29b6513673f8a62b2ea6c5171700 100644 (file)
@@ -142,7 +142,7 @@ void release(){
 void apply(){
        Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), m_check.active() ? "1" : "0" );
 }
-typedef MemberCaller<BooleanAttribute, &BooleanAttribute::apply> ApplyCaller;
+typedef MemberCaller<BooleanAttribute, void(), &BooleanAttribute::apply> ApplyCaller;
 
 void update(){
        const char* value = SelectedEntity_getValueForKey( m_key.c_str() );
@@ -154,7 +154,7 @@ void update(){
                toggle_button_set_active_no_signal( m_check, false );
        }
 }
-typedef MemberCaller<BooleanAttribute, &BooleanAttribute::update> UpdateCaller;
+typedef MemberCaller<BooleanAttribute, void(), &BooleanAttribute::update> UpdateCaller;
 };
 
 
@@ -190,14 +190,14 @@ void apply(){
        value << m_entry.text();
        Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), value.c_str() );
 }
-typedef MemberCaller<StringAttribute, &StringAttribute::apply> ApplyCaller;
+typedef MemberCaller<StringAttribute, void(), &StringAttribute::apply> ApplyCaller;
 
 void update(){
        StringOutputStream value( 64 );
        value << SelectedEntity_getValueForKey( m_key.c_str() );
        m_entry.text(value.c_str());
 }
-typedef MemberCaller<StringAttribute, &StringAttribute::update> UpdateCaller;
+typedef MemberCaller<StringAttribute, void(), &StringAttribute::update> UpdateCaller;
 };
 
 class ShaderAttribute : public StringAttribute
@@ -232,13 +232,13 @@ void apply(){
        value << m_entry.m_entry.m_entry.text();
        Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), value.c_str() );
 }
-typedef MemberCaller<ModelAttribute, &ModelAttribute::apply> ApplyCaller;
+typedef MemberCaller<ModelAttribute, void(), &ModelAttribute::apply> ApplyCaller;
 void update(){
        StringOutputStream value( 64 );
        value << SelectedEntity_getValueForKey( m_key.c_str() );
        m_entry.m_entry.m_entry.text(value.c_str());
 }
-typedef MemberCaller<ModelAttribute, &ModelAttribute::update> UpdateCaller;
+typedef MemberCaller<ModelAttribute, void(), &ModelAttribute::update> UpdateCaller;
 void browse( const BrowsedPathEntry::SetPathCallback& setPath ){
        const char *filename = misc_model_dialog( m_entry.m_entry.m_frame.window() );
 
@@ -247,7 +247,7 @@ void browse( const BrowsedPathEntry::SetPathCallback& setPath ){
                apply();
        }
 }
-typedef MemberCaller1<ModelAttribute, const BrowsedPathEntry::SetPathCallback&, &ModelAttribute::browse> BrowseCaller;
+typedef MemberCaller<ModelAttribute, void(const BrowsedPathEntry::SetPathCallback&), &ModelAttribute::browse> BrowseCaller;
 };
 
 const char* browse_sound( ui::Widget parent ){
@@ -295,13 +295,13 @@ void apply(){
        value << m_entry.m_entry.m_entry.text();
        Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), value.c_str() );
 }
-typedef MemberCaller<SoundAttribute, &SoundAttribute::apply> ApplyCaller;
+typedef MemberCaller<SoundAttribute, void(), &SoundAttribute::apply> ApplyCaller;
 void update(){
        StringOutputStream value( 64 );
        value << SelectedEntity_getValueForKey( m_key.c_str() );
        m_entry.m_entry.m_entry.text(value.c_str());
 }
-typedef MemberCaller<SoundAttribute, &SoundAttribute::update> UpdateCaller;
+typedef MemberCaller<SoundAttribute, void(), &SoundAttribute::update> UpdateCaller;
 void browse( const BrowsedPathEntry::SetPathCallback& setPath ){
        const char *filename = browse_sound( m_entry.m_entry.m_frame.window() );
 
@@ -310,7 +310,7 @@ void browse( const BrowsedPathEntry::SetPathCallback& setPath ){
                apply();
        }
 }
-typedef MemberCaller1<SoundAttribute, const BrowsedPathEntry::SetPathCallback&, &SoundAttribute::browse> BrowseCaller;
+typedef MemberCaller<SoundAttribute, void(const BrowsedPathEntry::SetPathCallback&), &SoundAttribute::browse> BrowseCaller;
 };
 
 inline double angle_normalised( double angle ){
@@ -342,7 +342,7 @@ void apply(){
        angle << angle_normalised( entry_get_float( m_entry ) );
        Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), angle.c_str() );
 }
-typedef MemberCaller<AngleAttribute, &AngleAttribute::apply> ApplyCaller;
+typedef MemberCaller<AngleAttribute, void(), &AngleAttribute::apply> ApplyCaller;
 
 void update(){
        const char* value = SelectedEntity_getValueForKey( m_key.c_str() );
@@ -356,7 +356,7 @@ void update(){
                m_entry.text("0");
        }
 }
-typedef MemberCaller<AngleAttribute, &AngleAttribute::update> UpdateCaller;
+typedef MemberCaller<AngleAttribute, void(), &AngleAttribute::update> UpdateCaller;
 };
 
 namespace
@@ -403,7 +403,7 @@ void apply(){
        angle << angle_normalised( entry_get_float( m_entry ) );
        Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), angle.c_str() );
 }
-typedef MemberCaller<DirectionAttribute, &DirectionAttribute::apply> ApplyCaller;
+typedef MemberCaller<DirectionAttribute, void(), &DirectionAttribute::apply> ApplyCaller;
 
 void update(){
        const char* value = SelectedEntity_getValueForKey( m_key.c_str() );
@@ -433,7 +433,7 @@ void update(){
                m_entry.text("0");
        }
 }
-typedef MemberCaller<DirectionAttribute, &DirectionAttribute::update> UpdateCaller;
+typedef MemberCaller<DirectionAttribute, void(), &DirectionAttribute::update> UpdateCaller;
 
 void applyRadio(){
        int index = radio_button_get_active( m_radio.m_radio );
@@ -447,7 +447,7 @@ void applyRadio(){
                apply();
        }
 }
-typedef MemberCaller<DirectionAttribute, &DirectionAttribute::applyRadio> ApplyRadioCaller;
+typedef MemberCaller<DirectionAttribute, void(), &DirectionAttribute::applyRadio> ApplyRadioCaller;
 };
 
 
@@ -508,7 +508,7 @@ void apply(){
                   << " " << angle_normalised( entry_get_float( m_angles.m_roll ) );
        Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), angles.c_str() );
 }
-typedef MemberCaller<AnglesAttribute, &AnglesAttribute::apply> ApplyCaller;
+typedef MemberCaller<AnglesAttribute, void(), &AnglesAttribute::apply> ApplyCaller;
 
 void update(){
        StringOutputStream angle( 32 );
@@ -538,7 +538,7 @@ void update(){
                m_angles.m_roll.text("0");
        }
 }
-typedef MemberCaller<AnglesAttribute, &AnglesAttribute::update> UpdateCaller;
+typedef MemberCaller<AnglesAttribute, void(), &AnglesAttribute::update> UpdateCaller;
 };
 
 class Vector3Entry
@@ -595,7 +595,7 @@ void apply(){
                        << " " << entry_get_float( m_vector3.m_z );
        Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), vector3.c_str() );
 }
-typedef MemberCaller<Vector3Attribute, &Vector3Attribute::apply> ApplyCaller;
+typedef MemberCaller<Vector3Attribute, void(), &Vector3Attribute::apply> ApplyCaller;
 
 void update(){
        StringOutputStream buffer( 32 );
@@ -625,21 +625,21 @@ void update(){
                m_vector3.m_z.text("0");
        }
 }
-typedef MemberCaller<Vector3Attribute, &Vector3Attribute::update> UpdateCaller;
+typedef MemberCaller<Vector3Attribute, void(), &Vector3Attribute::update> UpdateCaller;
 };
 
 class NonModalComboBox
 {
-Callback m_changed;
+Callback<void()> m_changed;
 guint m_changedHandler;
 
-static gboolean changed( GtkComboBox *widget, NonModalComboBox* self ){
+static gboolean changed( ui::ComboBox widget, NonModalComboBox* self ){
        self->m_changed();
        return FALSE;
 }
 
 public:
-NonModalComboBox( const Callback& changed ) : m_changed( changed ), m_changedHandler( 0 ){
+NonModalComboBox( const Callback<void()>& changed ) : m_changed( changed ), m_changedHandler( 0 ){
 }
 void connect( ui::ComboBox combo ){
        m_changedHandler = combo.connect( "changed", G_CALLBACK( changed ), this );
@@ -684,7 +684,7 @@ ui::Widget getWidget() const {
 void apply(){
        Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), m_type[gtk_combo_box_get_active( m_combo )].second.c_str() );
 }
-typedef MemberCaller<ListAttribute, &ListAttribute::apply> ApplyCaller;
+typedef MemberCaller<ListAttribute, void(), &ListAttribute::apply> ApplyCaller;
 
 void update(){
        const char* value = SelectedEntity_getValueForKey( m_key.c_str() );
@@ -697,7 +697,7 @@ void update(){
                m_nonModal.setActive( m_combo, 0 );
        }
 }
-typedef MemberCaller<ListAttribute, &ListAttribute::update> UpdateCaller;
+typedef MemberCaller<ListAttribute, void(), &ListAttribute::update> UpdateCaller;
 };
 
 
@@ -710,7 +710,7 @@ int g_entitysplit2_position;
 
 bool g_entityInspector_windowConstructed = false;
 
-GtkTreeView* g_entityClassList;
+ui::TreeView g_entityClassList{ui::null};
 ui::TextView g_entityClassComment{ui::null};
 
 GtkCheckButton* g_entitySpawnflagsCheck[MAX_FLAGS];
@@ -888,7 +888,7 @@ void SurfaceFlags_setEntityClass( EntityClass* eclass ){
 }
 
 void EntityClassList_selectEntityClass( EntityClass* eclass ){
-       GtkTreeModel* model = GTK_TREE_MODEL( g_entlist_store );
+       auto model = g_entlist_store;
        GtkTreeIter iter;
        for ( gboolean good = gtk_tree_model_get_iter_first( model, &iter ); good != FALSE; good = gtk_tree_model_iter_next( model, &iter ) )
        {
@@ -896,7 +896,7 @@ void EntityClassList_selectEntityClass( EntityClass* eclass ){
                gtk_tree_model_get( model, &iter, 0, &text, -1 );
                if ( strcmp( text, eclass->name() ) == 0 ) {
                        auto view = ui::TreeView(g_entityClassList);
-                       GtkTreePath* path = gtk_tree_model_get_path( model, &iter );
+                       auto path = gtk_tree_model_get_path( model, &iter );
                        gtk_tree_selection_select_path( gtk_tree_view_get_selection( view ), path );
                        if ( gtk_widget_get_realized( view ) ) {
                                gtk_tree_view_scroll_to_cell( view, path, 0, FALSE, 0, 0 );
@@ -1063,7 +1063,7 @@ class EntityInspectorDraw
 {
 IdleDraw m_idleDraw;
 public:
-EntityInspectorDraw() : m_idleDraw( FreeCaller<EntityInspector_updateKeyValues>( ) ){
+EntityInspectorDraw() : m_idleDraw( makeCallbackF(EntityInspector_updateKeyValues) ){
 }
 void queueDraw(){
        m_idleDraw.queueDraw();
@@ -1083,7 +1083,7 @@ void EntityInspector_selectionChanged( const Selectable& ){
 // Creates a new entity based on the currently selected brush and entity type.
 //
 void EntityClassList_createEntity(){
-       auto view = ui::Widget::from(g_entityClassList);
+       auto view = g_entityClassList;
 
        // find out what type of entity we are trying to create
        GtkTreeModel* model;
@@ -1168,7 +1168,7 @@ void EntityInspector_clearAllKeyValues(){
 // =============================================================================
 // callbacks
 
-static void EntityClassList_selection_changed( GtkTreeSelection* selection, gpointer data ){
+static void EntityClassList_selection_changed( ui::TreeSelection selection, gpointer data ){
        GtkTreeModel* model;
        GtkTreeIter selected;
        if ( gtk_tree_selection_get_selected( selection, &model, &selected ) ) {
@@ -1212,7 +1212,7 @@ static gint EntityClassList_keypress( ui::Widget widget, GdkEventKey* event, gpo
                        gtk_tree_model_get( model, &iter, 0, &text, -1 );
 
                        if ( toupper( text[0] ) == (int)code ) {
-                               GtkTreePath* path = gtk_tree_model_get_path( model, &iter );
+                               auto path = gtk_tree_model_get_path( model, &iter );
                                gtk_tree_selection_select_path( gtk_tree_view_get_selection( view ), path );
                                if ( gtk_widget_get_realized( view ) ) {
                                        gtk_tree_view_scroll_to_cell( view, path, 0, FALSE, 0, 0 );
@@ -1233,7 +1233,7 @@ static gint EntityClassList_keypress( ui::Widget widget, GdkEventKey* event, gpo
        return FALSE;
 }
 
-static void EntityProperties_selection_changed( GtkTreeSelection* selection, gpointer data ){
+static void EntityProperties_selection_changed( ui::TreeSelection selection, gpointer data ){
        // find out what type of entity we are trying to create
        GtkTreeModel* model;
        GtkTreeIter iter;
@@ -1316,15 +1316,15 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
                                {
                                        ui::ListStore store = ui::ListStore(gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_POINTER ));
 
-                                       auto view = ui::TreeView( ui::TreeModel( GTK_TREE_MODEL( store ) ));
-                                       gtk_tree_view_set_enable_search( GTK_TREE_VIEW( view ), FALSE );
+                                       auto view = ui::TreeView( ui::TreeModel(store ));
+                                       gtk_tree_view_set_enable_search(view, FALSE );
                                        gtk_tree_view_set_headers_visible( view, FALSE );
                                        view.connect( "button_press_event", G_CALLBACK( EntityClassList_button_press ), 0 );
                                        view.connect( "key_press_event", G_CALLBACK( EntityClassList_keypress ), 0 );
 
                                        {
                                                auto renderer = ui::CellRendererText(ui::New);
-                                               GtkTreeViewColumn* column = ui::TreeViewColumn( "Key", renderer, {{"text", 0}} );
+                                               auto column = ui::TreeViewColumn( "Key", renderer, {{"text", 0}} );
                                                gtk_tree_view_append_column( view, column );
                                        }
 
@@ -1352,7 +1352,7 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
 
                                {
                                        auto text = ui::TextView(ui::New);
-                                       gtk_widget_set_size_request( text , 0, -1 ); // allow shrinking
+                                       text.dimensions(0, -1); // allow shrinking
                                        gtk_text_view_set_wrap_mode( text, GTK_WRAP_WORD );
                                        gtk_text_view_set_editable( text, FALSE );
                                        text.show();
@@ -1400,24 +1400,24 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
                                        {
                                                ui::ListStore store = ui::ListStore(gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_STRING ));
 
-                                               ui::Widget view = ui::TreeView(ui::TreeModel( 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 );
+                                               auto view = ui::TreeView(ui::TreeModel(store ));
+                                               gtk_tree_view_set_enable_search(view, FALSE );
+                                               gtk_tree_view_set_headers_visible(view, FALSE );
 
                                                {
                                                        auto renderer = ui::CellRendererText(ui::New);
-                                                       GtkTreeViewColumn* column = ui::TreeViewColumn( "", renderer, {{"text", 0}} );
-                                                       gtk_tree_view_append_column( GTK_TREE_VIEW( view ), column );
+                                                       auto column = ui::TreeViewColumn( "", renderer, {{"text", 0}} );
+                                                       gtk_tree_view_append_column(view, column );
                                                }
 
                                                {
                                                        auto renderer = ui::CellRendererText(ui::New);
-                                                       GtkTreeViewColumn* column = ui::TreeViewColumn( "", renderer, {{"text", 1}} );
-                                                       gtk_tree_view_append_column( GTK_TREE_VIEW( view ), column );
+                                                       auto column = ui::TreeViewColumn( "", renderer, {{"text", 1}} );
+                                                       gtk_tree_view_append_column(view, column );
                                                }
 
                                                {
-                                                       auto selection = ui::TreeSelection(gtk_tree_view_get_selection( GTK_TREE_VIEW( view ) ));
+                                                       auto selection = ui::TreeSelection(gtk_tree_view_get_selection(view ));
                                                        selection.connect( "changed", G_CALLBACK( EntityProperties_selection_changed ), 0 );
                                                }
 
@@ -1532,7 +1532,7 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
        g_entityInspector_windowConstructed = true;
        EntityClassList_fill();
 
-       typedef FreeCaller1<const Selectable&, EntityInspector_selectionChanged> EntityInspectorSelectionChangedCaller;
+       typedef FreeCaller<void(const Selectable&), EntityInspector_selectionChanged> EntityInspectorSelectionChangedCaller;
        GlobalSelectionSystem().addSelectionChangeCallback( EntityInspectorSelectionChangedCaller() );
        GlobalEntityCreator().setKeyValueChangedFunc( EntityInspector_keyValueChanged );
 
@@ -1574,8 +1574,8 @@ EntityInspector g_EntityInspector;
 void EntityInspector_construct(){
        GlobalEntityClassManager().attach( g_EntityInspector );
 
-       GlobalPreferenceSystem().registerPreference( "EntitySplit1", IntImportStringCaller( g_entitysplit1_position ), IntExportStringCaller( g_entitysplit1_position ) );
-       GlobalPreferenceSystem().registerPreference( "EntitySplit2", IntImportStringCaller( g_entitysplit2_position ), IntExportStringCaller( g_entitysplit2_position ) );
+       GlobalPreferenceSystem().registerPreference( "EntitySplit1", make_property_string( g_entitysplit1_position ) );
+       GlobalPreferenceSystem().registerPreference( "EntitySplit2", make_property_string( g_entitysplit2_position ) );
 
 }