Log add window startup functions

pull/2/head
Ivan Yartsev 2 years ago
parent 6c33265383
commit 4db5fe1df1

@ -3,6 +3,7 @@
<gresource prefix="/com/ublinux/ui">
<file>ubl-settings-logging.glade</file>
<file>ubl-settings-logging-add.glade</file>
<file>ubl-settings-logging-add-path.glade</file>
<file>ubl-settings-logging-inspector.glade</file>
<file>ubl-settings-logging-logrotate.glade</file>
<file>ubl-settings-logging-journald.glade</file>

@ -37,6 +37,7 @@ add_custom_target(GLADE ubl-settings-logging.glade)
set(DEPENDFILES
../ubl-settings-logging.glade
../ubl-settings-logging-add.glade
../ubl-settings-logging-add-path.glade
../ubl-settings-logging-inspector.glade
../ubl-settings-logging-journald.glade
../ubl-settings-logging-logrotate.glade

@ -108,28 +108,6 @@ void yon_load_proceed(char *command){
}
add_log_window *on_add_open(){
add_log_window *window = malloc(sizeof(add_log_window));
GtkBuilder *builder = gtk_builder_new_from_resource(glade_add_path);
window->MainWindow=yon_gtk_builder_get_widget(builder,"MainWindow");
window->CancelButton=yon_gtk_builder_get_widget(builder,"CancelButton");
window->SaveButton=yon_gtk_builder_get_widget(builder,"SaveButton");
window->LogAddingBox=yon_gtk_builder_get_widget(builder,"LogAddingBox");
window->LogTypeCombo=yon_gtk_builder_get_widget(builder,"LogTypeCombo");
window->LogPathEntry=yon_gtk_builder_get_widget(builder,"LogPathEntry");
window->LogFindButton=yon_gtk_builder_get_widget(builder,"LogFindButton");
window->LogDescriptionEntry=yon_gtk_builder_get_widget(builder,"LogDescriptionEntry");
window->LogrotateButton=yon_gtk_builder_get_widget(builder,"LogrotateButton");
window->MetalogButton=yon_gtk_builder_get_widget(builder,"MetalogButton");
window->SyslogButton=yon_gtk_builder_get_widget(builder,"SyslogButton");
window->JournaldButton=yon_gtk_builder_get_widget(builder,"JournaldButton");
window->LogSizeLabel=yon_gtk_builder_get_widget(builder,"LogSizeLabel");
window->StatisticsFrame=yon_gtk_builder_get_widget(builder,"StatisticsFrame");
gtk_window_set_title(GTK_WINDOW(window->MainWindow),TITLE_LABEL);
g_signal_connect(G_OBJECT(window->CancelButton),"clicked", G_CALLBACK(on_close_subwindow),NULL);
return window;
}
void on_inspector_update(GtkWidget *self, inspector_window *window){
int size;
GtkTextIter titer,titerend;
@ -227,6 +205,8 @@ void on_log_choose(GtkWidget *self,add_log_window *window){
gtk_widget_destroy(dialog);
}
// Logrotate window
logrotate_configure_window *yon_logrotate_window_new(){
logrotate_configure_window *window = malloc(sizeof(logrotate_configure_window));
GtkBuilder *builder = gtk_builder_new_from_resource(glade_logrotate_path);
@ -343,6 +323,8 @@ void on_logrotate_tab_open(GtkWidget *self, main_window *widgets){
gtk_widget_show(window->Window);
}
// Journald window
void on_journald_open(GtkWidget *self, main_window *widgets){
journald_window *window = malloc(sizeof(journald_window));
GtkBuilder *builder = gtk_builder_new_from_resource(glade_journald_path);
@ -388,18 +370,35 @@ void on_journald_open(GtkWidget *self, main_window *widgets){
gtk_widget_show(window->MainWindow);
}
void on_serivces_open(GtkWidget *self,main_window *widgets){
GtkTreeModel *model = GTK_TREE_MODEL(widgets->list);
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model, &iter)){
char *service_name;
gtk_tree_model_get(model,&iter,1,&service_name,-1);
if (!strcmp(service_name,"journald")){
on_journald_open(NULL,widgets);
} else {
on_logrotate_tab_open(NULL,widgets);
}
}
// Log adding menu
add_log_window *on_add_open(){
add_log_window *window = malloc(sizeof(add_log_window));
GtkBuilder *builder = gtk_builder_new_from_resource(glade_add_path);
window->MainWindow=yon_gtk_builder_get_widget(builder,"MainWindow");
window->CancelButton=yon_gtk_builder_get_widget(builder,"CancelButton");
window->SaveButton=yon_gtk_builder_get_widget(builder,"SaveButton");
window->LogAddingBox=yon_gtk_builder_get_widget(builder,"LogAddingBox");
window->LogTypeCombo=yon_gtk_builder_get_widget(builder,"LogTypeCombo");
window->LogPathEntry=yon_gtk_builder_get_widget(builder,"LogPathEntry");
window->LogFindButton=yon_gtk_builder_get_widget(builder,"LogFindButton");
window->LogDescriptionEntry=yon_gtk_builder_get_widget(builder,"LogDescriptionEntry");
window->LogrotateButton=yon_gtk_builder_get_widget(builder,"LogrotateButton");
window->MetalogButton=yon_gtk_builder_get_widget(builder,"MetalogButton");
window->SyslogButton=yon_gtk_builder_get_widget(builder,"SyslogButton");
window->JournaldButton=yon_gtk_builder_get_widget(builder,"JournaldButton");
window->LogSizeLabel=yon_gtk_builder_get_widget(builder,"LogSizeLabel");
window->StatisticsFrame=yon_gtk_builder_get_widget(builder,"StatisticsFrame");
window->ControlSectionBox=yon_gtk_builder_get_widget(builder,"ControlSectionBox");
window->LogPathsBox=yon_gtk_builder_get_widget(builder,"LogPathsBox");
gtk_window_set_title(GTK_WINDOW(window->MainWindow),TITLE_LABEL);
g_signal_connect(G_OBJECT(window->CancelButton),"clicked", G_CALLBACK(on_close_subwindow),NULL);
return window;
}
void on_log_edit_logrotate_settings(GtkWidget *self, add_log_window *window){
}
@ -409,10 +408,65 @@ void on_log_add(GtkWidget *self, main_window *widgets){
add_log_window *window = on_add_open();
gtk_widget_show(window->MainWindow);
gtk_widget_hide(window->StatisticsFrame);
gtk_widget_hide(window->JournaldButton);
gtk_widget_hide(window->ControlSectionBox);
g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_close_subwindow),NULL);
}
void on_log_path_choose(GtkWidget *self,add_log_window *window){
GtkWidget *dialog = gtk_file_chooser_dialog_new(TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_OPEN,CANCEL_LABEL,GTK_RESPONSE_CANCEL,ACCEPT_LABEL,GTK_RESPONSE_ACCEPT,NULL);
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),"/");
int response = gtk_dialog_run(GTK_DIALOG(dialog));
if (response == GTK_RESPONSE_ACCEPT){
GtkWidget *parent = gtk_widget_get_parent(self);
GList *list = gtk_container_get_children(GTK_CONTAINER(parent));
gtk_entry_set_text((GtkEntry*)g_list_nth_data(list,1),gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
}
gtk_widget_destroy(dialog);
}
void on_log_path_remove(GtkWidget *self, add_log_window *window){
GList *paths = gtk_container_get_children(GTK_CONTAINER(window->LogPathsBox));
for (int i=0;i<g_list_length(paths);i++){
GtkWidget *box = (GtkWidget*)g_list_nth_data(paths,i);
GList *list = gtk_container_get_children(GTK_CONTAINER(box));
GtkWidget *button = (GtkWidget*)g_list_nth_data(list,4);
if (self==button){
if (g_list_length(list)>1&&gtk_widget_get_sensitive(g_list_nth_data(list,3))){
GtkWidget *prevbox = (GtkWidget*)g_list_nth_data(paths,i-1);
GList *prevlist = gtk_container_get_children(GTK_CONTAINER(prevbox));
gtk_widget_show(g_list_nth_data(prevlist,3));
g_list_free(prevlist);
gtk_widget_destroy(box);
}
}
g_list_free(list);
}
g_list_free(paths);
}
void on_log_path_append(GtkWidget *self, add_log_window *window){
GList *paths = gtk_container_get_children(GTK_CONTAINER(window->LogPathsBox));
GtkWidget *box = (GtkWidget*)g_list_nth_data(paths,g_list_length(paths)-1);
GList *path_widgets = gtk_container_get_children(GTK_CONTAINER(box));
GtkWidget *entry = (GtkWidget*)g_list_nth_data(path_widgets,1);
if (gtk_widget_get_sensitive(box)&&strcmp(gtk_entry_get_text(GTK_ENTRY(entry)),"")){
GtkBuilder *builder = gtk_builder_new_from_resource(glade_add_path_path);
GtkWidget *box = yon_gtk_builder_get_widget(builder,"PathBox");
GtkWidget *entry = yon_gtk_builder_get_widget(builder,"PathEntry");
GtkWidget *AppendButton = yon_gtk_builder_get_widget(builder,"AppendButton");
GtkWidget *SearchButton = yon_gtk_builder_get_widget(builder,"SearchButton");
GtkWidget *RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton");
g_signal_connect(G_OBJECT(AppendButton),"clicked",G_CALLBACK(on_log_path_append),window);
g_signal_connect(G_OBJECT(RemoveButton),"clicked",G_CALLBACK(on_log_path_remove),window);
g_signal_connect(G_OBJECT(SearchButton),"clicked",G_CALLBACK(on_log_path_choose),window);
gtk_widget_show(AppendButton);
gtk_widget_hide(self);
gtk_box_pack_start(GTK_BOX(window->LogPathsBox),box,0,0,5);
}
g_list_free(paths);
g_list_free(path_widgets);
}
void on_log_edit(GtkWidget *self,main_window *widgets){
GtkTreeModel *model = GTK_TREE_MODEL(widgets->list);
GtkTreeIter iter;
@ -421,7 +475,10 @@ void on_log_edit(GtkWidget *self,main_window *widgets){
gtk_widget_show(window->MainWindow);
gtk_widget_hide(window->StatisticsFrame);
char *name;
gtk_tree_model_get(model,&iter,0,&name,-1);
char *paths;
int size;
char *description;
gtk_tree_model_get(model,&iter,0,&name,1,&paths,2,&description,-1);
if (!strcmp(name,"journald")){
gtk_widget_hide(window->LogrotateButton);
gtk_widget_hide(window->MetalogButton);
@ -429,11 +486,30 @@ void on_log_edit(GtkWidget *self,main_window *widgets){
g_signal_connect(G_OBJECT(window->JournaldButton),"clicked", G_CALLBACK(on_journald_open),widgets);
} else {
gtk_widget_hide(window->JournaldButton);
// g_signal_connect(G_OBJECT(window->JournaldButton),"clicked", G_CALLBACK(on_journald_open),widgets);
// g_signal_connect(G_OBJECT(window->JournaldButton),"clicked", G_CALLBACK(on_log),widgets);
// g_signal_connect(G_OBJECT(window->JournaldButton),"clicked", G_CALLBACK(on_journald_open),widgets);
g_signal_connect(G_OBJECT(window->LogrotateButton),"clicked", G_CALLBACK(on_log_edit_logrotate_settings),widgets);
// g_signal_connect(G_OBJECT(window->MetalogButton),"clicked", G_CALLBACK(on_log),widgets);
// g_signal_connect(G_OBJECT(window->SyslogButton),"clicked", G_CALLBACK(on_journald_open),widgets);
}
gtk_widget_set_sensitive(window->LogAddingBox,0);
gtk_entry_set_text(GTK_ENTRY(window->LogDescriptionEntry),description);
config_str paths_parsed = yon_char_parse(paths,&size,"\n");
GtkWidget *last=NULL;
for (int i=0;i<size;i++){
GtkBuilder *builder = gtk_builder_new_from_resource(glade_add_path_path);
GtkWidget *box = yon_gtk_builder_get_widget(builder,"PathBox");
GtkWidget *entry = yon_gtk_builder_get_widget(builder,"PathEntry");
GtkWidget *AppendButton = yon_gtk_builder_get_widget(builder,"AppendButton");
GtkWidget *SearchButton = yon_gtk_builder_get_widget(builder,"SearchButton");
GtkWidget *RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton");
gtk_widget_set_sensitive(entry,0);
gtk_widget_set_sensitive(SearchButton,0);
gtk_entry_set_text(GTK_ENTRY(entry),paths_parsed[i]);
gtk_box_pack_start(GTK_BOX(window->LogPathsBox),box,0,0,5);
last = AppendButton;
}
gtk_widget_show(last);
g_signal_connect(G_OBJECT(last),"clicked",G_CALLBACK(on_log_path_append),window);
gtk_widget_set_sensitive(window->LogTypeCombo,0);
gtk_widget_set_sensitive(window->LogDescriptionEntry,0);
g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_close_subwindow),NULL);
}
}
@ -446,6 +522,8 @@ void on_log_remove(GtkWidget *self, main_window *widgets){
}
}
// Main window
void on_service_edit(GtkWidget *self,main_window *widgets){
GtkTreeModel *model = GTK_TREE_MODEL(widgets->ServicesList);
GtkTreeIter iter;
@ -552,6 +630,7 @@ main_window *setup_window(){
int log_size;
journals[i]=yon_char_divide_search(journals[i],"\n",-1);
config_str log = yon_char_parse(journals[i],&log_size,";");
log[1] = yon_char_replace(log[1],",","\n");
gtk_list_store_append(widgets->list,&iter);
gtk_list_store_set(widgets->list,&iter,0,log[0],1,log[1],2,log[2],3,-1,4,-1,5,-1,6,-1,7,-1,-1);
}

@ -20,6 +20,7 @@
#define glade_path "/com/ublinux/ui/ubl-settings-logging.glade"
#define glade_add_path "/com/ublinux/ui/ubl-settings-logging-add.glade"
#define glade_add_path_path "/com/ublinux/ui/ubl-settings-logging-add-path.glade"
#define glade_inspector_path "/com/ublinux/ui/ubl-settings-logging-inspector.glade"
#define glade_journald_path "/com/ublinux/ui/ubl-settings-logging-journald.glade"
#define glade_logrotate_path "/com/ublinux/ui/ubl-settings-logging-logrotate.glade"
@ -161,6 +162,8 @@ typedef struct {
GtkWidget *JournaldButton;
GtkWidget *LogSizeLabel;
GtkWidget *StatisticsFrame;
GtkWidget *ControlSectionBox;
GtkWidget *LogPathsBox;
} add_log_window;
typedef struct {

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkBox" id="PathBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Path (-s):</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="PathEntry">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="SearchButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image4</property>
<style>
<class name="thin"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="AppendButton">
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image3</property>
<style>
<class name="thin"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkButton" id="RemoveButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image9</property>
<style>
<class name="thin"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.ubl-settings-logging.increase-symbolic</property>
</object>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.ubl-settings-logging.zoom-symbolic</property>
</object>
<object class="GtkImage" id="image9">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.ubl-settings-logging.decrease-symbolic</property>
</object>
</interface>

@ -28,16 +28,6 @@
<property name="can-focus">False</property>
<property name="icon-name">emblem-ok-symbolic</property>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.ubl-settings-logging.increase-symbolic</property>
</object>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.ubl-settings-logging.zoom-symbolic</property>
</object>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="can-focus">False</property>
@ -135,6 +125,7 @@
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Log/Journal:</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
@ -166,85 +157,34 @@
</packing>
</child>
<child>
<object class="GtkBox">
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<property name="can-focus">True</property>
<property name="hscrollbar-policy">never</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkLabel" id="label4">
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Path (-s):</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="margin-top">5</property>
<property name="margin-bottom">5</property>
<child>
<object class="GtkEntry" id="LogPathEntry">
<object class="GtkBox" id="LogPathsBox">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkButton" id="LogSearchButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image4</property>
<style>
<class name="thin"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
<placeholder/>
</child>
<child>
<object class="GtkButton" id="LogFindButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image3</property>
<style>
<class name="thin"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkButton" id="LogRemoveButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image9</property>
<style>
<class name="thin"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
@ -259,6 +199,7 @@
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Description:</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
@ -286,14 +227,14 @@
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
@ -312,7 +253,7 @@
</packing>
</child>
<child>
<object class="GtkBox">
<object class="GtkBox" id="ControlSectionBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
@ -321,6 +262,7 @@
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Control:</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
@ -409,7 +351,7 @@
<object class="GtkFrame" id="StatisticsFrame">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label-xalign">0</property>
<property name="label-xalign">0.019999999552965164</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkAlignment">
@ -429,6 +371,7 @@
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Log size:</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
@ -513,13 +456,7 @@
<widgets>
<widget name="label1"/>
<widget name="label2"/>
<widget name="label4"/>
<widget name="label3"/>
</widgets>
</object>
<object class="GtkImage" id="image9">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.ubl-settings-logging.decrease-symbolic</property>
</object>
</interface>

@ -73,6 +73,22 @@
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.ubl-settings-logging.profile-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.ubl-settings-logging.decrease-symbolic</property>
</object>
<object class="GtkImage" id="image7">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.ubl-settings-logging.increase-symbolic</property>
</object>
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name gchararray1 -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkDialog" id="MainWindow">
<property name="width-request">800</property>
<property name="height-request">600</property>
@ -312,6 +328,7 @@
<object class="GtkTreeView">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="model">liststore1</property>
<property name="headers-visible">False</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
@ -2027,15 +2044,4 @@
<widget name="label6"/>
</widgets>
</object>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.ubl-settings-logging.decrease-symbolic</property>
</object>
<object class="GtkImage" id="image7">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.ubl-settings-logging.increase-symbolic</property>
</object>
<object class="GtkListStore" id="liststore1"/>
</interface>

Loading…
Cancel
Save