You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ubl-settings-keyboard/source/ubl-settings-keyboard-optio...

214 lines
9.4 KiB

#include "ubl-settings-keyboard.h"
// void on_options_accept(GtkWidget *self, dictionary *dict){
// main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
// layouts_window *window = yon_dictionary_get_data(dict->first->next,layouts_window*);
// GtkTreeModel *model = GTK_TREE_MODEL(window->list);
// GtkTreeIter iter;
// char *name, *id;
// if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),&model,&iter)){
// gtk_tree_model_get(model,&iter,0,&id,1,&name,-1);
// gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),name);
// yon_config_register(options_parameter,options_parameter_command,id);
// }
// on_subwindow_close(self);
// }
// void on_options_open(GtkWidget *, main_window *widgets){
// GtkBuilder *builder = gtk_builder_new_from_resource(glade_layouts_path);
// layouts_window *window = malloc(sizeof(layouts_window));
// window->Window = yon_gtk_builder_get_widget(builder,"Window");
// window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton");
// window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
// window->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree");
// window->list = main_config.options_list;
// gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree),GTK_TREE_MODEL(window->list));
// dictionary *dict = NULL;
// gtk_tree_view_remove_column(GTK_TREE_VIEW(window->MainTree),gtk_tree_view_get_column(GTK_TREE_VIEW(window->MainTree),0));
// yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets);
// yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
// g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
// g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_options_accept),dict);
// }
// GList *yon_get_all_selected(GtkTreeView *tree, int column){
// GtkTreeIter iter;
// GList *list = NULL;
// GtkTreeModel *model = gtk_tree_view_get_model(tree);
// for_iter(model,&iter){
// int status;
// gtk_tree_model_get(model,&iter,column,&status,-1);
// if (status){
// GtkTreePath *path = gtk_tree_model_get_path(model,&iter);
// list = g_list_append(list,path);
// }
// }
// return list;
// }
void on_option_chosen(GtkCellRenderer *, gchar *path, layouts_window *window){
GtkTreeIter iter;
GtkTreeIter itar;
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->OptionsFilter),&iter,path);
gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(window->OptionsFilter),&itar,&iter);
int chosen;
gtk_tree_model_get(GTK_TREE_MODEL(window->OptionsList),&itar,2,&chosen,-1);
gtk_list_store_set(GTK_LIST_STORE(window->OptionsList),&itar,2,!chosen,-1);
}
gboolean yon_filter_refilter(GtkTreeModel *model, GtkTreeIter *iter, layouts_window *window){
char *target_id;
const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->OptionsFilterCombo));
if (yon_char_is_empty(id)) return 0;
gtk_tree_model_get(model,iter,0,&target_id,-1);
char *filter_section = yon_char_divide_search(target_id,":",-1);
int result = !strcmp(filter_section,id);
if (target_id)
free(target_id);
if (filter_section)
free(filter_section);
return result;
}
void yon_options_setup(layouts_window *window){
int size;
config_str option_commands = yon_char_parsed_new(&size,
lv2_options_command,
lv3_options_command,
ctrl_options_command,
grp_led_options_command,
mod_led_options_command,
keypad_options_command,
kpdl_options_command,
caps_options_command,
altwin_options_command,
Compose_options_command,
compat_options_command,
currencysign_options_command,
lv5_options_command,
nbsp_options_command,
japan_options_command,
korean_options_command,
esperanto_options_command,
solaris_options_command,
terminate_options_command,
NULL);
char *command_full = yon_char_parsed_to_string(option_commands,size,"; ");
int options_size;
config_str options = yon_config_load(command_full,&options_size);
GtkTreeIter iter;
int filter_size;
config_str filter = NULL;
for (int i=0;i<options_size;i++){
yon_char_remove_last_symbol(options[i],'\n');
int parsed_size;
config_str parsed = yon_char_parse(options[i],&parsed_size,"|");
gtk_list_store_append(window->OptionsList,&iter);
gtk_list_store_set(window->OptionsList,&iter,0,parsed[0],1,parsed[1],-1);
char *str = yon_char_new(parsed[0]);
char *type = yon_char_divide_search(str,":",-1);
if (yon_char_parsed_check_exist(filter,filter_size,type)==-1){
yon_char_parsed_add_or_create_if_exists(filter,&filter_size,type);
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->OptionsFilterCombo),type,type);
}
if (!yon_char_is_empty(str))free(str);
if (!yon_char_is_empty(type))free(type);
yon_char_parsed_free(parsed,parsed_size);
}
gtk_combo_box_set_active(GTK_COMBO_BOX(window->OptionsFilterCombo),0);
yon_char_parsed_free(filter,filter_size);
yon_char_parsed_free(option_commands,size);
}
void on_options_filter_changed(GtkWidget *, layouts_window *window){
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->OptionsFilter));
}
void on_options_accept(GtkWidget *self, layouts_window *window){
main_window *widgets = g_object_get_data(G_OBJECT(window->Window),"widgets");
GtkTreeModel *model = GTK_TREE_MODEL(window->OptionsList);
GtkTreeIter iter, itar;
char *name, *id;
int status;
for_iter(model,&iter){
gtk_tree_model_get(model,&iter,0,&id,1,&name,2,&status,-1);
if (status){
gtk_list_store_append(widgets->OptionsList,&itar);
gtk_list_store_set(widgets->OptionsList,&itar,0,id,1,_(name),-1);
}
}
on_subwindow_close(self);
on_options_save(NULL, widgets);
}
void on_options_save(GtkWidget *,main_window *widgets){
char *main_id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(widgets->LayoutChangingCombo));
int parameter_parsed_size;
config_str parameter_parsed = NULL;
yon_char_parsed_add_or_create_if_exists(parameter_parsed,&parameter_parsed_size,!yon_char_is_empty(main_id)?main_id:"");
GtkTreeIter iter;
for_iter(GTK_TREE_MODEL(widgets->OptionsList),&iter){
char *cur_id;
gtk_tree_model_get(GTK_TREE_MODEL(widgets->OptionsList),&iter,0,&cur_id,-1);
yon_char_parsed_add_or_create_if_exists(parameter_parsed,&parameter_parsed_size,cur_id);
}
char *final_parameter = yon_char_parsed_to_string_full(parameter_parsed,parameter_parsed_size,",");
yon_char_parsed_free(parameter_parsed,parameter_parsed_size);
if (!yon_char_is_empty(final_parameter)){
yon_config_register(options_parameter,options_parameter_command,final_parameter);
gtk_entry_set_text(GTK_ENTRY(widgets->ManualEntry),final_parameter);
free(final_parameter);
} else {
yon_config_remove_by_key(options_parameter);
gtk_entry_set_text(GTK_ENTRY(widgets->ManualEntry),"");
}
}
layouts_window *yon_options_window_new(){
GtkBuilder *builder = gtk_builder_new_from_resource(glade_options_path);
layouts_window *window = malloc(sizeof(layouts_window));
window->Window = yon_gtk_builder_get_widget(builder,"Window");
window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton");
window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
window->MainTree = yon_gtk_builder_get_widget(builder,"OptionsTree");
window->OptionsFilterCombo = yon_gtk_builder_get_widget(builder,"OptionsFilterCombo");
window->OptionsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"OptionsList"));
window->OptionsFilter = GTK_TREE_MODEL(gtk_builder_get_object(builder,"OptionsFilter"));
window->ChosenCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ChosenCell"));
g_signal_connect(G_OBJECT(window->OptionsFilterCombo),"changed",G_CALLBACK(on_options_filter_changed),window);
g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
g_signal_connect(G_OBJECT(window->ChosenCell),"toggled",G_CALLBACK(on_option_chosen),window);
gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree),GTK_TREE_MODEL(window->OptionsFilter));
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(window->OptionsFilter),(GtkTreeModelFilterVisibleFunc)yon_filter_refilter,window,NULL);
yon_options_setup(window);
return window;
}
void on_options_open(GtkWidget *, main_window *widgets){
layouts_window *window = yon_options_window_new();
// window->list = main_config.options_list;
g_object_set_data(G_OBJECT(window->Window),"widgets",widgets);
g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_options_accept),window);
}
void on_option_remove(GtkWidget*, main_window *widgets){
GtkTreeIter iter;
GtkTreeModel *model;
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->OptionsTree)),&model, &iter)){
char *target;
gtk_tree_model_get(model,&iter,0,&target,-1);
yon_config_remove_element(options_parameter,target,",");
}
yon_interface_update(widgets);
}