static void bar_pane_keywords_connect_mark_cb(GtkWidget *menu_widget, gpointer data) { PaneKeywordsData *pkd = data; GtkTreeModel *model; GtkTreeIter iter; GtkTreeModel *keyword_tree; GtkTreeIter kw_iter; gint mark = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_widget), "mark")) - 1; model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); if (!pkd->click_tpath) return; if (!gtk_tree_model_get_iter(model, &iter, pkd->click_tpath)) return; gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &kw_iter, &iter); file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd); meta_data_connect_mark_with_keyword(keyword_tree, &kw_iter, mark); file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, NOTIFY_PRIORITY_LOW); // bar_pane_keywords_update(pkd); }
static gboolean bar_pane_keywords_changed_idle_cb(gpointer data) { PaneKeywordsData *pkd = data; file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd); bar_pane_keywords_write(pkd); bar_keyword_tree_sync(pkd); file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, NOTIFY_PRIORITY_LOW); pkd->idle_id = 0; return FALSE; }
static GtkWidget *bar_pane_comment_new(const gchar *id, const gchar *title, const gchar *key, gboolean expanded, gint height) { PaneCommentData *pcd; GtkWidget *scrolled; GtkTextBuffer *buffer; pcd = g_new0(PaneCommentData, 1); pcd->pane.pane_set_fd = bar_pane_comment_set_fd; pcd->pane.pane_event = bar_pane_comment_event; pcd->pane.pane_write_config = bar_pane_comment_write_config; pcd->pane.title = bar_pane_expander_title(title); pcd->pane.id = g_strdup(id); pcd->pane.type = PANE_COMMENT; pcd->pane.expanded = expanded; pcd->key = g_strdup(key); pcd->height = height; scrolled = gtk_scrolled_window_new(NULL, NULL); pcd->widget = scrolled; g_object_set_data(G_OBJECT(pcd->widget), "pane_data", pcd); g_signal_connect(G_OBJECT(pcd->widget), "destroy", G_CALLBACK(bar_pane_comment_destroy), pcd); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_size_request(pcd->widget, -1, height); gtk_widget_show(scrolled); pcd->comment_view = gtk_text_view_new(); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(pcd->comment_view), GTK_WRAP_WORD); gtk_container_add(GTK_CONTAINER(scrolled), pcd->comment_view); g_signal_connect(G_OBJECT(pcd->comment_view), "populate-popup", G_CALLBACK(bar_pane_comment_populate_popup), pcd); gtk_widget_show(pcd->comment_view); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pcd->comment_view)); g_signal_connect(G_OBJECT(buffer), "changed", G_CALLBACK(bar_pane_comment_changed), pcd); file_data_register_notify_func(bar_pane_comment_notify_cb, pcd, NOTIFY_PRIORITY_LOW); return pcd->widget; }
gboolean vd_set_fd(ViewDir *vd, FileData *dir_fd) { gboolean ret = FALSE; file_data_unregister_notify_func(vd_notify_cb, vd); switch (vd->type) { case DIRVIEW_LIST: ret = vdlist_set_fd(vd, dir_fd); break; case DIRVIEW_TREE: ret = vdtree_set_fd(vd, dir_fd); break; } file_data_register_notify_func(vd_notify_cb, vd, NOTIFY_PRIORITY_HIGH); return ret; }
static GtkWidget *bar_pane_exif_new(const gchar *id, const gchar *title, gboolean expanded, gboolean show_all) { PaneExifData *ped; ped = g_new0(PaneExifData, 1); ped->pane.pane_set_fd = bar_pane_exif_set_fd; ped->pane.pane_write_config = bar_pane_exif_write_config; ped->pane.pane_event = bar_pane_exif_event; ped->pane.title = bar_pane_expander_title(title); ped->pane.id = g_strdup(id); ped->pane.expanded = expanded; ped->pane.type = PANE_EXIF; ped->show_all = show_all; ped->size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); ped->widget = gtk_event_box_new(); ped->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP); gtk_container_add(GTK_CONTAINER(ped->widget), ped->vbox); gtk_widget_show(ped->vbox); ped->min_height = MIN_HEIGHT; g_object_set_data(G_OBJECT(ped->widget), "pane_data", ped); g_signal_connect_after(G_OBJECT(ped->widget), "destroy", G_CALLBACK(bar_pane_exif_destroy), ped); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_size_request(ped->widget, -1, ped->min_height); #else g_signal_connect(G_OBJECT(ped->widget), "size-request", G_CALLBACK(bar_pane_exif_size_request), ped); #endif g_signal_connect(G_OBJECT(ped->widget), "size-allocate", G_CALLBACK(bar_pane_exif_size_allocate), ped); bar_pane_exif_dnd_init(ped->widget); g_signal_connect(ped->widget, "button_release_event", G_CALLBACK(bar_pane_exif_menu_cb), ped); file_data_register_notify_func(bar_pane_exif_notify_cb, ped, NOTIFY_PRIORITY_LOW); gtk_widget_show(ped->widget); return ped->widget; }
ViewDir *vd_new(DirViewType type, FileData *dir_fd) { ViewDir *vd = g_new0(ViewDir, 1); vd->widget = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(vd->widget), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vd->widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); vd->pf = folder_icons_new(vd->widget); switch (type) { case DIRVIEW_LIST: vd = vdlist_new(vd, dir_fd); break; case DIRVIEW_TREE: vd = vdtree_new(vd, dir_fd); break; } gtk_container_add(GTK_CONTAINER(vd->widget), vd->view); vd_dnd_init(vd); g_signal_connect(G_OBJECT(vd->view), "row_activated", G_CALLBACK(vd_activate_cb), vd); g_signal_connect(G_OBJECT(vd->widget), "destroy", G_CALLBACK(vd_destroy_cb), vd); g_signal_connect(G_OBJECT(vd->view), "key_press_event", G_CALLBACK(vd_press_key_cb), vd); g_signal_connect(G_OBJECT(vd->view), "button_press_event", G_CALLBACK(vd_press_cb), vd); g_signal_connect(G_OBJECT(vd->view), "button_release_event", G_CALLBACK(vd_release_cb), vd); file_data_register_notify_func(vd_notify_cb, vd, NOTIFY_PRIORITY_HIGH); /* vd_set_fd expects that vd_notify_cb is already registered */ if (dir_fd) vd_set_fd(vd, dir_fd); gtk_widget_show(vd->view); return vd; }
CollectionData *collection_new(const gchar *path) { CollectionData *cd; static gint untitled_counter = 0; cd = g_new0(CollectionData, 1); cd->ref = 1; /* starts with a ref of 1 */ cd->sort_method = SORT_NONE; cd->window_w = COLLECT_DEF_WIDTH; cd->window_h = COLLECT_DEF_HEIGHT; cd->existence = g_hash_table_new(NULL, NULL); if (path) { cd->path = g_strdup(path); cd->name = g_strdup(filename_from_path(cd->path)); /* load it */ } else { if (untitled_counter == 0) { cd->name = g_strdup(_("Untitled")); } else { cd->name = g_strdup_printf(_("Untitled (%d)"), untitled_counter + 1); } untitled_counter++; } file_data_register_notify_func(collection_notify_cb, cd, NOTIFY_PRIORITY_MEDIUM); collection_list = g_list_append(collection_list, cd); return cd; }
static GtkWidget *bar_pane_keywords_new(const gchar *id, const gchar *title, const gchar *key, gboolean expanded) { PaneKeywordsData *pkd; GtkWidget *hbox; GtkWidget *scrolled; GtkTextBuffer *buffer; GtkTreeModel *store; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeIter iter; pkd = g_new0(PaneKeywordsData, 1); pkd->pane.pane_set_fd = bar_pane_keywords_set_fd; pkd->pane.pane_event = bar_pane_keywords_event; pkd->pane.pane_write_config = bar_pane_keywords_write_config; pkd->pane.title = bar_pane_expander_title(title); pkd->pane.id = g_strdup(id); pkd->pane.type = PANE_KEYWORDS; pkd->pane.expanded = expanded; pkd->key = g_strdup(key); pkd->expand_checked = TRUE; hbox = gtk_hbox_new(FALSE, PREF_PAD_GAP); pkd->widget = hbox; g_object_set_data(G_OBJECT(pkd->widget), "pane_data", pkd); g_signal_connect(G_OBJECT(pkd->widget), "destroy", G_CALLBACK(bar_pane_keywords_destroy), pkd); gtk_widget_show(hbox); scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0); gtk_widget_show(scrolled); pkd->keyword_view = gtk_text_view_new(); gtk_container_add(GTK_CONTAINER(scrolled), pkd->keyword_view); g_signal_connect(G_OBJECT(pkd->keyword_view), "populate-popup", G_CALLBACK(bar_pane_keywords_populate_popup_cb), pkd); gtk_widget_show(pkd->keyword_view); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pkd->keyword_view)); g_signal_connect(G_OBJECT(buffer), "changed", G_CALLBACK(bar_pane_keywords_changed), pkd); scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0); gtk_widget_show(scrolled); if (!keyword_tree || !gtk_tree_model_get_iter_first(GTK_TREE_MODEL(keyword_tree), &iter)) { /* keyword tree does not exist or is empty - fill with defaults */ keyword_tree_new_default(); } store = gtk_tree_model_filter_new(GTK_TREE_MODEL(keyword_tree), NULL); gtk_tree_model_filter_set_modify_func(GTK_TREE_MODEL_FILTER(store), FILTER_KEYWORD_COLUMN_COUNT, filter_keyword_column_types, bar_pane_keywords_filter_modify, pkd, NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(store), bar_pane_keywords_filter_visible, store, NULL); pkd->keyword_treeview = gtk_tree_view_new_with_model(store); g_object_unref(store); gtk_widget_set_size_request(pkd->keyword_treeview, -1, 400); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pkd->keyword_treeview), FALSE); // gtk_tree_view_set_search_column(GTK_TREE_VIEW(pkd->keyword_treeview), FILTER_KEYWORD_COLUMN_); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", FILTER_KEYWORD_COLUMN_MARK); gtk_tree_view_append_column(GTK_TREE_VIEW(pkd->keyword_treeview), column); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); renderer = gtk_cell_renderer_toggle_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "active", FILTER_KEYWORD_COLUMN_TOGGLE); gtk_tree_view_column_add_attribute(column, renderer, "visible", FILTER_KEYWORD_COLUMN_IS_KEYWORD); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(bar_pane_keywords_keyword_toggle), pkd); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", FILTER_KEYWORD_COLUMN_NAME); gtk_tree_view_append_column(GTK_TREE_VIEW(pkd->keyword_treeview), column); gtk_tree_view_set_expander_column(GTK_TREE_VIEW(pkd->keyword_treeview), column); gtk_drag_source_set(pkd->keyword_treeview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK, bar_pane_keywords_drag_types, n_keywords_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); g_signal_connect(G_OBJECT(pkd->keyword_treeview), "drag_data_get", G_CALLBACK(bar_pane_keywords_dnd_get), pkd); g_signal_connect(G_OBJECT(pkd->keyword_treeview), "drag_begin", G_CALLBACK(bar_pane_keywords_dnd_begin), pkd); g_signal_connect(G_OBJECT(pkd->keyword_treeview), "drag_end", G_CALLBACK(bar_pane_keywords_dnd_end), pkd); gtk_drag_dest_set(pkd->keyword_treeview, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, bar_pane_keywords_drop_types, n_keywords_drop_types, GDK_ACTION_COPY | GDK_ACTION_MOVE); g_signal_connect(G_OBJECT(pkd->keyword_treeview), "drag_data_received", G_CALLBACK(bar_pane_keywords_dnd_receive), pkd); g_signal_connect(G_OBJECT(pkd->keyword_treeview), "drag_motion", G_CALLBACK(bar_pane_keywords_dnd_motion), pkd); g_signal_connect(G_OBJECT(pkd->keyword_treeview), "button_release_event", G_CALLBACK(bar_pane_keywords_menu_cb), pkd); gtk_container_add(GTK_CONTAINER(scrolled), pkd->keyword_treeview); gtk_widget_show(pkd->keyword_treeview); file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, NOTIFY_PRIORITY_LOW); return pkd->widget; }
GtkWidget *bar_pane_gps_new(const gchar *id, const gchar *title, const gchar *map_id, const gint zoom, const gdouble latitude, const gdouble longitude, gboolean expanded, gint height) { PaneGPSData *pgd; GtkWidget *vbox, *frame; GtkWidget *gpswidget, *viewport; GtkWidget *status, *state, *progress, *slider; ChamplainLayer *layer; ChamplainView *view; const gchar *slider_list[] = {GTK_STOCK_ZOOM_IN, GTK_STOCK_ZOOM_OUT, NULL}; const gchar **slider_icons = slider_list; pgd = g_new0(PaneGPSData, 1); pgd->pane.pane_set_fd = bar_pane_gps_set_fd; pgd->pane.pane_notify_selection = bar_pane_gps_notify_selection; pgd->pane.pane_event = bar_pane_gps_event; pgd->pane.pane_write_config = bar_pane_gps_write_config; pgd->pane.title = bar_pane_expander_title(title); pgd->pane.id = g_strdup(id); pgd->pane.type = PANE_GPS; pgd->pane.expanded = expanded; pgd->height = height; frame = gtk_frame_new(NULL); vbox = gtk_vbox_new(FALSE, 0); gpswidget = gtk_champlain_embed_new(); view = gtk_champlain_embed_get_view(GTK_CHAMPLAIN_EMBED(gpswidget)); gtk_box_pack_start(GTK_BOX(vbox), gpswidget, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(frame), vbox); status = gtk_hbox_new(FALSE,0); slider = gtk_scale_button_new(GTK_ICON_SIZE_SMALL_TOOLBAR, 1, 17, 1, slider_icons); gtk_widget_set_tooltip_text(slider, "Zoom"); gtk_scale_button_set_value(GTK_SCALE_BUTTON(slider), (gdouble)zoom); progress = gtk_progress_bar_new(); state = gtk_label_new(""); gtk_label_set_justify(GTK_LABEL(state), GTK_JUSTIFY_CENTER); gtk_box_pack_start(GTK_BOX(status), GTK_WIDGET(slider), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(status), GTK_WIDGET(state), FALSE, FALSE, 5); gtk_box_pack_end(GTK_BOX(status), GTK_WIDGET(progress), FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(vbox),GTK_WIDGET(status), FALSE, FALSE, 0); layer = champlain_layer_new(); champlain_view_add_layer(view, layer); pgd->icon_layer = layer; pgd->gps_view = CLUTTER_ACTOR(view); pgd->widget = frame; pgd->progress = progress; pgd->slider = slider; pgd->state = state; bar_pane_gps_set_map_source(pgd, map_id); g_object_set(G_OBJECT(view), "scroll-mode", CHAMPLAIN_SCROLL_MODE_KINETIC, "zoom-level", zoom, "keep-center-on-resize", TRUE, /* This seems to be broken, https://bugzilla.gnome.org/show_bug.cgi?id=596419 "decel-rate", 1.0, */ "show-license", TRUE, "zoom-on-double-click", FALSE, "max-zoom-level", 17, "min-zoom-level", 1, NULL); champlain_view_center_on(view, latitude, longitude); pgd->centre_map_checked = TRUE; g_object_set_data(G_OBJECT(pgd->widget), "pane_data", pgd); g_signal_connect(G_OBJECT(pgd->widget), "destroy", G_CALLBACK(bar_pane_gps_destroy), pgd); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_widget_set_size_request(pgd->widget, -1, height); clutter_set_motion_events_enabled(TRUE); g_signal_connect(G_OBJECT(gpswidget), "button_press_event", G_CALLBACK(bar_pane_gps_map_keypress_cb), pgd); g_signal_connect(pgd->gps_view, "notify::state", G_CALLBACK(bar_pane_gps_view_state_changed_cb), pgd); g_signal_connect(pgd->gps_view, "notify::zoom-level", G_CALLBACK(bar_pane_gps_view_state_changed_cb), pgd); g_signal_connect(G_OBJECT(slider), "value-changed", G_CALLBACK(bar_pane_gps_slider_changed_cb), pgd); file_data_register_notify_func(bar_pane_gps_notify_cb, pgd, NOTIFY_PRIORITY_LOW); pgd->create_markers_id = 0; pgd->enable_markers_checked = TRUE; pgd->centre_map_checked = TRUE; return pgd->widget; }
static ViewWindow *real_view_window_new(FileData *fd, GList *list, CollectionData *cd, CollectInfo *info) { ViewWindow *vw; GtkAllocation req_size; GdkGeometry geometry; gint w, h; if (!fd && !list && (!cd || !info)) return NULL; vw = g_new0(ViewWindow, 1); vw->window = window_new(GTK_WINDOW_TOPLEVEL, "view", PIXBUF_INLINE_ICON_VIEW, NULL, NULL); geometry.min_width = DEFAULT_MINIMAL_WINDOW_SIZE; geometry.min_height = DEFAULT_MINIMAL_WINDOW_SIZE; gtk_window_set_geometry_hints(GTK_WINDOW(vw->window), NULL, &geometry, GDK_HINT_MIN_SIZE); gtk_window_set_resizable(GTK_WINDOW(vw->window), TRUE); gtk_container_set_border_width(GTK_CONTAINER(vw->window), 0); vw->imd = image_new(FALSE); image_color_profile_set(vw->imd, options->color_profile.input_type, options->color_profile.use_image); image_color_profile_set_use(vw->imd, options->color_profile.enabled); image_background_set_color_from_options(vw->imd, FALSE); image_attach_window(vw->imd, vw->window, NULL, GQ_APPNAME, TRUE); image_auto_refresh_enable(vw->imd, TRUE); image_top_window_set_sync(vw->imd, TRUE); gtk_container_add(GTK_CONTAINER(vw->window), vw->imd->widget); gtk_widget_show(vw->imd->widget); view_window_dnd_init(vw); view_image_set_buttons(vw, vw->imd); g_signal_connect(G_OBJECT(vw->window), "destroy", G_CALLBACK(view_window_destroy_cb), vw); g_signal_connect(G_OBJECT(vw->window), "delete_event", G_CALLBACK(view_window_delete_cb), vw); g_signal_connect(G_OBJECT(vw->window), "key_press_event", G_CALLBACK(view_window_key_press_cb), vw); if (cd && info) { image_change_from_collection(vw->imd, cd, info, image_zoom_get_default(NULL)); if (options->image.enable_read_ahead) { CollectInfo * r_info = collection_next_by_info(cd, info); if (!r_info) r_info = collection_prev_by_info(cd, info); if (r_info) image_prebuffer_set(vw->imd, r_info->fd); } } else if (list) { view_window_set_list(vw, list); vw->list_pointer = vw->list; image_change_fd(vw->imd, (FileData *)vw->list->data, image_zoom_get_default(NULL)); if (options->image.enable_read_ahead) { GList *work = vw->list->next; if (work) image_prebuffer_set(vw->imd, (FileData *)work->data); } } else { image_change_fd(vw->imd, fd, image_zoom_get_default(NULL)); } /* Wait until image is loaded otherwise size is not defined */ int count; for (count = 10; count && !w && !h; count++) { image_get_image_size(vw->imd, &w, &h); usleep(100000); } if (image_zoom_get(vw->imd) == 0.0) { image_get_image_size(vw->imd, &w, &h); } else { pixbuf_renderer_get_scaled_size(PIXBUF_RENDERER(vw->imd->pr), &w, &h); } if (options->image.limit_window_size) { gint mw = gdk_screen_width() * options->image.max_window_size / 100; gint mh = gdk_screen_height() * options->image.max_window_size / 100; if (w > mw) w = mw; if (h > mh) h = mh; } gtk_window_set_default_size(GTK_WINDOW(vw->window), w, h); req_size.x = req_size.y = 0; req_size.width = w; req_size.height = h; gtk_widget_size_allocate(GTK_WIDGET(vw->window), &req_size); gtk_widget_set_size_request(vw->imd->pr, w, h); gtk_widget_show(vw->window); view_window_list = g_list_append(view_window_list, vw); file_data_register_notify_func(view_window_notify_cb, vw, NOTIFY_PRIORITY_LOW); return vw; }