void gui_cleanup(dt_lib_module_t *self) { uint32_t curr_pos = dt_view_lighttable_get_position(darktable.view_manager); dt_conf_set_int("plugins/lighttable/recentcollect/pos0", curr_pos); dt_control_signal_disconnect(darktable.signals, G_CALLBACK(_lib_recentcollection_updated), self); free(self->data); self->data = NULL; }
static void _lib_recentcollection_updated(gpointer instance, gpointer user_data) { dt_lib_module_t *self =(dt_lib_module_t *)user_data; dt_lib_recentcollect_t *d = (dt_lib_recentcollect_t *)self->data; // serialize, check for recently used char confname[200]; const int bufsize = 4096; char buf[bufsize]; if(dt_collection_serialize(buf, bufsize)) return; // is the current position, i.e. the one to be stored with the old collection (pos0, pos1-to-be) uint32_t curr_pos = 0; if(d->inited) { curr_pos = dt_view_lighttable_get_position(darktable.view_manager); dt_conf_set_int("plugins/lighttable/recentcollect/pos0", curr_pos); } else { curr_pos = dt_conf_get_int("plugins/lighttable/recentcollect/pos0"); d->inited = 1; } uint32_t new_pos = 0; int n = -1; for(int k=0; k<CLAMPS(dt_conf_get_int("plugins/lighttable/recentcollect/num_items"), 0, NUM_LINES); k++) { // is it already in the current list? snprintf(confname, 200, "plugins/lighttable/recentcollect/line%1d", k); gchar *line = dt_conf_get_string(confname); if(!line) continue; if(!strcmp(line, buf)) { snprintf(confname, 200, "plugins/lighttable/recentcollect/pos%1d", k); new_pos = dt_conf_get_int(confname); n = k; break; } g_free(line); } if(n < 0) { const int num_items = CLAMPS(dt_conf_get_int("plugins/lighttable/recentcollect/num_items"), 0, NUM_LINES); if(num_items < NUM_LINES) { // new, unused entry n = num_items; dt_conf_set_int("plugins/lighttable/recentcollect/num_items", num_items + 1); } else { // kill least recently used entry: n = num_items - 1; } } if(n >= 0 && n < NUM_LINES) { // sort n to the top for(int k=n; k>0; k--) { snprintf(confname, 200, "plugins/lighttable/recentcollect/line%1d", k-1); gchar *line1 = dt_conf_get_string(confname); snprintf(confname, 200, "plugins/lighttable/recentcollect/pos%1d", k-1); uint32_t pos1 = dt_conf_get_int(confname); if(line1 && line1[0] != '\0') { snprintf(confname, 200, "plugins/lighttable/recentcollect/line%1d", k); dt_conf_set_string(confname, line1); snprintf(confname, 200, "plugins/lighttable/recentcollect/pos%1d", k); dt_conf_set_int(confname, pos1); } g_free(line1); } dt_conf_set_string("plugins/lighttable/recentcollect/line0", buf); dt_conf_set_int("plugins/lighttable/recentcollect/pos0", new_pos); } // update button descriptions: for(int k=0; k<NUM_LINES; k++) { char str[200] = {0}; char str_cut[200] = {0}; char str_pretty[200] = {0}; snprintf(confname, 200, "plugins/lighttable/recentcollect/line%1d", k); gchar *buf = dt_conf_get_string(confname); if(buf && buf[0] != '\0') { pretty_print(buf, str); g_free(buf); } g_object_set(G_OBJECT(d->item[k].button), "tooltip-text", str, (char *)NULL); const int cut = 45; if (g_utf8_strlen(str, -1) > cut) { g_utf8_strncpy(str_cut, str, cut); snprintf(str_pretty, 200, "%s...", str_cut); gtk_button_set_label(GTK_BUTTON(d->item[k].button), str_pretty); } else { gtk_button_set_label(GTK_BUTTON(d->item[k].button), str); } gtk_widget_set_no_show_all(d->item[k].button, TRUE); gtk_widget_set_visible(d->item[k].button, FALSE); } for(int k=0; k<CLAMPS(dt_conf_get_int("plugins/lighttable/recentcollect/num_items"), 0, NUM_LINES); k++) { gtk_widget_set_no_show_all(d->item[k].button, FALSE); gtk_widget_set_visible(d->item[k].button, TRUE); } dt_view_lighttable_set_position(darktable.view_manager, new_pos); }