/* * main logic. * If component is a ".", don't do anything. * If it's a "..", back track one entry. * For everything else, add the entry to the end of our "list" */ int main(int argc, char *argv[]) { char *cur_comp; int i; if (argc != 2) { printf("Usage is ./path_make <string>\n"); return 0; } cur_comp = strtok(argv[1], "/"); while (cur_comp) { if (!strcmp(cur_comp,"..")) { back_track(); } else if (strcmp(cur_comp, ".")) { add_comp(cur_comp); } cur_comp = strtok(NULL, "/"); } printf("\n/"); for (i = 0; i < cur_tail-1; i++) printf("%s/", comp_arr[i]); printf("%s\n", comp_arr[i]); return 0; }
TestPage::TestPage( Client & client ) { name = "Test"; func_alloc = [ &client = client ] ( Page * page ) { page->is_visible = true; page->is_remesh = true; page->root->anchor = { 0.5f, 0.5f }; page->root->offset = { 0, 0 }; page->root->dim = { 500, 500 }; auto comp_resize = page->add_comp( "RootResizable", "Resizable", [ &client = client ] ( PComp * comp ) { auto data = comp->get< ResizableComp::ResizableData >( ); data->func_resize = [ &client = client ] ( PComp * comp ) { comp->dim = comp->parent->dim; comp->offset = -comp->dim / 2; return 0; }; return 0; } ); auto comp_border = comp_resize->add_comp( "Border", "BorderImage", [ ] ( PComp * comp ) { return 0; } ); auto clickable = comp_border->add_comp( "ClickableBorder", "Clickable", [ &client = client ] ( PComp * comp ) { auto data = comp->get< ClickableComp::ClickableData >( ); data->func_hold = [ &client = client ] ( PComp * comp ) { comp->page->root->offset += client.input_mgr.get_mouse_delta( ); return 0; }; return 0; } ); comp_border->add_comp( "TestButton", "TextButton", [ ] ( PComp * comp ) { comp->anchor = { 0.5f, 0.5f }; auto button_data = comp->get< TextButtonComp::TextButtonData >( ); auto label_data = button_data->comp_label->get< LabelComp::LabelData >( ); label_data->text = "TestButton"; comp->page->is_remesh = true; return 0; } ); comp_border->add_comp( "TitleLabel", "Label", [ ] ( PComp * comp ) { auto data = comp->get< LabelComp::LabelData >( ); data->alignment_v = LabelComp::LabelData::AlignVertical::AV_Bottom; data->text = comp->page->name + " Page"; comp->anchor = { 0.0f, 1.0f }; comp->offset = { 10, -10 }; comp->page->is_remesh = true; return 0; } ); comp_border->add_comp( "TestImage", "Image", [ ] ( PComp * comp ) { comp->anchor = { 1.0f, 1.0f }; comp->offset = -comp->dim - glm::ivec2( 10, 10 ); return 0; } ); comp_border->add_comp( "TestCheck", "Checkbox", [ ] ( PComp * comp ) { comp->anchor = { 0.0f, 0.0f }; comp->offset = { 25, 25 }; return 0; } ); comp_border->add_comp( "TestSlider", "Slider", [ &client = client ] ( PComp * comp ) { comp->offset += glm::ivec2{ 0, 100 }; auto data = comp->get< SliderComp::SliderData >( ); data->set_bounds( 0.0f, 359.0f ); data->set_value( 180 ); data->func_read = [ &client = client, data ] ( PComp * comp ) { data->set_value( client.chunk_mgr.get_sun_deg( ) ); return 0; }; data->func_write = [ &client = client, data ] ( PComp * comp ) { client.chunk_mgr.set_sun_deg( data->value ); return 0; }; return 1; } ); comp_border->add_comp( "TestSliderV", "SliderV", [ &client = client ] ( PComp * comp ) { comp->offset += glm::ivec2 { 0, -200 }; auto data = comp->get< SliderVComp::SliderVData >( ); data->set_bounds( 0.0f, 359.0f ); data->set_value( 180 ); data->func_read = [ &client = client, data ] ( PComp * comp ) { data->set_value( client.chunk_mgr.get_sun_deg( ) ); return 0; }; data->func_write = [ &client = client, data ] ( PComp * comp ) { client.chunk_mgr.set_sun_deg( data->value ); return 0; }; return 1; } ); page->add_comp( "TestResize", "Resize", [ ] ( PComp * comp ) { return 0; } ); comp_border->add_comp( "TestTextField", "TextField", [ &client = client ] ( PComp * comp ) { comp->dim = { 400, 33 }; comp->offset = { -200, 0 }; auto data = comp->get< TextFieldComp::TextFieldData >( ); data->data_label->text = "Hello World"; return 0; } ); auto button = page->add_comp( "CloseButton", "TextButton", [ &client = client ] ( PComp * comp ) { comp->anchor = { 0.0f, 0.0f }; comp->offset = { 16 + 300, 16 }; auto data = comp->get< TextButtonComp::TextButtonData >( ); data->data_label->text = "Close"; data->func_action = [ ] ( PComp * comp ) { comp->page->is_visible = false; return 0; }; return 0; } ); return 0; }; }
CheckboxComp::CheckboxComp( Client & client ) { name = "Checkbox"; func_register = [ &client = client ]( ) { client.resource_mgr.reg_pool< CheckboxData >( num_comp_default ); return 0; }; func_alloc = [ &client = client ] ( PComp * comp ) { comp->dim = { 25, 25 }; comp->anchor = { 0.5f, 0.5f }; auto data = comp->add_data< CheckboxData >( ); data->is_checked = false; data->color_default = { 1.0f, 1.0f, 1.0f, 1.0f }; data->color_over = { 0.5f, 0.5f, 0.5f, 1.0f }; data->color_down = { 1.0f, 0.5f, 0.5f, 1.0f }; data->id_texture = client.texture_mgr.get_texture_id( "Gui" ); data->id_subtex_unchecked = client.texture_mgr.get_texture_layer( "Gui", "Default/Unchecked" ); data->id_subtex_checked = client.texture_mgr.get_texture_layer( "Gui", "Default/Checked" ); data->func_checked = func_null; data->func_unchecked = func_null; auto resizable = comp->add_comp( "Resizable", "Resizable", [ &client = client ] ( PComp * comp ) { auto data = comp->get< ResizableComp::ResizableData >( ); data->func_resize = [ &client = client ] ( PComp * comp ) { comp->dim = comp->parent->dim; comp->offset = -comp->dim / 2; return 0; }; return 0; } ); data->comp_border = resizable->add_comp( "Border", "BorderImage", [ &client = client, data ] ( PComp * comp ) { data->data_border = comp->get< BorderImageComp::BorderImageData >( ); data->data_border->set_texture( client, "Gui", "Default/CheckboxBG", 8 ); data->data_border->padding_border = 4; return 0; } ); auto clickable = data->comp_border->add_comp( "Clickable", "Clickable", [ &client = client, data ] ( PComp * comp ) { auto data_clickable = comp->get< ClickableComp::ClickableData >( ); data_clickable->func_down = [ &client = client, data ] ( PComp * comp ) { data->data_border->color = data->color_down; return 0; }; data_clickable->func_up = [ &client = client, data ] ( PComp * comp ) { if( Directional::is_point_in_rect( client.input_mgr.get_mouse( ), comp->page->get_pos( ) + comp->pos, comp->page->get_pos( ) + comp->pos + comp->dim ) ) { if( !data->is_checked ) { data->func_checked( comp ); data->data_image->id_subtex = data->id_subtex_checked; comp->page->is_remesh = true; } else { data->func_unchecked( comp ); data->data_image->id_subtex = data->id_subtex_unchecked; comp->page->is_remesh = true; } data->is_checked = !data->is_checked; } data->data_border->color = data->color_default; return 0; }; return 0; } ); auto overable = comp->add_comp( "Overable", "Overable", [ &client = client, data ] ( PComp * comp ) { auto data_overable = comp->get< OverableComp::OverableData >( ); data_overable->func_enter = [ &client = client, data ] ( PComp * comp ) { data->data_border->color = data->color_over; comp->page->is_remesh = true; return 0; }; data_overable->func_exit = [ &client = client, data ] ( PComp * comp ) { if( data->data_border->color != data->color_down ) { data->data_border->color = data->color_default; } comp->page->is_remesh = true; return 0; }; return 0; } ); auto resizable_half = comp->add_comp( "ResizableHalf", "Resizable", [ &client = client ] ( PComp * comp ) { auto data = comp->get< ResizableComp::ResizableData >( ); data->func_resize = [ &client = client ] ( PComp * comp ) { comp->dim = comp->parent->dim / 2; comp->offset = -comp->dim / 2; return 0; }; return 0; } ); data->comp_image = resizable_half->add_comp( "Image", "Image", [ &client = client, data ] ( PComp * comp ) { data->data_image = comp->get< ImageComp::ImageData >( ); data->data_image->id_texture = data->id_texture; data->data_image->id_subtex = data->id_subtex_unchecked; return 0; } ); data->comp_label = comp->add_comp( "Label", "Label", [ &client = client, data ] ( PComp * comp ) { comp->anchor = { 1.0f, 0.5f }; comp->offset = { 5.0f, 0.0f }; data->data_label = comp->get< LabelComp::LabelData >( ); data->data_label->text = "Checkbox"; data->data_label->alignment_v = LabelComp::LabelData::AlignVertical::AV_Center; return 0; } ); return 0; }; }
ConsolePage::ConsolePage( Client & client ) { name = "Console"; func_alloc = [ &client = client ] ( Page * page ) { page->set_dim( { 600, 250 } ); page->set_anchor( { 0, 0 } ); auto data_console = page->add_data< ConsoleData >( ); data_console->console = page; data_console->padding = 4; data_console->padding_text = 0; data_console->size_text = 16; data_console->dy_input = 24; data_console->idx_visible = 0; data_console->num_visible = 0; data_console->idx_labels = 0; data_console->size_labels = 0; data_console->idx_history = 0; data_console->idx_history_recall = 0; data_console->list_history.resize( ConsoleData::num_history_max ); data_console->size_title = 24; data_console->size_text_title = 18; auto resizable_root = page->add_comp( "ResizableRoot", "Resizable", [ &client = client ] ( PComp * comp ) { auto data = comp->get< ResizableComp::ResizableData >( ); data->func_resize = [ &client = client ] ( PComp * comp ) { comp->dim = comp->parent->dim; comp->offset = -comp->dim / 2; return 0; }; return 0; } ); auto border_root = resizable_root->add_comp( "BorderBG", "BorderImage", [ &client = client ] ( PComp * comp ) { auto data = comp->get< BorderImageComp::BorderImageData >( ); data->padding_border = 4; return 0; } ); auto clickable_root = border_root->add_comp( "ClickableRoot", "Clickable", [ &client = client ] ( PComp * comp ) { auto data = comp->get< ClickableComp::ClickableData >( ); data->func_hold = [ &client = client ] ( PComp * comp ) { comp->page->root->offset += client.input_mgr.get_mouse_delta( ); return 0; }; return 0; } ); auto label_title = border_root->add_comp( "LabelTitle", "Label", [ &client = client, data_console ] ( PComp * comp ) { auto data = comp->get< LabelComp::LabelData >( ); data->text = "Console"; data->size_text = data_console->size_text_title; data->alignment_v = LabelComp::LabelData::AlignVertical::AV_Center; comp->anchor = { 0.0f, 1.0f }; comp->offset = { data_console->padding * 2, -data_console->padding - data_console->size_title / 2 }; return 0; } ); auto resizable_text = border_root->add_comp( "ResizableText", "Resizable", [ &client = client, data_console ] ( PComp * comp ) { auto data = comp->get< ResizableComp::ResizableData >( ); data->func_resize = [ &client = client, data_console ] ( PComp * comp ) { comp->dim = comp->parent->dim; comp->dim.x -= data_console->padding * 2; comp->dim.y -= data_console->dy_input + data_console->padding * 3; comp->dim.y -= data_console->size_title; comp->offset = -comp->dim / 2; comp->offset.y += ( ( data_console->dy_input + data_console->padding ) / 2 ); comp->offset.y -= data_console->size_title / 2; data_console->check_visibles( ); data_console->reposition_labels( ); return 0; }; return 0; } ); data_console->comp_border_text = resizable_text->add_comp( "BorderText", "BorderImage", [ &client = client ] ( PComp * comp ) { auto data = comp->get< BorderImageComp::BorderImageData >( ); data->padding_border = 4; data->color *= 0.75f; return 0; } ); for( unsigned int i = 0; i < ConsoleData::num_text_max; ++i ) { data_console->list_labels.push_back( data_console->comp_border_text->add_comp( "Label" + std::to_string( i ), "Label", [ &client = client , data_console, i ] ( PComp * comp ) { comp->is_visible = false; auto data = comp->get< LabelComp::LabelData >( ); data->text = comp->name; return 0; } ) ); } auto resizable_scroll = data_console->comp_border_text->add_comp( "ResizableScrollBar", "Resizable", [ &client = client, data_console ] ( PComp * comp ) { auto data = comp->get< ResizableComp::ResizableData >( ); data->func_resize = [ &client = client, data_console ] ( PComp * comp ) { comp->dim = { 24, comp->parent->dim.y }; comp->offset = { -comp->dim.x, -comp->dim.y / 2 }; return 0; }; return 0; } ); data_console->comp_slider = resizable_scroll->add_comp( "Slider", "SliderV", [ &client = client, data_console ] ( PComp * comp ) { comp->anchor = { 1.0f, 0.5f }; data_console->data_slider = comp->get< SliderVComp::SliderVData >( ); data_console->data_slider->set_bounds( 0.0f, 1.0f ); data_console->data_slider->set_value( 0.0f ); data_console->data_slider->set_labels_visible( false ); data_console->data_slider->func_write = [ &client = client, data_console ] ( PComp * comp ) { std::lock_guard< std::recursive_mutex > lock( client.gui_mgr.mtx_console ); data_console->set_idx_visible( std::round( data_console->data_slider->ratio * std::max( 0, data_console->size_labels - data_console->num_visible ) ) ); return 0; }; return 0; } ); auto resizable_input = page->add_comp( "ResizableInput", "Resizable", [ &client = client, data_console ] ( PComp * comp ) { auto data = comp->get< ResizableComp::ResizableData >( ); data->func_resize = [ &client = client, data_console ] ( PComp * comp ) { comp->dim.y = data_console->dy_input; comp->dim.x = comp->parent->dim.x - data_console->padding * 2; comp->offset.x = -comp->dim.x / 2; comp->offset.y = -comp->parent->dim.y / 2 + data_console->padding; return 0; }; return 0; } ); auto textfield_input = resizable_input->add_comp( "TextFieldInput", "TextField", [ &client = client, data_console ] ( PComp * comp ) { data_console->data_input = comp->get< TextFieldComp::TextFieldData >( ); data_console->data_input->text = ""; data_console->data_input->data_border->color *= 0.75f; data_console->data_input->comp_cursor->dim.x /= 2; data_console->data_input->comp_cursor->dim.y -= 4; return 0; } ); auto resizer = page->add_comp( "ResizerRoot", "Resize", PageComponentLoader::func_null ); data_console->set_idx_visible( 0 ); return 0; }; }
SliderVComp::SliderVComp( Client & client ) { name = "SliderV"; func_register = [ &client = client ] ( ) { client.resource_mgr.reg_pool< SliderVData >( num_comp_default ); return 0; }; func_alloc = [ &client = client ] ( PComp * comp ) { comp->anchor = { 0.5f, 0.5f }; comp->dim = { 32, 128 }; auto data = comp->add_data< SliderVData >( ); data->cnt_remesh = 0; data->is_label_visible = true; data->ratio = 0.0f; data->value = 0.0f; data->lower = 0.0f; data->upper = 1.0f; data->width_bar = 8; data->func_read = func_null; data->func_write = func_null; auto resizable = comp->add_comp( "Resizable", "Resizable", [ &client = client ] ( PComp * comp ) { auto data = comp->get < ResizableComp::ResizableData >( ); data->func_resize = [ ] ( PComp * comp ) { comp->dim = comp->parent->dim; comp->offset = -comp->dim / 2; return 0; }; return 0; } ); data->comp_border = resizable->add_comp( "Border", "BorderImage", [ &client = client, data ] ( PComp * comp ) { data->data_border = comp->get< BorderImageComp::BorderImageData >( ); data->data_border->padding_border = 4; data->data_border->set_texture( client, "Gui", "Default/SliderBG", 8 ); auto overable = comp->add_comp( "Overable", "Overable", [ &client = client, data ] ( PComp * comp ) { auto data_over = comp->get< OverableComp::OverableData >( ); data_over->func_enter = [ &client = client, data ] ( PComp * comp ) { data->data_border->color = { 0.5f, 0.5f, 0.5f, 1.0f }; if( data->is_label_visible ) { data->comp_label_bottom->is_visible = true; data->comp_label_top->is_visible = true; } comp->page->is_remesh = true; return 0; }; data_over->func_exit = [ &client = client, data ] ( PComp * comp ) { data->data_border->color = { 1.0f, 1.0f, 1.0f, 1.0f }; if( data->is_label_visible ) { data->comp_label_bottom->is_visible = false; data->comp_label_top->is_visible = false; } comp->page->is_remesh = true; return 0; }; return 0; } ); auto clickable = comp->add_comp( "Clickable", "Clickable", [ &client = client, data ] ( PComp * comp ) { auto data_click = comp->get< ClickableComp::ClickableData >( ); data_click->func_hold = [ &client = client, data ] ( PComp * comp ) { int posl_mouse = client.input_mgr.get_mouse( ).y - ( comp->page->pos.y + data->comp_bar->pos.y ); if( posl_mouse < 0 ) { posl_mouse = 0; } else if( posl_mouse > data->length_bar ) { posl_mouse = data->length_bar; } data->set_ratio( posl_mouse / data->length_bar ); data->func_write( comp ); comp->page->is_remesh = true; return 0; return 0; }; return 0; } ); return 0; } ); data->comp_bar = comp->add_comp( "Bar", "BorderImage", [ &client = client, data ] ( PComp * comp ) { data->data_bar = comp->get< BorderImageComp::BorderImageData >( ); data->data_bar->padding_border = 4; data->data_bar->set_texture( client, "Gui", "Default/SliderBG", 8 ); return 0; } ); data->comp_label_title = comp->add_comp( "TitleLabel", "Label", [ &client = client, data ] ( PComp * comp ) { comp->is_visible = true; comp->anchor = { 0.5f, 1.0f }; comp->offset = { 0.0f, 3.0f }; data->data_label_title = comp->get< LabelComp::LabelData >( ); data->data_label_title->size_text = 12; data->data_label_title->alignment_v = LabelComp::LabelData::AlignVertical::AV_Top; data->data_label_title->alignment_h = LabelComp::LabelData::AlignHorizontal::AH_Center; data->data_label_title->text = "Title"; return 0; } ); data->comp_label_bottom = comp->add_comp( "BottomLabel", "Label", [ &client = client, data ] ( PComp * comp ) { comp->is_visible = false; comp->anchor = { 1.0f, 0.0f }; comp->offset = { 3.0f, 1.0f }; data->data_label_left = comp->get< LabelComp::LabelData >( ); data->data_label_left->size_text = 10; data->data_label_left->alignment_v = LabelComp::LabelData::AlignVertical::AV_Top; data->data_label_left->alignment_h = LabelComp::LabelData::AlignHorizontal::AH_Right; data->data_label_left->text = "Bottom"; return 0; } ); data->comp_label_top = comp->add_comp( "TopLabel", "Label", [ &client = client, data ] ( PComp * comp ) { comp->is_visible = false; comp->anchor = { 1.0f, 1.0f }; comp->offset = { 3.0f, -1.0f }; data->data_label_right = comp->get< LabelComp::LabelData >( ); data->data_label_right->size_text = 10; data->data_label_right->alignment_v = LabelComp::LabelData::AlignVertical::AV_Bottom; data->data_label_right->alignment_h = LabelComp::LabelData::AlignHorizontal::AH_Right; data->data_label_right->text = "Top"; return 0; } ); data->comp_label_value = comp->add_comp( "ValueLabel", "Label", [ &client = client, data ] ( PComp * comp ) { comp->anchor = { 1.0f, 0.5f }; comp->offset = { 3.0f, 0.0f }; data->data_label_value = comp->get< LabelComp::LabelData >( ); data->data_label_value->size_text = 12; data->data_label_value->alignment_v = LabelComp::LabelData::AlignVertical::AV_Center; data->data_label_value->alignment_h = LabelComp::LabelData::AlignHorizontal::AH_Right; data->data_label_value->text = "Value"; return 0; } ); data->comp_slider = comp->add_comp( "Slider", "BorderImage", [ &client = client, data ] ( PComp * comp ) { data->data_slider = comp->get< BorderImageComp::BorderImageData >( ); data->data_slider->padding_border = 4; data->data_slider->set_texture( client, "Gui", "Default/SliderBG", 8 ); return 0; } ); return 0; }; func_update = [ &client = client ] ( PComp * comp ) { auto data = comp->get< SliderVData >( ); data->length_bar = comp->dim.y - data->data_border->padding_border * 2; data->comp_bar->dim = { data->width_bar, data->length_bar }; data->comp_bar->offset = -data->comp_bar->dim / 2; data->comp_slider->anchor = { 0.5f, 0.5f }; data->comp_slider->dim = { comp->dim.x, data->width_bar }; data->comp_slider->offset = -data->comp_slider->dim / 2; data->comp_slider->offset.y += ( data->ratio - 0.5f ) * data->length_bar; data->func_read( comp ); if( ++data->cnt_remesh % 4 == 0 ) { comp->page->is_remesh = true; } return 0; }; }