Layout manager

Discussing libraries simplifying applications development
  • Небольшой мануал, поясняющий, как создавать собственные виджеты. В качестве примера будем создавать 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);
    }
    
  • Я правильно понимаю, библиотека написана на FASM?
    to infinity and beyond
  • Увы. Написано на С
  • Who is online

    Users browsing this forum: No registered users and 5 guests