diff options
| author | kasull <qsullian@gmail.com> | 2026-03-05 11:38:03 -0500 |
|---|---|---|
| committer | kasull <qsullian@gmail.com> | 2026-03-05 11:38:03 -0500 |
| commit | 7c8b5072d8441aa6a7da9bd7560c47ba8c41270b (patch) | |
| tree | 7f3a076dd4c651047dfcea82dbf05aa90ea83ed0 /src/editor/editor_window.cpp | |
| parent | 54bcabc374b438ee288964d6f6314f5da2121a0e (diff) | |
split UI components and make menubar data-driven
replace monolithic gui.cpp with focused editor UI component files
shared editor_gui_internal.h for layout constants and cross-component helpers
modular menubar rendering/input
Diffstat (limited to 'src/editor/editor_window.cpp')
| -rw-r--r-- | src/editor/editor_window.cpp | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/src/editor/editor_window.cpp b/src/editor/editor_window.cpp new file mode 100644 index 0000000..51ca67d --- /dev/null +++ b/src/editor/editor_window.cpp @@ -0,0 +1,285 @@ +#include "editor_gui_internal.h" + +#include "../game.h" + +void gui_editorwindow_draw_fn( void* ptr ) { + GUI_EDITORWINDOW* wnd = (GUI_EDITORWINDOW*)ptr; + editor_raise_header_toolbar( editor ); + + GUI_BASE* toolbar = ( editor && editor->map ) ? editor->gui.header_toolbar : 0; + GUI_EDITOR_TOOLBAR* tbar = (GUI_EDITOR_TOOLBAR*)toolbar; + U8 menu_open = editor_toolbar_menu_open( tbar ); + + F32 saved_mx = input.mouse.pos.x; + F32 saved_my = input.mouse.pos.y; + if( menu_open ) { + editor_menu_hover_mask_active = 1; + editor_menu_hover_real_x = (I32)saved_mx; + editor_menu_hover_real_y = (I32)saved_my; + input.mouse.pos.x = -100000.f; + input.mouse.pos.y = -100000.f; + } else { + editor_menu_hover_mask_active = 0; + } + + CLR clr = gui_is_fg_window( wnd ) ? ui_clr.border : ui_clr.border_inactive; + gui_draw_frect( wnd->x, wnd->y, wnd->w, wnd->h, clr ); + gui_draw_frect( wnd->x + 1, wnd->y + 1, wnd->w - 2, wnd->h - 2, ui_clr.bg ); + + wnd->children.each( fn( GUI_BASE** ptr ) { + GUI_BASE* it = *ptr; + if( !it->enabled ) return; + if( it->draw_fn ) it->draw_fn( it ); + else dlog( "gui_editorwindow_draw_fn(): child %p has no draw_fn", it ); + } ); + + input.mouse.pos.x = saved_mx; + input.mouse.pos.y = saved_my; + editor_menu_hover_mask_active = 0; +} + +static void gui_editorwindow_input_fn( void* ptr ) { + GUI_EDITORWINDOW* wnd = (GUI_EDITORWINDOW*)ptr; + editor_raise_header_toolbar( editor ); + + GUI_BASE* toolbar = ( editor && editor->map ) ? editor->gui.header_toolbar : 0; + if( toolbar && toolbar->enabled && toolbar->input_fn ) + toolbar->input_fn( toolbar ); + + GUI_EDITOR_TOOLBAR* tbar = (GUI_EDITOR_TOOLBAR*)toolbar; + if( editor_toolbar_menu_open( tbar ) ) + return; + + wnd->children.each( fn( GUI_BASE** childptr ) { + GUI_BASE* child = *childptr; + if( !child || child == toolbar || !child->enabled || !child->input_fn ) + return; + child->input_fn( child ); + } ); +} + +GUI_EDITORWINDOW* gui_editorwindow_create( I32 w, I32 h ) { + GUI_EDITORWINDOW* wnd = new GUI_EDITORWINDOW; + wnd->x = 0; + wnd->y = 0; + wnd->xbound = wnd->w = w; + wnd->ybound = wnd->h = h; + wnd->locked = 1; + wnd->draw_fn = gui_editorwindow_draw_fn; + wnd->input_fn = gui_editorwindow_input_fn; + strcpy( wnd->name, "EDITORWINDOW" ); + + _gui.windows.push( wnd ); + gui_set_window( wnd ); + gui_set_view( 0 ); + gui_view( 1, 1, w - 2, h - 2 ); + return wnd; +} + +GUI_EDITORWINDOW* gui_editorwindow( I32 w, I32 h ) { + GUI_EDITORWINDOW* wnd = gui_editorwindow_create( w, h ); + GAME_EDITOR* e = editor; + LIST<GUI_LIST_ENTRY>* map_list = editor_get_map_list( e ); + gui_list( wnd->w / 2 - 100, EDITOR_LAYOUT_CONTENT_Y, 200, 200, "map list", map_list, &editor->gui.map_select ); + gui_button( wnd->w / 2 - 100, EDITOR_LAYOUT_CONTENT_Y + 220, 95, 25, "new map", editor_new_map_cb ); + gui_button( wnd->w / 2 + 5, EDITOR_LAYOUT_CONTENT_Y + 220, 95, 25, "load map", editor_load_map_cb ); + return wnd; +} + +void editor_update_properties_column( GAME_EDITOR* e ) { + GAME_EDITOR::EDITOR_GUI* egui = &e->gui; + gui_editor_propview_update( egui->props ); +} + +void editor_create_properties_column( GAME_EDITOR* e ) { + GAME_EDITOR::EDITOR_GUI* egui = &e->gui; + egui->props = gui_editor_propview( 10, EDITOR_LAYOUT_CONTENT_Y, 300, 460 ); + gui_editor_propview_select( egui->props, e->map, EDITOR_SELECT_ORIGIN ); +} + +void editor_create_auxiliary_panels( GAME_EDITOR* e ) { + GAME_EDITOR::EDITOR_GUI* egui = &e->gui; + egui->assets = gui_editor_infobox( 10, EDITOR_LAYOUT_CONTENT_Y + 310, 300, 180, EDITOR_INFOBOX_ASSETS, "EDITOR_ASSETS_VIEW" ); + egui->status = gui_editor_infobox( 10, 568, 780, EDITOR_LAYOUT_STATUS_H, EDITOR_INFOBOX_STATUS, "EDITOR_STATUS_VIEW" ); +} + +void editor_update_toolview( GAME_EDITOR* e ) { + GAME_EDITOR::EDITOR_GUI* egui = &e->gui; + gui_editor_toolview_update( egui->tool ); +} + +void settool( U8 t ) { + editor->tool.type = t; + if( editor->gui.v2d ) + editor->gui.v2d->poly_drag = 0; + if( editor->gui.tool ) + editor_update_toolview( editor ); +} + +const char* editor_tool_name() { + switch( editor->tool.type ) { + case EDITOR_TOOL_SELECT: return "select"; + case EDITOR_TOOL_WALL: return "wall"; + case EDITOR_TOOL_POLY: return "poly"; + case EDITOR_TOOL_SPRITE: return "sprite"; + case EDITOR_TOOL_ENT: return "ent"; + default: return "none"; + } +} + +static U8 EDITOR_TOOL_BUTTON_TYPES[] = { + EDITOR_TOOL_NONE, + EDITOR_TOOL_SELECT, + EDITOR_TOOL_WALL, + EDITOR_TOOL_POLY, + EDITOR_TOOL_SPRITE, + EDITOR_TOOL_ENT +}; + +static void settool_btn_cb( void* ptr ) { + GUI_BUTTON* btn = (GUI_BUTTON*)ptr; + if( !btn || !btn->extra ) + return; + + settool( *(U8*)btn->extra ); +} + +void editor_create_toolview_column( GAME_EDITOR* e ) { + GAME_EDITOR::EDITOR_GUI* egui = &e->gui; + + I32 x = 320; + I32 y = EDITOR_LAYOUT_CONTENT_Y + EDITOR_LAYOUT_VIEW_DEFAULT_H + EDITOR_LAYOUT_VIEW_TOOL_GAP + EDITOR_LAYOUT_TOOL_BTN_TOP_GAP; + I32 off = 23; + const char* labels[] = { "none", "select", "wall", "poly", "sprite", "ent" }; + + for( U32 i = 0; i < sizeof( labels ) / sizeof( labels[0] ); ++i ) { + GUI_BUTTON* btn = gui_button( x, y, 45, 20, labels[i], settool_btn_cb ); + btn->extra = &EDITOR_TOOL_BUTTON_TYPES[i]; + y += off; + } + + egui->tool = gui_editor_toolview( 370, y - EDITOR_LAYOUT_TOOL_BTN_TOP_GAP, 300, 150 ); + gui_editor_toolview_update( egui->tool ); +} + +void editor_create_game_view_column( GAME_EDITOR* e ) { + GAME_EDITOR::EDITOR_GUI* egui = &e->gui; + I32 x = 320, y = EDITOR_LAYOUT_CONTENT_Y; + egui->v2d = gui_editor_2dview( x, y, 468, 370 ); + egui->v3d = gui_editor_3dview( x, y, 468, 370 ); + egui->v2d->enabled = 1; + egui->v3d->enabled = 0; +} + +void editor_create_map_view( GAME_EDITOR* e ) { + if( !e->map ) { + dlog( "editor_create_map_views() : no map loaded\n" ); + return; + } + + GUI_EDITORWINDOW* w = e->wnd; + w->children.each( fn( GUI_BASE** ptr ) { + gui_free( *ptr ); + } ); + w->children.clear(); + editor_clear_gui_state_refs( e ); + + e->gui.view2d_type = EDITOR_2DVIEW_TOP_DOWN; + e->gui.view_mode = EDITOR_VIEWMODE_2D; + + gui_set_window( w ); + gui_set_view( 0 ); + gui_view( 1, 1, w->w - 2, w->h - 2 ); + + editor_create_header_controls( e ); + editor_create_properties_column( e ); + editor_create_toolview_column( e ); + editor_create_game_view_column( e ); + editor_create_auxiliary_panels( e ); + editor_layout_map_view( e ); +} + +void editor_resize( GAME_EDITOR* e, I32 w, I32 h ) { + if( !e || !e->wnd ) + return; + + w = max( 1, w ); + h = max( 1, h ); + + GUI_EDITORWINDOW* wnd = e->wnd; + if( wnd->w == w && wnd->h == h ) + return; + + editor_set_bounds( wnd, 0, 0, w, h ); + editor_resize_base_view( wnd ); + + if( e->map ) editor_layout_map_view( e ); + else editor_layout_start_menu( e ); + + if( !e->gui.new_map_popup ) + return; + + GUI_WINDOW* popup = e->gui.new_map_popup; + if( popup->x > w - 5 ) popup->x = w - 5; + if( popup->x + popup->w < 5 ) popup->x = 5 - popup->w; + if( popup->y > h - 5 ) popup->y = h - 5; + if( popup->y + popup->h < 5 ) popup->y = 5 - popup->h; +} + +void close_new_map_popup( void* ) { + gui_push_callback( pfn( void* ) { + GUI_WINDOW* popup = editor->gui.new_map_popup; + if( !popup ) + return; + + gui_free( popup ); + editor->gui.new_map_popup = 0; + } ); +} + +void editor_new_map_cb( void* ptr ) { + if( editor->gui.new_map_popup ) + return; + + GUI_WINDOW* cwnd = gui_get_window(); + GUI_VIEW* view = gui_get_view(); + + I32 wx = 250; + I32 wy = 140; + I32 ww = 300; + I32 wh = 200; + + editor->gui.new_map_popup = gui_window( wx, wy, ww, wh ); + gui_title( "new map" ); + GUI_TEXTBOX* tb = gui_textbox( 10, 20, ww - 20, 20, "name", 32 ); + tb->active = 1; + + gui_button( ww - 50 - 70, wh - 20 - 10, 50, 20, "ok", pfn( void* ptr ) { + GUI_BUTTON* btn = (GUI_BUTTON*)ptr; + GUI_TEXTBOX* name = (GUI_TEXTBOX*)gui_find_node( btn->parent, "name" ); + if( !name ) + return; + + editor_new_map( editor, name->value ); + close_new_map_popup( 0 ); + } ); + + gui_button( ww - 50 - 10, wh - 20 - 10, 50, 20, "cancel", close_new_map_popup ); + gui_set_window( cwnd ); + gui_set_view( view ); +} + +void editor_load_map_cb( void* ptr ) { + GUI_LIST* list = (GUI_LIST*)gui_find_node( editor->wnd, "map list" ); + GUI_LIST_ENTRY* e = gui_list_get_selected( list ); + if( !e ) + return; + + char full_path[256]; + sprintf( full_path, "../assets/maps/%s", e->title ); + + if( editor->map ) + editor_close( editor ); + + editor_load_map( editor, full_path ); +} |
