46 return _(
"locations");
51 static const char *
v[] = {
"map", NULL};
114 gtk_widget_get_size_request (GTK_WIDGET(
d->window), &
width, &
height);
118 gtk_widget_set_size_request(GTK_WIDGET(
d->window), -1, (gint)
height);
129 gboolean found =
FALSE;
130 if(locid <= 0)
return found;
136 if(found)
return found;
137 GtkTreeIter child, parent = *iter;
138 if(gtk_tree_model_iter_children(
model, &child, &parent))
147 }
while(gtk_tree_model_iter_next(
model, iter));
155 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
158 gtk_tree_view_set_model(GTK_TREE_VIEW(
d->view), NULL);
159 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
160 GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
162 gtk_tree_store_clear(GTK_TREE_STORE(
model));
165 char **last_tokens = NULL;
166 int last_tokens_length = 0;
167 GtkTreeIter last_parent = { 0 };
170 for(GList *stag = tags; stag; stag = g_list_next(stag))
176 tokens = g_strsplit(tag,
"|", -1);
180 GtkTreeIter parent = last_parent;
181 const int tokens_length = g_strv_length(tokens);
182 int common_length = 0;
185 while(tokens[common_length] && last_tokens[common_length] &&
186 !g_strcmp0(tokens[common_length], last_tokens[common_length]))
192 for(
int i = common_length;
i < last_tokens_length;
i++)
194 gtk_tree_model_iter_parent(GTK_TREE_MODEL(
model), &parent, &last_parent);
195 last_parent = parent;
201 for(
int i = 0;
i < common_length;
i++)
204 for(
char **token = &tokens[common_length]; *token; token++)
207 gchar *pth2 = g_strdup(pth);
208 pth2[strlen(pth2) - 1] =
'\0';
209 gtk_tree_store_insert(GTK_TREE_STORE(
model), &iter, common_length > 0 ? &parent : NULL, -1);
210 gtk_tree_store_set(GTK_TREE_STORE(
model), &iter,
225 if(last_tokens) g_strfreev(last_tokens);
226 last_tokens = tokens;
227 last_parent = parent;
228 last_tokens_length = tokens_length;
231 g_strfreev(last_tokens);
234 gtk_tree_view_set_model(GTK_TREE_VIEW(
d->view),
model);
235 g_object_unref(
model);
236 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
243 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
244 if(gtk_tree_model_get_iter_first(
model, &iter))
248 gtk_tree_selection_select_iter(selection, &iter);
249 GtkTreePath *path = gtk_tree_model_get_path(
model, &iter);
250 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(
d->view), path);
251 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(
d->view), path, NULL,
TRUE, 0.5, 0.5);
252 gtk_tree_view_set_cursor(GTK_TREE_VIEW(
d->view), path,
d->name_col,
FALSE);
253 gtk_tree_path_free(path);
263 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
264 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
265 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
267 gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(
d->new_button))), _(
"new sub-location"));
271 gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(
d->new_button))), _(
"new location"));
276 GtkTreeModel *
model, GtkTreeIter *iter,
284 gtk_tree_model_get(
model, iter,
291 coltext = g_markup_printf_escaped(locid ?
"%s" :
"<i>%s</i>",
name);
295 coltext = g_markup_printf_escaped(locid ?
"%s (%d)" :
"<i>%s</i> (%d)",
name, count);
297 g_object_set(renderer,
"markup", coltext, NULL);
306 GtkTreeIter iter, parent;
307 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
308 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
311 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
316 name = path ? g_strconcat(path,
"|", NULL) : g_strdup(
"");
317 const int base_len = strlen(
name);
320 char *new_name = g_strdup(
name);
324 new_name = g_strdup_printf(
"%s %d",
name,
i);
329 gtk_tree_store_insert(GTK_TREE_STORE(
model), &iter, path ? &parent : NULL, -1);
330 gtk_tree_store_set(GTK_TREE_STORE(
model), &iter,
341 g_object_set(G_OBJECT(
d->renderer),
"editable",
TRUE, NULL);
342 GtkTreePath *path2 = gtk_tree_model_get_path(
model, &iter);
343 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(
d->view), path2);
344 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(
d->view), path2, NULL,
TRUE, 0.5, 0.5);
345 gtk_tree_view_set_cursor(GTK_TREE_VIEW(
d->view), path2,
d->name_col,
TRUE);
346 gtk_tree_path_free(path2);
359 g_signal_handler_block (
d->shape_button,
d->shape_button_handler);
360 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
d->shape_button),
FALSE);
362 g_signal_handler_unblock (
d->shape_button,
d->shape_button_handler);
369 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
d->show_all_button)));
376 GtkTreeIter child, parent = *iter;
377 gboolean valid =
TRUE;
380 if(gtk_tree_model_iter_children(
model, &child, &parent))
382 GtkTreeIter tobedel = parent;
383 valid = gtk_tree_model_iter_next(
model, &parent);
387 gtk_tree_store_remove(GTK_TREE_STORE(
model), &tobedel);
388 }
while (!root && valid);
397 if (g_str_has_prefix(tagname, oldtagname))
399 if (strlen(tagname) == strlen(oldtagname))
402 char *subtag = g_strrstr(to->
newtagname,
"|");
403 subtag = (!subtag) ? newtagname : subtag + 1;
404 gtk_tree_store_set(GTK_TREE_STORE(
model), iter,
408 else if (strlen(tagname) > strlen(oldtagname) && tagname[strlen(oldtagname)] ==
'|')
411 char *newpath = g_strconcat(newtagname, &tagname[strlen(oldtagname)] , NULL);
412 gtk_tree_store_set(GTK_TREE_STORE(
model), iter,
429 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
430 if(gtk_tree_model_get_iter_first(
model, &iter))
434 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
435 gtk_tree_selection_select_iter(selection, &iter);
436 GtkTreePath *path = gtk_tree_model_get_path(
model, &iter);
437 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(
d->view), path);
438 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(
d->view), path, NULL,
TRUE, 0.5, 0.5);
439 gtk_tree_view_set_cursor(GTK_TREE_VIEW(
d->view), path,
d->name_col,
FALSE);
440 gtk_tree_path_free(path);
448 for(GList* img = imgs; img; img = g_list_next(img))
460 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
461 if(gtk_tree_model_get_iter_first(
model, &iter))
463 for(GList *loc = locs; loc; loc = g_list_next(loc))
466 GtkTreeIter iter2 = iter;
469 gtk_tree_store_set(GTK_TREE_STORE(
model), &iter2,
485 g_signal_handler_block (
d->shape_button,
d->shape_button_handler);
488 g_signal_handler_unblock (
d->shape_button,
d->shape_button_handler);
491 d->polygons = polygons;
504 gboolean canceled =
TRUE;
505 g_object_get(editable,
"editing-canceled", &canceled, NULL);
506 const gchar *
name = gtk_entry_get_text(GTK_ENTRY(editable));
509 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
510 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
511 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
523 const gboolean isroot = !strcmp(path,
leave);
524 const int path_len = strlen(path);
528 const int leave_len = strlen(
leave);
529 const char letter = path[path_len - leave_len];
530 path[path_len - leave_len] =
'\0';
531 new_path = g_strconcat(path,
name, NULL);
532 path[path_len - leave_len] = letter;
535 new_path = g_strdup((
char *)
name);
537 gboolean new_exists =
FALSE;
538 GList *new_existing = NULL;
559 g.delta1 =
g.delta2 = 0.0;
560 g.polygons =
d->polygons;
563 if(g_strstr_len(
name, -1,
"|"))
570 gtk_tree_store_set(GTK_TREE_STORE(
model), &iter,
578 else canceled =
TRUE;
584 for (GList *tag = children; tag; tag = g_list_next(tag))
588 char *new_name = g_strconcat(new_path, new_part, NULL);
606 GtkSortType sort_order;
607 gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(
model),
608 &sort_column, &sort_order);
609 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
610 GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
613 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
614 sort_column, sort_order);
621 dt_control_log(_(
"location name \'%s\' already exists"), new_path);
632 gtk_tree_selection_unselect_all(selection);
638 g_object_set(G_OBJECT(
d->renderer),
"editable",
FALSE, NULL);
646 if (GTK_IS_ENTRY(editable))
649 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
651 GtkTreePath *new_path = gtk_tree_path_new_from_string(path);
652 if(gtk_tree_model_get_iter(
model, &iter, new_path))
656 gtk_entry_set_text(GTK_ENTRY(editable),
name);
659 gtk_tree_path_free(new_path);
661 g_signal_connect(G_OBJECT(editable),
"editing-done", G_CALLBACK(
_name_editing_done), self);
666 GtkTreeIter *a, GtkTreeIter *b,
675 const gboolean sort = g_ascii_strncasecmp(tag_a, tag_b, -1);
685 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
686 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
687 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
689 GtkTreePath *path = gtk_tree_model_get_path(
model, &iter);
690 g_object_set(G_OBJECT(
d->renderer),
"editable",
TRUE, NULL);
691 gtk_tree_view_set_cursor(GTK_TREE_VIEW(
d->view), path,
d->name_col,
TRUE);
692 gtk_tree_path_free(path);
701 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
702 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
703 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
715 if(gtk_tree_model_iter_parent(
model, &parent, &iter))
722 gtk_tree_selection_unselect_all(selection);
733 gtk_tree_selection_unselect_all(selection);
742 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
744 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
745 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
748 gtk_tree_model_get(
model, &iter,
768 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
769 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
d->view));
770 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
774 char *collection = g_strdup_printf(
"1:0:%d:%s|%s$",
799 menu = gtk_menu_new();
802 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
view));
803 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
view));
805 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
809 GtkTreeIter child, parent = iter;
810 const gboolean children = gtk_tree_model_iter_children(
model, &child, &parent);
812 menuitem = gtk_menu_item_new_with_label(_(
"edit location"));
814 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
815 menuitem = gtk_menu_item_new_with_label(_(
"delete location"));
817 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
820 gtk_widget_set_sensitive(menuitem,
FALSE);
823 menuitem = gtk_separator_menu_item_new();
824 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
825 menuitem = gtk_menu_item_new_with_label(_(
"update filmstrip"));
826 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
829 gtk_widget_set_sensitive(menuitem,
FALSE);
832 menuitem = gtk_menu_item_new_with_label(_(
"go to collection (lighttable)"));
833 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
837 gtk_widget_set_sensitive(menuitem,
FALSE);
841 gtk_widget_show_all(GTK_WIDGET(menu));
843 gtk_menu_popup_at_pointer(GTK_MENU(menu), (GdkEvent *)event);
850 gtk_tree_selection_unselect_all(
d->selection);
858 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(
d->view));
859 if(gtk_tree_selection_get_selected(selection, &
model, &iter))
875 g_object_get(G_OBJECT(
d->renderer),
"editing", &editing, NULL);
878 dt_control_log(_(
"terminate edit (press enter or escape) before selecting another location"));
882 const int button_pressed = (
event->type == GDK_BUTTON_PRESS) ? event->button : 0;
883 const gboolean ctrl_pressed =
dt_modifier_is(event->state, GDK_CONTROL_MASK);
889 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
view));
890 GtkTreePath *path = NULL;
892 if(gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(
view), (gint)event->x,
893 (gint)event->y, &path, NULL, NULL, NULL))
897 gtk_tree_selection_select_path(selection, path);
899 gtk_tree_path_free(path);
905 if(gtk_tree_selection_path_is_selected(selection, path))
907 gtk_tree_path_free(path);
912 gtk_tree_selection_select_path(selection, path);
913 g_object_set(G_OBJECT(
d->renderer),
"editable",
TRUE, NULL);
914 gtk_tree_view_set_cursor(GTK_TREE_VIEW(
d->view), path,
d->name_col,
TRUE);
915 gtk_tree_path_free(path);
936 GtkWidget *w = gtk_scrolled_window_new(NULL, NULL);
940 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(w), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
943 GtkTreeView *
view = GTK_TREE_VIEW(gtk_tree_view_new());
944 d->view = GTK_WIDGET(
view);
945 gtk_tree_view_set_headers_visible(
view,
FALSE);
947 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT);
951 GtkTreeViewColumn *col = gtk_tree_view_column_new();
952 gtk_tree_view_append_column(
view, col);
953 gtk_tree_view_set_expander_column(
view, col);
956 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
957 gtk_tree_view_column_pack_start(col, renderer,
TRUE);
959 gtk_tree_view_column_set_cell_data_func(col, renderer,
_tree_name_show, (gpointer)self, NULL);
961 g_signal_connect(G_OBJECT(renderer),
"editing-started", G_CALLBACK(
_name_start_editing), self);
962 d->renderer = renderer;
964 GtkTreeSelection *selection = gtk_tree_view_get_selection(
view);
965 d->selection = selection;
966 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
967 gtk_tree_view_set_model(
view, GTK_TREE_MODEL(treestore));
968 g_object_unref(treestore);
969 g_signal_connect(G_OBJECT(
view),
"button-press-event", G_CALLBACK(
_click_on_view), self);
970 g_signal_connect(G_OBJECT(
view),
"scroll-event", G_CALLBACK(
_mouse_scroll), self);
971 gtk_container_add(GTK_CONTAINER(w), GTK_WIDGET(
view));
972 gtk_widget_set_tooltip_text(GTK_WIDGET(
view),
973 _(
"list of user locations,"
974 "\nclick to show or hide a location on the map:"
975 "\n - wheel scroll inside the shape to resize it"
976 "\n - <shift> or <ctrl> scroll to modify the width or the height"
977 "\n - click inside the shape and drag it to change its position"
978 "\n - ctrl-click to move an image from inside the location"
979 "\nctrl-click to edit a location name"
980 "\n - a pipe \'|\' symbol breaks the name into several levels"
981 "\n - to remove a group of locations clear its name"
982 "\n - press enter to validate the new name, escape to cancel the edit"
983 "\nright-click for other actions: delete location and go to collection,"
984 "\nctrl-wheel scroll to resize the window"));
996 gtk_box_pack_start(hbox,
d->shape_button,
FALSE,
TRUE, 0);
997 d->shape_button_handler = g_signal_connect(G_OBJECT(
d->shape_button),
"clicked",
999 gtk_widget_set_tooltip_text(GTK_WIDGET(
d->shape_button ),
1000 _(
"select the shape of the location\'s limits on the map, circle or rectangle"
1001 "\nor even polygon if available (select first a polygon place in 'find location' module)"));
1004 _(
"add a new location on the center of the visible map"), 0, 0);
1005 gtk_box_pack_start(hbox,
d->new_button,
TRUE,
TRUE, 0);
1008 d->show_all_button = gtk_check_button_new_with_label(_(
"show all"));
1009 gtk_label_set_ellipsize(GTK_LABEL(gtk_bin_get_child(GTK_BIN(
d->show_all_button))), PANGO_ELLIPSIZE_END);
1010 gtk_widget_set_tooltip_text(
d->show_all_button,
1011 _(
"show all locations which are on the visible map"));
1012 gtk_box_pack_end(hbox,
d->show_all_button,
FALSE,
FALSE, 8);
1015 gtk_box_pack_start(GTK_BOX(self->
widget), GTK_WIDGET(hbox),
FALSE,
TRUE, 0);
1020 g_signal_connect(G_OBJECT(selection),
"changed", G_CALLBACK(
_selection_changed), self);
int button_pressed(struct dt_iop_module_t *self, double x, double y, double pressure, int which, int type, uint32_t state)
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
void dt_collection_deserialize(const char *buf)
@ DT_COLLECTION_PROP_GEOTAGGING
GList * dt_map_location_get_locations_by_path(const gchar *path, const gboolean remove_root)
void dt_map_location_update_locations(const int32_t imgid, const GList *tags)
dt_map_location_data_t * dt_map_location_get_data(const guint locid)
void dt_map_location_free_result(GList **result)
void dt_map_location_delete(const guint locid)
void dt_map_location_rename(const guint locid, const char *const name)
GList * dt_map_location_find_locations(const int32_t imgid)
gboolean dt_map_location_name_exists(const char *const name)
int dt_map_location_get_images_count(const guint locid)
guint dt_map_location_new(const char *const name)
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)
void dt_control_log(const char *msg,...)
void leave(dt_view_t *self)
void reset(dt_view_t *self)
uint32_t view(const dt_view_t *self)
#define DT_MODULE(MODVER)
static gboolean dt_modifier_is(const GdkModifierType state, const GdkModifierType desired_modifier_mask)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
void dtgtk_cairo_paint_masks_circle(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_polygon(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_rect_landscape(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void(* DTGTKCairoPaintIconFunc)(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dt_gui_add_class(GtkWidget *widget, const gchar *class_name)
#define DT_GUI_BOX_SPACING
#define DT_PIXEL_APPLY_DPI(value)
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)
@ MAP_LOCATION_ACTION_UPDATE_OTHERS
@ MAP_LOCATION_ACTION_REMOVE
@ MAP_LOCATION_SHAPE_POLYGONS
@ MAP_LOCATION_SHAPE_ELLIPSE
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,...)
@ 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)
struct _GtkWidget GtkWidget
struct dt_control_signal_t * signals
struct dt_view_manager_t * view_manager
GtkCellRenderer * renderer
GtkWidget * show_all_button
GtkTreeViewColumn * name_col
GtkTreeSelection * selection
gulong shape_button_handler
gchar * dt_util_dstrcat(gchar *str, const gchar *format,...)
int dt_view_manager_switch(dt_view_manager_t *vm, const char *view_name)
@ DT_UI_CONTAINER_PANEL_RIGHT_CENTER