56 return _(
"locations");
61 static const char *
v[] = {
"map", NULL};
124 gtk_widget_get_size_request (GTK_WIDGET(
d->window), &
width, &
height);
128 gtk_widget_set_size_request(GTK_WIDGET(
d->window), -1, (gint)
height);
139 gboolean found =
FALSE;
140 if(locid <= 0)
return found;
146 if(found)
return found;
147 GtkTreeIter child, parent = *iter;
148 if(gtk_tree_model_iter_children(
model, &child, &parent))
157 }
while(gtk_tree_model_iter_next(
model, iter));
165 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
168 gtk_tree_view_set_model(GTK_TREE_VIEW(
d->view), NULL);
169 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
170 GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
172 gtk_tree_store_clear(GTK_TREE_STORE(
model));
175 char **last_tokens = NULL;
176 int last_tokens_length = 0;
177 GtkTreeIter last_parent = { 0 };
180 for(GList *stag = tags; stag; stag = g_list_next(stag))
186 tokens = g_strsplit(tag,
"|", -1);
190 GtkTreeIter parent = last_parent;
191 const int tokens_length = g_strv_length(tokens);
192 int common_length = 0;
195 while(tokens[common_length] && last_tokens[common_length] &&
196 !g_strcmp0(tokens[common_length], last_tokens[common_length]))
202 for(
int i = common_length;
i < last_tokens_length;
i++)
204 gtk_tree_model_iter_parent(GTK_TREE_MODEL(
model), &parent, &last_parent);
205 last_parent = parent;
211 for(
int i = 0;
i < common_length;
i++)
214 for(
char **token = &tokens[common_length]; *token; token++)
217 gchar *pth2 = g_strdup(pth);
218 pth2[strlen(pth2) - 1] =
'\0';
219 gtk_tree_store_insert(GTK_TREE_STORE(
model), &iter, common_length > 0 ? &parent : NULL, -1);
220 gtk_tree_store_set(GTK_TREE_STORE(
model), &iter,
235 if(last_tokens) g_strfreev(last_tokens);
236 last_tokens = tokens;
237 last_parent = parent;
238 last_tokens_length = tokens_length;
241 g_strfreev(last_tokens);
244 gtk_tree_view_set_model(GTK_TREE_VIEW(
d->view),
model);
245 g_object_unref(
model);
246 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
253 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
254 if(gtk_tree_model_get_iter_first(
model, &iter))
258 gtk_tree_selection_select_iter(selection, &iter);
259 GtkTreePath *path = gtk_tree_model_get_path(
model, &iter);
260 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(
d->view), path);
261 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(
d->view), path, NULL,
TRUE, 0.5, 0.5);
262 gtk_tree_view_set_cursor(GTK_TREE_VIEW(
d->view), path,
d->name_col,
FALSE);
263 gtk_tree_path_free(path);
273 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
274 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
275 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
277 gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(
d->new_button))), _(
"new sub-location"));
281 gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(
d->new_button))), _(
"new location"));
286 GtkTreeModel *
model, GtkTreeIter *iter,
294 gtk_tree_model_get(
model, iter,
301 coltext = g_markup_printf_escaped(locid ?
"%s" :
"<i>%s</i>",
name);
305 coltext = g_markup_printf_escaped(locid ?
"%s (%d)" :
"<i>%s</i> (%d)",
name, count);
307 g_object_set(renderer,
"markup", coltext, NULL);
316 GtkTreeIter iter, parent;
317 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
318 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
321 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
326 name = path ? g_strconcat(path,
"|", NULL) : g_strdup(
"");
327 const int base_len = strlen(
name);
330 char *new_name = g_strdup(
name);
334 new_name = g_strdup_printf(
"%s %d",
name,
i);
339 gtk_tree_store_insert(GTK_TREE_STORE(
model), &iter, path ? &parent : NULL, -1);
340 gtk_tree_store_set(GTK_TREE_STORE(
model), &iter,
351 g_object_set(G_OBJECT(
d->renderer),
"editable",
TRUE, NULL);
352 GtkTreePath *path2 = gtk_tree_model_get_path(
model, &iter);
353 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(
d->view), path2);
354 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(
d->view), path2, NULL,
TRUE, 0.5, 0.5);
355 gtk_tree_view_set_cursor(GTK_TREE_VIEW(
d->view), path2,
d->name_col,
TRUE);
356 gtk_tree_path_free(path2);
369 g_signal_handler_block (
d->shape_button,
d->shape_button_handler);
370 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
d->shape_button),
FALSE);
372 g_signal_handler_unblock (
d->shape_button,
d->shape_button_handler);
379 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
d->show_all_button)));
386 GtkTreeIter child, parent = *iter;
387 gboolean valid =
TRUE;
390 if(gtk_tree_model_iter_children(
model, &child, &parent))
392 GtkTreeIter tobedel = parent;
393 valid = gtk_tree_model_iter_next(
model, &parent);
397 gtk_tree_store_remove(GTK_TREE_STORE(
model), &tobedel);
398 }
while (!root && valid);
407 if (g_str_has_prefix(tagname, oldtagname))
409 if (strlen(tagname) == strlen(oldtagname))
412 char *subtag = g_strrstr(to->
newtagname,
"|");
413 subtag = (!subtag) ? newtagname : subtag + 1;
414 gtk_tree_store_set(GTK_TREE_STORE(
model), iter,
418 else if (strlen(tagname) > strlen(oldtagname) && tagname[strlen(oldtagname)] ==
'|')
421 char *newpath = g_strconcat(newtagname, &tagname[strlen(oldtagname)] , NULL);
422 gtk_tree_store_set(GTK_TREE_STORE(
model), iter,
439 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
440 if(gtk_tree_model_get_iter_first(
model, &iter))
444 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
445 gtk_tree_selection_select_iter(selection, &iter);
446 GtkTreePath *path = gtk_tree_model_get_path(
model, &iter);
447 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(
d->view), path);
448 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(
d->view), path, NULL,
TRUE, 0.5, 0.5);
449 gtk_tree_view_set_cursor(GTK_TREE_VIEW(
d->view), path,
d->name_col,
FALSE);
450 gtk_tree_path_free(path);
458 for(GList* img = imgs; img; img = g_list_next(img))
470 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
471 if(gtk_tree_model_get_iter_first(
model, &iter))
473 for(GList *loc = locs; loc; loc = g_list_next(loc))
476 GtkTreeIter iter2 = iter;
479 gtk_tree_store_set(GTK_TREE_STORE(
model), &iter2,
495 g_signal_handler_block (
d->shape_button,
d->shape_button_handler);
498 g_signal_handler_unblock (
d->shape_button,
d->shape_button_handler);
501 d->polygons = polygons;
514 gboolean canceled =
TRUE;
515 g_object_get(editable,
"editing-canceled", &canceled, NULL);
516 const gchar *
name = gtk_entry_get_text(GTK_ENTRY(editable));
519 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
520 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
521 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
533 const gboolean isroot = !strcmp(path,
leave);
534 const int path_len = strlen(path);
538 const int leave_len = strlen(
leave);
539 const char letter = path[path_len - leave_len];
540 path[path_len - leave_len] =
'\0';
541 new_path = g_strconcat(path,
name, NULL);
542 path[path_len - leave_len] = letter;
545 new_path = g_strdup((
char *)
name);
547 gboolean new_exists =
FALSE;
548 GList *new_existing = NULL;
569 g.delta1 =
g.delta2 = 0.0;
570 g.polygons =
d->polygons;
573 if(g_strstr_len(
name, -1,
"|"))
580 gtk_tree_store_set(GTK_TREE_STORE(
model), &iter,
588 else canceled =
TRUE;
594 for (GList *tag = children; tag; tag = g_list_next(tag))
598 char *new_name = g_strconcat(new_path, new_part, NULL);
616 GtkSortType sort_order;
617 gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(
model),
618 &sort_column, &sort_order);
619 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
620 GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
623 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
624 sort_column, sort_order);
631 dt_control_log(_(
"location name \'%s\' already exists"), new_path);
642 gtk_tree_selection_unselect_all(selection);
648 g_object_set(G_OBJECT(
d->renderer),
"editable",
FALSE, NULL);
656 if (GTK_IS_ENTRY(editable))
659 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
661 GtkTreePath *new_path = gtk_tree_path_new_from_string(path);
662 if(gtk_tree_model_get_iter(
model, &iter, new_path))
666 gtk_entry_set_text(GTK_ENTRY(editable),
name);
669 gtk_tree_path_free(new_path);
671 g_signal_connect(G_OBJECT(editable),
"editing-done", G_CALLBACK(
_name_editing_done), self);
676 GtkTreeIter *a, GtkTreeIter *b,
685 const gboolean sort = g_ascii_strncasecmp(tag_a, tag_b, -1);
695 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
696 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
697 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
699 GtkTreePath *path = gtk_tree_model_get_path(
model, &iter);
700 g_object_set(G_OBJECT(
d->renderer),
"editable",
TRUE, NULL);
701 gtk_tree_view_set_cursor(GTK_TREE_VIEW(
d->view), path,
d->name_col,
TRUE);
702 gtk_tree_path_free(path);
711 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
712 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
713 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
725 if(gtk_tree_model_iter_parent(
model, &parent, &iter))
732 gtk_tree_selection_unselect_all(selection);
743 gtk_tree_selection_unselect_all(selection);
752 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
754 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
755 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
758 gtk_tree_model_get(
model, &iter,
778 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
779 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
780 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
784 char *collection = g_strdup_printf(
"1:0:%d:%s|%s$",
809 menu = gtk_menu_new();
812 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
view));
813 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
view));
815 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
819 GtkTreeIter child, parent = iter;
820 const gboolean children = gtk_tree_model_iter_children(
model, &child, &parent);
822 menuitem = gtk_menu_item_new_with_label(_(
"edit location"));
824 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
825 menuitem = gtk_menu_item_new_with_label(_(
"delete location"));
827 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
830 gtk_widget_set_sensitive(menuitem,
FALSE);
833 menuitem = gtk_separator_menu_item_new();
834 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
835 menuitem = gtk_menu_item_new_with_label(_(
"update filmstrip"));
836 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
839 gtk_widget_set_sensitive(menuitem,
FALSE);
842 menuitem = gtk_menu_item_new_with_label(_(
"go to collection (lighttable)"));
843 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
847 gtk_widget_set_sensitive(menuitem,
FALSE);
851 gtk_widget_show_all(GTK_WIDGET(menu));
853 gtk_menu_popup_at_pointer(GTK_MENU(menu), (GdkEvent *)event);
860 gtk_tree_selection_unselect_all(
d->selection);
868 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
869 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
885 g_object_get(G_OBJECT(
d->renderer),
"editing", &editing, NULL);
888 dt_control_log(_(
"terminate edit (press enter or escape) before selecting another location"));
892 const int button_pressed = (
event->type == GDK_BUTTON_PRESS) ? event->button : 0;
899 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
view));
900 GtkTreePath *path = NULL;
902 if(gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(
view), (gint)event->x,
903 (gint)event->y, &path, NULL, NULL, NULL))
907 gtk_tree_selection_select_path(selection, path);
909 gtk_tree_path_free(path);
915 if(gtk_tree_selection_path_is_selected(selection, path))
917 gtk_tree_path_free(path);
922 gtk_tree_selection_select_path(selection, path);
923 g_object_set(G_OBJECT(
d->renderer),
"editable",
TRUE, NULL);
924 gtk_tree_view_set_cursor(GTK_TREE_VIEW(
d->view), path,
d->name_col,
TRUE);
925 gtk_tree_path_free(path);
946 GtkWidget *w = gtk_scrolled_window_new(NULL, NULL);
950 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(w), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
953 GtkTreeView *
view = GTK_TREE_VIEW(gtk_tree_view_new());
954 d->view = GTK_WIDGET(
view);
955 gtk_tree_view_set_headers_visible(
view,
FALSE);
957 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT);
961 GtkTreeViewColumn *col = gtk_tree_view_column_new();
962 gtk_tree_view_append_column(
view, col);
963 gtk_tree_view_set_expander_column(
view, col);
966 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
967 gtk_tree_view_column_pack_start(col, renderer,
TRUE);
969 gtk_tree_view_column_set_cell_data_func(col, renderer,
_tree_name_show, (gpointer)self, NULL);
971 g_signal_connect(G_OBJECT(renderer),
"editing-started", G_CALLBACK(
_name_start_editing), self);
972 d->renderer = renderer;
974 GtkTreeSelection *selection = gtk_tree_view_get_selection(
view);
975 d->selection = selection;
976 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
977 gtk_tree_view_set_model(
view, GTK_TREE_MODEL(treestore));
978 g_object_unref(treestore);
979 g_signal_connect(G_OBJECT(
view),
"button-press-event", G_CALLBACK(
_click_on_view), self);
980 g_signal_connect(G_OBJECT(
view),
"scroll-event", G_CALLBACK(
_mouse_scroll), self);
981 gtk_container_add(GTK_CONTAINER(w), GTK_WIDGET(
view));
982 gtk_widget_set_tooltip_text(GTK_WIDGET(
view),
983 _(
"list of user locations,"
984 "\nclick to show or hide a location on the map:"
985 "\n - wheel scroll inside the shape to resize it"
986 "\n - <shift> or <ctrl> scroll to modify the width or the height"
987 "\n - click inside the shape and drag it to change its position"
988 "\n - ctrl-click to move an image from inside the location"
989 "\nctrl-click to edit a location name"
990 "\n - a pipe \'|\' symbol breaks the name into several levels"
991 "\n - to remove a group of locations clear its name"
992 "\n - press enter to validate the new name, escape to cancel the edit"
993 "\nright-click for other actions: delete location and go to collection,"
994 "\nctrl-wheel scroll to resize the window"));
1006 gtk_box_pack_start(hbox,
d->shape_button,
FALSE,
TRUE, 0);
1007 d->shape_button_handler = g_signal_connect(G_OBJECT(
d->shape_button),
"clicked",
1009 gtk_widget_set_tooltip_text(GTK_WIDGET(
d->shape_button ),
1010 _(
"select the shape of the location\'s limits on the map, circle or rectangle"
1011 "\nor even polygon if available (select first a polygon place in 'find location' module)"));
1014 _(
"add a new location on the center of the visible map"), 0, 0);
1015 gtk_box_pack_start(hbox,
d->new_button,
TRUE,
TRUE, 0);
1018 d->show_all_button = gtk_check_button_new_with_label(_(
"show all"));
1019 gtk_label_set_ellipsize(GTK_LABEL(gtk_bin_get_child(GTK_BIN(
d->show_all_button))), PANGO_ELLIPSIZE_END);
1020 gtk_widget_set_tooltip_text(
d->show_all_button,
1021 _(
"show all locations which are on the visible map"));
1022 gtk_box_pack_end(hbox,
d->show_all_button,
FALSE,
FALSE, 8);
1025 gtk_box_pack_start(GTK_BOX(self->
widget), GTK_WIDGET(hbox),
FALSE,
TRUE, 0);
1030 g_signal_connect(G_OBJECT(selection),
"changed", G_CALLBACK(
_selection_changed), self);
Handle default and user-set shortcuts (accelerators)
int button_pressed(struct dt_iop_module_t *self, double x, double y, double pressure, int which, int type, uint32_t state)
void dt_collection_deserialize(const char *buf)
@ DT_COLLECTION_PROP_GEOTAGGING
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
void dt_conf_set_bool(const char *name, int val)
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
Integer for name, clamped to the bounds declared in the XML.
void dt_control_log(const char *msg,...)
void leave(dt_view_t *self)
void reset(dt_view_t *self)
struct dt_view_manager_t * dt_view_manager_get_global(void)
GtkWidget * view
the tree view
GtkWidget * dt_action_button_new(dt_lib_module_t *self, const gchar *label, gpointer callback, gpointer data, const gchar *tooltip, guint accel_key, GdkModifierType mods)
static void _view_map_geotag_changed(gpointer instance, GList *imgs, const int newlocid, dt_lib_module_t *self)
static void _display_buttons(dt_lib_module_t *self)
static void _name_start_editing(GtkCellRenderer *renderer, GtkCellEditable *editable, char *path, dt_lib_module_t *self)
static void _tree_name_show(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
static void _pop_menu_goto_collection(GtkWidget *menuitem, dt_lib_module_t *self)
static void _show_location(dt_lib_module_t *self)
static gboolean _set_location_collection(dt_lib_module_t *self)
const DTGTKCairoPaintIconFunc location_shapes[]
static void _delete_tree_path(GtkTreeModel *model, GtkTreeIter *iter, gboolean root)
static void _pop_menu_edit_location(GtkWidget *menuitem, dt_lib_module_t *self)
static void _new_button_clicked(GtkButton *button, dt_lib_module_t *self)
static gboolean _find_tag_iter_id(GtkTreeModel *model, GtkTreeIter *iter, const guint locid)
static void _signal_location_change(dt_lib_module_t *self)
static gboolean _update_tag_name_per_name(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, dt_loc_op_t *to)
static void _pop_menu_view(GtkWidget *view, GdkEventButton *event, dt_lib_module_t *self)
static void _show_all_button_clicked(GtkButton *button, dt_lib_module_t *self)
void gui_cleanup(dt_lib_module_t *self)
static void _name_editing_done(GtkCellEditable *editable, dt_lib_module_t *self)
static void _pop_menu_update_filmstrip(GtkWidget *menuitem, dt_lib_module_t *self)
static gboolean _mouse_scroll(GtkWidget *treeview, GdkEventScroll *event, dt_lib_module_t *self)
dt_map_position_name_sort_id
@ DT_MAP_POSITION_SORT_NAME_ID
uint32_t container(dt_lib_module_t *self)
@ DT_MAP_LOCATION_NUM_COLS
@ DT_MAP_LOCATION_COL_TAG
@ DT_MAP_LOCATION_COL_COUNT
@ DT_MAP_LOCATION_COL_PATH
static gboolean _click_on_view(GtkWidget *view, GdkEventButton *event, dt_lib_module_t *self)
static void _shape_button_clicked(GtkButton *button, dt_lib_module_t *self)
void gui_init(dt_lib_module_t *self)
static gboolean _force_selection_changed(gpointer user_data)
static void _selection_changed(GtkTreeSelection *selection, dt_lib_module_t *self)
const char ** views(dt_lib_module_t *self)
static void _view_map_location_changed(gpointer instance, GList *polygons, dt_lib_module_t *self)
static void _pop_menu_delete_location(GtkWidget *menuitem, dt_lib_module_t *self)
static gint _sort_position_names_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, dt_lib_module_t *self)
static void _locations_tree_update(dt_lib_module_t *self, const guint locid)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
@ MAP_LOCATION_ACTION_UPDATE_OTHERS
@ MAP_LOCATION_ACTION_REMOVE
@ MAP_LOCATION_SHAPE_POLYGONS
@ MAP_LOCATION_SHAPE_ELLIPSE
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
#define DT_MODULE(MODVER)
Instantiate the version handshake every module must export. Use once, at file scope,...
void dt_control_signal_unblock_by_func(const struct dt_control_signal_t *ctlsig, GCallback cb, gpointer user_data)
void dt_control_signal_block_by_func(const struct dt_control_signal_t *ctlsig, GCallback cb, gpointer user_data)
#define DT_DEBUG_CONTROL_SIGNAL_DISCONNECT(ctlsig, cb, user_data)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
struct dt_control_signal_t * dt_control_signal_get_global(void)
@ DT_SIGNAL_GEOTAG_CHANGED
This signal is raised when a geotag is added/deleted/changed
@ DT_SIGNAL_LOCATION_CHANGED
#define DT_DEBUG_CONTROL_SIGNAL_CONNECT(ctlsig, signal, cb, user_data)
GtkCellRenderer * renderer
GtkWidget * show_all_button
GtkTreeViewColumn * name_col
GtkTreeSelection * selection
gulong shape_button_handler
Telling the user something happened.
gchar * dt_util_dstrcat(gchar *str, const gchar *format,...)
void dt_view_map_location_action(const dt_view_manager_t *vm, const int action)
void dt_view_map_add_location(const dt_view_manager_t *vm, dt_map_location_data_t *p, const guint posid)
int dt_view_manager_switch(dt_view_manager_t *vm, const char *view_name)
@ DT_UI_CONTAINER_PANEL_RIGHT_CENTER