«Лучший» способ изменения размера GtkTreeViewColumns ... но как мне это сделать? - PullRequest
2 голосов
/ 29 сентября 2010

Я пытаюсь создать функцию изменения размера GtkTreeViewColumn, как в Thunderbird.Ключевое слово здесь «пытается».Пока что у меня ничего не получилось.

Самый простой способ понять, как работает это изменение размера, - запустить Thunderbird и поиграть с изменением размера столбцов самостоятельно, но в основном это работает в Thunderbird, если вы перетаскиваете, скажем,, столбец № 1 справа, это увеличивает ширину столбца № 1, в то же время уменьшая ширину столбца № 2 на ту же величину.Это происходит до тех пор, пока столбец № 2 не достигнет своей минимальной ширины (например, 0 пикселей).На этом этапе продолжение перетаскивания столбца № 1 вправо по-прежнему увеличивает ширину столбца № 1, но поскольку столбец № 2 не может быть уменьшен дальше, столбец № 3 сокращается до тех пор, пока не достигнет минимальной ширины.Это продолжается до тех пор, пока все столбцы справа от столбца № 1 не достигнут абсолютной минимальной ширины;в этот момент ширина столбца № 1 больше не может быть увеличена, поэтому продолжение перетаскивания столбца вправо ничего не делает.

Если кнопка мыши все еще удерживается, если вы начинаете перетаскивать столбецСнова # 1 слева (чтобы уменьшить его), то, что произошло, это то, что произошло выше, за исключением обратного порядка.Когда столбец № 1 сжимается, последний столбец в древовидном представлении увеличивается до тех пор, пока не достигнет своей ширины в тот момент, когда началось первоначальное перетаскивание (когда мышь сначала нажимали для начала перетаскивания).В этот момент столбец со второго по последний увеличивается до тех пор, пока не достигнет своей ширины во время первоначального перетаскивания ... и т. Д.

Затем, конечно, когда столбец № 1 достигает минимальной ширины, столбец № 0сжимается, пока не достигнет минимальной ширины.Поскольку столбец № 0 является первым столбцом, то продолжение перетаскивания столбца № 1 влево больше не будет уменьшать его;на самом деле ничего не произойдет.

Одним из основных преимуществ такой обработки перетаскивания является то, что размер столбцов никогда не будет изменяться «за пределы», что приведет к увеличению ширины GtkTreeView или, если GtkTreeView, содержащийGtkTreeViewColumns упакован в прокручиваемое окно, поэтому появляются горизонтальные полосы прокрутки.Появление этих полос прокрутки или увеличение ширины представления дерева (и, следовательно, увеличение ширины окна) очень раздражает пользователя и делает его намного менее чистым.Именно поэтому, как я полагаю, Thunderbird справляется с этим так же, как и другие приложения.

Так что, в любом случае, моя проблема в том, что я просто не могу понять, как это сделать в GTK +.Мне интересно, возможно ли это вообще?Если это ... как бы это сделать?Я здесь не в курсе.

Насколько я знаю, единственный сигнал, к которому вы можете подключиться, чтобы узнать, был ли изменен размер GtkTreeViewColumn, это сигнал notify :: width.Проблема в том, что вы не можете вернуть TRUE или FALSE из функции обработчика сигнала, чтобы сказать GTK +, что нельзя разрешать изменение размера.Это просто сигнал уведомления.Так что я не могу, например, обнаружить, что все столбцы справа от перетаскиваемого столбца достигли минимальной ширины, а затем сказать GTK +, чтобы больше не увеличивать ширину столбца.

Еще одна проблема:если вы вызываете gtk_tree_view_column_set_fixed_width() - то, что я делаю, вызывает gtk_tree_view_column_set_resizable(column, TRUE), а затем вызывает gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED) при создании столбцов, кстати - в сигнале notify::width, это создает бесконечный цикл, который я неНе знаю, как предотвратить, либо.

Опять же, любая помощь будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 30 сентября 2010

Бесконечный цикл может быть прерван временной блокировкой сигналов, например:

g_signal_handler_block(...);
/* update width */
g_isgnal_handler_unblock(...)
0 голосов
/ 09 ноября 2014

У меня возникла та же проблема, и мой подход состоял в том, чтобы использовать 2 функции для сигнала изменения размера:

  • Первый проверен на наличие подключенного / отключенного обработчика; если не подключен, подключите его и сохраните идентификатор обработчика.
  • Второй просто пропорционально изменил размеры всех столбцов, а затем отключил сигнал с сохраненным идентификатором обработчика.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...