mc-dev
mc-dev@conference.jabber.ru
[04:22:50] andrew_b зашёл в конференцию
[04:28:49] <andrew_b> slavazanko: и ещё. В MSG_RESIZE надо размеры устанавливать.
[07:08:24] repolainen зашёл в конференцию
[08:05:56] <slavazanko> У скроллбара нет своих размеров, он привязывается к parent-виджету и каждый раз для MSG_DRAW по ссылке берутся размеры родительского виджета
[08:15:15] iliamaslakov зашёл в конференцию
[08:32:24] iliamaslakov вышел из конференции
[08:32:54] iliamaslakov зашёл в конференцию
[08:35:05] <andrew_b> У любого виджета есть размер.
[08:35:42] <andrew_b> Размер скроллбара надо корректировать в зависимости от размеров парента.
[08:38:53] <andrew_b> И в зависимости от типа скроллбара.
[08:39:20] <andrew_b> 107 if (*scrollbar->total <= scrollbar->parent->lines)
108 return;
Что-то тут не то. Почему total сравнивается с размером?
[08:40:28] <slavazanko> если количество записей для скроллирования целиком влазят на экран (нечего скроллировать), то скроллбар и не показывается
[08:40:43] <andrew_b> Как-то это не того.
[08:41:12] <andrew_b> Лучше сделать пропорциональный скроллбар.
[08:41:38] <slavazanko> это как?
[08:42:06] <andrew_b> Ползунок изменяет размер в зависимости от того, сколько инфы видно в области скроллинга.
[08:43:13] <andrew_b> Плюс обработка мыши.
[08:43:14] <slavazanko> а. да, было бы неплохо. Пока так, первая версия, выбранная ил listbox в отдельный скроллбар. Я пока что воюю с косяками при ресайзинге
[08:43:43] <andrew_b> Я тебе говорю: изменяй рамер и расположение в MSG_RESIZE.
[08:43:56] <andrew_b> Ща.
[08:44:37] <slavazanko> я уже там делаю
[08:49:27] <andrew_b> diff --git a/lib/widget/scrollbar.c b/lib/widget/scrollbar.c
index 8b639d1..68e16b1 100644
--- a/lib/widget/scrollbar.c
+++ b/lib/widget/scrollbar.c
@@ -48,10 +48,34 @@
/*** file scope variables ************************************************************************/
+/* --------------------------------------------------------------------------------------------- */
/*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
static void
+scrollbar_set_size (WScrollBar *scrollbar)
+{
+ Widget *w WIDGET (scrollbar);
+
+ switch (type)
+ {
+ case SCROLLBAR_VERTICAL:
+ w->y = parent->y - 1;
+ w->x = parent->cols - 2;
+ w->lines = parent->lines - 2;
+ w->cols = 1;
+ break;
+ default:
+ w->y = parent->lines - 2;
+ w->x = parent->x + 1;
+ w->lines = 1;
+ w->cols = parent->cols - 2;
+ }
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
+static void
scrollbar_draw_horizontal (WScrollBar * scrollbar)
{
Widget *w = WIDGET (scrollbar);
@@ -141,6 +165,10 @@ scrollbar_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, voi
scrollbar_draw (scrollbar);
return ret;
+ case MSG_RESIZE:
+ scrollbar_set_size (scrollbar);
+ return MSG_HANDLED;
+
case MSG_DESTROY:
return MSG_HANDLED;
@@ -172,24 +200,11 @@ scrollbar_new (Widget * parent, scrollbar_type_t type)
scrollbar = g_new (WScrollBar, 1);
scrollbar->type = type;
- switch (type)
- {
- case SCROLLBAR_VERTICAL:
- x = parent->cols - 2;
- y = parent->y - 1;
- lines = parent->lines - 2;
- break;
- default:
- x = parent->x + 1;
- y = parent->lines - 2;
- cols = parent->cols - 2;
- }
-
widget = WIDGET (scrollbar);
widget_init (widget, y, x, lines, cols, scrollbar_callback, NULL);
scrollbar->parent = parent;
- widget->owner = parent->owner;
+ scrollbar_set_size (scrollbar);
widget_want_cursor (widget, FALSE);
widget_want_hotkey (widget, FALSE);
[08:49:50] <andrew_b> Не проверял.
[09:02:17] <slavazanko> что-то странное получается. Если вызывать scrollbar_set_size() из scrollbar_new(), то надо y вычислять как y = parent->lines - 2;
а если вызывать по MSG_RESIZE, то y надо вычислять как y = parent->lines;
[09:04:17] <andrew_b> Не понял.
[09:04:41] <andrew_b> А.
[09:05:52] <slavazanko> Смысл такой: если вычисляю координату 'y' для скроллбара как y = parent->lines - 2;
то при первой отрисовке скроллбар распологается правильно, но после первого ресайза прыгает на два символа вверх и отображается на предпоследней строке списка
[09:06:26] <slavazanko> а если 'y' вычислять как y = parent->lines;
то при первой отрисовке скролбара вообще не видно, но после ресайза он отрисовывается ка надо
[09:06:29] <slavazanko> я запушил
[09:08:23] iliamaslakov вышел из конференции
[09:08:55] <andrew_b> У виджетов координаты абсолютные, поэтому надо учитывать не только размер парента, но и его положение.
[09:11:22] <andrew_b> static void
scrollbar_set_size (WScrollBar *scrollbar)
{
Widget *w = WIDGET (scrollbar);
Widget *p = scrollbar->parent;
switch (type)
{
case SCROLLBAR_VERTICAL:
w->y = p->y + 1;
w->x = p->x + p->cols - 1;
w->lines = p->lines - 2;
w->cols = 1;
break;
default:
w->y = p->y + p->lines - 1;
w->x = p->x + 1;
w->lines = 1;
w->cols = p->cols - 2;
}
}
[09:15:01] <slavazanko> всё равно позиция скроллбара прыгает.
[09:15:05] <slavazanko> после ресайза
[09:35:59] <andrew_b> Во-первых, у тебя скроллбар привязан к самому диалогу. Это не правильно. Он должен быть привязан к тому виджету, в котором делается скроллинг, то есть к листбоксу.
[09:36:25] <andrew_b> Во-вторых, скроллбар должен быть или справа (вертикальный), либо снизу (горизонтальный).
[09:37:01] <andrew_b> То есть все эти поправки на 1 и 2 в размерах надо убрать.
[09:37:22] <andrew_b> Но это всё равно почему-то не помогло.
[09:37:38] <andrew_b> Скроллбара не видно совсем.
[09:37:52] <andrew_b> С разбегу понять почему не получилось.
[09:42:57] <andrew_b> Если в диалоге только листвох, скролллбар должен рисоваться поверх рамки.
[09:44:20] <slavazanko> да. Я так и сделал, привязав диалог в качестве родителя для скроллбара. Но если в диалоге будет несколько виджетов, то родителем будет, например, непосредственно листбокс
[09:48:35] D-ion вышел из конференции: Replaced by new connection
[09:48:37] D-ion зашёл в конференцию
[09:59:37] monkey зашёл в конференцию
[10:20:41] <andrew_b> Подпушил. Стало лучше, но ненамного. Происходит что-то странное. Сейчас нету времени разбираться. Посмотрю на выходных.
[10:51:35] <slavazanko> там я ранее сделал горизонтальный тип скроллбара только для тестов, само собой, что для списка будет вертикальный. тестовый код просочился в коммиты, после ребейза уйдёт
[11:18:12] monkey вышел из конференции
[11:19:54] monkey зашёл в конференцию
[11:25:47] slavazanko вышел из конференции
[11:34:17] andrew_b вышел из конференции
[14:01:32] andrew_b зашёл в конференцию
[14:18:22] slavazanko/h зашёл в конференцию
[14:56:14] iliamaslakov зашёл в конференцию
[15:20:54] monkey вышел из конференции
[16:00:10] iliamaslakov вышел из конференции
[16:00:31] iliamaslakov зашёл в конференцию
[16:22:49] monkey зашёл в конференцию
[16:32:36] andrew_b вышел из конференции
[16:38:12] iliamaslakov вышел из конференции
[16:38:28] iliamaslakov зашёл в конференцию
[16:40:43] monkey вышел из конференции
[18:00:57] iliamaslakov вышел из конференции: Replaced by new connection
[18:00:59] iliamaslakov зашёл в конференцию
[18:04:37] iliamaslakov вышел из конференции
[18:55:07] slavazanko/h вышел из конференции
[18:56:41] slavazanko/h зашёл в конференцию
[19:13:27] slavazanko/h вышел из конференции
[19:13:27] slavazanko/h зашёл в конференцию
[19:13:27] slavazanko/h вышел из конференции: Этого участника выгнали из комнаты за то, что он послал сообщение об ошибке другому участнику: service-unavailable
[19:16:52] slavazanko/h зашёл в конференцию
[21:17:22] repolainen вышел из конференции: Replaced by new connection
[21:17:31] repolainen зашёл в конференцию
[22:04:49] D-ion вышел из конференции