Beispiel #1
0
/*
 * 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;
	};
}