Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Ср мар 29, 2017 8:17 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 4 сообщения ] 
Автор Сообщение
 Заголовок сообщения: Layout manager
СообщениеДобавлено: Вт дек 15, 2015 4:26 pm 
Не в сети

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

Описание API:
Код:
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 -- освобождает память структуры

Пример создания разметки
Код:
   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 КБ | 2342 просмотра ]


Вложения:
layout.zip [17.33 КБ]
36 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: Layout manager
СообщениеДобавлено: Пт дек 18, 2015 11:44 am 
Не в сети

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

Для начала пишем функцию создания виджета
Код:
// структура для хранения служебных данных виджета
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;
}


Теперь пишем функцию рисующую наш виджет
Код:
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);
}


Ну и конечно же пишем функцию освобождения памяти
Код:
void LAYOUT_API label_free(t_Widget *this)
{
   if (!this)
      return;

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


Вернуться к началу
 Заголовок сообщения: Re: Layout manager
СообщениеДобавлено: Вт янв 05, 2016 10:26 pm 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1041
Я правильно понимаю, библиотека написана на FASM?

_________________
я лишь учусь


Вернуться к началу
 Заголовок сообщения: Re: Layout manager
СообщениеДобавлено: Пн янв 11, 2016 11:43 am 
Не в сети

Зарегистрирован: Чт янв 26, 2006 8:47 pm
Сообщения: 284
Увы. Написано на С


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 4 сообщения ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB