Added file chooser window functions

pull/38/head
parent 2bb05506f3
commit 03b520c1f5

@ -6,6 +6,7 @@
<file>libublsettingsui-gtk3-documentation.glade</file> <file>libublsettingsui-gtk3-documentation.glade</file>
<file>libublsettingsui-gtk3-saving.glade</file> <file>libublsettingsui-gtk3-saving.glade</file>
<file>libublsettingsui-gtk3-debugger.glade</file> <file>libublsettingsui-gtk3-debugger.glade</file>
<file>libublsettingsui-gtk3-filechooser.glade</file>
<file>libublsettingsui-gtk3-config-window.glade</file> <file>libublsettingsui-gtk3-config-window.glade</file>
</gresource> </gresource>
<gresource prefix="/com/ublinux/css"> <gresource prefix="/com/ublinux/css">

@ -2,6 +2,22 @@
<!-- Generated with glade 3.38.2 --> <!-- Generated with glade 3.38.2 -->
<interface> <interface>
<requires lib="gtk+" version="3.24"/> <requires lib="gtk+" version="3.24"/>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.libublsettingsui-gtk3.cancel-symbolic</property>
<style>
<class name="marginright"/>
</style>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.libublsettingsui-gtk3.accept-symbolic</property>
<style>
<class name="marginright"/>
</style>
</object>
<object class="GtkWindow" id="Window"> <object class="GtkWindow" id="Window">
<property name="width-request">450</property> <property name="width-request">450</property>
<property name="height-request">500</property> <property name="height-request">500</property>
@ -13,8 +29,8 @@
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="margin-bottom">5</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">5</property>
<child> <child>
<object class="GtkBox" id="StatusBox"> <object class="GtkBox" id="StatusBox">
<property name="visible">True</property> <property name="visible">True</property>
@ -36,13 +52,10 @@
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="margin-left">5</property> <property name="margin-left">5</property>
<property name="margin-right">5</property> <property name="margin-right">5</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="margin-bottom">5</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">5</property> <property name="spacing">5</property>
<child> <child>
<object class="GtkFileChooserWidget"> <object class="GtkFileChooserWidget" id="MainFileChooser">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="create-folders">False</property> <property name="create-folders">False</property>
@ -54,6 +67,22 @@
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkCheckButton" id="ChooseFolderCheck">
<property name="label" translatable="yes">Choose folder instead of file</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="halign">end</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
@ -67,7 +96,6 @@
<object class="GtkHeaderBar"> <object class="GtkHeaderBar">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="show-close-button">True</property>
<child type="title"> <child type="title">
<object class="GtkLabel" id="HeaderTopic"> <object class="GtkLabel" id="HeaderTopic">
<property name="visible">True</property> <property name="visible">True</property>
@ -123,20 +151,4 @@
</object> </object>
</child> </child>
</object> </object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.libublsettingsui-gtk3.cancel-symbolic</property>
<style>
<class name="marginright"/>
</style>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.libublsettingsui-gtk3.accept-symbolic</property>
<style>
<class name="marginright"/>
</style>
</object>
</interface> </interface>

@ -41,6 +41,7 @@ set(DEPENDFILES
../libublsettingsui-gtk3-about.glade ../libublsettingsui-gtk3-about.glade
../libublsettingsui-gtk3-documentation.glade ../libublsettingsui-gtk3-documentation.glade
../libublsettingsui-gtk3-saving.glade ../libublsettingsui-gtk3-saving.glade
../libublsettingsui-gtk3-filechooser.glade
../libublsettingsui-gtk3-debugger.glade ../libublsettingsui-gtk3-debugger.glade
../libublsettingsui-gtk3-config-window.glade ../libublsettingsui-gtk3-config-window.glade
../gresource.xml ../gresource.xml
@ -79,6 +80,7 @@ add_library(${PROJECT_NAME} SHARED
libublsettingsui-gtk3.c libublsettingsui-gtk3.c
libublsettingsui-gtk3-save.c libublsettingsui-gtk3-save.c
libublsettingsui-gtk3-config-window.c libublsettingsui-gtk3-config-window.c
libublsettingsui-gtk3-filechooser.c
libublsettingsui-gtk3.h libublsettingsui-gtk3.h
${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C})

@ -0,0 +1,108 @@
#include "libublsettingsui-gtk3.h"
void on_file_chooser_accept(GtkWidget *, filechooser_window *window){
switch (gtk_file_chooser_get_action(GTK_FILE_CHOOSER(window->MainFileChooser))){
case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER:
case GTK_FILE_CHOOSER_ACTION_SAVE:
window->responce=GTK_RESPONSE_APPLY;
break;
case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER:
case GTK_FILE_CHOOSER_ACTION_OPEN:
window->responce = GTK_RESPONSE_ACCEPT;
break;
}
gtk_widget_destroy(window->Window);
gtk_main_quit();
}
void on_file_chooser_cancel(GtkWidget *, filechooser_window *window){
window->responce=GTK_RESPONSE_CANCEL;
gtk_widget_destroy(window->Window);
gtk_main_quit();
}
char *yon_get_default_label_with_parameter(char *command){
int size;
config_str parsed = yon_config_load(command,&size);
if (parsed){
yon_char_remove_last_symbol(parsed[0],'\n');
char *default_string = yon_char_unite(DEFAULT_LABEL," ","(",parsed[0],")",NULL);
return default_string;
}
}
void on_file_chooser_selected(GtkWidget *self, filechooser_window *window){
if (window->last_any_selection) free(window->last_any_selection);
if (window->last_success_selection) free(window->last_success_selection);
GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(window->MainFileChooser));
config_str paths_all = NULL;
config_str paths_success = NULL;
int all_size=0;
int success_size=0;
GtkFileChooserAction action = gtk_file_chooser_get_action(GTK_FILE_CHOOSER(window->MainFileChooser));
for (int i=0;i<g_slist_length(list);i++){
char *data = (char*)g_slist_nth_data(list,i);
if ((action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER&&success_size==0) ||
(action == GTK_FILE_CHOOSER_ACTION_OPEN&&gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->ChooseFolderCheck))&&yon_file_is_directory(data)) ||
(action == GTK_FILE_CHOOSER_ACTION_OPEN&&!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->ChooseFolderCheck))&&!yon_file_is_directory(data)) ||
(action == GTK_FILE_CHOOSER_ACTION_SAVE&&!yon_file_is_directory(data)) ||
(action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER&&yon_file_is_directory(data))
){
yon_char_parsed_add_or_create_if_exists(paths_success,&success_size,data);
}
yon_char_parsed_add_or_create_if_exists(paths_all,&all_size,data);
}
char *full_success = yon_char_parsed_to_string(paths_success,success_size,",");
char *full_all = yon_char_parsed_to_string(paths_all,all_size,",");
window->last_any_selection = yon_char_is_empty(full_all)?NULL:full_all;
window->last_success_selection = yon_char_is_empty(full_success)?NULL:full_success;
if (all_size) yon_char_parsed_free(paths_all,all_size);
if (success_size) yon_char_parsed_free(paths_success,success_size);
}
filechooser_window *yon_file_chooser_window_new(GtkFileChooserAction action){
filechooser_window *window = malloc(sizeof(filechooser_window));
GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_filechooser);
window->Window = yon_gtk_builder_get_widget(builder,"Window");
window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
window->MainFileChooser = yon_gtk_builder_get_widget(builder,"MainFileChooser");
window->SaveButton = yon_gtk_builder_get_widget(builder,"SaveButton");
window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
window->ChooseFolderCheck = yon_gtk_builder_get_widget(builder,"ChooseFolderCheck");
window->last_any_selection=NULL;
window->last_success_selection=NULL;
g_signal_connect(G_OBJECT(window->MainFileChooser),"selection-changed",G_CALLBACK(on_file_chooser_selected),window);
g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_file_chooser_cancel),window);
g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_file_chooser_accept),window);
gtk_file_chooser_set_action(GTK_FILE_CHOOSER(window->MainFileChooser),action);
switch(action){
case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER:
gtk_widget_hide(window->ChooseFolderCheck);
break;
case GTK_FILE_CHOOSER_ACTION_OPEN:
break;
case GTK_FILE_CHOOSER_ACTION_SAVE:
gtk_widget_hide(window->ChooseFolderCheck);
break;
case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER:
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->ChooseFolderCheck),1);
gtk_widget_hide(window->ChooseFolderCheck);
break;
}
g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
return window;
}
GtkResponseType yon_file_chooser_start(filechooser_window *window){
gtk_widget_show(window->Window);
gtk_main();
return window->responce;
}

@ -1,79 +1,11 @@
#include "libublsettingsui-gtk3.h" #include "libublsettingsui-gtk3.h"
#include "libublsettingsui-gtk3-save.h"
struct loaded_config { /*
dictionary_fields(loaded_config); ==============
char *section; saving section
}; ==============
template_saving_window *yon_saving_window_new();
struct loaded_config *yon_config_convert_parameter(config_str parsed, int size);
/**function and argument, which called after successful config saving.
* Example:
* void on_save_done(main_window *widgets, config_str output, int size)
*/ */
void (*save_success_function)(void*,config_str,int)=NULL;
void *save_success_argument=NULL;
void (*save_failure_function)(void*,config_str,int)=NULL;
void *save_failure_argument=NULL;
void yon_save_window_set_postsave_function(void *function, void *data){
save_success_function=function;
save_success_argument=data;
}
void yon_save_window_set_postsave_failure_function(void *function, void *data){
save_failure_function=function;
save_failure_argument=data;
}
void on_save_window_parameter_switched(GtkCellRendererToggle *self, gchar *path, template_saving_window *window){
GtkTreeIter iter,itar;
if (path){
if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->list),&itar,path)){
gboolean is_active;
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&itar,0,&is_active,-1);
gtk_list_store_set(window->list,&itar,0,!is_active,-1);
}
}
int once_active=0;
int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter);
for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),&iter)){
int is_active;
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&is_active,-1);
if (is_active){
once_active=1;
break;
}
}
if (!once_active) gtk_widget_set_sensitive(window->SaveButton,0);
else gtk_widget_set_sensitive(window->SaveButton,1);
}
template_debug_window *template_debugger_window_new(){
template_debug_window *window = malloc(sizeof(template_debug_window));
GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_debug);
window->Window=yon_gtk_builder_get_widget(builder,"Window");
window->HeaderTopic=yon_gtk_builder_get_widget(builder,"HeaderTopic");
window->HeaderImage=yon_gtk_builder_get_widget(builder,"HeaderImage");
window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox");
window->Vte=yon_gtk_builder_get_widget(builder,"DebuggerTerminal");
gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title);
gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title);
gtk_window_set_icon_name(GTK_WINDOW(window->Window),yon_char_append("com.ublinux.",template_app_information.app_tech_name));
gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL));
yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"DebugWindow");
return window;
}
struct save_return {
void *save_success_argument;
config_str file_return;
int file_save;
};
gboolean _yon_postsave_function_start(struct save_return *data){ gboolean _yon_postsave_function_start(struct save_return *data){
save_success_function(data->save_success_argument,data->file_return,data->file_save); save_success_function(data->save_success_argument,data->file_return,data->file_save);
@ -200,34 +132,210 @@ config_str yon_loaded_config_convert_to_save_command(struct loaded_config *targe
} }
} }
int yon_config_parameter_prepare_elements(config_str target, int *size){ void yon_save_window_set_postsave_function(void *function, void *data){
int success = 0; save_success_function=function;
for (int i=0;i<(*size);i++){ save_success_argument=data;
char *start_bracket_replaced_string = yon_char_replace(target[i],"[","[\"");
char *end_bracket_replaced_string = yon_char_replace(start_bracket_replaced_string,"]","\"]");
target[i] = end_bracket_replaced_string;
}
return success;
} }
void on_save_parameters(GtkWidget *self, template_saving_window *window){ void yon_save_window_set_postsave_failure_function(void *function, void *data){
save_failure_function=function;
save_failure_argument=data;
}
/*
==============
window section
==============
*/
void yon_save_window_set_status(template_saving_window *window,char *path,YON_CONFIG_TYPE type){
textdomain(template_ui_LocaleName); textdomain(template_ui_LocaleName);
yon_ubl_status_box_render(SAVE_PROCESS_LABEL,BACKGROUND_IMAGE_INFO_TYPE); window->type=type;
window->custom_save_path=path;
if (type==YON_CONFIG_BOTH){
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
} else if (type==YON_CONFIG_GLOBAL){
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
} else if (type==YON_CONFIG_LOCAL){
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
} else if (type==YON_CONFIG_CUSTOM){
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_CUSTOM_STATE_LABEL(path),BACKGROUND_IMAGE_INFO_TYPE);
}
textdomain(template_app_information.app_locale); textdomain(template_app_information.app_locale);
}
int saved_size; gboolean yon_save_window_destroy_if_empty(template_saving_window *window){
struct loaded_config *saved_parameters = yon_save_window_get_saved_parameters(window); GtkTreeIter iter;
if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter)){
gtk_widget_destroy(window->Window);
textdomain(template_ui_LocaleName);
yon_ubl_status_box_render(NOTHING_TO_SAVE_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
textdomain(template_app_information.app_locale);
if (save_failure_function){
int size=0; struct save_return *data = malloc(sizeof(struct save_return));
config_str commands = yon_loaded_config_convert_to_save_command(saved_parameters,&size,window->type!=YON_CONFIG_CUSTOM? yon_config_get_type_path(window->type):window->custom_save_path); data->save_success_argument = save_failure_argument;
yon_config_parameter_prepare_elements(commands,&size); data->file_return = NULL;
data->file_save = 0;
gdk_threads_add_idle((GSourceFunc)_yon_postsave_failure_function_start,data);
}
return 0;
}
return 1;
}
char *final_command = yon_char_parsed_to_string(commands,size,";"); void on_save_window_parameter_switched(GtkCellRendererToggle *self, gchar *path, template_saving_window *window){
pthread_t thread_id; GtkTreeIter iter,itar;
pthread_create(&thread_id, NULL, (void *)_yon_saving_threaded,final_command); if (path){
if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->list),&itar,path)){
gboolean is_active;
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&itar,0,&is_active,-1);
gtk_list_store_set(window->list,&itar,0,!is_active,-1);
}
}
int once_active=0;
int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter);
for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),&iter)){
int is_active;
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&is_active,-1);
if (is_active){
once_active=1;
break;
}
}
if (!once_active) gtk_widget_set_sensitive(window->SaveButton,0);
else gtk_widget_set_sensitive(window->SaveButton,1);
yon_window_config_custom_window_set(GTK_WINDOW(window->Window),"SaveWindow"); }
on_subwindow_close(self);
template_saving_window *yon_saving_window_new(){
GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_saving);
template_saving_window *window = malloc(sizeof(template_saving_window));
window->Window = yon_gtk_builder_get_widget(builder,"Window");
window->HeaderImage = yon_gtk_builder_get_widget(builder,"HeaderImage");
window->HeaderTopic = yon_gtk_builder_get_widget(builder,"HeaderTopic");
window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
window->ParametersTree = yon_gtk_builder_get_widget(builder,"ParametersTree");
window->SaveButton = yon_gtk_builder_get_widget(builder,"SaveButton");
window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
window->ToggleCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ToggleCell"));
window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1"));
window->OldValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"OldValueColumn"));
window->OldValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"OldValueCell"));
window->NewValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"NewValueColumn"));
window->NewValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"NewValueCell"));
window->filteredModel = GTK_TREE_MODEL(gtk_builder_get_object(builder,"listfilter1"));
yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"SaveWindow");
char *icon_name = yon_char_append("com.ublinux.",template_app_information.app_tech_name);
gtk_window_set_icon_name(GTK_WINDOW(window->Window),icon_name);
gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title);
gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title);
gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL));
g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_save_parameters),window);
g_signal_connect(G_OBJECT(window->ToggleCell),"toggled", G_CALLBACK(on_save_window_parameter_switched),window);
return window;
}
/*
======================
config getting section
======================
*/
char *yon_get_compare_config_command(va_list args,char *path,YON_CONFIG_TYPE type){
char *cur_command;
char *compare_command="";
while ((cur_command=va_arg(args,char*))){
char *temp=cur_command;
cur_command = yon_config_parameter_prepare_command(cur_command,type!=YON_CONFIG_CUSTOM?yon_config_get_type_path(type):path,NULL,NULL);
char *temp_command = yon_char_unite(compare_command,!yon_char_is_empty(compare_command)?";":"",cur_command,NULL);
if (!yon_char_is_empty(compare_command)) free(compare_command);
compare_command = temp_command;
}
return yon_char_is_empty(compare_command)?NULL:compare_command;
}
void yon_save_window_loaded_config_init(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){
if (current_loaded){
struct loaded_config *current = NULL;
for_dictionaries(current,current_loaded){
if (!yon_config_check_ignore(current->key)){
dictionary *dict = NULL;
if (!yon_config_compare_ignore_get(current->key)){
dict = yon_dictionary_get((dictionary**)&config_compare,current->key); // get old parameter value
}
gboolean status=0;
status = yon_config_get_status(current->key);
if (dict&&!yon_char_is_empty((char*)dict->data)&&status!=-2){
if (strcmp((char*)dict->data,(char*)current->data)){
GtkTreeIter iter;
if (status==0||status==-2) status = 0;
else status=1;
char *old_val = yon_char_new(current->data);
char *new_val = yon_char_new(dict->data);
if (strstr(old_val,"&")) {old_val = yon_char_replace(old_val,"&","\003");old_val = yon_char_replace(old_val,"\003","&amp;");}
if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","&lt;");
if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<","&gt;");
if (strstr(new_val,"&")) {int sz = 0; config_str new_val_parsed = yon_char_parse(new_val,&sz,"&");new_val = yon_char_parsed_to_string(new_val_parsed,sz,"&amp;"); yon_char_parsed_free(new_val_parsed,sz);}
if (strstr(new_val,">")) new_val = yon_char_replace(new_val,">","&lt;");
if (strstr(new_val,"<")) new_val = yon_char_replace(new_val,"<","&gt;");
char *compare_string = yon_char_unite("<s>",(char*)new_val,"</s>\n",(char*)old_val,NULL);
gtk_list_store_append(window->list,&iter);
gtk_list_store_set(window->list,&iter,0,status,1,current->key,2,(char*)dict->data,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1);
free(compare_string);
}
} else if ((strcmp((char*)current->data,""))&&status!=-2){
GtkTreeIter iter;
if (status==0||status==-2) status = 0;
else status=1;
char *old_val = yon_char_new(current->data);
if (strstr(old_val,"&")) {int sz = 0; config_str old_val_parsed = yon_char_parse(old_val,&sz,"&");old_val = yon_char_parsed_to_string(old_val_parsed,sz,"&amp;"); yon_char_parsed_free(old_val_parsed,sz);}
if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","&lt;");
if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<","&gt;");
char *compare_string = yon_char_unite("\n",(char*)old_val,NULL);
gtk_list_store_append(window->list,&iter);
gtk_list_store_set(window->list,&iter,0,status,1,current->key,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1);
free(compare_string);
}
}
}
}
}
void yon_save_window_compared_config_init_unfound(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){
if (config_compare){
struct loaded_config *current = NULL;
for_dictionaries(current,config_compare){
if (!yon_config_check_ignore(current->key)){
GtkTreeIter iter;
dictionary *dict = yon_dictionary_get((dictionary**)&current_loaded,current->key);
if (!dict){
GdkRGBA rgba;
rgba.alpha=0.8;
rgba.red=1;
rgba.blue=0.3;
rgba.green=0.65;
char *rgba_string = gdk_rgba_to_string(&rgba);
int status=0;
char *compare_string = yon_char_unite((char*)current->data,"\n",NULL);
gtk_list_store_append(window->list,&iter);
gtk_list_store_set(window->list,&iter,0,0,1,current->key,2,(char*)current->data,4,compare_string,5,rgba_string,6,1,7,current->section,-1);
free(compare_string);
}
}
}
}
}
int yon_config_parameter_prepare_elements(config_str target, int *size){
int success = 0;
for (int i=0;i<(*size);i++){
char *start_bracket_replaced_string = yon_char_replace(target[i],"[","[\"");
char *end_bracket_replaced_string = yon_char_replace(start_bracket_replaced_string,"]","\"]");
target[i] = end_bracket_replaced_string;
}
return success;
} }
struct loaded_config *yon_config_convert_parameter(config_str parsed, int size){ struct loaded_config *yon_config_convert_parameter(config_str parsed, int size){
@ -347,19 +455,17 @@ struct loaded_config *yon_config_get_compared(char *command){
} }
char *yon_custom_config_init(){ char *yon_custom_config_init(){
textdomain(template_ui_LocaleName); filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_OPEN);
GtkWidget *dialog = gtk_file_chooser_dialog_new(template_app_information.app_title,NULL,GTK_FILE_CHOOSER_ACTION_SAVE,CANCEL_LABEL,GTK_RESPONSE_CANCEL,SAVE_LABEL,GTK_RESPONSE_ACCEPT,NULL);
textdomain(template_app_information.app_locale); yon_gtk_window_setup(GTK_WINDOW(dialog->Window),NULL,template_app_information.app_title,yon_char_unite("com.ublinux.",template_app_information.app_tech_name,NULL),"ConfigFilechooserWindow");
GtkFileFilter *filter = gtk_file_filter_new(); GtkFileFilter *filter = gtk_file_filter_new();
gtk_window_set_icon_name(GTK_WINDOW(dialog),yon_char_append("com.ublinux.",template_app_information.app_tech_name));
gtk_file_filter_add_pattern(filter,"*.ini"); gtk_file_filter_add_pattern(filter,"*.ini");
gtk_file_filter_set_name(filter, "*.ini"); gtk_file_filter_set_name(filter, "*.ini");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->MainFileChooser),filter);
if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){
int response = gtk_dialog_run(GTK_DIALOG(dialog)); char *file = dialog->last_success_selection;
if (response == GTK_RESPONSE_ACCEPT){
char *file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
if (!yon_char_is_empty(file)){ if (!yon_char_is_empty(file)){
if (!strstr(file,".ini")) file = yon_char_append(file,".ini"); if (!strstr(file,".ini")) file = yon_char_append(file,".ini");
if (access(file,0)!=F_OK){ if (access(file,0)!=F_OK){
@ -372,138 +478,56 @@ char *yon_custom_config_init(){
} }
} }
} }
char *path = yon_char_unite("'",file,"'",NULL); char *path = yon_char_unite("'",file,"'",NULL);
free(file); free(file);
gtk_widget_destroy(dialog); gtk_widget_destroy(dialog->Window);
return path; return path;
} else {
gtk_widget_destroy(dialog);
} }
return NULL; return NULL;
} }
char *yon_get_compare_config_command(va_list args,char *path,YON_CONFIG_TYPE type){ /*
char *cur_command; ============
char *compare_command=""; init section
while ((cur_command=va_arg(args,char*))){ ============
char *temp=cur_command; */
cur_command = yon_config_parameter_prepare_command(cur_command,type!=YON_CONFIG_CUSTOM?yon_config_get_type_path(type):path,NULL,NULL);
char *temp_command = yon_char_unite(compare_command,!yon_char_is_empty(compare_command)?";":"",cur_command,NULL);
if (!yon_char_is_empty(compare_command)) free(compare_command);
compare_command = temp_command;
}
return yon_char_is_empty(compare_command)?NULL:compare_command;
}
void yon_save_window_loaded_config_init(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){ void on_save_parameters(GtkWidget *self, template_saving_window *window){
if (current_loaded){ textdomain(template_ui_LocaleName);
struct loaded_config *current = NULL; yon_ubl_status_box_render(SAVE_PROCESS_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
for_dictionaries(current,current_loaded){ textdomain(template_app_information.app_locale);
if (!yon_config_check_ignore(current->key)){
dictionary *dict = NULL;
if (!yon_config_compare_ignore_get(current->key)){
dict = yon_dictionary_get((dictionary**)&config_compare,current->key); // get old parameter value
}
gboolean status=0;
status = yon_config_get_status(current->key);
if (dict&&!yon_char_is_empty((char*)dict->data)&&status!=-2){
if (strcmp((char*)dict->data,(char*)current->data)){
GtkTreeIter iter;
if (status==0||status==-2) status = 0;
else status=1;
char *old_val = yon_char_new(current->data);
char *new_val = yon_char_new(dict->data);
if (strstr(old_val,"&")) {old_val = yon_char_replace(old_val,"&","\003");old_val = yon_char_replace(old_val,"\003","&amp;");}
if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","&lt;");
if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<","&gt;");
if (strstr(new_val,"&")) {int sz = 0; config_str new_val_parsed = yon_char_parse(new_val,&sz,"&");new_val = yon_char_parsed_to_string(new_val_parsed,sz,"&amp;"); yon_char_parsed_free(new_val_parsed,sz);}
if (strstr(new_val,">")) new_val = yon_char_replace(new_val,">","&lt;");
if (strstr(new_val,"<")) new_val = yon_char_replace(new_val,"<","&gt;");
char *compare_string = yon_char_unite("<s>",(char*)new_val,"</s>\n",(char*)old_val,NULL);
gtk_list_store_append(window->list,&iter);
gtk_list_store_set(window->list,&iter,0,status,1,current->key,2,(char*)dict->data,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1);
free(compare_string);
}
} else if ((strcmp((char*)current->data,""))&&status!=-2){
GtkTreeIter iter;
if (status==0||status==-2) status = 0;
else status=1;
char *old_val = yon_char_new(current->data);
if (strstr(old_val,"&")) {int sz = 0; config_str old_val_parsed = yon_char_parse(old_val,&sz,"&");old_val = yon_char_parsed_to_string(old_val_parsed,sz,"&amp;"); yon_char_parsed_free(old_val_parsed,sz);}
if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","&lt;");
if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<","&gt;");
char *compare_string = yon_char_unite("\n",(char*)old_val,NULL);
gtk_list_store_append(window->list,&iter);
gtk_list_store_set(window->list,&iter,0,status,1,current->key,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1);
free(compare_string);
}
}
}
}
}
void yon_save_window_compared_config_init_unfound(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){ int saved_size;
if (config_compare){ struct loaded_config *saved_parameters = yon_save_window_get_saved_parameters(window);
struct loaded_config *current = NULL;
for_dictionaries(current,config_compare){
if (!yon_config_check_ignore(current->key)){
GtkTreeIter iter;
dictionary *dict = yon_dictionary_get((dictionary**)&current_loaded,current->key);
if (!dict){
GdkRGBA rgba;
rgba.alpha=0.8;
rgba.red=1;
rgba.blue=0.3;
rgba.green=0.65;
char *rgba_string = gdk_rgba_to_string(&rgba);
int status=0;
char *compare_string = yon_char_unite((char*)current->data,"\n",NULL);
gtk_list_store_append(window->list,&iter);
gtk_list_store_set(window->list,&iter,0,0,1,current->key,2,(char*)current->data,4,compare_string,5,rgba_string,6,1,7,current->section,-1);
free(compare_string);
}
}
}
}
}
gboolean yon_save_window_destroy_if_empty(template_saving_window *window){ int size=0;
GtkTreeIter iter; config_str commands = yon_loaded_config_convert_to_save_command(saved_parameters,&size,window->type!=YON_CONFIG_CUSTOM? yon_config_get_type_path(window->type):window->custom_save_path);
if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter)){ yon_config_parameter_prepare_elements(commands,&size);
gtk_widget_destroy(window->Window);
textdomain(template_ui_LocaleName);
yon_ubl_status_box_render(NOTHING_TO_SAVE_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
textdomain(template_app_information.app_locale);
if (save_failure_function){
struct save_return *data = malloc(sizeof(struct save_return)); char *final_command = yon_char_parsed_to_string(commands,size,";");
data->save_success_argument = save_failure_argument; pthread_t thread_id;
data->file_return = NULL; pthread_create(&thread_id, NULL, (void *)_yon_saving_threaded,final_command);
data->file_save = 0;
gdk_threads_add_idle((GSourceFunc)_yon_postsave_failure_function_start,data); yon_window_config_custom_window_set(GTK_WINDOW(window->Window),"SaveWindow");
} on_subwindow_close(self);
return 0;
}
return 1;
} }
void yon_save_window_set_status(template_saving_window *window,char *path,YON_CONFIG_TYPE type){ template_debug_window *template_debugger_window_new(){
textdomain(template_ui_LocaleName); template_debug_window *window = malloc(sizeof(template_debug_window));
window->type=type; GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_debug);
window->custom_save_path=path; window->Window=yon_gtk_builder_get_widget(builder,"Window");
if (type==YON_CONFIG_BOTH){ window->HeaderTopic=yon_gtk_builder_get_widget(builder,"HeaderTopic");
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); window->HeaderImage=yon_gtk_builder_get_widget(builder,"HeaderImage");
} else if (type==YON_CONFIG_GLOBAL){ window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox");
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); window->Vte=yon_gtk_builder_get_widget(builder,"DebuggerTerminal");
gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title);
gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title);
gtk_window_set_icon_name(GTK_WINDOW(window->Window),yon_char_append("com.ublinux.",template_app_information.app_tech_name));
gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL));
} else if (type==YON_CONFIG_LOCAL){ yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"DebugWindow");
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); return window;
} else if (type==YON_CONFIG_CUSTOM){
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_CUSTOM_STATE_LABEL(path),BACKGROUND_IMAGE_INFO_TYPE);
}
textdomain(template_app_information.app_locale);
} }
template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...){ template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...){
@ -542,42 +566,3 @@ template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...){
on_save_window_parameter_switched(NULL,NULL,window); on_save_window_parameter_switched(NULL,NULL,window);
return window; return window;
} }
template_saving_window *yon_saving_window_new(){
GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_saving);
template_saving_window *window = malloc(sizeof(template_saving_window));
window->Window = yon_gtk_builder_get_widget(builder,"Window");
window->HeaderImage = yon_gtk_builder_get_widget(builder,"HeaderImage");
window->HeaderTopic = yon_gtk_builder_get_widget(builder,"HeaderTopic");
window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
window->ParametersTree = yon_gtk_builder_get_widget(builder,"ParametersTree");
window->SaveButton = yon_gtk_builder_get_widget(builder,"SaveButton");
window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
window->ToggleCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ToggleCell"));
window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1"));
window->OldValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"OldValueColumn"));
window->OldValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"OldValueCell"));
window->NewValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"NewValueColumn"));
window->NewValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"NewValueCell"));
window->filteredModel = GTK_TREE_MODEL(gtk_builder_get_object(builder,"listfilter1"));
yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"SaveWindow");
char *icon_name = yon_char_append("com.ublinux.",template_app_information.app_tech_name);
gtk_window_set_icon_name(GTK_WINDOW(window->Window),icon_name);
gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title);
gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title);
gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL));
g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_save_parameters),window);
g_signal_connect(G_OBJECT(window->ToggleCell),"toggled", G_CALLBACK(on_save_window_parameter_switched),window);
return window;
}
#define default_config_command(target, data) yon_char_unite("ubconfig --source default --raw get ",target," ",data,NULL)
char *yon_get_default_label_with_parameter(char *section, char *parameter){
int size;
config_str parsed = yon_config_load(default_config_command(section,parameter),&size);
if (parsed){
yon_char_remove_last_symbol(parsed[0],'\n');
char *default_string = yon_char_unite(DEFAULT_LABEL," ","(",parsed[0],")",NULL);
return default_string;
}
}

@ -0,0 +1,27 @@
struct loaded_config {
dictionary_fields(loaded_config);
char *section;
};
template_saving_window *yon_saving_window_new();
struct loaded_config *yon_config_convert_parameter(config_str parsed, int size);
struct save_return {
void *save_success_argument;
config_str file_return;
int file_save;
};
/**function and argument, which called after successful config saving.
* Example:
* void on_save_done(main_window *widgets, config_str output, int size)
*/
void (*save_success_function)(void*,config_str,int)=NULL;
void *save_success_argument=NULL;
void (*save_failure_function)(void*,config_str,int)=NULL;
void *save_failure_argument=NULL;
#define default_config_command(target, data) yon_char_unite("ubconfig --source default --raw get ",target," ",data,NULL)
void on_save_parameters(GtkWidget *self, template_saving_window *window);

@ -23,6 +23,7 @@
#define ui_glade_path_documentation "/com/ublinux/ui/libublsettingsui-gtk3-documentation.glade" #define ui_glade_path_documentation "/com/ublinux/ui/libublsettingsui-gtk3-documentation.glade"
#define ui_glade_path_about "/com/ublinux/ui/libublsettingsui-gtk3-about.glade" #define ui_glade_path_about "/com/ublinux/ui/libublsettingsui-gtk3-about.glade"
#define ui_glade_path_saving "/com/ublinux/ui/libublsettingsui-gtk3-saving.glade" #define ui_glade_path_saving "/com/ublinux/ui/libublsettingsui-gtk3-saving.glade"
#define ui_glade_path_filechooser "/com/ublinux/ui/libublsettingsui-gtk3-filechooser.glade"
#define ui_glade_path_debug "/com/ublinux/ui/libublsettingsui-gtk3-debugger.glade" #define ui_glade_path_debug "/com/ublinux/ui/libublsettingsui-gtk3-debugger.glade"
#define ui_banner_path "/com/ublinux/images/libublsettingsui-gtk3-banner.png" #define ui_banner_path "/com/ublinux/images/libublsettingsui-gtk3-banner.png"
#define ui_CssPath "/com/ublinux/css/libublsettingsui-gtk3.css" #define ui_CssPath "/com/ublinux/css/libublsettingsui-gtk3.css"
@ -155,6 +156,20 @@ typedef struct {
char *action_text; char *action_text;
} dialog_confirmation_data; } dialog_confirmation_data;
typedef struct {
GtkWidget *Window;
GtkWidget *StatusBox;
GtkWidget *MainFileChooser;
GtkWidget *SaveButton;
GtkWidget *CancelButton;
GtkWidget *ChooseFolderCheck;
char *last_success_selection;
char *last_any_selection;
GtkResponseType responce;
} filechooser_window;
filechooser_window *yon_file_chooser_window_new(GtkFileChooserAction action);
GtkResponseType yon_file_chooser_start(filechooser_window *window);
int yon_confirmation_dialog_call(GtkWidget *self,dialog_confirmation_data *data); int yon_confirmation_dialog_call(GtkWidget *self,dialog_confirmation_data *data);
/**yon_open_browser(GtkWidget *self, char *link) /**yon_open_browser(GtkWidget *self, char *link)
@ -250,7 +265,7 @@ void yon_save_window_set_postsave_function(void *function, void *data);
void yon_save_window_set_postsave_failure_function(void *function, void *data); void yon_save_window_set_postsave_failure_function(void *function, void *data);
char *yon_get_default_label_with_parameter(char *section, char *parameter); char *yon_get_default_label_with_parameter(char *command);
template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...); template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...);
@ -279,6 +294,7 @@ typedef struct {
} ubl_settings_window; } ubl_settings_window;
char *yon_settings_configuration_get(char *id); char *yon_settings_configuration_get(char *id);
char *yon_custom_config_init();
#define VERSION_LABEL yon_char_unite(_("Version:")," ",!yon_char_is_empty(template_app_information.app_version)?template_app_information.app_version:"","\n",NULL) #define VERSION_LABEL yon_char_unite(_("Version:")," ",!yon_char_is_empty(template_app_information.app_version)?template_app_information.app_version:"","\n",NULL)
#define HELP_LABEL(rest) yon_char_unite(template_app_information.app_tech_name,_(" version:")," ", !yon_char_is_empty(template_app_information.app_version)?template_app_information.app_version:"","\n",template_app_information.app_title,"\n",_("Usage:"), " ",template_app_information.app_tech_name," ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n\t--clear-config\t\t\t",_("Reset application settings"),"\n",!yon_char_is_empty(rest)?rest:NULL,NULL) #define HELP_LABEL(rest) yon_char_unite(template_app_information.app_tech_name,_(" version:")," ", !yon_char_is_empty(template_app_information.app_version)?template_app_information.app_version:"","\n",template_app_information.app_title,"\n",_("Usage:"), " ",template_app_information.app_tech_name," ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n\t--clear-config\t\t\t",_("Reset application settings"),"\n",!yon_char_is_empty(rest)?rest:NULL,NULL)
@ -356,4 +372,6 @@ char *yon_settings_configuration_get(char *id);
#define EMAIL_INVALID_LABEL _("Invalid email adress") #define EMAIL_INVALID_LABEL _("Invalid email adress")
#define PATH_INVALID_LABEL _("Invalid path") #define PATH_INVALID_LABEL _("Invalid path")
#define CHOOSE_FILE_LABEL _("Choose path")
#endif #endif
Loading…
Cancel
Save