mirror of
https://github.com/13hannes11/toolbx-tuner.git
synced 2024-09-03 23:21:00 +02:00
implement factory for toolbox_apps
This commit is contained in:
82
src/ui/components/toolbox_apps/factory.rs
Normal file
82
src/ui/components/toolbox_apps/factory.rs
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
use relm4::{
|
||||||
|
adw::prelude::{BoxExt, OrientableExt, WidgetExt},
|
||||||
|
factory::{FactoryPrototype, FactoryVec},
|
||||||
|
gtk::{self, Orientation},
|
||||||
|
view, Sender, WidgetPlus,
|
||||||
|
};
|
||||||
|
|
||||||
|
use super::{
|
||||||
|
messages::ToolboxAppDialogMsg, model::DotDesktopApplication, widgets::AppFactoryWidgets,
|
||||||
|
};
|
||||||
|
|
||||||
|
impl FactoryPrototype for DotDesktopApplication {
|
||||||
|
type Factory = FactoryVec<Self>;
|
||||||
|
type Widgets = AppFactoryWidgets;
|
||||||
|
type Root = gtk::Box;
|
||||||
|
type View = gtk::FlowBox;
|
||||||
|
type Msg = ToolboxAppDialogMsg;
|
||||||
|
|
||||||
|
fn init_view(
|
||||||
|
&self,
|
||||||
|
key: &<Self::Factory as relm4::factory::Factory<Self, Self::View>>::Key,
|
||||||
|
sender: Sender<Self::Msg>,
|
||||||
|
) -> Self::Widgets {
|
||||||
|
view! {
|
||||||
|
app_box = >k::Box {
|
||||||
|
set_css_classes: &[&"card"],
|
||||||
|
set_halign: gtk::Align::Center,
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
set_orientation: Orientation::Vertical,
|
||||||
|
set_hexpand: false,
|
||||||
|
set_vexpand: false,
|
||||||
|
set_width_request: 100,
|
||||||
|
set_height_request: 100,
|
||||||
|
|
||||||
|
append = >k::Switch {
|
||||||
|
set_halign: gtk::Align::Center,
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
set_hexpand: false,
|
||||||
|
set_vexpand: false,
|
||||||
|
set_margin_all: 10,
|
||||||
|
set_active: self.selected,
|
||||||
|
},
|
||||||
|
append = >k::Image::from_file(&self.icon_path) {
|
||||||
|
set_halign: gtk::Align::Center,
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
set_width_request: 64,
|
||||||
|
set_height_request: 64,
|
||||||
|
set_margin_start: 36,
|
||||||
|
set_margin_end: 36,
|
||||||
|
set_hexpand: false,
|
||||||
|
set_vexpand: false,
|
||||||
|
},
|
||||||
|
append = >k::Label {
|
||||||
|
set_halign: gtk::Align::Center,
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
set_text: &self.name,
|
||||||
|
set_margin_all: 5,
|
||||||
|
set_hexpand: false,
|
||||||
|
set_vexpand: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AppFactoryWidgets { app_box }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn position(
|
||||||
|
&self,
|
||||||
|
key: &<Self::Factory as relm4::factory::Factory<Self, Self::View>>::Key,
|
||||||
|
) -> <Self::View as relm4::factory::FactoryView<Self::Root>>::Position {
|
||||||
|
}
|
||||||
|
|
||||||
|
fn view(
|
||||||
|
&self,
|
||||||
|
key: &<Self::Factory as relm4::factory::Factory<Self, Self::View>>::Key,
|
||||||
|
widgets: &Self::Widgets,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
fn root_widget(widgets: &Self::Widgets) -> &Self::Root {
|
||||||
|
&widgets.app_box
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,3 +2,4 @@ pub mod messages;
|
|||||||
pub mod model;
|
pub mod model;
|
||||||
pub mod update;
|
pub mod update;
|
||||||
pub mod widgets;
|
pub mod widgets;
|
||||||
|
pub mod factory;
|
||||||
|
|||||||
@@ -1,10 +1,17 @@
|
|||||||
use relm4::{Model};
|
use relm4::{Model, factory::{FactoryVec}};
|
||||||
|
|
||||||
|
|
||||||
use super::{messages::ToolboxAppDialogMsg, widgets::ToolboxAppDialogWidgets};
|
use super::{messages::ToolboxAppDialogMsg, widgets::{ToolboxAppDialogWidgets}};
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct DotDesktopApplication {
|
||||||
|
pub name: String,
|
||||||
|
pub selected: bool,
|
||||||
|
pub icon_path: String,
|
||||||
|
}
|
||||||
pub struct ToolboxAppDialogModel {
|
pub struct ToolboxAppDialogModel {
|
||||||
pub hidden: bool,
|
pub hidden: bool,
|
||||||
|
pub apps: FactoryVec<DotDesktopApplication>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Model for ToolboxAppDialogModel {
|
impl Model for ToolboxAppDialogModel {
|
||||||
|
|||||||
@@ -1,12 +1,33 @@
|
|||||||
use relm4::{ComponentUpdate, Sender};
|
use relm4::{ComponentUpdate, Sender, factory::FactoryVec};
|
||||||
|
|
||||||
use crate::ui::app::{messages::AppMsg, model::AppModel};
|
use crate::ui::app::{messages::AppMsg, model::AppModel};
|
||||||
|
|
||||||
use super::{messages::ToolboxAppDialogMsg, model::ToolboxAppDialogModel};
|
use super::{messages::ToolboxAppDialogMsg, model::{ToolboxAppDialogModel, DotDesktopApplication}};
|
||||||
|
|
||||||
impl ComponentUpdate<AppModel> for ToolboxAppDialogModel {
|
impl ComponentUpdate<AppModel> for ToolboxAppDialogModel {
|
||||||
fn init_model(_parent_model: &AppModel) -> Self {
|
fn init_model(_parent_model: &AppModel) -> Self {
|
||||||
ToolboxAppDialogModel { hidden: true }
|
let mut factory_vec = FactoryVec::new();
|
||||||
|
factory_vec.push(DotDesktopApplication {
|
||||||
|
name: "Firefox".to_string(),
|
||||||
|
selected: true,
|
||||||
|
icon_path: "".to_string(),
|
||||||
|
});
|
||||||
|
factory_vec.push(DotDesktopApplication {
|
||||||
|
name: "Firefox".to_string(),
|
||||||
|
selected: false,
|
||||||
|
icon_path: "".to_string(),
|
||||||
|
});
|
||||||
|
factory_vec.push(DotDesktopApplication {
|
||||||
|
name: "Firefox".to_string(),
|
||||||
|
selected: true,
|
||||||
|
icon_path: "".to_string(),
|
||||||
|
});
|
||||||
|
factory_vec.push(DotDesktopApplication {
|
||||||
|
name: "Firefox".to_string(),
|
||||||
|
selected: false,
|
||||||
|
icon_path: "".to_string(),
|
||||||
|
});
|
||||||
|
ToolboxAppDialogModel { hidden: true, apps: factory_vec }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(
|
fn update(
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
use std::cell::Cell;
|
|
||||||
|
|
||||||
|
|
||||||
use gtk::Orientation;
|
use gtk::Orientation;
|
||||||
use gtk::PolicyType;
|
use gtk::PolicyType;
|
||||||
use relm4::adw;
|
use relm4::adw;
|
||||||
use relm4::adw::prelude::BoxExt;
|
|
||||||
use relm4::adw::prelude::GtkWindowExt;
|
use relm4::adw::prelude::GtkWindowExt;
|
||||||
use relm4::adw::prelude::WidgetExt;
|
use relm4::adw::prelude::WidgetExt;
|
||||||
use relm4::adw::traits::PreferencesGroupExt;
|
use relm4::adw::traits::PreferencesGroupExt;
|
||||||
@@ -14,7 +10,6 @@ use relm4::gtk;
|
|||||||
use relm4::send;
|
use relm4::send;
|
||||||
use relm4::WidgetPlus;
|
use relm4::WidgetPlus;
|
||||||
use relm4::Widgets;
|
use relm4::Widgets;
|
||||||
use gtk::glib;
|
|
||||||
|
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
|
|
||||||
@@ -25,6 +20,11 @@ use crate::ui::components::toolbox_apps::messages::ToolboxAppDialogMsg;
|
|||||||
|
|
||||||
use super::model::ToolboxAppDialogModel;
|
use super::model::ToolboxAppDialogModel;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct AppFactoryWidgets {
|
||||||
|
pub app_box: gtk::Box,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#[relm4::widget(pub)]
|
#[relm4::widget(pub)]
|
||||||
@@ -56,331 +56,7 @@ impl Widgets<ToolboxAppDialogModel, AppModel> for ToolboxAppDialogWidgets {
|
|||||||
set_column_spacing: 5,
|
set_column_spacing: 5,
|
||||||
set_row_spacing: 5,
|
set_row_spacing: 5,
|
||||||
set_orientation: Orientation::Horizontal,
|
set_orientation: Orientation::Horizontal,
|
||||||
insert(1) = >k::Box {
|
factory!(model.apps),
|
||||||
set_css_classes: &[&"card"],
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_orientation: Orientation::Vertical,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_width_request: 100,
|
|
||||||
set_height_request: 100,
|
|
||||||
|
|
||||||
append = >k::Switch {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_margin_all: 10,
|
|
||||||
},
|
|
||||||
append = >k::Button {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_width_request: 64,
|
|
||||||
set_height_request: 64,
|
|
||||||
set_margin_start: 36,
|
|
||||||
set_margin_end: 36,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
},
|
|
||||||
append = >k::Label {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_text: "Firefox",
|
|
||||||
set_margin_all: 5,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
insert(1) = >k::Box {
|
|
||||||
set_css_classes: &[&"card"],
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_orientation: Orientation::Vertical,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_width_request: 100,
|
|
||||||
set_height_request: 100,
|
|
||||||
|
|
||||||
append = >k::Switch {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_margin_all: 10,
|
|
||||||
},
|
|
||||||
append = >k::Button {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_width_request: 64,
|
|
||||||
set_height_request: 64,
|
|
||||||
set_margin_start: 36,
|
|
||||||
set_margin_end: 36,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
},
|
|
||||||
append = >k::Label {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_text: "Firefox",
|
|
||||||
set_margin_all: 5,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
insert(1) = >k::Box {
|
|
||||||
set_css_classes: &[&"card"],
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_orientation: Orientation::Vertical,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_width_request: 100,
|
|
||||||
set_height_request: 100,
|
|
||||||
|
|
||||||
append = >k::Switch {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_margin_all: 10,
|
|
||||||
},
|
|
||||||
append = >k::Button {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_width_request: 64,
|
|
||||||
set_height_request: 64,
|
|
||||||
set_margin_start: 36,
|
|
||||||
set_margin_end: 36,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
},
|
|
||||||
append = >k::Label {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_text: "Firefox",
|
|
||||||
set_margin_all: 5,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
insert(1) = >k::Box {
|
|
||||||
set_css_classes: &[&"card"],
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_orientation: Orientation::Vertical,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_width_request: 100,
|
|
||||||
set_height_request: 100,
|
|
||||||
|
|
||||||
append = >k::Switch {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_margin_all: 10,
|
|
||||||
},
|
|
||||||
append = >k::Button {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_width_request: 64,
|
|
||||||
set_height_request: 64,
|
|
||||||
set_margin_start: 36,
|
|
||||||
set_margin_end: 36,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
},
|
|
||||||
append = >k::Label {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_text: "Firefox",
|
|
||||||
set_margin_all: 5,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
insert(1) = >k::Box {
|
|
||||||
set_css_classes: &[&"card"],
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_orientation: Orientation::Vertical,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_width_request: 100,
|
|
||||||
set_height_request: 100,
|
|
||||||
|
|
||||||
append = >k::Switch {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_margin_all: 10,
|
|
||||||
},
|
|
||||||
append = >k::Button {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_width_request: 64,
|
|
||||||
set_height_request: 64,
|
|
||||||
set_margin_start: 36,
|
|
||||||
set_margin_end: 36,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
},
|
|
||||||
append = >k::Label {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_text: "Firefox",
|
|
||||||
set_margin_all: 5,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
insert(1) = >k::Box {
|
|
||||||
set_css_classes: &[&"card"],
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_orientation: Orientation::Vertical,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_width_request: 100,
|
|
||||||
set_height_request: 100,
|
|
||||||
|
|
||||||
append = >k::Switch {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_margin_all: 10,
|
|
||||||
},
|
|
||||||
append = >k::Button {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_width_request: 64,
|
|
||||||
set_height_request: 64,
|
|
||||||
set_margin_start: 36,
|
|
||||||
set_margin_end: 36,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
},
|
|
||||||
append = >k::Label {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_text: "Firefox",
|
|
||||||
set_margin_all: 5,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
insert(1) = >k::Box {
|
|
||||||
set_css_classes: &[&"card"],
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_orientation: Orientation::Vertical,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_width_request: 100,
|
|
||||||
set_height_request: 100,
|
|
||||||
|
|
||||||
append = >k::Switch {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_margin_all: 10,
|
|
||||||
},
|
|
||||||
append = >k::Button {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_width_request: 64,
|
|
||||||
set_height_request: 64,
|
|
||||||
set_margin_start: 36,
|
|
||||||
set_margin_end: 36,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
},
|
|
||||||
append = >k::Label {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_text: "Firefox",
|
|
||||||
set_margin_all: 5,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
insert(1) = >k::Box {
|
|
||||||
set_css_classes: &[&"card"],
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_orientation: Orientation::Vertical,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_width_request: 100,
|
|
||||||
set_height_request: 100,
|
|
||||||
|
|
||||||
append = >k::Switch {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_margin_all: 10,
|
|
||||||
},
|
|
||||||
append = >k::Button {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_width_request: 64,
|
|
||||||
set_height_request: 64,
|
|
||||||
set_margin_start: 36,
|
|
||||||
set_margin_end: 36,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
},
|
|
||||||
append = >k::Label {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_text: "Firefox",
|
|
||||||
set_margin_all: 5,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
insert(1) = >k::Box {
|
|
||||||
set_css_classes: &[&"card"],
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_orientation: Orientation::Vertical,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_width_request: 100,
|
|
||||||
set_height_request: 100,
|
|
||||||
|
|
||||||
append = >k::Switch {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
set_margin_all: 10,
|
|
||||||
},
|
|
||||||
append = >k::Button {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_width_request: 64,
|
|
||||||
set_height_request: 64,
|
|
||||||
set_margin_start: 36,
|
|
||||||
set_margin_end: 36,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
},
|
|
||||||
append = >k::Label {
|
|
||||||
set_halign: gtk::Align::Center,
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_text: "Firefox",
|
|
||||||
set_margin_all: 5,
|
|
||||||
set_hexpand: false,
|
|
||||||
set_vexpand: false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user