LINUX.ORG.RU

gtk_cell_renderer_activate

 


0

1

Здравствуйте! Необходимо, чтобы в dconf-editor-e значения ключей можно было отредактировать не только кликом по строке в области столбца «Значение», но и без использования мыши. Для этого к GtkTreeView я подключил обработчик сигнала «row-activated», который срабатывает при нажатии, например, кнопки Enter. Вопрос: как вызвать из этого обработчика то событие, которое возникает при клике мышью? Код, приведенный ниже, работает на чекбаттонах и не работает на комбобоксах и спинбаттонах. Спасибо.

static void on_key_tree_view_row_activated(GtkTreeView       *tree_view,
                                           GtkTreePath       *path,
                                           GtkTreeViewColumn *column,
                                           gpointer           user_data)
{
 printf("key row-activated\n");	
 GdkRectangle rect;
 gtk_tree_view_get_cell_area (tree_view, path, column, &rect);
 gchar *path_string = gtk_tree_path_to_string (path);
 
 
 
 GtkCellRenderer *cell = NULL;
 GdkEvent *event = gdk_event_new(GDK_BUTTON_PRESS);
 /* Get the second column */
 GtkTreeViewColumn *key_column = gtk_tree_view_get_column( GTK_TREE_VIEW( tree_view ), 1 );

 /* Get renderers in that column */
 GList *list = gtk_cell_layout_get_cells( GTK_CELL_LAYOUT( key_column ) );
 g_assert (g_list_length (list) == 1);

 cell = g_list_nth_data (list, 0);
 g_assert (cell);

 gboolean event_was_handled = 
 gtk_cell_renderer_activate 
   //gtk_cell_renderer_start_editing
                           (cell,
                            event,
                            GTK_WIDGET(tree_view),
                            path_string,
                            &rect,
                            &rect,
                            GTK_CELL_RENDERER_SELECTED);
 g_list_free( list );
 g_free(path_string);                           
 printf("event was %s handled\n", event_was_handled ? "":"not");

}



Последнее исправление: Vitaly1988 (всего исправлений: 2)
Ответ на: комментарий от monk

Спасибо. «button-press-event», наверно? «clicked» вроде для кнопок. И как мне получить значение вертикальной координаты выделенной строки в пикселях, чтобы заполнить им GtkEvent.button.y?

Vitaly1988
() автор топика

а нельзя напрямую вызвать нужный обработчик? чтобы не костылить buttonpress...

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

нужный обработчик напрямую вызывается по идее через gtk_cell_renderer_activate(), но у меня работает только для CheckButton-ов

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

ты уверен, что оно не сломано в самом гтк?

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

/me уже неоднократно натыкался на подобные регрессии

правда, в случае с treeview cells мне не удалось обойти грабли gtk3, пришлось полностью изменить интерфейс, и не использовать inline editing.

waker ★★★★★
()
Последнее исправление: waker (всего исправлений: 1)
Ответ на: комментарий от monk

Сымитировал «button-press-event», но нормальная работа в этом случае только для спинбаттнов и энтри. Чекбаттоны и комбобоксы реагируют только первый раз после выбора строки. Думал, что это от отсутсвия сигнала «button-release-event», - послал и его следом, но ничего не изменилось.

static void on_key_tree_view_row_activated(GtkTreeView       *tree_view,
                                           GtkTreePath       *path,
                                           GtkTreeViewColumn *column,
                                           gpointer           user_data)
{
 // Get the second column 
 GtkTreeViewColumn *key_column = gtk_tree_view_get_column( GTK_TREE_VIEW( tree_view ), 1 );

GdkRectangle rect;

gtk_tree_view_get_cell_area (tree_view, path, key_column, &rect);

  GdkEvent *event = gdk_event_new(GDK_BUTTON_PRESS);

  event->button.window = gtk_tree_view_get_bin_window(tree_view);
  
  event->button.send_event = TRUE;
  event->button.time = GDK_CURRENT_TIME;
  event->button.axes = NULL;
  event->button.button = 1;
  event->button.x = rect.x + rect.width/2;
  event->button.y = rect.y + rect.height/2;
  
 g_signal_emit_by_name (tree_view, "button-press-event", event);

//gdk_display_put_event (gtk_widget_get_display(GTK_WIDGET(tree_view)),  event);
//gtk_widget_event (GTK_WIDGET(tree_view), event);
//gtk_main_do_event(event);
}

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

Запустил пример gtk3-demo:Editable Cells с небольшими изменениями - там все работает прекрасно. И даже писать ничего не надо - по умолчанию нажатие кнопки Enter вызывает тот самый нужный обработчик: для GtkCellRendererToggle - переключение состояния, для остальных - начало редактирования. Проблема в dconf-editore, потому что на на кнопку Enter чекбаттоны реагируют так:

** (dconf-editor:19455): CRITICAL **: key_value_renderer_real_activate: assertion 'event != NULL' failed
а остальные так:
** (dconf-editor:19455): CRITICAL **: key_value_renderer_real_start_editing: assertion 'event != NULL' failed

(dconf-editor:19455): Gtk-CRITICAL **: gtk_widget_get_style_context: assertion 'GTK_IS_WIDGET (widget)' failed

(dconf-editor:19455): Gtk-CRITICAL **: gtk_style_context_add_class: assertion 'GTK_IS_STYLE_CONTEXT (context)' failed
Не заметил этого сразу, потому перед нажатием кнопки Enter надо устанавливать фокус на нужный cellrendrer

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