LINUX.ORG.RU

GtkTreeSelection: выделить строку


0

0

Меняю строки в моделе местами:

     next_iter = gtk_tree_iter_copy(&current_iter);
     gtk_tree_model_iter_next(model, next_iter);
 
     gtk_list_store_swap(GTK_LIST_STORE(model), &current_iter, next_iter);

И хочу, что бы выделение перемещалось вместе с перемещенной на 
позицию вниз строкой.

GtkTreeSelection* selection = gtk_tree_view_get_selection(
                                       GTK_TREE_VIEW(tree_view));
gtk_tree_selection_select_iter(selection, next_iter);

Но проблема в том, что выделение как оставалось на одном месте,
так и остается. Вместо next_iter пробовал &current_iter --
но результат один и тот же. Что я делаю не так?

Спасибо.

P.S. Данные действия производятся в обработчике сигнала 'activate' 
наследника GtkCellRendererPixbuf.
★★★

Ответ на: комментарий от Deleted

Не работает:

 static inline void select_treeview_row(GtkWidget* tree_view, GtkTreeIter* iter)
 {
     GtkTreeModel* model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view));
     GtkTreePath* path = gtk_tree_model_get_path(model, iter);
     GtkTreeViewColumn* column = gtk_tree_view_get_column(GTK_TREE_VIEW(tree_view), 0);

     gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree_view), path, column, FALSE);

     gtk_tree_path_free(path);
 }  

...

     gtk_list_store_swap(GTK_LIST_STORE(model), &current_iter, next_iter);
     select_treeview_row(tree_view, next_iter);

kondor ★★★
() автор топика
Ответ на: комментарий от kondor

попробуй так..

gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree_view), path, NULL, FALSE);

а вообще должно работать. мне кажется где-то у тебя ошибка.

Deleted
()
Ответ на: комментарий от Deleted

> gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree_view), path, NULL, FALSE);

Я первым делом так (column = NULL) пробовал. Не работает.

kondor ★★★
() автор топика
Ответ на: комментарий от kondor

хммм... тады надобно взять якуюнть тулзу, в которой эта фича работает и подглядеть как у них это реализовано. хотя мне кажется что-то тут не чисто.

Deleted
()
Ответ на: комментарий от Deleted

Мне тоже кажется, что здесь что-то неправильно :). Смотрел в Google CodeSearch аналогичный функционал -- сделано всё так же.

Сейчас для разнообразия сделал обработчик cursor-changed для GtkTreeView и он честно вызывается на функции, которая должна менять, но не меняет, курсорную позицию. Даже если swap() не делать, то позиция все равно не меняется.

У меня такое нехорошее предположение, что возможно это не работает из-за того, что все дело происходит в обработчике сигнала 'activate' следующего класса: http://www.linux.org.ru/view-message.jsp?msgid=3100114.

kondor ★★★
() автор топика
Ответ на: комментарий от kondor

Поставил вызов модального message-box'а, после того как сделается set cursor: курсорная позиция действительно меняется. После закрытия message-box'а, позиция снова меняется на прежнюю. Какое-то странное поведение.

kondor ★★★
() автор топика
Ответ на: комментарий от kondor

мне кажется ты там с наследованием чет намутил :) попробуй на простых вещах этот трюк сделать, а после уже проверяй со своим рендерером (или что ты там унаследовал).

Deleted
()
Ответ на: комментарий от Deleted

Не затруднит, пожалуйста, посмотреть? Я накидал простейший примерчик (не больше 300 строк), который использует унаследованный GtkCellRendererPixbuf:

main.c: http://pastebin.com/m6f795949
cellrendererpixbuf.h: http://pastebin.com/m3f0d6251
cellrendererpixbuf.c: http://pastebin.com/m43be83aa

Пример полностью демонстрирует непонятное мне поведение (при клике на любой, НЕ первый, элемент в списке, курсор должен переместиться на первый). Уже вроде бы изучил, что такое G_SIGNAL_RUN_LAST/FIRST/etc, g_signal_connect_after() etc, поэкспериментировал с ними, но желаемого результата не достиг.

kondor ★★★
() автор топика
Ответ на: комментарий от kondor

Если только завтра и то одним глазком, у меня тут у самого вагон работы... дедлайны всякие.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.