Page 1 of 1

Layout manager

Posted: Tue Dec 15, 2015 4:26 pm
by Veliant
Библиотека реализующая примитивный менеджер разметки.
Позволяет создавать как статический так и "резиновый" дизайн окна с вытягивающимися и плавающими элементами окна.

Описание API:

Code: Select all

layout_set_margin -- установить размер отступов между элементами (глобально)
container_create -- создать контейнер. базируется на структуре виджета (базовая структура для создания пользовательских контейнеров)
container_add_child -- добавляет виджет/контейнер в другой контейнер
container_free -- освобождает память структуры контейнера
vcontainer_create -- создать контейнер с вертикальной упаковкой дочерних элементов (столбцами)
hcontainer_create -- создать контейнер с горизонтальной упаковкой дочерних элементов (рядами)
widget_create -- создать виджет (базовая структура для создания пользовательских виджетов)
widget_set_size -- установить размер
widget_invalidate -- перерисовать виджет/контейнер
widget_free -- освобождает память структуры 
button_create -- создать виджет-кнопку
button_free -- освобождает память структуры
spacer_create -- создать пустой виджет-разделитель для выравнивания элементов
spacer_free -- освобождает память структуры
Пример создания разметки

Code: Select all

	mainLayout = vcontainer_create();
	mainLayout->expand = EXPAND_HORIZONTAL | EXPAND_VERTICAL;
	
	t_Container *h1 = hcontainer_create();
	h1->expand = EXPAND_HORIZONTAL | EXPAND_VERTICAL;

	t_Widget *btn1 = button_create("Button 1", 101, 110, 25, &theme);
	btn1->alignment = ALIGNMENT_LEFT;
	container_add_child(h1, btn1);
	
	t_Widget *btn2 = button_create("Button 2", 102, 110, 25, &theme);
	btn2->alignment = ALIGNMENT_CENTER;
	container_add_child(h1, btn2);
	
	t_Widget *btn3 = button_create("Button 3", 103, 110, 25, &theme);
	btn3->alignment = ALIGNMENT_RIGHT;
	container_add_child(h1, btn3);	

	container_add_child(h1, spacer_create());
	
	t_Widget *btn4 = button_create("Exit", 1, 100, 25, &theme);
	btn4->expand = EXPAND_HORIZONTAL;
	container_add_child(h1, btn4);
	
	container_add_child(mainLayout, h1);
example.png
example.png (3.71 KiB)
Viewed 8227 times

Re: Layout manager

Posted: Fri Dec 18, 2015 11:44 am
by Veliant
Небольшой мануал, поясняющий, как создавать собственные виджеты. В качестве примера будем создавать Label.

Для начала пишем функцию создания виджета

Code: Select all

// структура для хранения служебных данных виджета
typedef struct {
	char *text;
	size_t text_len;
	size_t bg_color, text_color;
} t_Label_data;

t_Widget * LAYOUT_API label_create(char *text, size_t width, size_t height, t_system_colors *theme)
{
	t_rect rc;
	rc.left   = rc.top = 0;
	rc.right  = width;
	rc.bottom = height;
	
	// выделяем память и инициализируем структуру с служебными данными
	t_Label_data *data = (t_Label_data*)malloc(sizeof(*ld));
	if (!data)
		return NULL;
	data->text     = text;
	data->text_len = strlen(text);
	
	if (theme)
	{
		data->bg_color = theme->win_body;
		data->text_color = theme->win_text;
	}
	
	// создаем виджет, передавая ему минимальные размеры и адрес функции отрисовки
	t_Widget *this = widget_create(&rc, label_draw);
	if (!this)
	{
		free(data);
		return NULL;
	}
	this->custom_data = data;
	
	return this;
}
Теперь пишем функцию рисующую наш виджет

Code: Select all

void LAYOUT_API label_draw(void* this, t_rect* rc)
{
	if (!this)
		return;
	t_Widget *widget = (t_Widget *)this;

	t_Label_data *customData = widget->custom_data;
	if (!customData)
		return;

	// выводим саму строку средствами используемой библиотеки
	// в t_rect передаются предрасчитанные координаты и размеры области в которой мы можем рисовать
	t_label lbl = {0};
	lbl.font.color   = customData->text_color;
	lbl.font.bgcolor = customData->bg_color;
	lbl.font.type    = FONT_MONOSPACED | FONT_DRAW_ASCIIZ;

	lbl.position.left = rc->left + widget->left;
	lbl.position.top  = rc->top + widget->top;
	lbl.text = customData->text;
	kos_PutLabel(&lbl);
}
Ну и конечно же пишем функцию освобождения памяти

Code: Select all

void LAYOUT_API label_free(t_Widget *this)
{
	if (!this)
		return;

	free(this->custom_data);
	free(this);
}

Re: Layout manager

Posted: Tue Jan 05, 2016 10:26 pm
by punk_joker
Я правильно понимаю, библиотека написана на FASM?

Re: Layout manager

Posted: Mon Jan 11, 2016 11:43 am
by Veliant
Увы. Написано на С