Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
map_settings.c
Go to the documentation of this file.
1/*
2 This file is part of darktable,
3 Copyright (C) 2012, 2014, 2016-2017 Tobias Ellinghaus.
4 Copyright (C) 2013 Thomas Pryds.
5 Copyright (C) 2014-2016 Roman Lebedev.
6 Copyright (C) 2018 Maurizio Paglia.
7 Copyright (C) 2018 rawfiner.
8 Copyright (C) 2019, 2025 Aurélien PIERRE.
9 Copyright (C) 2020-2021 Pascal Obry.
10 Copyright (C) 2020-2021 Philippe Weyland.
11 Copyright (C) 2021 Ralf Brown.
12 Copyright (C) 2022 Diederik Ter Rahe.
13 Copyright (C) 2022 Martin Bařinka.
14
15 darktable is free software: you can redistribute it and/or modify
16 it under the terms of the GNU General Public License as published by
17 the Free Software Foundation, either version 3 of the License, or
18 (at your option) any later version.
19
20 darktable is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 GNU General Public License for more details.
24
25 You should have received a copy of the GNU General Public License
26 along with darktable. If not, see <http://www.gnu.org/licenses/>.
27*/
28#include "bauhaus/bauhaus.h"
29#include "common/collection.h"
30#include "common/darktable.h"
31#include "common/debug.h"
32#include "common/selection.h"
33#include "control/conf.h"
34#include "control/control.h"
35#include "dtgtk/button.h"
36
37#include "gui/gtk.h"
38#include "libs/lib.h"
39#include "libs/lib_api.h"
40#include "gui/preferences.h"
41#include <gdk/gdkkeysyms.h>
42
43#include <osm-gps-map-source.h>
44
45DT_MODULE(1)
46
47const char *name(struct dt_lib_module_t *self)
48{
49 return _("map settings");
50}
51
52const char **views(dt_lib_module_t *self)
53{
54 static const char *v[] = {"map", NULL};
55 return v;
56}
57
62
68
70{
71 return 990;
72}
73
74static void _show_osd_toggled(GtkToggleButton *button, gpointer data)
75{
76 dt_view_map_show_osd(darktable.view_manager);
77}
78
79static void _parameter_changed(GtkToggleButton *button, gpointer data)
80{
81 dt_view_map_redraw(darktable.view_manager);
82}
83
84static void _map_source_changed(GtkWidget *widget, gpointer data)
85{
86 GtkTreeIter iter;
87
88 if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter) == TRUE)
89 {
90 GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
91 GValue value = {
92 0,
93 };
94 OsmGpsMapSource_t map_source;
95
96 gtk_tree_model_get_value(model, &iter, 1, &value);
97 map_source = g_value_get_int(&value);
98 g_value_unset(&value);
99 dt_view_map_set_map_source(darktable.view_manager, map_source);
100 }
101}
102
110static gboolean _thumbnail_change_accel(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval,
111 GdkModifierType mods, gpointer user_data)
112{
113 dt_lib_module_t *self = (dt_lib_module_t *)user_data;
115
116 const char *str = dt_conf_get_string_const("plugins/map/images_thumbnail");
117 if(!g_strcmp0(str, "thumbnail"))
118 dt_conf_set_string("plugins/map/images_thumbnail", "count");
119 else if(!g_strcmp0(str, "count"))
120 dt_conf_set_string("plugins/map/images_thumbnail", "none");
121 else
122 dt_conf_set_string("plugins/map/images_thumbnail", "thumbnail");
123
124 dt_gui_preferences_enum_update(d->images_thumb);
125 _parameter_changed(NULL, self);
126 return TRUE;
127}
128
130{
132 self->data = d;
133 self->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, DT_GUI_BOX_SPACING);
134 GtkBox *hbox;
135 GtkWidget *label;
136
137 hbox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DT_GUI_BOX_SPACING));
138
139 label = dt_ui_label_new(_("map source"));
140 gtk_box_pack_start(hbox, label, TRUE, TRUE, 0);
141
142 GtkListStore *model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
143 d->map_source_dropdown = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model));
144 gtk_widget_set_tooltip_text(d->map_source_dropdown, _("select the source of the map. some entries might not work"));
145 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
146 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(d->map_source_dropdown), renderer, FALSE);
147 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(d->map_source_dropdown), renderer, "text", 0, NULL);
148
149 const char *map_source = dt_conf_get_string_const("plugins/map/map_source");
150 int selection = OSM_GPS_MAP_SOURCE_OPENSTREETMAP - 1, entry = 0;
151 GtkTreeIter iter;
152 for(int i = 1; i < OSM_GPS_MAP_SOURCE_LAST; i++)
153 {
154 if(osm_gps_map_source_is_valid(i))
155 {
156 const gchar *name = osm_gps_map_source_get_friendly_name(i);
157 gtk_list_store_append(model, &iter);
158 gtk_list_store_set(model, &iter, 0, name, 1, i, -1);
159 if(!g_strcmp0(name, map_source)) selection = entry;
160 entry++;
161 }
162 }
163 gtk_combo_box_set_active(GTK_COMBO_BOX(d->map_source_dropdown), selection);
164 gtk_box_pack_start(hbox, d->map_source_dropdown, TRUE, TRUE, 0);
165 g_signal_connect(G_OBJECT(d->map_source_dropdown), "changed", G_CALLBACK(_map_source_changed), NULL);
166 g_object_unref(model);
167 gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(hbox), TRUE, TRUE, 0);
168
169 GtkGrid *grid = GTK_GRID(gtk_grid_new());
170 gtk_grid_set_column_spacing(grid, DT_GUI_BOX_SPACING);
171
172 int line = 0;
173 d->max_outline_nodes = dt_gui_preferences_int(grid, "plugins/map/max_outline_nodes", 0, line++);
174 d->show_osd_checkbutton = dt_gui_preferences_bool(grid, "plugins/map/show_map_osd", 0, line++, FALSE);
175 g_signal_connect(G_OBJECT(d->show_osd_checkbutton), "toggled", G_CALLBACK(_show_osd_toggled), NULL);
176 d->filtered_images_checkbutton = dt_gui_preferences_bool(grid, "plugins/map/filter_images_drawn", 0, line++, FALSE);
177 g_signal_connect(G_OBJECT(d->filtered_images_checkbutton), "toggled", G_CALLBACK(_parameter_changed), NULL);
178 d->max_images_entry = dt_gui_preferences_int(grid, "plugins/map/max_images_drawn", 0, line++);
179 g_signal_connect(G_OBJECT(d->max_images_entry), "value-changed", G_CALLBACK(_parameter_changed), self);
180 d->epsilon_factor = dt_gui_preferences_int(grid, "plugins/map/epsilon_factor", 0, line++);
181 g_signal_connect(G_OBJECT(d->epsilon_factor), "value-changed", G_CALLBACK(_parameter_changed), self);
182 d->min_images = dt_gui_preferences_int(grid, "plugins/map/min_images_per_group", 0, line++);
183 g_signal_connect(G_OBJECT(d->min_images), "value-changed", G_CALLBACK(_parameter_changed), self);
184 d->images_thumb = dt_gui_preferences_enum(grid, "plugins/map/images_thumbnail", 0, line++);
185 g_signal_connect(G_OBJECT(d->images_thumb), "changed", G_CALLBACK(_parameter_changed), self);
186 gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(grid), FALSE, FALSE, 0);
187
188 dt_accels_new_map_action(_thumbnail_change_accel, self, N_("Map/Actions"),
189 N_("Thumbnail display"), GDK_KEY_s, GDK_SHIFT_MASK,
190 _("Cycles the image display mode on the map"));
191}
192
194{
195 gchar *path = dt_accels_build_path(N_("Map/Actions"), N_("Thumbnail display"));
197 dt_free(path);
198
199 if(IS_NULL_PTR(self->data)) return;
200 dt_free(self->data);
201}
202
204{
206 dt_gui_preferences_bool_reset(d->show_osd_checkbutton);
207 dt_gui_preferences_bool_reset(d->filtered_images_checkbutton);
208 dt_gui_preferences_int_reset(d->max_outline_nodes);
209 dt_gui_preferences_int_reset(d->max_images_entry);
210 dt_gui_preferences_int_reset(d->epsilon_factor);
211 dt_gui_preferences_int_reset(d->min_images);
212 dt_gui_preferences_enum_reset(d->images_thumb);
213}
214
215// clang-format off
216// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
217// vim: shiftwidth=2 expandtab tabstop=2 cindent
218// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
219// clang-format on
gchar * dt_accels_build_path(const gchar *scope, const gchar *feature)
void dt_accels_remove_accel(dt_accels_t *accels, const char *path, gpointer data)
Recursively remove all accels for all shortcuts containing path. This is unneeded for accels attached...
#define TRUE
Definition ashift_lsd.c:162
#define FALSE
Definition ashift_lsd.c:158
char * name
void dt_conf_set_string(const char *name, const char *val)
const char * dt_conf_get_string_const(const char *name)
darktable_t darktable
Definition darktable.c:181
#define DT_MODULE(MODVER)
Definition darktable.h:140
#define dt_free(ptr)
Definition darktable.h:456
static const dt_aligned_pixel_simd_t value
Definition darktable.h:577
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
Definition darktable.h:281
#define dt_accels_new_map_action(a, b, c, d, e, f, g)
Definition gtk.h:434
#define DT_GUI_BOX_SPACING
Definition gtk.h:109
static GtkWidget * dt_ui_label_new(const gchar *str)
Definition gtk.h:461
const char * model
const float v
void gui_reset(dt_lib_module_t *self)
static void _map_source_changed(GtkWidget *widget, gpointer data)
void gui_cleanup(dt_lib_module_t *self)
static void _parameter_changed(GtkToggleButton *button, gpointer data)
static void _show_osd_toggled(GtkToggleButton *button, gpointer data)
uint32_t container(dt_lib_module_t *self)
static gboolean _thumbnail_change_accel(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType mods, gpointer user_data)
Cycle the map thumbnail rendering mode from the map accel group.
void gui_init(dt_lib_module_t *self)
int position()
const char ** views(dt_lib_module_t *self)
void dt_gui_preferences_enum_reset(GtkWidget *widget)
void dt_gui_preferences_bool_reset(GtkWidget *widget)
void dt_gui_preferences_int_reset(GtkWidget *widget)
void dt_gui_preferences_enum_update(GtkWidget *widget)
GtkWidget * dt_gui_preferences_int(GtkGrid *grid, const char *key, const guint col, const guint line)
GtkWidget * dt_gui_preferences_enum(GtkGrid *grid, const char *key, const guint col, const guint line)
GtkWidget * dt_gui_preferences_bool(GtkGrid *grid, const char *key, const guint col, const guint line, const gboolean swap)
struct _GtkWidget GtkWidget
Definition splash.h:29
struct dt_gui_gtk_t * gui
Definition darktable.h:775
struct dt_view_manager_t * view_manager
Definition darktable.h:772
dt_accels_t * accels
Definition gtk.h:194
GtkWidget * max_images_entry
GtkWidget * show_osd_checkbutton
GtkWidget * filtered_images_checkbutton
GtkWidget * epsilon_factor
GtkWidget * max_outline_nodes
GtkWidget * images_thumb
GtkWidget * map_source_dropdown
GModule *void * data
Definition lib.h:80
GtkWidget * widget
Definition lib.h:84
@ DT_UI_CONTAINER_PANEL_RIGHT_CENTER