X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fxywindow.cpp;h=17141af554c832a5b012b91795061ee99bd3aa14;hb=3764f8088d5b34474a6bd909f7bec3b29de27b12;hp=b094b7744d5f034f57216469357dc65d59068734;hpb=e4287c28bb2dafedc81c66e63951d947cfbeb225;p=xonotic%2Fnetradiant.git diff --git a/radiant/xywindow.cpp b/radiant/xywindow.cpp index b094b774..17141af5 100644 --- a/radiant/xywindow.cpp +++ b/radiant/xywindow.cpp @@ -27,6 +27,8 @@ #include "xywindow.h" +#include + #include "debugging/debugging.h" #include "ientity.h" @@ -39,8 +41,8 @@ #include "image.h" #include "gtkutil/messagebox.h" -#include -#include +#include +#include #include "generic/callback.h" #include "string/string.h" @@ -56,6 +58,7 @@ #include "gtkutil/widget.h" #include "gtkutil/glwidget.h" #include "gtkutil/filechooser.h" +#include "gtkutil/cursor.h" #include "gtkmisc.h" #include "select.h" #include "csg.h" @@ -410,6 +413,7 @@ inline unsigned int buttons_for_button_and_modifiers( ButtonIdentifier button, M switch ( button.get() ) { + case ButtonEnumeration::INVALID: break; case ButtonEnumeration::LEFT: buttons |= RAD_LBUTTON; break; case ButtonEnumeration::MIDDLE: buttons |= RAD_MBUTTON; break; case ButtonEnumeration::RIGHT: buttons |= RAD_RBUTTON; break; @@ -525,6 +529,19 @@ void XYWnd_ZoomOut( XYWnd* xy ){ } } +void XYWnd::Redraw() { + if ( glwidget_make_current( m_gl_widget ) != FALSE ) { + if ( Map_Valid( g_map ) && ScreenUpdates_Enabled() ) { + GlobalOpenGL_debugAssertNoErrors(); + XY_Draw(); + GlobalOpenGL_debugAssertNoErrors(); + + m_XORRectangle.set( rectangle_t() ); + } + glwidget_swap_buffers( m_gl_widget ); + } +} + VIEWTYPE GlobalXYWnd_getCurrentViewType(){ ASSERT_NOTNULL( g_pParentWnd ); ASSERT_NOTNULL( g_pParentWnd->ActiveXY() ); @@ -536,7 +553,7 @@ VIEWTYPE GlobalXYWnd_getCurrentViewType(){ bool g_bCrossHairs = false; -GtkMenu* XYWnd::m_mnuDrop = 0; +ui::Menu XYWnd::m_mnuDrop(ui::null); // this is disabled, and broken // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=394 @@ -548,7 +565,7 @@ void WXY_Print(){ unsigned char* img; const char* filename; - filename = file_dialog( GTK_WIDGET( MainFrame_getWindow() ), FALSE, "Save Image", 0, FILTER_BMP ); + filename = ui::file_dialog( MainFrame_getWindow( ), FALSE, "Save Image", 0, FILTER_BMP ); if ( !filename ) { return; } @@ -705,12 +722,12 @@ bool XYWnd::chaseMouseMotion( int pointx, int pointy ){ Shader* XYWnd::m_state_selected = 0; void xy_update_xor_rectangle( XYWnd& self, rect_t area ){ - if ( GTK_WIDGET_VISIBLE( self.GetWidget() ) ) { + if ( self.GetWidget().visible() ) { self.m_XORRectangle.set( rectangle_from_area( area.min, area.max, self.Width(), self.Height() ) ); } } -gboolean xywnd_button_press( GtkWidget* widget, GdkEventButton* event, XYWnd* xywnd ){ +gboolean xywnd_button_press( ui::Widget widget, GdkEventButton* event, XYWnd* xywnd ){ if ( event->type == GDK_BUTTON_PRESS ) { g_pParentWnd->SetActiveXY( xywnd ); @@ -721,7 +738,7 @@ gboolean xywnd_button_press( GtkWidget* widget, GdkEventButton* event, XYWnd* xy return FALSE; } -gboolean xywnd_button_release( GtkWidget* widget, GdkEventButton* event, XYWnd* xywnd ){ +gboolean xywnd_button_release( ui::Widget widget, GdkEventButton* event, XYWnd* xywnd ){ if ( event->type == GDK_BUTTON_RELEASE ) { xywnd->XY_MouseUp( static_cast( event->x ), static_cast( event->y ), buttons_for_event_button( event ) ); @@ -730,7 +747,7 @@ gboolean xywnd_button_release( GtkWidget* widget, GdkEventButton* event, XYWnd* return FALSE; } -gboolean xywnd_focus_in( GtkWidget* widget, GdkEventFocus* event, XYWnd* xywnd ){ +gboolean xywnd_focus_in( ui::Widget widget, GdkEventFocus* event, XYWnd* xywnd ){ if ( event->type == GDK_FOCUS_CHANGE ) { if ( event->in ) { g_pParentWnd->SetActiveXY( xywnd ); @@ -746,7 +763,7 @@ void xywnd_motion( gdouble x, gdouble y, guint state, void* data ){ reinterpret_cast( data )->XY_MouseMoved( static_cast( x ), static_cast( y ), buttons_for_state( state ) ); } -gboolean xywnd_wheel_scroll( GtkWidget* widget, GdkEventScroll* event, XYWnd* xywnd ){ +gboolean xywnd_wheel_scroll( ui::Widget widget, GdkEventScroll* event, XYWnd* xywnd ){ if ( event->direction == GDK_SCROLL_UP ) { XYWnd_ZoomIn( xywnd ); } @@ -756,7 +773,7 @@ gboolean xywnd_wheel_scroll( GtkWidget* widget, GdkEventScroll* event, XYWnd* xy return FALSE; } -gboolean xywnd_size_allocate( GtkWidget* widget, GtkAllocation* allocation, XYWnd* xywnd ){ +gboolean xywnd_size_allocate( ui::Widget widget, GtkAllocation* allocation, XYWnd* xywnd ){ xywnd->m_nWidth = allocation->width; xywnd->m_nHeight = allocation->height; xywnd->updateProjection(); @@ -764,21 +781,11 @@ gboolean xywnd_size_allocate( GtkWidget* widget, GtkAllocation* allocation, XYWn return FALSE; } -gboolean xywnd_expose( GtkWidget* widget, GdkEventExpose* event, XYWnd* xywnd ){ - if ( glwidget_make_current( xywnd->GetWidget() ) != FALSE ) { - if ( Map_Valid( g_map ) && ScreenUpdates_Enabled() ) { - GlobalOpenGL_debugAssertNoErrors(); - xywnd->XY_Draw(); - GlobalOpenGL_debugAssertNoErrors(); - - xywnd->m_XORRectangle.set( rectangle_t() ); - } - glwidget_swap_buffers( xywnd->GetWidget() ); - } +gboolean xywnd_expose( ui::Widget widget, GdkEventExpose* event, XYWnd* xywnd ){ + xywnd->Redraw(); return FALSE; } - void XYWnd_CameraMoved( XYWnd& xywnd ){ if ( g_xywindow_globals_private.m_bCamXYUpdate ) { XYWnd_Update( xywnd ); @@ -787,12 +794,13 @@ void XYWnd_CameraMoved( XYWnd& xywnd ){ XYWnd::XYWnd() : m_gl_widget( glwidget_new( FALSE ) ), - m_deferredDraw( WidgetQueueDrawCaller( *m_gl_widget ) ), + m_deferredDraw( WidgetQueueDrawCaller( m_gl_widget ) ), m_deferred_motion( xywnd_motion, this ), - m_parent( 0 ), + m_parent( ui::null ), m_window_observer( NewWindowObserver() ), m_XORRectangle( m_gl_widget ), - m_chasemouse_handler( 0 ){ + m_chasemouse_handler( 0 ) { + m_bActive = false; m_buttonstate = 0; @@ -818,36 +826,39 @@ XYWnd::XYWnd() : m_entityCreate = false; - m_mnuDrop = 0; + m_mnuDrop = ui::Menu(ui::null); GlobalWindowObservers_add( m_window_observer ); GlobalWindowObservers_connectWidget( m_gl_widget ); - m_window_observer->setRectangleDrawCallback( ReferenceCaller1( *this ) ); + m_window_observer->setRectangleDrawCallback( ReferenceCaller( *this ) ); m_window_observer->setView( m_view ); - gtk_widget_ref( m_gl_widget ); + g_object_ref( m_gl_widget._handle ); gtk_widget_set_events( m_gl_widget, GDK_DESTROY | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_SCROLL_MASK ); - GTK_WIDGET_SET_FLAGS( m_gl_widget, GTK_CAN_FOCUS ); + gtk_widget_set_can_focus( m_gl_widget, true ); - m_sizeHandler = g_signal_connect( G_OBJECT( m_gl_widget ), "size_allocate", G_CALLBACK( xywnd_size_allocate ), this ); - m_exposeHandler = g_signal_connect( G_OBJECT( m_gl_widget ), "expose_event", G_CALLBACK( xywnd_expose ), this ); + m_sizeHandler = m_gl_widget.connect( "size_allocate", G_CALLBACK( xywnd_size_allocate ), this ); + m_exposeHandler = m_gl_widget.on_render( G_CALLBACK( xywnd_expose ), this ); - g_signal_connect( G_OBJECT( m_gl_widget ), "button_press_event", G_CALLBACK( xywnd_button_press ), this ); - g_signal_connect( G_OBJECT( m_gl_widget ), "button_release_event", G_CALLBACK( xywnd_button_release ), this ); - g_signal_connect( G_OBJECT( m_gl_widget ), "focus_in_event", G_CALLBACK( xywnd_focus_in ), this ); - g_signal_connect( G_OBJECT( m_gl_widget ), "motion_notify_event", G_CALLBACK( DeferredMotion::gtk_motion ), &m_deferred_motion ); + m_gl_widget.connect( "button_press_event", G_CALLBACK( xywnd_button_press ), this ); + m_gl_widget.connect( "button_release_event", G_CALLBACK( xywnd_button_release ), this ); + m_gl_widget.connect( "focus_in_event", G_CALLBACK( xywnd_focus_in ), this ); + m_gl_widget.connect( "motion_notify_event", G_CALLBACK( DeferredMotion::gtk_motion ), &m_deferred_motion ); - g_signal_connect( G_OBJECT( m_gl_widget ), "scroll_event", G_CALLBACK( xywnd_wheel_scroll ), this ); + m_gl_widget.connect( "scroll_event", G_CALLBACK( xywnd_wheel_scroll ), this ); Map_addValidCallback( g_map, DeferredDrawOnMapValidChangedCaller( m_deferredDraw ) ); - updateProjection(); - updateModelview(); + // This reconstruct=false argument is used to avoid a circular dependency + // between modelview and projection initialization and a valgrind complaint + updateProjection( false ); + updateModelview( false ); + m_view.Construct( m_projection, m_modelview, m_nWidth, m_nHeight ); - AddSceneChangeCallback( ReferenceCaller( *this ) ); - AddCameraMovedCallback( ReferenceCaller( *this ) ); + AddSceneChangeCallback( ReferenceCaller( *this ) ); + AddCameraMovedCallback( ReferenceCaller( *this ) ); PressedButtons_connect( g_pressedButtons, m_gl_widget ); @@ -857,15 +868,15 @@ XYWnd::XYWnd() : XYWnd::~XYWnd(){ onDestroyed(); - if ( m_mnuDrop != 0 ) { - gtk_widget_destroy( GTK_WIDGET( m_mnuDrop ) ); - m_mnuDrop = 0; + if ( m_mnuDrop ) { + m_mnuDrop.destroy(); + m_mnuDrop = ui::Menu(ui::null); } g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_sizeHandler ); g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_exposeHandler ); - gtk_widget_unref( m_gl_widget ); + m_gl_widget.unref(); m_window_observer->release(); } @@ -942,14 +953,11 @@ void XYWnd::Clipper_Crosshair_OnMouseMoved( int x, int y ){ Vector3 mousePosition; XY_ToPoint( x, y, mousePosition ); if ( ClipMode() && GlobalClipPoints_Find( mousePosition, (VIEWTYPE)m_viewType, m_fScale ) != 0 ) { - GdkCursor *cursor; - cursor = gdk_cursor_new( GDK_CROSSHAIR ); - gdk_window_set_cursor( m_gl_widget->window, cursor ); - gdk_cursor_unref( cursor ); + set_cursor ( m_gl_widget, GDK_CROSSHAIR ); } else { - gdk_window_set_cursor( m_gl_widget->window, 0 ); + default_cursor( m_gl_widget ); } } @@ -1058,37 +1066,37 @@ void XYWnd::NewBrushDrag( int x, int y ){ "textures/common/caulk" : TextureBrowser_GetSelectedShader( GlobalTextureBrowser() ) ); } -void entitycreate_activated( GtkWidget* item ){ +void entitycreate_activated( ui::Widget item ){ scene::Node* world_node = Map_FindWorldspawn( g_map ); - const char* entity_name = gtk_label_get_text( GTK_LABEL( GTK_BIN( item )->child ) ); + const char* entity_name = gtk_label_get_text( GTK_LABEL( gtk_bin_get_child(GTK_BIN( item )) ) ); if ( !( world_node && string_equal( entity_name, "worldspawn" ) ) ) { g_pParentWnd->ActiveXY()->OnEntityCreate( entity_name ); } else { - GlobalRadiant().m_pfnMessageBox( GTK_WIDGET( MainFrame_getWindow() ), "There's already a worldspawn in your map!" - "", - "Info", - eMB_OK, - eMB_ICONDEFAULT ); + GlobalRadiant().m_pfnMessageBox( MainFrame_getWindow(), + "There's already a worldspawn in your map!", + "Info", + eMB_OK, + eMB_ICONDEFAULT ); } } -void EntityClassMenu_addItem( GtkMenu* menu, const char* name ){ - GtkMenuItem* item = GTK_MENU_ITEM( gtk_menu_item_new_with_label( name ) ); - g_signal_connect( G_OBJECT( item ), "activate", G_CALLBACK( entitycreate_activated ), item ); - gtk_widget_show( GTK_WIDGET( item ) ); +void EntityClassMenu_addItem( ui::Menu menu, const char* name ){ + auto item = ui::MenuItem( name ); + item.connect( "activate", G_CALLBACK( entitycreate_activated ), item ); + item.show(); menu_add_item( menu, item ); } class EntityClassMenuInserter : public EntityClassVisitor { -typedef std::pair MenuPair; +typedef std::pair MenuPair; typedef std::vector MenuStack; MenuStack m_stack; CopiedString m_previous; public: -EntityClassMenuInserter( GtkMenu* menu ){ +EntityClassMenuInserter( ui::Menu menu ){ m_stack.reserve( 2 ); m_stack.push_back( MenuPair( menu, "" ) ); } @@ -1105,12 +1113,12 @@ void visit( EntityClass* e ){ m_previous = e->name(); } void pushMenu( const CopiedString& name ){ - GtkMenuItem* item = GTK_MENU_ITEM( gtk_menu_item_new_with_label( name.c_str() ) ); - gtk_widget_show( GTK_WIDGET( item ) ); - container_add_widget( GTK_CONTAINER( m_stack.back().first ), GTK_WIDGET( item ) ); + auto item = ui::MenuItem( name.c_str() ); + item.show(); + m_stack.back().first.add(item); - GtkMenu* submenu = GTK_MENU( gtk_menu_new() ); - gtk_menu_item_set_submenu( item, GTK_WIDGET( submenu ) ); + auto submenu = ui::Menu(ui::New); + gtk_menu_item_set_submenu( item, submenu ); m_stack.push_back( MenuPair( submenu, name ) ); } @@ -1151,8 +1159,8 @@ void XYWnd::OnContextMenu(){ return; } - if ( m_mnuDrop == 0 ) { // first time, load it up - GtkMenu* menu = m_mnuDrop = GTK_MENU( gtk_menu_new() ); + if ( !m_mnuDrop ) { // first time, load it up + auto menu = m_mnuDrop = ui::Menu(ui::New); EntityClassMenuInserter inserter( menu ); GlobalEntityClassManager().forEach( inserter ); @@ -1172,7 +1180,7 @@ void XYWnd_moveDelta( int x, int y, unsigned int state, void* data ){ reinterpret_cast( data )->Scroll( -x, y ); } -gboolean XYWnd_Move_focusOut( GtkWidget* widget, GdkEventFocus* event, XYWnd* xywnd ){ +gboolean XYWnd_Move_focusOut( ui::Widget widget, GdkEventFocus* event, XYWnd* xywnd ){ xywnd->Move_End(); return FALSE; } @@ -1182,13 +1190,13 @@ void XYWnd::Move_Begin(){ Move_End(); } m_move_started = true; - g_xywnd_freezePointer.freeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow(), XYWnd_moveDelta, this ); - m_move_focusOut = g_signal_connect( G_OBJECT( m_gl_widget ), "focus_out_event", G_CALLBACK( XYWnd_Move_focusOut ), this ); + g_xywnd_freezePointer.freeze_pointer( m_gl_widget, XYWnd_moveDelta, this ); + m_move_focusOut = m_gl_widget.connect( "focus_out_event", G_CALLBACK( XYWnd_Move_focusOut ), this ); } void XYWnd::Move_End(){ m_move_started = false; - g_xywnd_freezePointer.unfreeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow() ); + g_xywnd_freezePointer.unfreeze_pointer( m_gl_widget ); g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_move_focusOut ); } @@ -1217,7 +1225,7 @@ void XYWnd_zoomDelta( int x, int y, unsigned int state, void* data ){ } } -gboolean XYWnd_Zoom_focusOut( GtkWidget* widget, GdkEventFocus* event, XYWnd* xywnd ){ +gboolean XYWnd_Zoom_focusOut( ui::Widget widget, GdkEventFocus* event, XYWnd* xywnd ){ xywnd->Zoom_End(); return FALSE; } @@ -1228,13 +1236,13 @@ void XYWnd::Zoom_Begin(){ } m_zoom_started = true; g_dragZoom = 0; - g_xywnd_freezePointer.freeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow(), XYWnd_zoomDelta, this ); - m_zoom_focusOut = g_signal_connect( G_OBJECT( m_gl_widget ), "focus_out_event", G_CALLBACK( XYWnd_Zoom_focusOut ), this ); + g_xywnd_freezePointer.freeze_pointer( m_parent ? m_parent : MainFrame_getWindow(), XYWnd_zoomDelta, this ); + m_zoom_focusOut = m_gl_widget.connect( "focus_out_event", G_CALLBACK( XYWnd_Zoom_focusOut ), this ); } void XYWnd::Zoom_End(){ m_zoom_started = false; - g_xywnd_freezePointer.unfreeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow() ); + g_xywnd_freezePointer.unfreeze_pointer( m_parent ? m_parent : MainFrame_getWindow() ); g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_zoom_focusOut ); } @@ -1255,7 +1263,7 @@ void XYWnd::SetViewType( VIEWTYPE viewType ){ m_viewType = viewType; updateModelview(); - if ( m_parent != 0 ) { + if ( m_parent ) { gtk_window_set_title( m_parent, ViewType_getTitle( m_viewType ) ); } } @@ -1484,17 +1492,25 @@ void XYWnd::XY_DisableBackground( void ){ void WXY_BackgroundSelect( void ){ bool brushesSelected = Scene_countSelectedBrushes( GlobalSceneGraph() ) != 0; + + ui::Window main_window = MainFrame_getWindow(); + if ( !brushesSelected ) { - gtk_MessageBox( 0, "You have to select some brushes to get the bounding box for.\n", - "No selection", eMB_OK, eMB_ICONERROR ); + ui::alert( main_window, "You have to select some brushes to get the bounding box for.\n", + "No selection", ui::alert_type::OK, ui::alert_icon::Error ); return; } - const char *filename = file_dialog( GTK_WIDGET( MainFrame_getWindow() ), TRUE, "Background Image", NULL, NULL ); + const char *filename = main_window.file_dialog( TRUE, "Background Image", NULL, NULL ); + g_pParentWnd->ActiveXY()->XY_DisableBackground(); + if ( filename ) { g_pParentWnd->ActiveXY()->XY_LoadBackgroundImage( filename ); } + + // Draw the background image immediately (do not wait for user input). + g_pParentWnd->ActiveXY()->Redraw(); } /* @@ -2064,7 +2080,7 @@ void SetState( Shader* state, EStyle style ){ m_state_stack.back().m_state = state; } } -const EStyle getStyle() const { +EStyle getStyle() const { return eWireframeOnly; } void PushState(){ @@ -2098,7 +2114,7 @@ RenderStateFlags m_globalstate; Shader* m_state_selected; }; -void XYWnd::updateProjection(){ +void XYWnd::updateProjection( bool reconstruct ){ m_projection[0] = 1.0f / static_cast( m_nWidth / 2 ); m_projection[5] = 1.0f / static_cast( m_nHeight / 2 ); m_projection[10] = 1.0f / ( g_MaxWorldCoord * m_fScale ); @@ -2121,11 +2137,13 @@ void XYWnd::updateProjection(){ m_projection[15] = 1.0f; - m_view.Construct( m_projection, m_modelview, m_nWidth, m_nHeight ); + if (reconstruct) { + m_view.Construct( m_projection, m_modelview, m_nWidth, m_nHeight ); + } } // note: modelview matrix must have a uniform scale, otherwise strange things happen when rendering the rotation manipulator. -void XYWnd::updateModelview(){ +void XYWnd::updateModelview( bool reconstruct ){ int nDim1 = ( m_viewType == YZ ) ? 1 : 0; int nDim2 = ( m_viewType == XY ) ? 1 : 2; @@ -2181,7 +2199,9 @@ void XYWnd::updateModelview(){ m_modelview[3] = m_modelview[7] = m_modelview[11] = 0; m_modelview[15] = 1; - m_view.Construct( m_projection, m_modelview, m_nWidth, m_nHeight ); + if (reconstruct) { + m_view.Construct( m_projection, m_modelview, m_nWidth, m_nHeight ); + } } /* @@ -2537,20 +2557,20 @@ void ToggleShowGrid(){ ToggleShown g_xy_top_shown( true ); -void XY_Top_Shown_Construct( GtkWindow* parent ){ - g_xy_top_shown.connect( GTK_WIDGET( parent ) ); +void XY_Top_Shown_Construct( ui::Window parent ){ + g_xy_top_shown.connect( parent ); } ToggleShown g_yz_side_shown( false ); -void YZ_Side_Shown_Construct( GtkWindow* parent ){ - g_yz_side_shown.connect( GTK_WIDGET( parent ) ); +void YZ_Side_Shown_Construct( ui::Window parent ){ + g_yz_side_shown.connect( parent ); } ToggleShown g_xz_front_shown( false ); -void XZ_Front_Shown_Construct( GtkWindow* parent ){ - g_xz_front_shown.connect( GTK_WIDGET( parent ) ); +void XZ_Front_Shown_Construct( ui::Window parent ){ + g_xz_front_shown.connect( parent ); } @@ -2566,9 +2586,9 @@ void realise(){ } void unrealise(){ if ( ++m_unrealised == 1 ) { - if ( XYWnd::m_mnuDrop != 0 ) { - gtk_widget_destroy( GTK_WIDGET( XYWnd::m_mnuDrop ) ); - XYWnd::m_mnuDrop = 0; + if ( XYWnd::m_mnuDrop ) { + XYWnd::m_mnuDrop.destroy(); + XYWnd::m_mnuDrop = ui::Menu(ui::null); } } } @@ -2583,98 +2603,98 @@ void ShowNamesToggle(){ GlobalEntityCreator().setShowNames( !GlobalEntityCreator().getShowNames() ); XY_UpdateAllWindows(); } -typedef FreeCaller ShowNamesToggleCaller; -void ShowNamesExport( const BoolImportCallback& importer ){ +typedef FreeCaller ShowNamesToggleCaller; +void ShowNamesExport( const Callback & importer ){ importer( GlobalEntityCreator().getShowNames() ); } -typedef FreeCaller1 ShowNamesExportCaller; +typedef FreeCaller &), ShowNamesExport> ShowNamesExportCaller; void ShowAnglesToggle(){ GlobalEntityCreator().setShowAngles( !GlobalEntityCreator().getShowAngles() ); XY_UpdateAllWindows(); } -typedef FreeCaller ShowAnglesToggleCaller; -void ShowAnglesExport( const BoolImportCallback& importer ){ +typedef FreeCaller ShowAnglesToggleCaller; +void ShowAnglesExport( const Callback & importer ){ importer( GlobalEntityCreator().getShowAngles() ); } -typedef FreeCaller1 ShowAnglesExportCaller; +typedef FreeCaller &), ShowAnglesExport> ShowAnglesExportCaller; void ShowBlocksToggle(){ g_xywindow_globals_private.show_blocks ^= 1; XY_UpdateAllWindows(); } -typedef FreeCaller ShowBlocksToggleCaller; -void ShowBlocksExport( const BoolImportCallback& importer ){ +typedef FreeCaller ShowBlocksToggleCaller; +void ShowBlocksExport( const Callback & importer ){ importer( g_xywindow_globals_private.show_blocks ); } -typedef FreeCaller1 ShowBlocksExportCaller; +typedef FreeCaller &), ShowBlocksExport> ShowBlocksExportCaller; void ShowCoordinatesToggle(){ g_xywindow_globals_private.show_coordinates ^= 1; XY_UpdateAllWindows(); } -typedef FreeCaller ShowCoordinatesToggleCaller; -void ShowCoordinatesExport( const BoolImportCallback& importer ){ +typedef FreeCaller ShowCoordinatesToggleCaller; +void ShowCoordinatesExport( const Callback & importer ){ importer( g_xywindow_globals_private.show_coordinates ); } -typedef FreeCaller1 ShowCoordinatesExportCaller; +typedef FreeCaller &), ShowCoordinatesExport> ShowCoordinatesExportCaller; void ShowOutlineToggle(){ g_xywindow_globals_private.show_outline ^= 1; XY_UpdateAllWindows(); } -typedef FreeCaller ShowOutlineToggleCaller; -void ShowOutlineExport( const BoolImportCallback& importer ){ +typedef FreeCaller ShowOutlineToggleCaller; +void ShowOutlineExport( const Callback & importer ){ importer( g_xywindow_globals_private.show_outline ); } -typedef FreeCaller1 ShowOutlineExportCaller; +typedef FreeCaller &), ShowOutlineExport> ShowOutlineExportCaller; void ShowAxesToggle(){ g_xywindow_globals_private.show_axis ^= 1; XY_UpdateAllWindows(); } -typedef FreeCaller ShowAxesToggleCaller; -void ShowAxesExport( const BoolImportCallback& importer ){ +typedef FreeCaller ShowAxesToggleCaller; +void ShowAxesExport( const Callback & importer ){ importer( g_xywindow_globals_private.show_axis ); } -typedef FreeCaller1 ShowAxesExportCaller; +typedef FreeCaller &), ShowAxesExport> ShowAxesExportCaller; void ShowWorkzoneToggle(){ g_xywindow_globals_private.d_show_work ^= 1; XY_UpdateAllWindows(); } -typedef FreeCaller ShowWorkzoneToggleCaller; -void ShowWorkzoneExport( const BoolImportCallback& importer ){ +typedef FreeCaller ShowWorkzoneToggleCaller; +void ShowWorkzoneExport( const Callback & importer ){ importer( g_xywindow_globals_private.d_show_work ); } -typedef FreeCaller1 ShowWorkzoneExportCaller; +typedef FreeCaller &), ShowWorkzoneExport> ShowWorkzoneExportCaller; ShowNamesExportCaller g_show_names_caller; -BoolExportCallback g_show_names_callback( g_show_names_caller ); +Callback &)> g_show_names_callback( g_show_names_caller ); ToggleItem g_show_names( g_show_names_callback ); ShowAnglesExportCaller g_show_angles_caller; -BoolExportCallback g_show_angles_callback( g_show_angles_caller ); +Callback &)> g_show_angles_callback( g_show_angles_caller ); ToggleItem g_show_angles( g_show_angles_callback ); ShowBlocksExportCaller g_show_blocks_caller; -BoolExportCallback g_show_blocks_callback( g_show_blocks_caller ); +Callback &)> g_show_blocks_callback( g_show_blocks_caller ); ToggleItem g_show_blocks( g_show_blocks_callback ); ShowCoordinatesExportCaller g_show_coordinates_caller; -BoolExportCallback g_show_coordinates_callback( g_show_coordinates_caller ); +Callback &)> g_show_coordinates_callback( g_show_coordinates_caller ); ToggleItem g_show_coordinates( g_show_coordinates_callback ); ShowOutlineExportCaller g_show_outline_caller; -BoolExportCallback g_show_outline_callback( g_show_outline_caller ); +Callback &)> g_show_outline_callback( g_show_outline_caller ); ToggleItem g_show_outline( g_show_outline_callback ); ShowAxesExportCaller g_show_axes_caller; -BoolExportCallback g_show_axes_callback( g_show_axes_caller ); +Callback &)> g_show_axes_callback( g_show_axes_caller ); ToggleItem g_show_axes( g_show_axes_callback ); ShowWorkzoneExportCaller g_show_workzone_caller; -BoolExportCallback g_show_workzone_callback( g_show_workzone_caller ); +Callback &)> g_show_workzone_callback( g_show_workzone_caller ); ToggleItem g_show_workzone( g_show_workzone_callback ); void XYShow_registerCommands(){ @@ -2705,7 +2725,7 @@ void Orthographic_constructPage( PreferenceGroup& group ){ Orthographic_constructPreferences( page ); } void Orthographic_registerPreferencesPage(){ - PreferencesDialog_addSettingsPage( FreeCaller1() ); + PreferencesDialog_addSettingsPage( makeCallbackF(Orthographic_constructPage) ); } void Clipper_constructPreferences( PreferencesPage& page ){ @@ -2716,7 +2736,7 @@ void Clipper_constructPage( PreferenceGroup& group ){ Clipper_constructPreferences( page ); } void Clipper_registerPreferencesPage(){ - PreferencesDialog_addSettingsPage( FreeCaller1() ); + PreferencesDialog_addSettingsPage( makeCallbackF(Clipper_constructPage) ); } @@ -2724,61 +2744,60 @@ void Clipper_registerPreferencesPage(){ #include "stringio.h" +struct ToggleShown_Bool { + static void Export(const ToggleShown &self, const Callback &returnz) { + returnz(self.active()); + } - -void ToggleShown_importBool( ToggleShown& self, bool value ){ - self.set( value ); -} -typedef ReferenceCaller1 ToggleShownImportBoolCaller; -void ToggleShown_exportBool( const ToggleShown& self, const BoolImportCallback& importer ){ - importer( self.active() ); -} -typedef ConstReferenceCaller1 ToggleShownExportBoolCaller; + static void Import(ToggleShown &self, bool value) { + self.set(value); + } +}; void XYWindow_Construct(){ - GlobalCommands_insert( "ToggleCrosshairs", FreeCaller(), Accelerator( 'X', (GdkModifierType)GDK_SHIFT_MASK ) ); - GlobalCommands_insert( "ToggleSizePaint", FreeCaller(), Accelerator( 'J' ) ); - GlobalCommands_insert( "ToggleGrid", FreeCaller(), Accelerator( '0' ) ); + GlobalCommands_insert( "ToggleCrosshairs", makeCallbackF(ToggleShowCrosshair), Accelerator( 'X', (GdkModifierType)GDK_SHIFT_MASK ) ); + GlobalCommands_insert( "ToggleSizePaint", makeCallbackF(ToggleShowSizeInfo), Accelerator( 'J' ) ); + GlobalCommands_insert( "ToggleGrid", makeCallbackF(ToggleShowGrid), Accelerator( '0' ) ); GlobalToggles_insert( "ToggleView", ToggleShown::ToggleCaller( g_xy_top_shown ), ToggleItem::AddCallbackCaller( g_xy_top_shown.m_item ), Accelerator( 'V', (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) ); GlobalToggles_insert( "ToggleSideView", ToggleShown::ToggleCaller( g_yz_side_shown ), ToggleItem::AddCallbackCaller( g_yz_side_shown.m_item ) ); GlobalToggles_insert( "ToggleFrontView", ToggleShown::ToggleCaller( g_xz_front_shown ), ToggleItem::AddCallbackCaller( g_xz_front_shown.m_item ) ); - GlobalCommands_insert( "NextView", FreeCaller(), Accelerator( GDK_Tab, (GdkModifierType)GDK_CONTROL_MASK ) ); - GlobalCommands_insert( "ZoomIn", FreeCaller(), Accelerator( GDK_Delete ) ); - GlobalCommands_insert( "ZoomOut", FreeCaller(), Accelerator( GDK_Insert ) ); - GlobalCommands_insert( "ViewTop", FreeCaller(), Accelerator( GDK_KP_Home ) ); - GlobalCommands_insert( "ViewSide", FreeCaller(), Accelerator( GDK_KP_Page_Down ) ); - GlobalCommands_insert( "ViewFront", FreeCaller(), Accelerator( GDK_KP_End ) ); - GlobalCommands_insert( "Zoom100", FreeCaller() ); - GlobalCommands_insert( "CenterXYView", FreeCaller(), Accelerator( GDK_Tab, (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) ); - - GlobalPreferenceSystem().registerPreference( "ClipCaulk", BoolImportStringCaller( g_clip_useCaulk ), BoolExportStringCaller( g_clip_useCaulk ) ); - - GlobalPreferenceSystem().registerPreference( "NewRightClick", BoolImportStringCaller( g_xywindow_globals.m_bRightClick ), BoolExportStringCaller( g_xywindow_globals.m_bRightClick ) ); - GlobalPreferenceSystem().registerPreference( "ChaseMouse", BoolImportStringCaller( g_xywindow_globals_private.m_bChaseMouse ), BoolExportStringCaller( g_xywindow_globals_private.m_bChaseMouse ) ); - GlobalPreferenceSystem().registerPreference( "SizePainting", BoolImportStringCaller( g_xywindow_globals_private.m_bSizePaint ), BoolExportStringCaller( g_xywindow_globals_private.m_bSizePaint ) ); - GlobalPreferenceSystem().registerPreference( "NoStipple", BoolImportStringCaller( g_xywindow_globals.m_bNoStipple ), BoolExportStringCaller( g_xywindow_globals.m_bNoStipple ) ); - GlobalPreferenceSystem().registerPreference( "SI_ShowCoords", BoolImportStringCaller( g_xywindow_globals_private.show_coordinates ), BoolExportStringCaller( g_xywindow_globals_private.show_coordinates ) ); - GlobalPreferenceSystem().registerPreference( "SI_ShowOutlines", BoolImportStringCaller( g_xywindow_globals_private.show_outline ), BoolExportStringCaller( g_xywindow_globals_private.show_outline ) ); - GlobalPreferenceSystem().registerPreference( "SI_ShowAxis", BoolImportStringCaller( g_xywindow_globals_private.show_axis ), BoolExportStringCaller( g_xywindow_globals_private.show_axis ) ); - GlobalPreferenceSystem().registerPreference( "CamXYUpdate", BoolImportStringCaller( g_xywindow_globals_private.m_bCamXYUpdate ), BoolExportStringCaller( g_xywindow_globals_private.m_bCamXYUpdate ) ); - GlobalPreferenceSystem().registerPreference( "ShowWorkzone", BoolImportStringCaller( g_xywindow_globals_private.d_show_work ), BoolExportStringCaller( g_xywindow_globals_private.d_show_work ) ); - - GlobalPreferenceSystem().registerPreference( "SI_AxisColors0", Vector3ImportStringCaller( g_xywindow_globals.AxisColorX ), Vector3ExportStringCaller( g_xywindow_globals.AxisColorX ) ); - GlobalPreferenceSystem().registerPreference( "SI_AxisColors1", Vector3ImportStringCaller( g_xywindow_globals.AxisColorY ), Vector3ExportStringCaller( g_xywindow_globals.AxisColorY ) ); - GlobalPreferenceSystem().registerPreference( "SI_AxisColors2", Vector3ImportStringCaller( g_xywindow_globals.AxisColorZ ), Vector3ExportStringCaller( g_xywindow_globals.AxisColorZ ) ); - GlobalPreferenceSystem().registerPreference( "SI_Colors1", Vector3ImportStringCaller( g_xywindow_globals.color_gridback ), Vector3ExportStringCaller( g_xywindow_globals.color_gridback ) ); - GlobalPreferenceSystem().registerPreference( "SI_Colors2", Vector3ImportStringCaller( g_xywindow_globals.color_gridminor ), Vector3ExportStringCaller( g_xywindow_globals.color_gridminor ) ); - GlobalPreferenceSystem().registerPreference( "SI_Colors3", Vector3ImportStringCaller( g_xywindow_globals.color_gridmajor ), Vector3ExportStringCaller( g_xywindow_globals.color_gridmajor ) ); - GlobalPreferenceSystem().registerPreference( "SI_Colors6", Vector3ImportStringCaller( g_xywindow_globals.color_gridblock ), Vector3ExportStringCaller( g_xywindow_globals.color_gridblock ) ); - GlobalPreferenceSystem().registerPreference( "SI_Colors7", Vector3ImportStringCaller( g_xywindow_globals.color_gridtext ), Vector3ExportStringCaller( g_xywindow_globals.color_gridtext ) ); - GlobalPreferenceSystem().registerPreference( "SI_Colors8", Vector3ImportStringCaller( g_xywindow_globals.color_brushes ), Vector3ExportStringCaller( g_xywindow_globals.color_brushes ) ); - GlobalPreferenceSystem().registerPreference( "SI_Colors14", Vector3ImportStringCaller( g_xywindow_globals.color_gridmajor_alt ), Vector3ExportStringCaller( g_xywindow_globals.color_gridmajor_alt ) ); - - - GlobalPreferenceSystem().registerPreference( "XZVIS", makeBoolStringImportCallback( ToggleShownImportBoolCaller( g_xz_front_shown ) ), makeBoolStringExportCallback( ToggleShownExportBoolCaller( g_xz_front_shown ) ) ); - GlobalPreferenceSystem().registerPreference( "YZVIS", makeBoolStringImportCallback( ToggleShownImportBoolCaller( g_yz_side_shown ) ), makeBoolStringExportCallback( ToggleShownExportBoolCaller( g_yz_side_shown ) ) ); + GlobalCommands_insert( "NextView", makeCallbackF(XY_Next), Accelerator( GDK_KEY_Tab, (GdkModifierType)GDK_CONTROL_MASK ) ); // fixme: doesn't show its shortcut + GlobalCommands_insert( "ZoomIn", makeCallbackF(XY_ZoomIn), Accelerator( GDK_KEY_Delete ) ); + GlobalCommands_insert( "ZoomOut", makeCallbackF(XY_ZoomOut), Accelerator( GDK_KEY_Insert ) ); + GlobalCommands_insert( "ViewTop", makeCallbackF(XY_Top), Accelerator( GDK_KEY_KP_Home ) ); + GlobalCommands_insert( "ViewSide", makeCallbackF(XY_Side), Accelerator( GDK_KEY_KP_Page_Down ) ); + GlobalCommands_insert( "ViewFront", makeCallbackF(XY_Front), Accelerator( GDK_KEY_KP_End ) ); + GlobalCommands_insert( "Zoom100", makeCallbackF(XY_Zoom100) ); + GlobalCommands_insert( "CenterXYView", makeCallbackF(XY_Focus), Accelerator( GDK_KEY_Tab, (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) ); + + GlobalPreferenceSystem().registerPreference( "ClipCaulk", make_property_string( g_clip_useCaulk ) ); + + GlobalPreferenceSystem().registerPreference( "NewRightClick", make_property_string( g_xywindow_globals.m_bRightClick ) ); + GlobalPreferenceSystem().registerPreference( "ChaseMouse", make_property_string( g_xywindow_globals_private.m_bChaseMouse ) ); + GlobalPreferenceSystem().registerPreference( "SizePainting", make_property_string( g_xywindow_globals_private.m_bSizePaint ) ); + GlobalPreferenceSystem().registerPreference( "NoStipple", make_property_string( g_xywindow_globals.m_bNoStipple ) ); + GlobalPreferenceSystem().registerPreference( "SI_ShowCoords", make_property_string( g_xywindow_globals_private.show_coordinates ) ); + GlobalPreferenceSystem().registerPreference( "SI_ShowOutlines", make_property_string( g_xywindow_globals_private.show_outline ) ); + GlobalPreferenceSystem().registerPreference( "SI_ShowAxis", make_property_string( g_xywindow_globals_private.show_axis ) ); + GlobalPreferenceSystem().registerPreference( "CamXYUpdate", make_property_string( g_xywindow_globals_private.m_bCamXYUpdate ) ); + GlobalPreferenceSystem().registerPreference( "ShowWorkzone", make_property_string( g_xywindow_globals_private.d_show_work ) ); + + GlobalPreferenceSystem().registerPreference( "SI_AxisColors0", make_property_string( g_xywindow_globals.AxisColorX ) ); + GlobalPreferenceSystem().registerPreference( "SI_AxisColors1", make_property_string( g_xywindow_globals.AxisColorY ) ); + GlobalPreferenceSystem().registerPreference( "SI_AxisColors2", make_property_string( g_xywindow_globals.AxisColorZ ) ); + GlobalPreferenceSystem().registerPreference( "SI_Colors1", make_property_string( g_xywindow_globals.color_gridback ) ); + GlobalPreferenceSystem().registerPreference( "SI_Colors2", make_property_string( g_xywindow_globals.color_gridminor ) ); + GlobalPreferenceSystem().registerPreference( "SI_Colors3", make_property_string( g_xywindow_globals.color_gridmajor ) ); + GlobalPreferenceSystem().registerPreference( "SI_Colors6", make_property_string( g_xywindow_globals.color_gridblock ) ); + GlobalPreferenceSystem().registerPreference( "SI_Colors7", make_property_string( g_xywindow_globals.color_gridtext ) ); + GlobalPreferenceSystem().registerPreference( "SI_Colors8", make_property_string( g_xywindow_globals.color_brushes ) ); + GlobalPreferenceSystem().registerPreference( "SI_Colors14", make_property_string( g_xywindow_globals.color_gridmajor_alt ) ); + + + GlobalPreferenceSystem().registerPreference( "XZVIS", make_property_string( g_xz_front_shown ) ); + GlobalPreferenceSystem().registerPreference( "YZVIS", make_property_string( g_yz_side_shown ) ); Orthographic_registerPreferencesPage(); Clipper_registerPreferencesPage();