From 7e718d5fa838611889848575220c90dce81f2d26 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 29 Apr 2025 12:14:34 +0600 Subject: [PATCH] Sort changes --- source/ubl-settings-services.c | 49 +++++++++++++++++++++++++++++----- source/ubl-settings-services.h | 2 ++ ubl-settings-services.glade | 4 +++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/source/ubl-settings-services.c b/source/ubl-settings-services.c index 7453663..616535e 100644 --- a/source/ubl-settings-services.c +++ b/source/ubl-settings-services.c @@ -393,6 +393,38 @@ void on_system_autostart_clicked(GtkCellRenderer *, char *path, main_window *wid } +gboolean sort_bool(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,gpointer col){ + int val_a,val_b; + char *name_a="", *name_b=""; + gtk_tree_model_get(model,a,GPOINTER_TO_INT(col),&val_a,6,&name_a,-1); + gtk_tree_model_get(model,b,GPOINTER_TO_INT(col),&val_b,6,&name_b,-1); + if (val_a==val_b){ + gchar *key_a = g_utf8_collate_key(name_a, -1); + gchar *key_b = g_utf8_collate_key(name_b, -1); + gint result = strcmp(key_a, key_b); + g_free(key_a); + g_free(key_b); + + return result; + } + return val_a ? -1 : 1; +} + +gboolean sort_string(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,gpointer col){ + char *name_a="", *name_b=""; + gtk_tree_model_get(model,a,GPOINTER_TO_INT(col),&name_a,-1); + gtk_tree_model_get(model,b,GPOINTER_TO_INT(col),&name_b,-1); + if (!name_a) name_a=""; + if (!name_b) name_b=""; + gchar *key_a = g_utf8_collate_key(name_a, -1); + gchar *key_b = g_utf8_collate_key(name_b, -1); + gint result = strcmp(key_a, key_b); + g_free(key_a); + g_free(key_b); + + return result; +} + gboolean yon_filter(GtkTreeModel* model, GtkTreeIter *iter, main_window *widgets){ gboolean autostart,autostop,masked,type,loaded,active; char *name; @@ -1149,14 +1181,14 @@ gboolean yon_interface_list_models_connect(main_window *widgets){ gboolean yon_system_set(struct system_services_data *data){ GtkTreeIter iter; gtk_list_store_append(data->widgets->SystemList,&iter); - gtk_list_store_set(data->widgets->SystemList,&iter,3,data->SystemAutostart,4,data->SystemLaunched,5,data->Name,6,data->Descr,7,data->Type,8,data->Loaded,9,data->Active,11,data->State,-1); + gtk_list_store_set(data->widgets->SystemList,&iter,3,data->SystemAutostart,4,data->SystemLaunched,5,data->Name,6,data->Descr,7,data->Type,8,data->Loaded,9,data->Active,11,_(data->State),13,data->State,-1); return G_SOURCE_REMOVE; } gboolean yon_user_set(struct system_user_data *data){ GtkTreeIter iter; gtk_list_store_append(data->widgets->UserList,&iter); - gtk_list_store_set(data->widgets->UserList,&iter,3,data->SystemAutostart,4,data->SystemLaunched,5,data->Name,6,data->Descr,5,data->Name,6,data->Descr,7,data->Type,8,data->Loaded,9,data->Active,11,data->State,-1); + gtk_list_store_set(data->widgets->UserList,&iter,3,data->SystemAutostart,4,data->SystemLaunched,5,data->Name,6,data->Descr,5,data->Name,6,data->Descr,7,data->Type,8,data->Loaded,9,data->Active,11,_(data->State),13,data->State,-1); return G_SOURCE_REMOVE; } @@ -1366,7 +1398,7 @@ void* yon_interface_update(main_window *widgets){ int active = !strcmp(parsed[2],"active"); enum YON_UNIT_TYPE type = yon_get_unit_type(parsed[0]); gtk_list_store_append(widgets->SystemList,&iter); - gtk_list_store_set(widgets->SystemList,&iter,3,loaded,4,active,5,parsed[0],6,parsed[4],7,type,8,active,9,1,11,_(parsed[3]),-1); + gtk_list_store_set(widgets->SystemList,&iter,3,loaded,4,active,5,parsed[0],6,parsed[4],7,type,8,active,9,1,11,_(parsed[3]),13,parsed[3],-1); } } @@ -1376,7 +1408,7 @@ void* yon_interface_update(main_window *widgets){ GtkTreeIter iter; gtk_list_store_append(widgets->SystemList,&iter); enum YON_UNIT_TYPE type = yon_get_unit_type(system_units[i]); - gtk_list_store_set(widgets->SystemList,&iter,0,0,1,0,2,0,3,0,4,0,5,system_units[i],6,"",7,type,8,0,9,0,10,0,11,_("disabled"),-1); + gtk_list_store_set(widgets->SystemList,&iter,0,0,1,0,2,0,3,0,4,0,5,system_units[i],6,"",7,type,8,0,9,0,10,0,11,_("disabled"),13,"disabled",-1); } } @@ -1416,7 +1448,7 @@ void* yon_interface_update(main_window *widgets){ int active = !strcmp(parsed[2],"active"); enum YON_UNIT_TYPE type = yon_get_unit_type(parsed[0]); gtk_list_store_append(widgets->UserList,&iter); - gtk_list_store_set(widgets->UserList,&iter,3,loaded,4,active,5,parsed[0],6,parsed[4],7,type,8,active,9,1,11,_(parsed[3]),-1); + gtk_list_store_set(widgets->UserList,&iter,3,loaded,4,active,5,parsed[0],6,parsed[4],7,type,8,active,9,1,11,_(parsed[3]),13,parsed[3],-1); } } @@ -1426,7 +1458,7 @@ void* yon_interface_update(main_window *widgets){ GtkTreeIter iter; gtk_list_store_append(widgets->UserList,&iter); enum YON_UNIT_TYPE type = yon_get_unit_type(user_units[i]); - gtk_list_store_set(widgets->UserList,&iter,0,0,1,0,2,0,3,0,4,0,5,user_units[i],6,"",7,type,8,0,9,0,10,0,11,_("disabled"),-1); + gtk_list_store_set(widgets->UserList,&iter,0,0,1,0,2,0,3,0,4,0,5,user_units[i],6,"",7,type,8,0,9,0,10,0,11,_("disabled"),13,"disabled",-1); } } @@ -2042,6 +2074,11 @@ void yon_main_window_complete(main_window *widgets){ yon_root_button_setup((template_main_window*)widgets,main_config.launch_arguments,main_config.launch_size); gtk_tree_model_filter_set_visible_func(widgets->UserFilter,(GtkTreeModelFilterVisibleFunc)yon_filter,widgets,NULL); gtk_tree_model_filter_set_visible_func(widgets->SystemFilter,(GtkTreeModelFilterVisibleFunc)yon_filter,widgets,NULL); + for (int i=0;i<5;i++){ + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(widgets->SystemSort),i,(GtkTreeIterCompareFunc)sort_bool,GINT_TO_POINTER(i),NULL); + } + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(widgets->SystemSort),5,(GtkTreeIterCompareFunc)sort_string,GINT_TO_POINTER(13),NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(widgets->SystemSort),6,(GtkTreeIterCompareFunc)sort_string,GINT_TO_POINTER(6),NULL); gtk_tree_view_set_search_column(GTK_TREE_VIEW(widgets->UserUnitsTree),5); yon_load_proceed(YON_CONFIG_LOCAL); yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); diff --git a/source/ubl-settings-services.h b/source/ubl-settings-services.h index 5ec7338..0aaeafb 100644 --- a/source/ubl-settings-services.h +++ b/source/ubl-settings-services.h @@ -544,4 +544,6 @@ gboolean yon_system_set(struct system_services_data *data); gboolean yon_interface_list_models_connect(main_window *widgets); gboolean yon_interface_list_models_disconnect(main_window *widgets); void on_sort_activate(GtkTreeViewColumn *self, main_window *widgets); +gboolean sort_bool(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,gpointer col); +gboolean sort_string(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,gpointer col); #endif \ No newline at end of file diff --git a/ubl-settings-services.glade b/ubl-settings-services.glade index 36282bc..c124c37 100644 --- a/ubl-settings-services.glade +++ b/ubl-settings-services.glade @@ -59,6 +59,8 @@ + + @@ -359,6 +361,8 @@ + +