From a35b15be33bd746ea3664242619cba172bb71221 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 14 Jul 2023 15:23:45 +0600 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D1=83=20?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B2=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/controler.c | 60 ++++-- source/controler.h | 4 +- source/model/load.c | 36 +++- source/model/load.h | 2 +- source/model/model.c | 26 ++- source/model/model.h | 8 +- source/model/philos_utils.c | 30 +-- source/model/philos_utils.h | 5 +- source/model/save.c | 18 +- source/model/ubl-utils.c | 2 +- source/model/vector.h | 11 +- source/ubl-settings-diskquota.c | 6 +- source/ubl-settings-diskquota.h | 2 +- source/view_check_user_table.c | 8 +- source/view_check_user_table.h | 3 +- source/view_temp_u_g_p.c | 128 +++++++++++-- source/view_temp_u_g_p.h | 5 + ubl-settings-diskquota | Bin 616920 -> 621128 bytes ubl-settings-diskquota.glade | 329 ++++++++++++++------------------ 19 files changed, 406 insertions(+), 277 deletions(-) diff --git a/source/controler.c b/source/controler.c index e26ca90..e9e1d08 100644 --- a/source/controler.c +++ b/source/controler.c @@ -11,6 +11,7 @@ void wrapper_filters_user_show() { } void wrapper_filters_group_show() { filters_set_name("group"); + filters_show(NULL, glade_path); } void wrapper_filters_project_show() { @@ -20,46 +21,52 @@ void wrapper_filters_project_show() { void wrapper_add_user_show() { set_temp_menu("user", "add"); + set_vector(&all_config->v_user); temp_show(NULL, glade_path); } void wrapper_edit_user_show() { int index = wrapper_select_tree_view(&cfg_custom_gui.user); set_temp_menu("user", "edit"); temp_show(NULL, glade_path); + set_vector(&all_config->v_user); set_edit_gui_data_base(all_config, index); } void wrapper_add_group_show() { set_temp_menu("group", "add"); + set_vector(&all_config->v_group); temp_show(NULL, glade_path); } void wrapper_edit_group_show() { int index = wrapper_select_tree_view(&cfg_custom_gui.group); set_temp_menu("group", "edit"); + set_vector(&all_config->v_group); temp_show(NULL, glade_path); set_edit_gui_data_base(all_config, index); } void wrapper_add_project_show() { set_temp_menu("project", "add"); + set_vector(&all_config->v_project); temp_show(NULL, glade_path); } void wrapper_edit_project_show() { int index = wrapper_select_tree_view(&cfg_custom_gui.project); set_temp_menu("project", "edit"); temp_show(NULL, glade_path); + set_vector(&all_config->v_project); set_edit_gui_data_base(all_config, index); } -int fill_tree_view_project(config_all* all_config, char* disk, hotebook* widget , char* str_fill, int flag_gui_add) { +int fill_tree_view_project(config_all* all_config,hotebook* widget , char* str_fill, int flag_gui_add) { GtkTreeModel *model = GTK_TREE_MODEL(widget->liststore); if (flag_gui_add == 0) { g_object_ref(widget->liststore); gtk_list_store_clear(widget->liststore); } int flag_searhc = 0; - for (int i = 0; i < all_config->v_u_g_p.pfVectorTotal(&all_config->v_u_g_p); i++) { - config_u_g_p* _config = (config_u_g_p*)all_config->v_u_g_p.pfVectorGet(&all_config->v_u_g_p, i); - if (strcmp(_config->type_arr, str_fill) == 0 && strstr(_config->UNIX_file, disk)) { + for (int i = 0; i < all_config->v_project.pfVectorTotal(&all_config->v_project); i++) { + config_u_g_p* _config = (config_u_g_p*)all_config->v_project.pfVectorGet(&all_config->v_project, i); + if (strcmp(_config->type_arr, str_fill) == 0) { GtkTreeIter iter; flag_searhc++; gtk_list_store_append(widget->liststore,&iter); @@ -67,7 +74,7 @@ int fill_tree_view_project(config_all* all_config, char* disk, hotebook* widget char* deferring_file = wrapper_str_time(_config->deferring_file); gtk_list_store_set(widget->liststore,&iter, 0,fill_tree_view_id(_config->id), - 1,_config->actors, + 1,format_actors(&_config->actors), 2,_config->quota, 3,_config->size_memory, 4,philos_format_cfg_str_size_memory("", _config->soft_restriction_size,_config->soft_restriction_size_pow), @@ -94,8 +101,15 @@ int fill_tree_view_user_group(config_all* all_config, char* disk, hotebook* widg gtk_list_store_clear(widget->liststore); } int flag_searhc = 0; - for (int i = 0; i < all_config->v_u_g_p.pfVectorTotal(&all_config->v_u_g_p); i++) { - config_u_g_p* _config = (config_u_g_p*)all_config->v_u_g_p.pfVectorGet(&all_config->v_u_g_p, i); + vector* vec_temp = NULL; + if (strcmp(str_fill, "usrquota")==0) { + vec_temp = &all_config->v_user; + } + else { + vec_temp = &all_config->v_group; + } + for (int i = 0; i < vec_temp->pfVectorTotal(vec_temp); i++) { + config_u_g_p* _config = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, i); if (strcmp(_config->type_arr, str_fill) == 0 && strstr(_config->UNIX_file, disk)) { GtkTreeIter iter; flag_searhc++; @@ -103,7 +117,7 @@ int fill_tree_view_user_group(config_all* all_config, char* disk, hotebook* widg char* deferring_size = wrapper_str_time(_config->deferring_size); char* deferring_file = wrapper_str_time(_config->deferring_file); gtk_list_store_set(widget->liststore,&iter, - 0,_config->actors, + 0,format_actors(&_config->actors), 1,_config->quota, 2,_config->size_memory, 3,philos_format_cfg_str_size_memory("", _config->soft_restriction_size,_config->soft_restriction_size_pow), @@ -141,20 +155,27 @@ void entry_groups_disk() { } void entry_project_disk() { - char* activ_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(cfg_custom_gui.group.comboBox)); - activ_text= yon_char_divide_search(activ_text, " ", -1); - int find = fill_tree_view_project(all_config, activ_text, &cfg_custom_gui.project,"prjquota", 0); + int find = fill_tree_view_project(all_config, &cfg_custom_gui.project,"prjquota", 0); if (find == 0) { g_object_ref(cfg_custom_gui.project.liststore); gtk_list_store_clear(cfg_custom_gui.project.liststore); } } +void tree_view_select_user(GtkWidget* self) { + tree_view_select(NULL,&all_config->v_user , &cfg_custom_gui.user); +} +void tree_view_select_group(GtkWidget* sel) { + tree_view_select(NULL,&all_config->v_group ,&cfg_custom_gui.group); +} +void tree_view_select_project(GtkWidget* self) { + tree_view_select(NULL,&all_config->v_project , &cfg_custom_gui.project); +} - -void tree_view_select(GtkWidget* self, hotebook* widgets) { - tree_view_edit(all_config, widgets); +void tree_view_select(GtkWidget* self, vector* vec_temp, hotebook* widgets) { + if (self) {} + tree_view_edit(all_config, vec_temp, widgets); GtkTreeIter iter; GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore); GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->tree_view)); @@ -233,12 +254,14 @@ void load_system_cfg() { all_config->flag_load = 0; load_template_load_cfg(all_config, CMD_LOAD_SYSTEM); yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL, BACKGROUND_IMAGE_SUCCESS_TYPE); + entry_project_disk(); } void load_global_cfg() { all_config->flag_load = 1; load_template_load_cfg(all_config, CMD_LOAD_GLOBAL); yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + entry_project_disk(); } void control_event(main_window* _config_main_gui, custom_window* _config_custom_gui) { @@ -252,18 +275,17 @@ void control_event(main_window* _config_main_gui, custom_window* _config_custom_ g_signal_connect(G_OBJECT(_config_custom_gui->group.btnAdd),"clicked",G_CALLBACK(wrapper_add_group_show), glade_path); g_signal_connect(G_OBJECT(_config_custom_gui->group.btnEdit),"clicked",G_CALLBACK(wrapper_edit_group_show), glade_path); g_signal_connect(G_OBJECT(_config_custom_gui->project.btnAdd),"clicked",G_CALLBACK(wrapper_add_project_show), glade_path); - g_signal_connect(G_OBJECT(_config_custom_gui->user.btnEdit),"clicked",G_CALLBACK(wrapper_edit_project_show), glade_path); + g_signal_connect(G_OBJECT(_config_custom_gui->project.btnEdit),"clicked",G_CALLBACK(wrapper_edit_project_show), glade_path); g_signal_connect(G_OBJECT(_config_custom_gui->user.btnFilter),"clicked",G_CALLBACK(wrapper_filters_user_show), glade_path); g_signal_connect(G_OBJECT(_config_custom_gui->group.btnFilter),"clicked",G_CALLBACK(wrapper_filters_group_show), glade_path); g_signal_connect(G_OBJECT(_config_custom_gui->project.btnFilter),"clicked",G_CALLBACK(wrapper_filters_project_show), glade_path); g_signal_connect(G_OBJECT(_config_custom_gui->user.comboBox),"changed",G_CALLBACK(entry_user_disk), NULL); g_signal_connect(G_OBJECT(_config_custom_gui->group.comboBox),"changed",G_CALLBACK(entry_groups_disk), NULL); - g_signal_connect(G_OBJECT(_config_custom_gui->project.comboBox),"changed",G_CALLBACK(entry_project_disk), NULL); - g_signal_connect(G_OBJECT(_config_custom_gui->user.tree_view), "cursor-changed", G_CALLBACK(tree_view_select), &_config_custom_gui->user); - g_signal_connect(G_OBJECT(_config_custom_gui->group.tree_view), "cursor-changed", G_CALLBACK(tree_view_select), &_config_custom_gui->group); - g_signal_connect(G_OBJECT(_config_custom_gui->project.tree_view), "cursor-changed", G_CALLBACK(tree_view_select), &_config_custom_gui->project); + g_signal_connect(G_OBJECT(_config_custom_gui->user.tree_view), "cursor-changed", G_CALLBACK(tree_view_select_user), NULL); + g_signal_connect(G_OBJECT(_config_custom_gui->group.tree_view), "cursor-changed", G_CALLBACK(tree_view_select_group), NULL); + g_signal_connect(G_OBJECT(_config_custom_gui->project.tree_view), "cursor-changed", G_CALLBACK(tree_view_select_project), NULL); } /* diff --git a/source/controler.h b/source/controler.h index 36f8ef0..875827b 100644 --- a/source/controler.h +++ b/source/controler.h @@ -12,7 +12,7 @@ void wrapper_all_save(); void wrapper_global_save(); void wrapper_system_save(); int fill_tree_view_user_group(config_all* all_config, char* disk, hotebook* widget,char* str_fill , int flag_gui_add); -int fill_tree_view_project(config_all* all_config, char* disk, hotebook* widget, char* str_fill , int flag_gui_add); +int fill_tree_view_project(config_all* all_config, hotebook* widget, char* str_fill , int flag_gui_add); void entry_user_disk(); void entry_groups_disk(); void entry_project_disk(); @@ -25,5 +25,5 @@ void wrapper_edit_project_show(); void wrapper_filters_user_show(); void wrapper_filters_group_show(); void wrapper_filters_project_show(); -void tree_view_select(GtkWidget* self, hotebook* widgets); +void tree_view_select(GtkWidget* self, vector* vec_temp, hotebook* widgets); diff --git a/source/model/load.c b/source/model/load.c index c019f7c..24033c2 100644 --- a/source/model/load.c +++ b/source/model/load.c @@ -6,8 +6,12 @@ void load_template_load_cfg(config_all* _all_config, char* cmd) { char** cfg = yon_config_load(cmd, &size); philos_array_string_remove_char(&cfg, "\n", size); int size_loaded_keys = 0; - load_free_vector(_all_config); - vector_init(&_all_config->v_u_g_p); + load_free_vector(_all_config, &_all_config->v_user); + load_free_vector(_all_config, &_all_config->v_group); + load_free_vector(_all_config, &_all_config->v_project); + vector_init(&_all_config->v_user); + vector_init(&_all_config->v_group); + vector_init(&_all_config->v_project); vector_init(&_all_config->v_disk_status); for (int index = 0; index < size; index++) { char* str_key_value = yon_char_new(cfg[index]); @@ -26,7 +30,16 @@ void load_template_load_cfg(config_all* _all_config, char* cmd) { _config->loaded_keys = yon_char_new(str_key); load_pars_keys(_config, yon_char_new(str_key), index); load_pars_values(_config, yon_char_new(str_value), index); - _all_config->v_u_g_p.pfVectorAdd(&_all_config->v_u_g_p,_config); + + if (strstr(str_key, "prjquota")) { + _all_config->v_project.pfVectorAdd(&_all_config->v_project,_config); + } + else if (strstr(str_key, "usrquota")) { + _all_config->v_user.pfVectorAdd(&_all_config->v_user,_config); + } + else if (strstr(str_key, "grpquota")){ + _all_config->v_group.pfVectorAdd(&_all_config->v_group,_config); + } } } @@ -54,9 +67,8 @@ void load_pars_keys_u_g(config_u_g_p* _config, char* str_key, int index) { int size_comma = 0; char** arr_user = philos_str_split(arr_keys[size_point-1], &size_comma, ","); _config->UNIX_file = yon_char_new(arr_keys[1]); - for (int i = 1; i < size_comma; i++) { - _config->actors = yon_char_new(arr_user[i]); + _config->actors.pfVectorAdd(&_config->actors,yon_char_new(arr_user[i])); } } else { @@ -88,7 +100,7 @@ void load_pars_keys_p(config_u_g_p* _config, char* str_key, int index) { else { _config->id = atoi(arr_user[0]); } - _config->actors = yon_char_new(arr_keys[size_comma-1]); + _config->actors.pfVectorAdd(&_config->actors,yon_char_new(arr_keys[size_comma-1])); } else { if (strstr(str_key, "AUTO")) { @@ -151,9 +163,14 @@ void load_pars_values(config_u_g_p* _config, char* str_value, int index) { } } -void load_free_vector(config_all* _all_config) { +void load_free_vector(config_all* _all_config, vector* vec_config) { + if (_all_config->flag_not_data == 1) { - _all_config->v_u_g_p.pfVectorFree(&_all_config->v_u_g_p); + for (int i = 0; i < vec_config->pfVectorTotal(vec_config); i++) { + config_u_g_p* _config = (config_u_g_p*)vec_config->pfVectorGet(vec_config, i); + model_clear_cfg(_config); + } + vec_config->pfVectorFree(vec_config); } } @@ -172,4 +189,5 @@ char* wrapper_str_time(size_t seconds) { } return t.str_time; -} \ No newline at end of file +} + diff --git a/source/model/load.h b/source/model/load.h index 3124754..cf9abd8 100644 --- a/source/model/load.h +++ b/source/model/load.h @@ -9,7 +9,7 @@ void load_pars_keys(config_u_g_p* _config, char* str_key, int index); void load_pars_keys_u_g(config_u_g_p* _config, char* str_key, int index); void load_pars_keys_p(config_u_g_p* _config, char* str_key, int index); void load_pars_values(config_u_g_p* _config, char* str_value, int index); -void load_free_vector(config_all* _all_config); +void load_free_vector(config_all* _all_config,vector* vec_config); void load_pars_values_status(disk_status* _config, char* key, char* value); char* wrapper_str_time(size_t seconds); diff --git a/source/model/model.c b/source/model/model.c index fdd7663..4872d9b 100644 --- a/source/model/model.c +++ b/source/model/model.c @@ -7,7 +7,7 @@ void model_clear_cfg(config_u_g_p* _config) { free(_config->device); free(_config->UNIX_file); free(_config->files); - free(_config->actors); + vectorFree(&_config->actors); free(_config->loaded_keys); } @@ -22,7 +22,6 @@ void model_null_str_writing(config_u_g_p* _config) { _config->device = yon_char_new(empty_str); _config->UNIX_file = yon_char_new(empty_str); _config->files = yon_char_new(empty_str); - _config->actors = yon_char_new(empty_str); _config->loaded_keys = yon_char_new(empty_str); _config->type_arr = yon_char_new(empty_str); _config->id = -3; @@ -38,6 +37,27 @@ void model_null_str_writing(config_u_g_p* _config) { _config->soft_restriction_file_pow = -3; _config->severe_limitation_size_pow = -3; _config->severe_limitation_file_pow = -3; + vector_init(&_config->actors); } - +char* format_actors(vector* vec_actors) { + char* str_all = yon_char_new(""); + char split_simvol[2] = {0}; + split_simvol[0] = 0; + split_simvol[1] = 0; + char* str_actors = NULL; + for (int i = 0; i < vec_actors->pfVectorTotal(vec_actors); i++) { + str_actors = (char*)vec_actors->pfVectorGet(vec_actors, i); + if (str_actors) { + str_actors = yon_char_unite(str_all,split_simvol, str_actors, NULL); + split_simvol[0] = ','; + split_simvol[1] = '\0'; + free(str_actors); + } + + } + if (strlen(str_all) < 5) { + return yon_char_new("-"); + } + return str_all; +} diff --git a/source/model/model.h b/source/model/model.h index f2e7f90..9c64926 100644 --- a/source/model/model.h +++ b/source/model/model.h @@ -11,7 +11,8 @@ typedef struct{ char* size_memory; char* UNIX_file; char* files; - char* actors; + vector actors; + size_t actors_size; char* loaded_keys; int status_set; @@ -39,7 +40,9 @@ typedef struct{ typedef struct { vector v_general; - vector v_u_g_p; + vector v_user; + vector v_group; + vector v_project; vector v_disk_status; int flag_set_data; int flag_save; @@ -64,5 +67,6 @@ typedef struct{ void model_null_str_writing(config_u_g_p* _config); void model_clear_cfg(config_u_g_p* _config); void model_array_size_memory(); +char* format_actors(vector* vec_actors); #endif \ No newline at end of file diff --git a/source/model/philos_utils.c b/source/model/philos_utils.c index 65d80ac..3d5e9ab 100644 --- a/source/model/philos_utils.c +++ b/source/model/philos_utils.c @@ -132,7 +132,7 @@ void philos_free_int_array_n2(int ***array, int size) { } } -config_str philos_list_group(int* size) { +config_str philos_list_user(int* size) { char* str_uid_min = "UID_MIN"; char* str_uid_max = "UID_MAX"; unsigned short uid_min = philos_read_uid_min_max(file_source_login_min_max, str_uid_min); @@ -200,7 +200,7 @@ unsigned short philos_read_uid_min_max(char* filename, char* search) { } -config_str philos_list_user(int* size) { +config_str philos_list_group(int* size) { char* str_uid_min = "UID_MIN"; char* str_uid_max = "UID_MAX"; unsigned short uid_min = philos_read_uid_min_max(file_source_login_min_max, str_uid_min); @@ -523,28 +523,14 @@ void philos_set_spin_adjustment(GtkWidget *check, GtkWidget *spin, GtkWidget *co } } } -void philos_set_active_widgets(GtkWidget *check, GtkWidget *spin, GtkWidget *combo, int flag_cpu, char* cmd) { +void philos_set_active_widgets(GtkWidget *check, GtkWidget *spin, GtkWidget *combo) { gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check)); size_t value_spin = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin)); gtk_widget_set_sensitive(spin, active); - gtk_widget_set_sensitive(combo, active); - size_t resurs = get_resurs_total(cmd); - if (value_spin>0) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),1); - } - else if (active == 0) { - gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), 0); - } - if (flag_cpu == 0) { - philos_set_spin_adjustment(check, spin, combo, resurs); - if (value_spin>resurs) { - gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), resurs); - } - } - else { - philos_set_spin_adjustment(check, spin, NULL, resurs); - } - + if (combo) { + gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); + gtk_widget_set_sensitive(combo, active); + } } size_t get_resurs_total(char* cmd) { @@ -864,3 +850,5 @@ char* fill_tree_view_id(int id) { } } + + diff --git a/source/model/philos_utils.h b/source/model/philos_utils.h index bbad406..b4bb35b 100644 --- a/source/model/philos_utils.h +++ b/source/model/philos_utils.h @@ -69,7 +69,8 @@ typedef struct { GtkWidget* quotegroupFilesSoftLimitSpin; GtkWidget* quotegroupFilesHardLimitCheck; GtkWidget* quotegroupFilesHardLimitSpin; - + GtkWidget* lblSetNameDevice; + GtkWidget* boxProjectAddEditboxProjectId; } temp_set_window; @@ -131,7 +132,7 @@ int** remove_element_int_array_n3(int** array, int* size, int item_to_delete); char* philos_get_size_bite(GtkWidget* chk_button, GtkWidget* spin, GtkWidget* combo_box_text); void philos_fill_combo_box_text(GtkWidget *cbt, config_str list_data, int size); void philos_set_spin_adjustment(GtkWidget *check, GtkWidget *spin, GtkWidget *combo, size_t value); -void philos_set_active_widgets(GtkWidget *check, GtkWidget *spin, GtkWidget *combo, int flag_cpu, char* cmd); +void philos_set_active_widgets(GtkWidget *check, GtkWidget *spin, GtkWidget *combo); size_t get_resurs_total(char* cmd); float get_size_pow_memory(size_t size_memory, int size); void philos_set_active_widgets_device_io(GtkWidget* combo_to_l2,GtkWidget *check, GtkWidget *spin, GtkWidget *combo); diff --git a/source/model/save.c b/source/model/save.c index e7fea9c..c51a1e8 100644 --- a/source/model/save.c +++ b/source/model/save.c @@ -2,7 +2,7 @@ #define SAVE_H #include "save.h" - +/* char* template_format_save(config_all* _all_config, char* source_set_cmd) { char* cmd = yon_char_new(""); for (int i = 0; i < _all_config->v_u_g_p.pfVectorTotal(&_all_config->v_u_g_p); i++) { @@ -123,17 +123,17 @@ char* save_str_users(config_u_g_p* config, int index) { split_simvol[0] = 0; split_simvol[1] = 0; if (strstr(config->type_arr, "prjquota")) { - for (int i=0; config->actors[i]; i++) { - cmd = yon_char_unite(":", split_simvol, config->actors[i], NULL); - split_simvol[0] = ','; - split_simvol[1] = '\0'; - } + //for (int i=0; config->actors[i]; i++) { + // cmd = yon_char_unite(":", split_simvol, config->actors[i], NULL); + // split_simvol[0] = ','; + // split_simvol[1] = '\0'; + //} } else { } } -/* + char* save_format_status_cmd(config_u_g_p* config, int index) { if (config->status_set == 1) { return NULL; @@ -146,7 +146,7 @@ char* save_format_status_cmd(config_u_g_p* config, int index) { } return yon_char_new("disable"); } -*/ + int save_check_save(config_all* _all_config) { if (_all_config->flag_set_data == 1 || _all_config->flag_save>0) { return 0; @@ -169,5 +169,5 @@ void save_remove_array(config_all* _all_config) { } } } - +*/ #endif \ No newline at end of file diff --git a/source/model/ubl-utils.c b/source/model/ubl-utils.c index 4c80139..51da14f 100644 --- a/source/model/ubl-utils.c +++ b/source/model/ubl-utils.c @@ -1750,7 +1750,7 @@ void yon_ubl_browser_window_open(char *link, char *browser_window_name){ if (!user) user=getlogin(); char *command=yon_char_unite("sudo -u ",user," xdg-open ", link,NULL); - yon_launch_app(command); + yon_launch(command); } #endif diff --git a/source/model/vector.h b/source/model/vector.h index 148d6a8..c46696c 100644 --- a/source/model/vector.h +++ b/source/model/vector.h @@ -3,7 +3,7 @@ // https://aticleworld.com/implement-vector-in-c/ -#define VECTOR_INIT_CAPACITY 6 +#define VECTOR_INIT_CAPACITY 7 #define UNDEFINE -1 #define SUCCESS 0 //Store and track the stored data @@ -27,4 +27,11 @@ struct sVector int (*pfVectorDelete)(vector *, int); int (*pfVectorFree)(vector *); }; -void vector_init(vector *v); \ No newline at end of file +void vector_init(vector *v); +int vectorFree(vector *v); +int vectorDelete(vector *v, int index); +void *vectorGet(vector *v, int index); +int vectorSet(vector *v, int index, void *item); +int vectorPushBack(vector *v, void *item); +int vectorResize(vector *v, int capacity); +int vectorTotal(vector *v); \ No newline at end of file diff --git a/source/ubl-settings-diskquota.c b/source/ubl-settings-diskquota.c index 8e78d6d..d964774 100644 --- a/source/ubl-settings-diskquota.c +++ b/source/ubl-settings-diskquota.c @@ -187,10 +187,10 @@ main_window *setup_window(main_window* widgets, custom_window* custom_widgets){ gtk_widget_show(widgets->Window); return widgets; } -int tree_view_edit(config_all* _all_config, hotebook* widgets) { +int tree_view_edit(config_all* _all_config, vector* vec_temp, hotebook* widgets) { int index = wrapper_select_tree_view(widgets); if (index < 0) { - config_u_g_p* _config = (config_u_g_p*)_all_config->v_u_g_p.pfVectorGet(&_all_config->v_u_g_p, index); + config_u_g_p* _config = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, index); set_time_spin(widgets,_config->deferring_file, _config->deferring_size); } } @@ -198,10 +198,8 @@ int tree_view_edit(config_all* _all_config, hotebook* widgets) { custom_window *setup_window_custom(custom_window* custom_widgets, GtkBuilder *builder) { custom_widgets->user.comboBox = yon_gtk_builder_get_widget(builder,"usersDeviceCombo"); custom_widgets->group.comboBox = yon_gtk_builder_get_widget(builder,"groupsDeviceCombo"); - custom_widgets->project.comboBox = yon_gtk_builder_get_widget(builder,"ProjectDeviceCombo"); device_fill_disk(custom_widgets->user.comboBox); device_fill_disk(custom_widgets->group.comboBox); - device_fill_disk(custom_widgets->project.comboBox); custom_widgets->user.btnAdd = yon_gtk_builder_get_widget(builder,"btnAddUsers"); custom_widgets->user.btnEdit = yon_gtk_builder_get_widget(builder,"btnEditUsers"); custom_widgets->user.btnDel = yon_gtk_builder_get_widget(builder,"btnDelUsers"); diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 7051757..27cf8e4 100755 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -124,6 +124,6 @@ custom_window *setup_window_custom(custom_window* custom_widgets, GtkBuilder *bu void on_link(GtkWidget *self, char* uri, gpointer user_data); void config_init(config_settings_gui* main_config); int wrapper_select_tree_view(hotebook* widgets); -int tree_view_edit(config_all* _all_config, hotebook* widgets); +int tree_view_edit(config_all* _all_config, vector* vec_temp, hotebook* widgets); void set_time_spin(hotebook* widgets, size_t seconds_file, size_t seconds_size); #endif diff --git a/source/view_check_user_table.c b/source/view_check_user_table.c index 0709681..95d8b2a 100644 --- a/source/view_check_user_table.c +++ b/source/view_check_user_table.c @@ -15,12 +15,12 @@ table_u_g *setup_table_u_g(){ table_widgets->liststoreUsersGroups = GTK_LIST_STORE(gtk_builder_get_object(builder, "liststoreUsersGroups")); int size = 0; if (strcmp(flag_u_g, "group")==0) { - char** array_user = philos_list_group(&size); - table_u_g_fill_tree_view(array_user, size); + char** array_groups = philos_list_group(&size); + table_u_g_fill_tree_view(array_groups, size); } else if (strcmp(flag_u_g, "user") == 0) { - char** array_groups = philos_list_user(&size); - table_u_g_fill_tree_view(array_groups, size); + char** array_user = philos_list_user(&size); + table_u_g_fill_tree_view(array_user, size); } table_u_g_event(); } diff --git a/source/view_check_user_table.h b/source/view_check_user_table.h index 245f48d..9b80fd4 100644 --- a/source/view_check_user_table.h +++ b/source/view_check_user_table.h @@ -29,4 +29,5 @@ void table_u_g_event(); void table_u_g_fill_tree_view(char** array, int size); void table_u_g_set_flag(char* _flag_u_g); void table_u_g_set_glade_path(char* _glade_path); -void table_u_g_show(GtkWidget *self, char* glade_path); \ No newline at end of file +void table_u_g_show(GtkWidget *self, char* glade_path); +void set_vector(vector* _vec_temp); \ No newline at end of file diff --git a/source/view_temp_u_g_p.c b/source/view_temp_u_g_p.c index 65e20e5..f40f828 100644 --- a/source/view_temp_u_g_p.c +++ b/source/view_temp_u_g_p.c @@ -1,15 +1,20 @@ #include "view_temp_u_g_p.h" temp_set_window *temp_widgets = NULL; -char* path_project = NULL; char* flag_temp_u_g_p; char* set_add_edit; char* _glade_path = NULL; +vector* vec_temp = NULL; + temp_set_window *get_widget_temp() { return temp_widgets; } +void set_vector(vector* _vec_temp) { + vec_temp = _vec_temp; +} + temp_set_window *temp_setup_window_base(char* __glade_path) { _glade_path = __glade_path; if (temp_widgets == NULL) { @@ -19,9 +24,9 @@ temp_set_window *temp_setup_window_base(char* __glade_path) { temp_widgets->btnSaveTempSave = yon_gtk_builder_get_widget(builder,"quotegroupSaveButton"); temp_widgets->btnTempCancel = yon_gtk_builder_get_widget(builder,"quotegroupCancelButton"); temp_setup_window_custom(temp_widgets, builder); - temp_event(temp_widgets); temp_init_windows(); temp_localization(temp_widgets); + temp_event(temp_widgets); } return temp_widgets; } @@ -37,6 +42,7 @@ temp_set_window *temp_setup_window_custom(temp_set_window* temp_widgets, GtkBuil temp_widgets->entryProjectName = yon_gtk_builder_get_widget(builder, "entryProjectName"); temp_widgets->boxProjectAddEdit = yon_gtk_builder_get_widget(builder, "boxProjectAddEdit"); temp_widgets->boxProject = yon_gtk_builder_get_widget(builder, "boxProject"); + temp_widgets->boxProjectAddEditboxProjectId = yon_gtk_builder_get_widget(builder, "boxProjectAddEditboxProjectId"); temp_widgets->lblOpenUserGroup = yon_gtk_builder_get_widget(builder, "lblOpenUserGroup"); temp_widgets->lblHeadQuotasEditWindow = yon_gtk_builder_get_widget(builder, "lblHeadQuotasEditWindow"); @@ -50,13 +56,17 @@ temp_set_window *temp_setup_window_custom(temp_set_window* temp_widgets, GtkBuil temp_widgets->quotegroupFilesSoftLimitSpin = yon_gtk_builder_get_widget(builder, "quotegroupFilesSoftLimitSpin"); temp_widgets->quotegroupFilesHardLimitCheck = yon_gtk_builder_get_widget(builder, "quotegroupFilesHardLimitCheck"); temp_widgets->quotegroupFilesHardLimitSpin = yon_gtk_builder_get_widget(builder, "quotegroupFilesHardLimitSpin"); - + temp_widgets->entryProjectId = yon_gtk_builder_get_widget(builder, "entryProjectId"); temp_widgets->lblSetNameDevice = yon_gtk_builder_get_widget(builder, "lblSetNameDevice"); + temp_widgets->lblCatalogProjectEdit = yon_gtk_builder_get_widget(builder, "lblCatalogProjectEdit"); + temp_widgets->lblProjectIdValueEdit = yon_gtk_builder_get_widget(builder, "lblProjectIdValueEdit"); table_u_g_set_flag(flag_temp_u_g_p); table_u_g_set_glade_path(_glade_path); if (strcmp(flag_temp_u_g_p,"project")==0) { + gtk_widget_hide(temp_widgets->lblSetUGP); + gtk_widget_hide(temp_widgets->lblSetUGPData); + gtk_widget_hide(temp_widgets->btnOpenUserGroup); if (strcmp(set_add_edit, "add")==0) { - gtk_widget_hide(temp_widgets->btnOpenUserGroup); gtk_widget_hide(temp_widgets->lblCatalogProjectEdit); gtk_widget_hide(temp_widgets->lblProjectIdValueEdit); gtk_label_set_label(GTK_LABEL(temp_widgets->lblHeadQuotasEditWindow), _("Settings disk quotas - Addition")); @@ -71,6 +81,7 @@ temp_set_window *temp_setup_window_custom(temp_set_window* temp_widgets, GtkBuil } } else { + gtk_widget_hide(temp_widgets->boxProjectAddEditboxProjectId); if (strcmp(flag_temp_u_g_p, "user")==0) { gtk_label_set_label(GTK_LABEL(temp_widgets->lblOpenUserGroup), _("Users")); } @@ -105,10 +116,12 @@ void temp_show(GtkWidget *self, char* _glade_path) { if (temp_widgets != NULL) { gtk_widget_show(temp_widgets->Window); temp_init_windows(); + event_toggled_all(); } else { temp_setup_window_base(_glade_path); gtk_widget_show(temp_widgets->Window); + event_toggled_all(); } } @@ -122,6 +135,14 @@ void temp_init_windows() { void temp_event(temp_set_window* temp_widgets) { g_signal_connect(G_OBJECT(temp_widgets->btnTempCancel),"clicked",G_CALLBACK(temp_on_destroy_subwindow),NULL); g_signal_connect(G_OBJECT(temp_widgets->Window), "destroy", G_CALLBACK(temp_destroy), NULL); + g_signal_connect(G_OBJECT(temp_widgets->quotegroupSizeSoftLimitCheck), "toggled", G_CALLBACK(event_toggled_all), NULL); + g_signal_connect(G_OBJECT(temp_widgets->quotegroupSizeHardLimitCheck), "toggled", G_CALLBACK(event_toggled_all), NULL); + g_signal_connect(G_OBJECT(temp_widgets->quotegroupFilesSoftLimitCheck), "toggled", G_CALLBACK(event_toggled_all), NULL); + g_signal_connect(G_OBJECT(temp_widgets->quotegroupFilesHardLimitCheck), "toggled", G_CALLBACK(event_toggled_all), NULL); + g_signal_connect(G_OBJECT(temp_widgets->btnSaveTempSave),"clicked",G_CALLBACK(temp_on_destroy_subwindow),NULL); + + + if (strcmp(flag_temp_u_g_p,"project")==0) { g_signal_connect(G_OBJECT(temp_widgets->btnOpenUserGroup),"clicked",G_CALLBACK(wrapper_show_file_manager),NULL); } @@ -130,6 +151,22 @@ void temp_event(temp_set_window* temp_widgets) { } } +void event_toggled_all() { + philos_set_active_widgets(temp_widgets->quotegroupSizeSoftLimitCheck, + temp_widgets->quotegroupSizeSoftLimitSpin, + temp_widgets->quotegroupSizeSoftLimitCombo); + philos_set_active_widgets(temp_widgets->quotegroupSizeHardLimitCheck, + temp_widgets->quotegroupSizeHardLimitSpin, + temp_widgets->quotegroupSizeHardLimitCombo + ); + philos_set_active_widgets(temp_widgets->quotegroupFilesSoftLimitCheck, + temp_widgets->quotegroupFilesSoftLimitSpin, + NULL + ); + philos_set_active_widgets(temp_widgets->quotegroupFilesHardLimitCheck, + temp_widgets->quotegroupFilesHardLimitSpin, + NULL); +} void wrapper_show_file_manager() { GtkBuilder *builder = gtk_builder_new_from_resource(_glade_path); @@ -165,14 +202,15 @@ void destroy_file_manager(GtkWidget *self) { } void btn_ok_file_manager(GtkWidget *self) { - path_project = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(temp_widgets->wndChooseFileWallpaper)); + char* path_project = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(temp_widgets->wndChooseFileWallpaper)); + gtk_entry_set_text(GTK_ENTRY(temp_widgets->entryCatalogProject), path_project); destroy_file_manager(self); } void set_edit_gui_data_base(config_all* all_config, int index) { - config_u_g_p* _config = (config_u_g_p*)all_config->v_u_g_p.pfVectorGet(&all_config->v_u_g_p, index); + config_u_g_p* _config = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, index); if (_config && index >= 0) { set_widget(temp_widgets->quotegroupSizeSoftLimitCheck, temp_widgets->quotegroupSizeSoftLimitSpin, @@ -198,8 +236,20 @@ void set_edit_gui_data_base(config_all* all_config, int index) { _config->severe_limitation_file, 0 ); + if (strcmp(flag_temp_u_g_p,"project") == 0) { + if (strcmp(set_add_edit, "add")==0) { + } + else { + gtk_entry_set_text(GTK_ENTRY(temp_widgets->entryProjectId), fill_tree_view_id(_config->id)); + gtk_label_set_label(GTK_LABEL(temp_widgets->lblCatalogProjectEdit), _config->UNIX_file); + gtk_label_set_label(GTK_LABEL(temp_widgets->lblProjectIdValueEdit), format_actors(&_config->actors)); + } + } + else { } + + } } void set_time_spin(hotebook* widgets, size_t seconds_file, size_t seconds_size) { me_time t_file = time_convert(seconds_file); @@ -244,20 +294,76 @@ void set_widget(GtkWidget* check, GtkWidget* spin, GtkWidget* combo, int value_s gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); } } + } void get_edit_gui_data_base(config_all* all_config, int index) { - config_u_g_p* _config = (config_u_g_p*)all_config->v_u_g_p.pfVectorGet(&all_config->v_u_g_p, index); + config_u_g_p* _config = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, index); if (_config && index >= 0) { - + _config = get_temp_gui_data_base(_config); + vec_temp->pfVectorSet(vec_temp, index, _config); } + +} +void get_add_gui_data_base(config_all* all_config) { + config_u_g_p* _config = malloc(sizeof(config_u_g_p)); + if (_config) { + _config = get_temp_gui_data_base(_config); + vec_temp->pfVectorAdd(vec_temp, _config); + } + +} - - +config_u_g_p* get_temp_gui_data_base(config_u_g_p* _config) { + set_widget_config(temp_widgets->quotegroupSizeSoftLimitCheck, + temp_widgets->quotegroupSizeSoftLimitSpin, + temp_widgets->quotegroupSizeSoftLimitCombo, + &_config->soft_restriction_size, + &_config->soft_restriction_size_pow + ); + set_widget_config(temp_widgets->quotegroupSizeHardLimitCheck, + temp_widgets->quotegroupSizeHardLimitSpin, + temp_widgets->quotegroupSizeHardLimitCombo, + &_config->severe_limitation_size, + &_config->severe_limitation_size_pow + ); + set_widget_config(temp_widgets->quotegroupFilesSoftLimitCheck, + temp_widgets->quotegroupFilesSoftLimitSpin, + NULL, + &_config->soft_restriction_file, + NULL + ); + set_widget_config(temp_widgets->quotegroupFilesHardLimitCheck, + temp_widgets->quotegroupFilesHardLimitSpin, + NULL, + &_config->severe_limitation_file, + NULL + ); if (strcmp(flag_temp_u_g_p,"project") == 0) { } else { } - all_config->pfVectorSet(_config, index); + return _config; } + +void set_widget_config(GtkWidget* check, GtkWidget* spin, GtkWidget* combo, size_t* value, int* mem_size) { + gboolean active = active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check)); + if (active) { + (*value) = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin)); + if (combo) { + if ((*value) != 0) { + (*mem_size) = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); + } + else { + (*mem_size) = -3; + } + } + } + else { + (*value) = 0; + if (combo) { + (*mem_size) = -3; + } + } +} \ No newline at end of file diff --git a/source/view_temp_u_g_p.h b/source/view_temp_u_g_p.h index 2fa5a27..41992a8 100644 --- a/source/view_temp_u_g_p.h +++ b/source/view_temp_u_g_p.h @@ -28,5 +28,10 @@ void destroy_file_manager(GtkWidget *self); void show_file_manger(temp_set_window* temp_widgets, GtkBuilder *builder); temp_set_window *temp_setup_window_custom(temp_set_window* temp_widgets, GtkBuilder *builder); void wrapper_show_file_manager(); +void event_toggled_all(); +void set_widget_config(GtkWidget* check, GtkWidget* spin, GtkWidget* combo, size_t* value, int* mem_size); void set_edit_gui_data_base(config_all* all_config, int index); +config_u_g_p* get_temp_gui_data_base(config_u_g_p* _config); +void get_add_gui_data_base(config_all* all_config); +void get_edit_gui_data_base(config_all* all_config, int index); void set_widget(GtkWidget* check, GtkWidget* spin, GtkWidget* combo, int value_spin, int pow_mem_size); \ No newline at end of file diff --git a/ubl-settings-diskquota b/ubl-settings-diskquota index c208470442c3b16ef5b52eac0a0fccfa50ec7366..9f728c4c9d1e9c9ee12f6536e17793735554f5dc 100755 GIT binary patch delta 119828 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