master #71
Merged
asmeron
merged 4 commits from YanTheKaller/libublsettingsui-gtk3:master into master 4 months ago
@ -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>
|
||||||
@ -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;
|
||||||
|
}
|
||||||
Loading…
Reference in new issue