Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Sep 17, 2019 12:00 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 4 posts ] 
Author Message
 Post subject: Layout manager
PostPosted: Tue Dec 15, 2015 4:26 pm 
Offline

Joined: Thu Jan 26, 2006 8:47 pm
Posts: 284
Библиотека реализующая примитивный менеджер разметки.
Позволяет создавать как статический так и "резиновый" дизайн окна с вытягивающимися и плавающими элементами окна.

Описание API:
Code:
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:
   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);

Attachment:
example.png
example.png [ 3.71 KiB | Viewed 3316 times ]


Attachments:
layout.zip [17.33 KiB]
Downloaded 112 times
Top
   
 Post subject: Re: Layout manager
PostPosted: Fri Dec 18, 2015 11:44 am 
Offline

Joined: Thu Jan 26, 2006 8:47 pm
Posts: 284
Небольшой мануал, поясняющий, как создавать собственные виджеты. В качестве примера будем создавать Label.

Для начала пишем функцию создания виджета
Code:
// структура для хранения служебных данных виджета
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:
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:
void LAYOUT_API label_free(t_Widget *this)
{
   if (!this)
      return;

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


Top
   
 Post subject: Re: Layout manager
PostPosted: Tue Jan 05, 2016 10:26 pm 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1150
Я правильно понимаю, библиотека написана на FASM?

_________________
я лишь учусь


Top
   
 Post subject: Re: Layout manager
PostPosted: Mon Jan 11, 2016 11:43 am 
Offline

Joined: Thu Jan 26, 2006 8:47 pm
Posts: 284
Увы. Написано на С


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 4 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited