Merge pull request 'master' (#71) from YanTheKaller/libublsettingsui-gtk3:master into master

Reviewed-on: #71
pull/73/head v1.65
Dmitry Razumov 4 months ago
commit 21cc4b8d84

@ -12,6 +12,7 @@
<file>libublsettingsui-gtk3-service-control.glade</file> <file>libublsettingsui-gtk3-service-control.glade</file>
<file>libublsettingsui-gtk3-app-chooser.glade</file> <file>libublsettingsui-gtk3-app-chooser.glade</file>
<file>libublsettingsui-gtk3-password.glade</file> <file>libublsettingsui-gtk3-password.glade</file>
<file>libublsettingsui-gtk3-users-window.glade</file>
</gresource> </gresource>
<gresource prefix="/com/ublinux/css"> <gresource prefix="/com/ublinux/css">
<file>libublsettingsui-gtk3.css</file> <file>libublsettingsui-gtk3.css</file>

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface domain="ubl-settings-usergroups">
<requires lib="gtk+" version="3.24"/>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.libublsettingsui-gtk3.cancel-symbolic</property>
</object>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.libublsettingsui-gtk3.accept-symbolic</property>
</object>
<object class="GtkWindow" id="Window">
<property name="width-request">250</property>
<property name="height-request">385</property>
<property name="can-focus">False</property>
<property name="modal">True</property>
<property name="icon-name">com.ublinux.ubl-settings-usergroups</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox" id="StatusBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-left">5</property>
<property name="margin-right">5</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="margin-top">5</property>
<property name="margin-bottom">5</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkTreeView" id="UsersTree">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="search-column">2</property>
<property name="enable-grid-lines">vertical</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">Chosen</property>
<child>
<object class="GtkCellRendererToggle" id="StatusCell">
<property name="radio">True</property>
</object>
<attributes>
<attribute name="active">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">ID</property>
<property name="sort-indicator">True</property>
<property name="sort-column-id">2</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">2</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="GroupColumn">
<property name="title" translatable="yes">Group</property>
<property name="sort-order">descending</property>
<property name="sort-column-id">1</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child type="titlebar">
<object class="GtkHeaderBar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child type="title">
<object class="GtkLabel" id="HeaderLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Choose groups</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
<child>
<object class="GtkButton" id="CancelButton">
<property name="label" translatable="yes">Cancel</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image5</property>
<style>
<class name="button"/>
<class name="marginright"/>
</style>
</object>
</child>
<child>
<object class="GtkButton" id="AcceptButton">
<property name="label" translatable="yes">Ok</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image6</property>
<style>
<class name="button"/>
<class name="marginright"/>
</style>
</object>
<packing>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

@ -144,7 +144,7 @@ msgid "Cancel"
msgstr "" msgstr ""
#: source/libublsettingsui-gtk3.h:418 #: source/libublsettingsui-gtk3.h:418
msgid "Accept" msgid "Ok"
msgstr "" msgstr ""
#: source/libublsettingsui-gtk3.h:419 #: source/libublsettingsui-gtk3.h:419
@ -391,4 +391,7 @@ msgstr ""
#: source/libublsettingsui-gtk3.h:493 #: source/libublsettingsui-gtk3.h:493
msgid "The configuration file contains incorrect parameters." msgid "The configuration file contains incorrect parameters."
msgstr ""
msgid "Empty important field!"
msgstr "" msgstr ""

@ -146,7 +146,7 @@ msgid "Cancel"
msgstr "Отмена" msgstr "Отмена"
#: source/libublsettingsui-gtk3.h:418 #: source/libublsettingsui-gtk3.h:418
msgid "Accept" msgid "Ok"
msgstr "Принять" msgstr "Принять"
#: source/libublsettingsui-gtk3.h:419 #: source/libublsettingsui-gtk3.h:419
@ -397,4 +397,7 @@ msgid "Access to file denied"
msgstr "Отказано в доступе к файлу" msgstr "Отказано в доступе к файлу"
msgid "The configuration file contains incorrect parameters." msgid "The configuration file contains incorrect parameters."
msgstr "Файл конфигурации содержит некорректные параметры" msgstr "Файл конфигурации содержит некорректные параметры"
msgid "Empty important field!"
msgstr "Пустое важное поле!"

@ -48,6 +48,7 @@ set(DEPENDFILES
../libublsettingsui-gtk3-service-control.glade ../libublsettingsui-gtk3-service-control.glade
../libublsettingsui-gtk3-app-chooser.glade ../libublsettingsui-gtk3-app-chooser.glade
../libublsettingsui-gtk3-password.glade ../libublsettingsui-gtk3-password.glade
../libublsettingsui-gtk3-users-window.glade
../gresource.xml ../gresource.xml
../libublsettingsui-gtk3-banner.png ../libublsettingsui-gtk3-banner.png
../libublsettingsui-gtk3.css ../libublsettingsui-gtk3.css
@ -89,6 +90,7 @@ add_library(${PROJECT_NAME} SHARED
libublsettingsui-gtk3-app-chooser.c libublsettingsui-gtk3-app-chooser.c
libublsettingsui-gtk3-standard-callbacks.c libublsettingsui-gtk3-standard-callbacks.c
libublsettingsui-gtk3-password.c libublsettingsui-gtk3-password.c
libublsettingsui-gtk3-users-window.c
libublsettingsui-gtk3.h libublsettingsui-gtk3.h
${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C})

@ -508,23 +508,11 @@ struct loaded_config *yon_config_get_compared(char *command){
} }
char *yon_custom_config_init(GtkFileChooserAction type){ char *yon_custom_config_init(GtkFileChooserAction type){
filechooser_window *dialog = yon_file_chooser_window_new(type); filechooser_window *dialog = yon_config_file_chooser_window_new(type);
gtk_widget_hide(dialog->ChooseFolderCheck); gtk_widget_hide(dialog->ChooseFolderCheck);
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"); 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");
gtk_label_set_text(GTK_LABEL(dialog->HeaderTopic),template_app_information.app_title); gtk_label_set_text(GTK_LABEL(dialog->HeaderTopic),template_app_information.app_title);
GtkFileFilter *filter = gtk_file_filter_new();
gtk_file_filter_add_pattern(filter,"*.ini");
gtk_file_filter_set_name(filter, "*.ini");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter);
GtkFileFilter *filter_json = gtk_file_filter_new();
gtk_file_filter_add_pattern(filter_json,"*.json");
gtk_file_filter_set_name(filter_json, "*.json");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter_json);
GtkFileFilter *filter_yaml = gtk_file_filter_new();
gtk_file_filter_add_pattern(filter_yaml,"*.yaml");
gtk_file_filter_set_name(filter_yaml, "*.yaml");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter_yaml);
if (type==GTK_FILE_CHOOSER_ACTION_SAVE){ if (type==GTK_FILE_CHOOSER_ACTION_SAVE){
// yon_file_chooser_set_button_label(yon_char_get_localised_from_lib(LOAD_CONFIG_LABEL)); // yon_file_chooser_set_button_label(yon_char_get_localised_from_lib(LOAD_CONFIG_LABEL));

@ -0,0 +1,132 @@
#include "libublsettingsui-gtk3.h"
typedef struct {
GtkWidget *Window;
GtkWidget *StatusBox;
GtkWidget *UsersTree;
GtkListStore *list;
GtkWidget *CancelButton;
GtkWidget *AcceptButton;
GtkCellRenderer *StatusCell;
GtkTreeViewColumn *GroupColumn;
unsigned int selection_size;
config_str selection;
} yon_user_window;
gboolean on_user_window_closed(GtkWidget *, yon_user_window *){
gtk_main_quit();
return 0;
}
void on_group_clicked(GtkCellRenderer *, char *path, yon_user_window *window){
GtkTreeIter iter;
gboolean status;
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->list),&iter,path);
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&status,-1);
gtk_list_store_set(window->list,&iter,0,!status,-1);
if (gtk_cell_renderer_toggle_get_radio(GTK_CELL_RENDERER_TOGGLE(window->StatusCell))){
GtkTreeIter *prev = gtk_tree_iter_copy(&iter);
for (int valid = gtk_tree_model_iter_previous(GTK_TREE_MODEL(window->list),prev); valid; valid = gtk_tree_model_iter_previous(GTK_TREE_MODEL(window->list),prev)){
gtk_list_store_set(window->list,prev,0,0,-1);
}
gtk_tree_iter_free(prev);
GtkTreeIter *next = gtk_tree_iter_copy(&iter);
for (int valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),next); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),next)){
gtk_list_store_set(window->list,next,0,0,-1);
}
gtk_tree_iter_free(next);
}
}
void on_users_window_accept(GtkWidget *, yon_user_window *window){
GtkTreeModel *model;
GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->UsersTree)),&model);
GList *liter;
for (liter=list;liter;liter=liter->next){
GtkTreeIter iter;
gtk_tree_model_get_iter(model,&iter,(GtkTreePath*)liter->data);
int selected;
char *target;
int id;
gtk_tree_model_get(model,&iter,0,&selected,1,&target,2,&id,-1);
if (selected){
char *id_string = yon_char_from_int(id);
yon_char_parsed_add_or_create_if_exists(window->selection,&window->selection_size,target); //FIXME: IMPLEMENT USER AND GROUP SYSTEM AND SWITCH TARGET TO UID/GID
free(id_string);
}
}
on_subwindow_close(window->Window);
}
yon_user_window *yon_user_window_new(enum YON_USER_WINDOW_MODE_TYPE mode){
yon_user_window *window = malloc(sizeof(yon_user_window));
memset(window,0,sizeof(yon_user_window));
GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_userwindow);
window->Window=yon_gtk_builder_get_widget(builder,"Window");
window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox");
window->UsersTree=yon_gtk_builder_get_widget(builder,"UsersTree");
window->StatusCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"StatusCell"));
window->GroupColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"GroupColumn"));
window->CancelButton=yon_gtk_builder_get_widget(builder,"CancelButton");
window->AcceptButton=yon_gtk_builder_get_widget(builder,"AcceptButton");
window->list = gtk_list_store_new(3,G_TYPE_BOOLEAN,G_TYPE_STRING,G_TYPE_INT);
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(window->list),2,GTK_SORT_ASCENDING);
yon_gtk_window_setup(GTK_WINDOW(window->Window),NULL,NULL,NULL,"GroupWindow");
g_signal_connect(G_OBJECT(window->Window),"destroy",G_CALLBACK(on_user_window_closed),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_users_window_accept),window);
g_signal_connect(G_OBJECT(window->StatusCell),"toggled",G_CALLBACK(on_group_clicked),window);
GtkTreeIter iter;
switch (mode){
case YON_USER_WINDOW_USERS_MULTIPLE:
gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(window->StatusCell),0);
[[fallthrough]];
case YON_USER_WINDOW_USERS:{
int size;
config_str system_param = yon_file_open("/etc/passwd",&size);
for (int i=0;i<size;i++){
int parsed_size;
config_str parsed = yon_char_parse(system_param[i],&parsed_size,":");
if (parsed_size>2&&!yon_char_is_empty(parsed[2])){
gtk_list_store_append(window->list,&iter);
gtk_list_store_set(window->list,&iter,0,0,1,parsed[0],2,atoi(parsed[2]),-1);
}
}
} break;
case YON_USER_WINDOW_GROUPS_MULTIPLE:
gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(window->StatusCell),0);
[[fallthrough]];
case YON_USER_WINDOW_GROUPS:{
int size;
config_str system_param = yon_file_open("/etc/group",&size);
for (int i=0;i<size;i++){
int parsed_size;
config_str parsed = yon_char_parse(system_param[i],&parsed_size,":");
if (parsed_size>2&&!yon_char_is_empty(parsed[2])){
gtk_list_store_append(window->list,&iter);
gtk_list_store_set(window->list,&iter,0,0,1,parsed[0],2,atoi(parsed[2]),-1);
}
}
} break;
}
gtk_tree_view_set_model(GTK_TREE_VIEW(window->UsersTree),GTK_TREE_MODEL(window->list));
g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
return window;
}
config_str yon_users_window_select(enum YON_USER_WINDOW_MODE_TYPE mode, unsigned int *size){
(*size) = 0;
yon_user_window *window = yon_user_window_new(mode);
gtk_widget_show(window->Window);
gtk_main();
(*size) = window->selection_size;
config_str ret = window->selection;
free(window);
return ret;
}

@ -26,7 +26,7 @@
#define ui_glade_path_window "/com/ublinux/ui/libublsettingsui-gtk3-window.glade" #define ui_glade_path_window "/com/ublinux/ui/libublsettingsui-gtk3-window.glade"
#define ui_glade_path_userwindow "/com/ublinux/ui/libublsettingsui-gtk3-users-window.glade"
/**Путь до файла подтверждения открытия документации утилит ubl-settings-**/ /**Путь до файла подтверждения открытия документации утилит ubl-settings-**/
#define ui_glade_path_documentation "/com/ublinux/ui/libublsettingsui-gtk3-documentation.glade" #define ui_glade_path_documentation "/com/ublinux/ui/libublsettingsui-gtk3-documentation.glade"
@ -365,6 +365,15 @@ void yon_window_remove_exit_config_check(template_main_window *widgets);
void yon_window_set_exit_config_check(template_main_window *widgets, GCallback data_callback_function); void yon_window_set_exit_config_check(template_main_window *widgets, GCallback data_callback_function);
enum YON_USER_WINDOW_MODE_TYPE {
YON_USER_WINDOW_USERS,
YON_USER_WINDOW_USERS_MULTIPLE,
YON_USER_WINDOW_GROUPS,
YON_USER_WINDOW_GROUPS_MULTIPLE
};
config_str yon_users_window_select(enum YON_USER_WINDOW_MODE_TYPE mode, unsigned int *size);
typedef struct { typedef struct {
GtkWidget *Window; GtkWidget *Window;
GtkWidget *HeaderTopic; GtkWidget *HeaderTopic;
@ -614,7 +623,7 @@ yon_window *yon_window_new();
#define LOAD_CONFIG_LABEL _("Load file") #define LOAD_CONFIG_LABEL _("Load file")
#define CANCEL_LABEL _("Cancel") #define CANCEL_LABEL _("Cancel")
#define ACCEPT_LABEL _("Accept") #define ACCEPT_LABEL yon_char_get_localised_from_lib("Ok")
#define OPEN_LABEL _("Open") #define OPEN_LABEL _("Open")
#define CREATE_FOLDER_LABEL _("Create directory") #define CREATE_FOLDER_LABEL _("Create directory")
#define SELECT_FOLDER_LABEL _("Select directory") #define SELECT_FOLDER_LABEL _("Select directory")

Loading…
Cancel
Save