LINUX.ORG.RU

[ Gtk ][ IconView ][ Selection ] Не получается


0

1

Пол дня ковыряю сабж, сам IconView создается довольно тривиально, и похоже на список, а обработка выделения реализована непонятно. Примеров не нашел, только пост на форуме Gtk, что мол:

The gtk_icon_view_selected_foreach function iterates through the whole selection of the GtkIconView and executes the function passed in as the parameter. This function does not react to changes to selection. If you need to monitor changes, connect your handlers to «selection-changed» or «button-press-event» and call selected_foreach method from within

Подключил обработчики этих сигналов, они тоже молчат. Код брал отсюда

★★★★★

так а в чем собственно проблема?

ananas ★★★★★
()

Телепаты в отпуске

Показали бы свой код что ли сначала, а не пример с форума.

Вот код для данного примера


sttaic void
selected_item_process_func (GtkIconView *icon_view, 
                            GtkTreePath *path,
                            gpointer user_data)
{
    //Здесь процессим выбранный элемент
}

static void
on_selection_changed (GtkIconView *icon_view, gpointer user_data)
{
   //Дальше тута можете получить все GtkTreePath выбранных элемнтов
   GList *selected_paths = gtk_icon_view_get_selected_items (icon_view);
   //Отпроцессить их
   ...
   //И не забыть освободить
   g_list_foreach (selected_paths, (GFunc)gtk_tree_path_free, NULL);
   g_list_free (selected_paths);

   //А можно просто свою функцию для каждого выбранного элемента вызвать
   gtk_icon_view_selected_foreach (icon_view,
                                  (GtkIconViewForeachFunc)selected_item_process_func, 
                                   NULL);
   //Что в принципе одно и то же
)
 
}

int 
main(int argc, char** argv)

  ....
  gtk_icon_view_set_selection_mode (GTK_ICON_VIEW (icon_view), 
                                    GTK_SELECTION_MULTIPLE); 
   
  //Здесь подключаем обработчик сигнала 
  g_signal_connect (G_OBJECT (icon_view), "selection-changed",
      		            G_CALLBACK (on_selection_changed), NULL);
 
  gtk_widget_show_all (scrolled_window);
  ....

}
grassmeister
()
Ответ на: комментарий от ananas

Так ему же надо отпроцессить только выделенные элементы вроде как я понял. *iter_next (...) это если по всей модели надо пробежаться.

А тута два варианта или через *selected_for_each(...) или через *get_selected_paths (...)

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

Что вы считаете под глобальными переменными, приведите пример кода.

ИМХО: присутствие глобальных переменных - признак плохого дизайна. Если цель иметь доступ отовсюду к глобальному объекту - например MainWindow или Application, то используйте Singleton pattern.

Как это сделать на Glib здесь http://blogs.gnome.org/xclaesse/2010/02/11/how-to-make-a-gobject-singleton/

Хотя использование больше одного Singleton в коде - тоже признак плохого дизайна.

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

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

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

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

Вот смотрите на примере диалога.:

1. Наследуете свой класс от GtkDialog (как это сделать читайте в документации)
2. В *.c файле класса в *_init_class через g_type_class_add_private добавляете private структуру
3. В *_init функции инициализируете эту private структуру своими данными.
4. Во все g_signal_connect добавляете свой GtkDialog* четвертым параметром - это то что будет передано вашему обработчику вторым параметром (3-м в случае если это GdkEvent)
5. Ну и в самом обработчике уже извлекаете private структуру из полученного GtkDialog* и имеете указатели на все виджеты.

Ну и вариант если лень разбираться с наследованием классов. В принципе то же самое:

1. В том месте где инициализируете обрабочики g_signal_connect последним параметром передаете указатель на ваш GtkDialog
2. К объекту GtkDialod добавляете через g_object_set_data свои указатели, и в обработчике имея указатель на GtkDialog через g_object_get_data уже получаете все что хотите


Ну и скачайте наконец исходники gedit хотя бы и разбирайтесь что к чему

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

Спасибо за разъяснения, буду учиться.

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