static int lua_job_progress(lua_State *L) { dt_progress_t *progress; luaA_to(L, dt_lua_backgroundjob_t, &progress, 1); dt_lua_unlock(false); gboolean i_own_lock = dt_control_gdk_lock(); dt_pthread_mutex_lock(&darktable.control->progress_system.mutex); GList *iter = g_list_find(darktable.control->progress_system.list, progress); dt_pthread_mutex_unlock(&darktable.control->progress_system.mutex); if(i_own_lock) dt_control_gdk_unlock(); dt_lua_lock(); if(!iter) luaL_error(L,"Accessing an invalid job"); if(lua_isnone(L, 3)) { dt_lua_unlock(false); double result = dt_control_progress_get_progress(progress); dt_lua_lock(); if(!dt_control_progress_has_progress_bar(progress)) lua_pushnil(L); else lua_pushnumber(L, result); return 1; } else { double value; luaA_to(L,progress_double,&value,3); dt_lua_unlock(false); dt_control_progress_set_progress(darktable.control, progress, value); dt_lua_lock(); return 0; } }
static int container_numindex(lua_State*L) { lua_container container; luaA_to(L,lua_container,&container,1); GList * children = gtk_container_get_children(GTK_CONTAINER(container->widget)); int index = lua_tointeger(L,2) -1; if(lua_gettop(L) >2) { int length = g_list_length(children); if(!lua_isnil(L,3) && index == length) { lua_widget widget; luaA_to(L, lua_widget,&widget,3), gtk_container_add(GTK_CONTAINER(container->widget),widget->widget); } else if(lua_isnil(L,3) && index < length) { GtkWidget *searched_widget = g_list_nth_data(children,index); gtk_container_remove(GTK_CONTAINER(container->widget),searched_widget); } else { luaL_error(L,"Incorrect index or value when setting the child of a container"); } g_list_free(children); return 0; } else { GtkWidget *searched_widget = g_list_nth_data(children,index); g_list_free(children); lua_getuservalue(L,1); lua_pushlightuserdata(L,searched_widget); lua_gettable(L,-2); return 1; } }
static int image_eq(lua_State*L) { dt_lua_image_t imgid1; luaA_to(L,dt_lua_image_t,&imgid1,-1); dt_lua_image_t imgid2; luaA_to(L,dt_lua_image_t,&imgid2,-2); lua_pushboolean(L,imgid1==imgid2); return 1; }
static int label_member(lua_State *L) { lua_slider slider; luaA_to(L,lua_slider,&slider,1); if(lua_gettop(L) > 2) { char tmp[256]; luaA_to(L,char_256,&tmp,3); dt_bauhaus_widget_set_label(slider->widget,NULL,tmp); return 0; } lua_pushstring(L,dt_bauhaus_widget_get_label(slider->widget)); return 1; }
static int label_member(lua_State *L) { lua_combobox combobox; luaA_to(L,lua_combobox,&combobox,1); if(lua_gettop(L) > 2) { char tmp[256]; luaA_to(L,char_256,&tmp,3); dt_bauhaus_widget_set_label(combobox->widget,NULL,tmp); return 0; } lua_pushstring(L,dt_bauhaus_widget_get_label(combobox->widget)); return 1; }
int dt_lua_move_image(lua_State*L) { dt_lua_image_t imgid = -1; dt_lua_film_t filmid = -1; if(luaL_testudata(L,1,"dt_lua_image_t")) { luaA_to(L,dt_lua_image_t,&imgid,1); luaA_to(L,dt_lua_film_t,&filmid,2); } else { luaA_to(L,dt_lua_film_t,&filmid,1); luaA_to(L,dt_lua_image_t,&imgid,2); } dt_image_move(imgid,filmid); return 0; }
int dt_lua_tag_detach(lua_State *L) { dt_lua_image_t imgid; dt_lua_tag_t tagid; if(luaL_testudata(L,1,"dt_lua_image_t")) { luaA_to(L,dt_lua_image_t,&imgid,1); luaA_to(L,dt_lua_tag_t,&tagid,2); } else { luaA_to(L,dt_lua_tag_t,&tagid,1); luaA_to(L,dt_lua_image_t,&imgid,2); } dt_tag_detach(tagid,imgid); return 0; }
static int halign_member(lua_State *L) { lua_label label; luaA_to(L, lua_label, &label, 1); dt_lua_align_t align; if(lua_gettop(L) > 2) { luaA_to(L, dt_lua_align_t, &align, 3); gtk_widget_set_halign(GTK_WIDGET(label->widget), align); return 0; } align = gtk_widget_get_halign(label->widget); luaA_push(L, dt_lua_align_t, &align); return 1; }
static int ellipsize_member(lua_State *L) { lua_label label; luaA_to(L, lua_label, &label, 1); dt_lua_ellipsize_mode_t ellipsize; if(lua_gettop(L) > 2) { luaA_to(L, dt_lua_ellipsize_mode_t, &ellipsize, 3); gtk_label_set_ellipsize(GTK_LABEL(label->widget), ellipsize); return 0; } ellipsize = gtk_label_get_ellipsize(GTK_LABEL(label->widget)); luaA_push(L, dt_lua_ellipsize_mode_t, &ellipsize); return 1; }
static int orientation_member(lua_State *L) { lua_box box; luaA_to(L,lua_box,&box,1); dt_lua_orientation_t orientation; if(lua_gettop(L) > 2) { luaA_to(L,dt_lua_orientation_t,&orientation,3); gtk_orientable_set_orientation(GTK_ORIENTABLE(box->widget),orientation); return 0; } orientation = gtk_orientable_get_orientation(GTK_ORIENTABLE(box->widget)); luaA_push(L,dt_lua_orientation_t,&orientation); return 1; }
int dt_lua_copy_image(lua_State*L) { dt_lua_image_t imgid = -1; dt_lua_film_t filmid = -1; if(luaL_testudata(L,1,"dt_lua_image_t")) { luaA_to(L,dt_lua_image_t,&imgid,1); luaA_to(L,dt_lua_film_t,&filmid,2); } else { luaA_to(L,dt_lua_film_t,&filmid,1); luaA_to(L,dt_lua_image_t,&imgid,2); } dt_lua_image_t new_image =dt_image_copy(imgid,filmid); luaA_push(L,dt_lua_image_t,&new_image); return 1; }
static int selection_cb(lua_State *L) { GList *image = dt_collection_get_selected(darktable.collection, -1); if(lua_gettop(L) > 0) { GList * new_selection = NULL; luaL_checktype(L,-1,LUA_TTABLE); lua_pushnil(L); while (lua_next(L, -2) != 0) { /* uses 'key' (at index -2) and 'value' (at index -1) */ int imgid; luaA_to(L,dt_lua_image_t,&imgid,-1); new_selection = g_list_prepend(new_selection,GINT_TO_POINTER(imgid)); lua_pop(L,1); } new_selection = g_list_reverse(new_selection); dt_lua_unlock(true);// we need the gdk lock to update ui information dt_selection_clear(darktable.selection); dt_selection_select_list(darktable.selection,new_selection); dt_lua_lock(); g_list_free(new_selection); } lua_newtable(L); while(image) { luaA_push(L,dt_lua_image_t,&image->data); luaL_ref(L,-2); image = g_list_delete_link(image, image); } return 1; }
static int lua_job_valid(lua_State*L) { dt_progress_t *progress; luaA_to(L, dt_lua_backgroundjob_t, &progress, 1); if(lua_isnone(L, 3)) { dt_lua_unlock(false); gboolean i_own_lock = dt_control_gdk_lock(); dt_pthread_mutex_lock(&darktable.control->progress_system.mutex); GList *iter = g_list_find(darktable.control->progress_system.list, progress); dt_pthread_mutex_unlock(&darktable.control->progress_system.mutex); if(i_own_lock) dt_control_gdk_unlock(); dt_lua_lock(); if(iter) lua_pushboolean(L, true); else lua_pushboolean(L, false); return 1; } else { int validity = lua_toboolean(L, 3); if(validity) return luaL_argerror(L, 3, "a job can not be made valid"); dt_lua_unlock(false); dt_control_progress_destroy(darktable.control, progress); dt_lua_lock(); return 0; } }
static int film_index(lua_State *L) { dt_lua_film_t film_id; luaA_to(L,dt_lua_film_t,&film_id,-2); switch(luaL_checkoption(L,-1,NULL,film_fields_name)) { case PATH: { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select folder from film_rolls where id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, film_id); if(sqlite3_step(stmt) == SQLITE_ROW) { lua_pushstring(L,(char *)sqlite3_column_text(stmt, 0)); } else { sqlite3_finalize(stmt); return luaL_error(L,"should never happen"); } sqlite3_finalize(stmt); break; } case ID: lua_pushinteger(L,film_id); break; case DELETE: lua_pushcfunction(L,film_delete); break; } return 1; }
static void box_init(lua_State* L) { lua_box box; luaA_to(L,lua_box,&box,-1); gtk_orientable_set_orientation(GTK_ORIENTABLE(box->widget),GTK_ORIENTATION_VERTICAL); gtk_box_set_spacing(GTK_BOX(box->widget), DT_PIXEL_APPLY_DPI(5)); }
static int combobox_len(lua_State*L) { lua_combobox combobox; luaA_to(L,lua_combobox,&combobox,1); lua_pushinteger(L,dt_bauhaus_combobox_length(combobox->widget)); return 1; }
static int style_tostring(lua_State *L) { dt_style_t style; luaA_to(L, dt_style_t, &style, 1); lua_pushstring(L, style.name); return 1; }
static int tag_index(lua_State *L) { dt_lua_tag_t tagid; luaA_to(L, dt_lua_tag_t, &tagid, -2); int index = luaL_checkinteger(L, -1); if(index < 1) { return luaL_error(L, "incorrect index in database"); } sqlite3_stmt *stmt = NULL; char query[1024]; snprintf(query, sizeof(query), "SELECT imgid FROM main.tagged_images WHERE tagid=?1 ORDER BY imgid LIMIT 1 OFFSET %d", index - 1); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), query, -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, tagid); if(sqlite3_step(stmt) == SQLITE_ROW) { int imgid = sqlite3_column_int(stmt, 0); luaA_push(L, dt_lua_image_t, &imgid); } else { sqlite3_finalize(stmt); luaL_error(L, "incorrect index in database"); } sqlite3_finalize(stmt); return 1; }
int dt_lua_delete_image(lua_State *L) { int imgid; luaA_to(L, dt_lua_image_t, &imgid, -1); dt_image_remove(imgid); return 0; }
static int drop_cache(lua_State *L) { dt_lua_image_t imgid = -1; luaA_to(L, dt_lua_image_t, &imgid, -1); dt_mipmap_cache_remove(darktable.mipmap_cache, imgid); return 0; }
static int id_member(lua_State *L) { dt_lua_film_t film_id; luaA_to(L,dt_lua_film_t,&film_id,1); lua_pushinteger(L,film_id); return 1; }
static int film_getnum(lua_State*L) { int index = luaL_checkinteger(L,-1); if(index < 1) { return luaL_error(L,"incorrect index in database"); } dt_lua_film_t film_id; luaA_to(L,dt_lua_film_t,&film_id,-2); sqlite3_stmt *stmt = NULL; char query[1024]; snprintf(query,sizeof(query),"select id from images where film_id = ?1 order by id limit 1 offset %d",index -1); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),query, -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, film_id); if(sqlite3_step(stmt) == SQLITE_ROW) { dt_lua_image_t imgid = sqlite3_column_int(stmt, 0); luaA_push(L,dt_lua_image_t,&imgid); sqlite3_finalize(stmt); } else { sqlite3_finalize(stmt); return luaL_error(L,"incorrect index in database"); } return 1; }
static int protected_to_yield(lua_State *L) { yield_type type; luaA_to(L, yield_type, &type, 1); lua_pushnumber(L, type); return 1; }
static int combobox_numindex(lua_State*L) { lua_combobox combobox; luaA_to(L,lua_combobox,&combobox,1); int key = lua_tointeger(L,2); int length = dt_bauhaus_combobox_length(combobox->widget); if(lua_gettop(L) > 2) { if(key <= 0 || key > length +1) { return luaL_error(L,"Invalid index for combobox : %d\n",key); } else if(key == length +1) { const char * string = luaL_checkstring(L,3); dt_bauhaus_combobox_add(combobox->widget,string); } else if(lua_isnil(L,3)){ dt_bauhaus_combobox_remove_at(combobox->widget,key-1); } else { const char * string = luaL_checkstring(L,3); dt_bauhaus_combobox_remove_at(combobox->widget,key-1); dt_bauhaus_combobox_insert(combobox->widget,string,key-1); } return 0; } if(key <= 0 || key > length) { return luaL_error(L,"Invalid index for combo box : %d\n",key); } else if (key > length) { lua_pushnil(L); return 1; } const GList *labels = dt_bauhaus_combobox_get_labels(combobox->widget); lua_pushstring(L,g_list_nth_data((GList*)labels,key-1)); return 1; }
int make_group_leader(lua_State *L) { dt_lua_image_t first_image; luaA_to(L, dt_lua_image_t, &first_image, 1); dt_grouping_change_representative(first_image); return 0; }
static int style_delete(lua_State *L) { dt_style_t style; luaA_to(L, dt_style_t, &style, 1); dt_styles_delete_by_name(style.name); return 0; }
static int tag_delete(lua_State *L) { dt_lua_tag_t tagid; luaA_to(L, dt_lua_tag_t, &tagid, -1); GList *tagged_images = NULL; sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT imgid FROM main.tagged_images WHERE tagid=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, tagid); while(sqlite3_step(stmt) == SQLITE_ROW) { tagged_images = g_list_append(tagged_images, GINT_TO_POINTER(sqlite3_column_int(stmt, 0))); } sqlite3_finalize(stmt); dt_tag_remove(tagid, TRUE); GList *list_iter; if((list_iter = g_list_first(tagged_images)) != NULL) { do { dt_image_synch_xmp(GPOINTER_TO_INT(list_iter->data)); } while((list_iter = g_list_next(list_iter)) != NULL); } g_list_free(g_list_first(tagged_images)); return 0; }
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 int history_delete(lua_State *L) { dt_lua_image_t imgid = -1; luaA_to(L,dt_lua_image_t,&imgid,-1); dt_history_delete_on_image(imgid); return 0; }
static void combobox_init(lua_State*L) { lua_combobox combobox; luaA_to(L,lua_combobox,&combobox,-1); dt_bauhaus_combobox_from_widget(DT_BAUHAUS_WIDGET(combobox->widget),NULL); }