static int value_member(lua_State*L) { lua_combobox combobox; luaA_to(L,lua_combobox,&combobox,1); int length = dt_bauhaus_combobox_length(combobox->widget); if(lua_gettop(L) > 2) { if(lua_isnil(L,3)) { dt_bauhaus_combobox_set(combobox->widget,-1); } else if(lua_isnumber(L,3)) { int index = lua_tointeger(L,3) ; if(index < 1 || index > length) { return luaL_error(L,"Invalid index for combo box : %d\n",index); } dt_bauhaus_combobox_set(combobox->widget,index -1); } else if(lua_isstring(L,3)&& dt_bauhaus_combobox_get_editable(combobox->widget)) { const char * string = lua_tostring(L,3); dt_bauhaus_combobox_set_text(combobox->widget,string); } else { return luaL_error(L,"Invalid type for combo box value\n"); } return 0; } lua_pushstring(L,dt_bauhaus_combobox_get_text(combobox->widget)); return 1; }
static void aspect_changed (GtkWidget *combo, dt_iop_module_t *self) { dt_iop_borders_gui_data_t *g = (dt_iop_borders_gui_data_t *)self->gui_data; dt_iop_borders_params_t *p = (dt_iop_borders_params_t *)self->params; int which = dt_bauhaus_combobox_get(combo); const char* text = dt_bauhaus_combobox_get_text(combo); if (which < 0) { p->aspect = DT_IOP_BORDERS_ASPECT_CONSTANT_VALUE; if(text) { const char *c = text; while(*c != ':' && *c != '/' && c < text + strlen(text)) c++; if(c < text + strlen(text) - 1) { // *c = '\0'; // not needed, atof will stop there. c++; p->aspect = atof(text) / atof(c); g_strlcpy(p->aspect_text, text, sizeof(p->aspect_text)); } } } else if (which < DT_IOP_BORDERS_ASPECT_COUNT) { g_strlcpy(p->aspect_text, text, sizeof(p->aspect_text)); p->aspect = g->aspect_ratios[which]; } dt_dev_add_history_item(darktable.develop, self, TRUE); }
static void aspect_changed (GtkWidget *combo, dt_iop_module_t *self) { dt_iop_borders_gui_data_t *g = (dt_iop_borders_gui_data_t *)self->gui_data; dt_iop_borders_params_t *p = (dt_iop_borders_params_t *)self->params; int which = dt_bauhaus_combobox_get(combo); if (which < 0) { p->aspect = self->dev->image_storage.width/(float)self->dev->image_storage.height; const char* text = dt_bauhaus_combobox_get_text(combo); if(text) { const char *c = text; while(*c != ':' && *c != '/' && c < text + strlen(text)) c++; if(c < text + strlen(text) - 1) { // *c = '\0'; // not needed, atof will stop there. c++; p->aspect = atof(text) / atof(c); } } } else if (which < 9) { if(self->dev->image_storage.height > self->dev->image_storage.width) p->aspect = 1.0/g->aspect_ratios[which]; else p->aspect = g->aspect_ratios[which]; } dt_dev_add_history_item(darktable.develop, self, TRUE); }
/* clean entries */ gtk_entry_set_text(GTK_ENTRY(lib->gui.plabel), ""); gtk_entry_set_text(GTK_ENTRY(lib->gui.pname), ""); } } } static void _toggle_capture_mode_clicked(GtkWidget *widget, gpointer user_data) { dt_lib_camera_t *lib = (dt_lib_camera_t *)user_data; GtkWidget *w = NULL; if(widget == GTK_WIDGET(lib->gui.tb1)) w = lib->gui.sb1; else if(widget == GTK_WIDGET(lib->gui.tb2)) w = lib->gui.sb2; else if(widget == GTK_WIDGET(lib->gui.tb3)) { gtk_widget_set_sensitive(lib->gui.sb3, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); gtk_widget_set_sensitive(lib->gui.sb4, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); } if(w) gtk_widget_set_sensitive(w, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); } #define BAR_HEIGHT DT_PIXEL_APPLY_DPI(18) /* also change in views/tethering.c */ static void _expose_info_bar(dt_lib_module_t *self, cairo_t *cr, int32_t width, int32_t height, int32_t pointerx, int32_t pointery) { dt_lib_camera_t *lib = (dt_lib_camera_t *)self->data; // Draw infobar background at top cairo_set_source_rgb(cr, .0, .0, .0); cairo_rectangle(cr, 0, 0, width, BAR_HEIGHT); cairo_fill(cr); cairo_set_source_rgb(cr, .8, .8, .8); // Draw left aligned value camera model value PangoLayout *layout; PangoRectangle ink; PangoFontDescription *desc = pango_font_description_copy_static(darktable.bauhaus->pango_font_desc); pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD); layout = pango_cairo_create_layout(cr); const int fontsize = DT_PIXEL_APPLY_DPI(11.5); pango_font_description_set_absolute_size(desc, fontsize * PANGO_SCALE); pango_layout_set_font_description(layout, desc); char model[4096] = { 0 }; sprintf(model + strlen(model), "%s", lib->data.camera_model); pango_layout_set_text(layout, model, -1); pango_layout_get_pixel_extents(layout, &ink, NULL); cairo_move_to(cr, DT_PIXEL_APPLY_DPI(5), DT_PIXEL_APPLY_DPI(1) + BAR_HEIGHT - ink.height / 2 - fontsize); pango_cairo_show_layout(cr, layout); // Draw right aligned battery value const char *battery_value = dt_camctl_camera_get_property(darktable.camctl, NULL, "batterylevel"); char battery[4096] = { 0 }; snprintf(battery, sizeof(battery), "%s: %s", _("battery"), battery_value ? battery_value : _("n/a")); pango_layout_set_text(layout, battery, -1); pango_layout_get_pixel_extents(layout, &ink, NULL); cairo_move_to(cr, width - ink.width - DT_PIXEL_APPLY_DPI(5), DT_PIXEL_APPLY_DPI(1) + BAR_HEIGHT - ink.height / 2 - fontsize); pango_cairo_show_layout(cr, layout); // Let's cook up the middle part of infobar gchar center[1024] = { 0 }; for(guint i = 0; i < g_list_length(lib->gui.properties); i++) { dt_lib_camera_property_t *prop = (dt_lib_camera_property_t *)g_list_nth_data(lib->gui.properties, i); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prop->osd)) == TRUE) { g_strlcat(center, " ", sizeof(center)); g_strlcat(center, prop->name, sizeof(center)); g_strlcat(center, ": ", sizeof(center)); g_strlcat(center, dt_bauhaus_combobox_get_text(prop->values), sizeof(center)); } } g_strlcat(center, " ", sizeof(center)); // Now lets put it in center view... pango_layout_set_text(layout, center, -1); pango_layout_get_pixel_extents(layout, &ink, NULL); cairo_move_to(cr, (width / 2) - (ink.width / 2), DT_PIXEL_APPLY_DPI(1) + BAR_HEIGHT - ink.height / 2 - fontsize); pango_cairo_show_layout(cr, layout); pango_font_description_free(desc); g_object_unref(layout); }
static void watermark_callback(GtkWidget *tb, gpointer user_data) { dt_iop_module_t *self = (dt_iop_module_t *)user_data; dt_iop_watermark_gui_data_t *g = (dt_iop_watermark_gui_data_t *)self->gui_data; if(self->dt->gui->reset) return; dt_iop_watermark_params_t *p = (dt_iop_watermark_params_t *)self->params; memset(p->filename, 0, sizeof(p->filename)); snprintf(p->filename, sizeof(p->filename), "%s", dt_bauhaus_combobox_get_text(g->watermarks)); dt_dev_add_history_item(darktable.develop, self, TRUE); }
static void flickr_album_changed(GtkComboBox *cb, gpointer data) { dt_storage_flickr_gui_data_t *ui = (dt_storage_flickr_gui_data_t *)data; const gchar *value = dt_bauhaus_combobox_get_text(ui->album_list); if(value != NULL && strcmp(value, _("create new album")) == 0) { gtk_widget_set_no_show_all(GTK_WIDGET(ui->create_box), FALSE); gtk_widget_show_all(GTK_WIDGET(ui->create_box)); } else gtk_widget_hide(GTK_WIDGET(ui->create_box)); }
static void _piwigo_account_changed(GtkComboBox *cb, gpointer data) { dt_storage_piwigo_gui_data_t *ui = (dt_storage_piwigo_gui_data_t *)data; const gchar *value = dt_bauhaus_combobox_get_text(ui->account_list); const _piwigo_account_t *account = _piwigo_get_account(ui, value); if(account) { gtk_entry_set_text(ui->server_entry, account->server); gtk_entry_set_text(ui->user_entry, account->username); gtk_entry_set_text(ui->pwd_entry, account->password); } }
/* clean entries */ gtk_entry_set_text(GTK_ENTRY(lib->gui.plabel), ""); gtk_entry_set_text(GTK_ENTRY(lib->gui.pname), ""); } } } static void _toggle_capture_mode_clicked(GtkWidget *widget, gpointer user_data) { dt_lib_camera_t *lib = (dt_lib_camera_t *)user_data; GtkWidget *w = NULL; if(widget == GTK_WIDGET(lib->gui.tb1)) w = lib->gui.sb1; else if(widget == GTK_WIDGET(lib->gui.tb2)) w = lib->gui.sb2; else if(widget == GTK_WIDGET(lib->gui.tb3)) { gtk_widget_set_sensitive(lib->gui.sb3, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); gtk_widget_set_sensitive(lib->gui.sb4, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); } if(w) gtk_widget_set_sensitive(w, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); } #define BAR_HEIGHT 18 /* also change in views/capture.c */ static void _expose_info_bar(dt_lib_module_t *self, cairo_t *cr, int32_t width, int32_t height, int32_t pointerx, int32_t pointery) { dt_lib_camera_t *lib = (dt_lib_camera_t *)self->data; // Draw infobar background at top cairo_set_source_rgb(cr, .0, .0, .0); cairo_rectangle(cr, 0, 0, width, BAR_HEIGHT); cairo_fill(cr); cairo_set_source_rgb(cr, .8, .8, .8); // Draw left aligned value camera model value cairo_text_extents_t te; char model[4096] = { 0 }; sprintf(model + strlen(model), "%s", lib->data.camera_model); cairo_text_extents(cr, model, &te); cairo_move_to(cr, 5, 1 + BAR_HEIGHT - te.height / 2); cairo_show_text(cr, model); // Draw right aligned battery value const char *battery_value = dt_camctl_camera_get_property(darktable.camctl, NULL, "batterylevel"); char battery[4096] = { 0 }; snprintf(battery, sizeof(battery), "%s: %s", _("battery"), battery_value ? battery_value : _("n/a")); cairo_text_extents(cr, battery, &te); cairo_move_to(cr, width - te.width - 5, 1 + BAR_HEIGHT - te.height / 2); cairo_show_text(cr, battery); // Let's cook up the middle part of infobar gchar center[1024] = { 0 }; for(guint i = 0; i < g_list_length(lib->gui.properties); i++) { dt_lib_camera_property_t *prop = (dt_lib_camera_property_t *)g_list_nth_data(lib->gui.properties, i); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prop->osd)) == TRUE) { g_strlcat(center, " ", sizeof(center)); g_strlcat(center, prop->name, sizeof(center)); g_strlcat(center, ": ", sizeof(center)); g_strlcat(center, dt_bauhaus_combobox_get_text(prop->values), sizeof(center)); } } g_strlcat(center, " ", sizeof(center)); // Now lets put it in center view... cairo_text_extents(cr, center, &te); cairo_move_to(cr, (width / 2) - (te.width / 2), 1 + BAR_HEIGHT - te.height / 2); cairo_show_text(cr, center); }
static void position_v_changed (GtkWidget *combo, dt_iop_module_t *self) { dt_iop_borders_gui_data_t *g = (dt_iop_borders_gui_data_t *)self->gui_data; dt_iop_borders_params_t *p = (dt_iop_borders_params_t *)self->params; int which = dt_bauhaus_combobox_get(combo); const char* text = dt_bauhaus_combobox_get_text(combo); if (which < 0) { p->pos_v = 0.5f; // center if(text) { const char *c = text; while(*c != ':' && *c != '/' && c < text + strlen(text)) c++; if(c < text + strlen(text) - 1) { // *c = '\0'; // not needed, atof will stop there. c++; p->pos_v = atof(text) / atof(c); } else { p->pos_v = atof(text); } g_strlcpy(p->pos_v_text, text, sizeof(p->pos_v_text)); p->pos_v = MAX(p->pos_v, 0); p->pos_v = MIN(p->pos_v, 1); } } else if (which < DT_IOP_BORDERS_POSITION_H_COUNT) { g_strlcpy(p->pos_v_text, text, sizeof(p->pos_v_text)); p->pos_v = g->pos_h_ratios[which]; } dt_dev_add_history_item(darktable.develop, self, TRUE); }
static gboolean borders_draw(GtkWidget *widget, cairo_t *cr, dt_iop_module_t *self) { if(darktable.gui->reset) return FALSE; if(self->picked_output_color_max[0] < 0) return FALSE; if(self->request_color_pick == DT_REQUEST_COLORPICK_OFF) return FALSE; dt_iop_borders_gui_data_t *g = (dt_iop_borders_gui_data_t *)self->gui_data; dt_iop_borders_params_t *p = (dt_iop_borders_params_t *)self->params; // interrupt if no valid color reading if(self->picked_color_min[0] == INFINITY) return FALSE; if(fabsf(p->color[0] - self->picked_color[0]) < 0.0001f && fabsf(p->color[1] - self->picked_color[1]) < 0.0001f && fabsf(p->color[2] - self->picked_color[2]) < 0.0001f) { // interrupt infinite loops return FALSE; } if(fabsf(p->frame_color[0] - self->picked_color[0]) < 0.0001f && fabsf(p->frame_color[1] - self->picked_color[1]) < 0.0001f && fabsf(p->frame_color[2] - self->picked_color[2]) < 0.0001f) { // interrupt infinite loops return FALSE; } GdkRGBA c = (GdkRGBA){.red = self->picked_color[0], .green = self->picked_color[1], .blue = self->picked_color[2], .alpha = 1.0 }; if(g->active_colorpick == g->frame_colorpick) { p->frame_color[0] = self->picked_color[0]; p->frame_color[1] = self->picked_color[1]; p->frame_color[2] = self->picked_color[2]; gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(g->frame_colorpick), &c); } else { p->color[0] = self->picked_color[0]; p->color[1] = self->picked_color[1]; p->color[2] = self->picked_color[2]; gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(g->colorpick), &c); } dt_dev_add_history_item(darktable.develop, self, TRUE); return FALSE; } static void aspect_changed(GtkWidget *combo, dt_iop_module_t *self) { dt_iop_borders_gui_data_t *g = (dt_iop_borders_gui_data_t *)self->gui_data; dt_iop_borders_params_t *p = (dt_iop_borders_params_t *)self->params; int which = dt_bauhaus_combobox_get(combo); const char *text = dt_bauhaus_combobox_get_text(combo); if(which < 0) { p->aspect = DT_IOP_BORDERS_ASPECT_CONSTANT_VALUE; if(text) { const char *c = text; const char *end = text + strlen(text); while(*c != ':' && *c != '/' && c < end) c++; if(c < end - 1) { // *c = '\0'; // not needed, atof will stop there. c++; p->aspect = atof(text) / atof(c); g_strlcpy(p->aspect_text, text, sizeof(p->aspect_text)); } } } else if(which < DT_IOP_BORDERS_ASPECT_COUNT) { g_strlcpy(p->aspect_text, text, sizeof(p->aspect_text)); p->aspect = g->aspect_ratios[which]; } dt_dev_add_history_item(darktable.develop, self, TRUE); }
/** Property changed*/ void property_changed_callback(GtkComboBox *cb, gpointer data) { dt_lib_camera_property_t *prop = (dt_lib_camera_property_t *)data; dt_camctl_camera_set_property_string(darktable.camctl, NULL, prop->property_name, dt_bauhaus_combobox_get_text(prop->values)); }
static gboolean _finalize_store(gpointer user_data) { dt_storage_piwigo_gui_data_t *g = (dt_storage_piwigo_gui_data_t *)user_data; _piwigo_refresh_albums(g, dt_bauhaus_combobox_get_text(g->album_list)); return FALSE; }
/** Refresh albums */ static void _piwigo_refresh_albums(dt_storage_piwigo_gui_data_t *ui, const gchar *select_album) { gtk_widget_set_sensitive(GTK_WIDGET(ui->album_list), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(ui->parent_album_list), FALSE); if(ui->api == NULL || ui->api->authenticated == FALSE) { _piwigo_authenticate(ui); if(ui->api == NULL || !ui->api->authenticated) return; } gchar *to_select; int index = 0; // get the new album name, it will be checked in the if(select_album == NULL) { to_select = g_strdup(dt_bauhaus_combobox_get_text(ui->album_list)); if(to_select) { // cut the count of picture in album to get the name only gchar *p = to_select; while(*p) { if(*p == ' ' && *(p+1) == '(') { *p = '\0'; break; } p++; } } } else to_select = g_strdup(select_album); // First clear the combobox except first 2 items (none / create new album) dt_bauhaus_combobox_clear(ui->album_list); dt_bauhaus_combobox_clear(ui->parent_album_list); g_list_free(ui->albums); ui->albums = NULL; GList *args = NULL; args = _piwigo_query_add_arguments(args, "method", "pwg.categories.getList"); args = _piwigo_query_add_arguments(args, "cat_id", "0"); args = _piwigo_query_add_arguments(args, "recursive", "true"); _piwigo_api_post(ui->api, args, NULL, FALSE); g_list_free(args); if(ui->api->response && !ui->api->error_occured) { dt_bauhaus_combobox_add(ui->album_list, _("create new album")); dt_bauhaus_combobox_add(ui->parent_album_list, _("---")); JsonObject *result = json_node_get_object(json_object_get_member(ui->api->response, "result")); JsonArray *albums = json_object_get_array_member(result, "categories"); if(json_array_get_length(albums)>0 && index==0) index = 1; if(index > json_array_get_length(albums) - 1) index = json_array_get_length(albums) - 1; for(int i = 0; i < json_array_get_length(albums); i++) { char data[MAX_ALBUM_NAME_SIZE] = { 0 }; JsonObject *album = json_array_get_object_element(albums, i); _piwigo_album_t *new_album = g_malloc0(sizeof(struct _piwigo_album_t)); g_strlcpy(new_album->name, json_object_get_string_member(album, "name"), sizeof(new_album->name)); new_album->id = json_object_get_int_member(album, "id"); new_album->size = json_object_get_int_member(album, "nb_images"); const int isroot = json_object_get_null_member(album, "id_uppercat"); int indent = 0; if(!isroot) { const char *hierarchy = json_object_get_string_member(album, "uppercats"); char const *p = hierarchy; while(*p++) if(*p == ',') indent++; } snprintf(data, sizeof(data), "%*c%s (%"PRId64")", indent * 3, ' ', new_album->name, new_album->size); if(to_select && !strcmp(new_album->name, to_select)) index = i + 1; g_strlcpy(new_album->label, data, sizeof(new_album->label)); ui->albums = g_list_append(ui->albums, new_album); dt_bauhaus_combobox_add_aligned(ui->album_list, data, DT_BAUHAUS_COMBOBOX_ALIGN_LEFT); dt_bauhaus_combobox_add_aligned(ui->parent_album_list, data, DT_BAUHAUS_COMBOBOX_ALIGN_LEFT); } } else dt_control_log(_("cannot refresh albums")); g_free(to_select); gtk_widget_set_sensitive(GTK_WIDGET(ui->album_list), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(ui->parent_album_list), TRUE); dt_bauhaus_combobox_set(ui->album_list, index); }
void *get_params(dt_imageio_module_storage_t *self) { dt_storage_piwigo_gui_data_t *ui = (dt_storage_piwigo_gui_data_t *)self->gui_data; if(!ui) return NULL; // gui not initialized, CLI mode dt_storage_piwigo_params_t *p = (dt_storage_piwigo_params_t *)g_malloc0(sizeof(dt_storage_piwigo_params_t)); if(!p) return NULL; // fill d from controls in ui if(ui->api && ui->api->authenticated == TRUE) { // create a new context for the import. set username/password to be able to connect. p->api = _piwigo_ctx_init(); p->api->authenticated = FALSE; p->api->server = g_strdup(ui->api->server); p->api->username = g_strdup(ui->api->username); p->api->password = g_strdup(ui->api->password); _piwigo_api_authenticate(p->api); int index = dt_bauhaus_combobox_get(ui->album_list); p->album_id = 0; p->export_tags = (dt_bauhaus_combobox_get(ui->export_tags) == 0); p->tags = NULL; switch(dt_bauhaus_combobox_get(ui->permission_list)) { case 0: // everyone p->privacy = 0; break; case 1: // contacts p->privacy = 1; break; case 2: // friends p->privacy = 2; break; case 3: // family p->privacy = 4; break; default: // you / admin p->privacy = 8; } if(index >= 0) { switch(index) { case 0: // Create album p->parent_album_id = _piwigo_album_id(dt_bauhaus_combobox_get_text(ui->parent_album_list), ui->albums); p->album = g_strdup(gtk_entry_get_text(ui->new_album_entry)); p->new_album = TRUE; break; default: p->album = g_strdup(dt_bauhaus_combobox_get_text(ui->album_list)); p->new_album = FALSE; if(p->album == NULL) { // Something went wrong... fprintf(stderr, "Something went wrong.. album index %d = NULL\n", index - 2); goto cleanup; } p->album_id = _piwigo_album_id(p->album, ui->albums); if(!p->album_id) { fprintf(stderr, "[imageio_storage_piwigo] cannot find album `%s'!\n", p->album); goto cleanup; } break; } } else goto cleanup; } else goto cleanup; return p; cleanup: g_free(p); return NULL; }