mirror of
https://gitlab.gnome.org/World/Authenticator.git
synced 2025-03-04 08:44:40 +01:00
subclass models as well
This commit is contained in:
parent
e75001d22f
commit
a55ec88bc3
13 changed files with 206 additions and 88 deletions
72
Cargo.lock
generated
72
Cargo.lock
generated
|
@ -419,7 +419,7 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
|
|||
[[package]]
|
||||
name = "cairo-rs"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cairo-sys-rs",
|
||||
|
@ -432,7 +432,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "cairo-sys-rs"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"libc",
|
||||
|
@ -441,9 +441,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.65"
|
||||
version = "1.0.66"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "95752358c8f7552394baf48cd82695b345628ad3f170d607de3ca03b8dacca15"
|
||||
checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
|
@ -475,15 +475,6 @@ dependencies = [
|
|||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cloudabi"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cmake"
|
||||
version = "0.1.45"
|
||||
|
@ -990,7 +981,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "gdk-pixbuf"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"gdk-pixbuf-sys",
|
||||
"gio",
|
||||
|
@ -1001,7 +992,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "gdk-pixbuf-sys"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"gio-sys",
|
||||
"glib-sys",
|
||||
|
@ -1013,7 +1004,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "gdk4"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#91d797945cddd19d20ea4f7e80833765d4169423"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#eb728b68ccdfb3415e7ce002956315f9f7455bd4"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cairo-rs",
|
||||
|
@ -1028,7 +1019,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "gdk4-sys"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#91d797945cddd19d20ea4f7e80833765d4169423"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#eb728b68ccdfb3415e7ce002956315f9f7455bd4"
|
||||
dependencies = [
|
||||
"cairo-sys-rs",
|
||||
"gdk-pixbuf-sys",
|
||||
|
@ -1102,7 +1093,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "gio"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"futures",
|
||||
|
@ -1120,7 +1111,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "gio-sys"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
|
@ -1132,7 +1123,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "glib"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"futures-channel",
|
||||
|
@ -1151,7 +1142,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "glib-macros"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
|
@ -1166,7 +1157,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "glib-sys"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"system-deps",
|
||||
|
@ -1188,7 +1179,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "gobject-sys"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"libc",
|
||||
|
@ -1198,7 +1189,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "graphene-rs"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"glib",
|
||||
"graphene-sys",
|
||||
|
@ -1208,7 +1199,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "graphene-sys"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"libc",
|
||||
|
@ -1219,7 +1210,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "gsk4"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#91d797945cddd19d20ea4f7e80833765d4169423"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#eb728b68ccdfb3415e7ce002956315f9f7455bd4"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cairo-rs",
|
||||
|
@ -1234,7 +1225,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "gsk4-sys"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#91d797945cddd19d20ea4f7e80833765d4169423"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#eb728b68ccdfb3415e7ce002956315f9f7455bd4"
|
||||
dependencies = [
|
||||
"cairo-sys-rs",
|
||||
"gdk4-sys",
|
||||
|
@ -1255,7 +1246,7 @@ checksum = "1874c48e670519ce192093ac906c08a6dde7cb2d18b28722ef237726a39c3a63"
|
|||
[[package]]
|
||||
name = "gtk4"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#91d797945cddd19d20ea4f7e80833765d4169423"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#eb728b68ccdfb3415e7ce002956315f9f7455bd4"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cairo-rs",
|
||||
|
@ -1276,7 +1267,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "gtk4-macros"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#91d797945cddd19d20ea4f7e80833765d4169423"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#eb728b68ccdfb3415e7ce002956315f9f7455bd4"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
|
@ -1291,7 +1282,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "gtk4-sys"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#91d797945cddd19d20ea4f7e80833765d4169423"
|
||||
source = "git+https://github.com/gtk-rs/gtk4-rs#eb728b68ccdfb3415e7ce002956315f9f7455bd4"
|
||||
dependencies = [
|
||||
"cairo-sys-rs",
|
||||
"gdk-pixbuf-sys",
|
||||
|
@ -1390,9 +1381,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "http-types"
|
||||
version = "2.8.0"
|
||||
version = "2.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6f316f6a06306570e899238d3b85375f350cfceda60ec47807c4164d6e169e58"
|
||||
checksum = "f2ab8d0085fb82859c9adf050bd53992297ecdd03a665a230dfa50c8c964bf3d"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-channel",
|
||||
|
@ -1911,7 +1902,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "pango"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"glib",
|
||||
|
@ -1923,7 +1914,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "pango-sys"
|
||||
version = "0.13.0"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#82017a57d9c6fddb086662c6b5cf4ca48ec12b27"
|
||||
source = "git+https://github.com/gtk-rs/gtk-rs#3ae272c9cb927803d72d6ecd9098d129f4052664"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
|
@ -1950,12 +1941,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "parking_lot_core"
|
||||
version = "0.8.0"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b"
|
||||
checksum = "d7c6d9b8427445284a09c55be860a15855ab580a417ccad9da88f5a06787ced0"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"cloudabi 0.1.0",
|
||||
"cfg-if 1.0.0",
|
||||
"instant",
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
|
@ -2293,7 +2283,7 @@ version = "0.1.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
|
||||
dependencies = [
|
||||
"cloudabi 0.0.3",
|
||||
"cloudabi",
|
||||
"fuchsia-cprng",
|
||||
"libc",
|
||||
"rand_core 0.4.2",
|
||||
|
@ -2565,9 +2555,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.5.0"
|
||||
version = "1.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7acad6f34eb9e8a259d3283d1e8c1d34d7415943d4895f65cc73813c7396fc85"
|
||||
checksum = "ae524f056d7d770e174287294f562e95044c68e88dec909a00d2094805db9d75"
|
||||
|
||||
[[package]]
|
||||
name = "socket2"
|
||||
|
|
|
@ -29,9 +29,11 @@ package = "gtk4"
|
|||
|
||||
[dependencies.glib]
|
||||
git = "https://github.com/gtk-rs/gtk-rs"
|
||||
features = ["v2_66"]
|
||||
|
||||
[dependencies.gio]
|
||||
git = "https://github.com/gtk-rs/gtk-rs"
|
||||
features = ["v2_66"]
|
||||
|
||||
[dependencies.gdk]
|
||||
git = "https://github.com/gtk-rs/gtk4-rs"
|
||||
|
|
|
@ -7,11 +7,8 @@ use glib::subclass::prelude::*;
|
|||
use glib::{subclass, WeakRef};
|
||||
use gtk::prelude::*;
|
||||
use gtk::subclass::prelude::{ApplicationImpl, ApplicationImplExt, GtkApplicationImpl};
|
||||
use std::cell::{Cell, RefCell};
|
||||
use std::env;
|
||||
use std::{
|
||||
cell::{Cell, RefCell},
|
||||
rc::Rc,
|
||||
};
|
||||
|
||||
use glib::{Receiver, Sender};
|
||||
pub enum Action {
|
||||
|
@ -23,7 +20,7 @@ pub enum Action {
|
|||
|
||||
pub struct ApplicationPrivate {
|
||||
window: RefCell<Option<WeakRef<Window>>>,
|
||||
model: Rc<ProvidersModel>,
|
||||
model: ProvidersModel,
|
||||
sender: Sender<Action>,
|
||||
receiver: RefCell<Option<Receiver<Action>>>,
|
||||
locked: Cell<bool>,
|
||||
|
@ -59,7 +56,7 @@ impl ObjectSubclass for ApplicationPrivate {
|
|||
fn new() -> Self {
|
||||
let (sender, r) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
|
||||
let receiver = RefCell::new(Some(r));
|
||||
let model = Rc::new(ProvidersModel::new());
|
||||
let model = ProvidersModel::new();
|
||||
|
||||
Self {
|
||||
window: RefCell::new(None),
|
||||
|
|
|
@ -49,6 +49,7 @@ sources = files(
|
|||
'models/favicon.rs',
|
||||
'models/mod.rs',
|
||||
'models/provider.rs',
|
||||
'models/provider_sorter.rs',
|
||||
'models/providers.rs',
|
||||
'widgets/accounts/add.rs',
|
||||
'widgets/accounts/mod.rs',
|
||||
|
|
|
@ -35,7 +35,15 @@ pub struct AccountPriv {
|
|||
|
||||
static PROPERTIES: [subclass::Property; 4] = [
|
||||
subclass::Property("id", |name| {
|
||||
glib::ParamSpec::int(name, "id", "Id", 0, 1000, 0, glib::ParamFlags::READWRITE)
|
||||
glib::ParamSpec::int(
|
||||
name,
|
||||
"id",
|
||||
"Id",
|
||||
0,
|
||||
i32::MAX,
|
||||
0,
|
||||
glib::ParamFlags::READWRITE,
|
||||
)
|
||||
}),
|
||||
subclass::Property("name", |name| {
|
||||
glib::ParamSpec::string(name, "name", "Name", None, glib::ParamFlags::READWRITE)
|
||||
|
|
|
@ -3,10 +3,12 @@ mod algorithm;
|
|||
pub mod database;
|
||||
mod favicon;
|
||||
mod provider;
|
||||
mod provider_sorter;
|
||||
mod providers;
|
||||
|
||||
pub use self::account::Account;
|
||||
pub use self::algorithm::Algorithm;
|
||||
pub use self::favicon::{FaviconError, FaviconScrapper};
|
||||
pub use self::provider::Provider;
|
||||
pub use self::provider_sorter::ProviderSorter;
|
||||
pub use self::providers::ProvidersModel;
|
||||
|
|
|
@ -52,7 +52,15 @@ pub struct ProviderPriv {
|
|||
|
||||
static PROPERTIES: [subclass::Property; 8] = [
|
||||
subclass::Property("id", |name| {
|
||||
glib::ParamSpec::int(name, "id", "Id", 0, 1000, 0, glib::ParamFlags::READWRITE)
|
||||
glib::ParamSpec::int(
|
||||
name,
|
||||
"id",
|
||||
"Id",
|
||||
0,
|
||||
i32::MAX,
|
||||
0,
|
||||
glib::ParamFlags::READWRITE,
|
||||
)
|
||||
}),
|
||||
subclass::Property("name", |name| {
|
||||
glib::ParamSpec::string(name, "name", "Name", None, glib::ParamFlags::READWRITE)
|
||||
|
|
63
src/models/provider_sorter.rs
Normal file
63
src/models/provider_sorter.rs
Normal file
|
@ -0,0 +1,63 @@
|
|||
use super::provider::Provider;
|
||||
use gio::prelude::*;
|
||||
use gio::subclass::ObjectSubclass;
|
||||
use glib::StaticType;
|
||||
use glib::{glib_object_subclass, glib_wrapper};
|
||||
|
||||
mod imp {
|
||||
use super::*;
|
||||
use glib::subclass;
|
||||
use glib::subclass::prelude::*;
|
||||
use gtk::subclass::sorter::SorterImpl;
|
||||
use unicase::UniCase;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct ProviderSorter;
|
||||
|
||||
impl ObjectSubclass for ProviderSorter {
|
||||
const NAME: &'static str = "ProviderSorter";
|
||||
type Type = super::ProviderSorter;
|
||||
type ParentType = gtk::Sorter;
|
||||
type Instance = subclass::simple::InstanceStruct<Self>;
|
||||
type Class = subclass::simple::ClassStruct<Self>;
|
||||
|
||||
glib_object_subclass!();
|
||||
|
||||
fn new() -> Self {
|
||||
Self {}
|
||||
}
|
||||
}
|
||||
impl ObjectImpl for ProviderSorter {}
|
||||
impl SorterImpl for ProviderSorter {
|
||||
fn get_order(&self, _sorter: &Self::Type) -> gtk::SorterOrder {
|
||||
gtk::SorterOrder::Total
|
||||
}
|
||||
|
||||
fn compare(
|
||||
&self,
|
||||
_sorter: &Self::Type,
|
||||
item1: &glib::Object,
|
||||
item2: &glib::Object,
|
||||
) -> gtk::Ordering {
|
||||
let provider1 = item1.downcast_ref::<Provider>().unwrap();
|
||||
let provider2 = item2.downcast_ref::<Provider>().unwrap();
|
||||
|
||||
UniCase::new(provider1.name())
|
||||
.cmp(&UniCase::new(provider2.name()))
|
||||
.into()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
glib_wrapper! {
|
||||
pub struct ProviderSorter(ObjectSubclass<imp::ProviderSorter>) @extends gtk::Sorter;
|
||||
}
|
||||
|
||||
impl ProviderSorter {
|
||||
pub fn new() -> Self {
|
||||
glib::Object::new(Self::static_type(), &[])
|
||||
.expect("Failed to create ProviderSorter")
|
||||
.downcast()
|
||||
.expect("Created ProviderSorter is of wrong type")
|
||||
}
|
||||
}
|
|
@ -2,26 +2,72 @@ use super::account::Account;
|
|||
use super::provider::Provider;
|
||||
use anyhow::Result;
|
||||
use gio::prelude::*;
|
||||
use gio::subclass::ObjectSubclass;
|
||||
use glib::StaticType;
|
||||
use glib::{glib_object_subclass, glib_wrapper};
|
||||
use gtk::prelude::*;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct ProvidersModel {
|
||||
pub model: gio::ListStore,
|
||||
mod imp {
|
||||
use super::*;
|
||||
use gio::subclass::ListModelImpl;
|
||||
use glib::subclass;
|
||||
use glib::subclass::prelude::*;
|
||||
use std::cell::RefCell;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct ProvidersModel(pub RefCell<Vec<Provider>>);
|
||||
|
||||
impl ObjectSubclass for ProvidersModel {
|
||||
const NAME: &'static str = "ProvidersModel";
|
||||
type Type = super::ProvidersModel;
|
||||
type ParentType = glib::Object;
|
||||
type Instance = subclass::simple::InstanceStruct<Self>;
|
||||
type Class = subclass::simple::ClassStruct<Self>;
|
||||
|
||||
glib_object_subclass!();
|
||||
|
||||
fn type_init(type_: &mut subclass::InitializingType<Self>) {
|
||||
type_.add_interface::<gio::ListModel>();
|
||||
}
|
||||
|
||||
fn new() -> Self {
|
||||
Self(RefCell::new(Vec::new()))
|
||||
}
|
||||
}
|
||||
impl ObjectImpl for ProvidersModel {}
|
||||
impl ListModelImpl for ProvidersModel {
|
||||
fn get_item_type(&self, _list_model: &Self::Type) -> glib::Type {
|
||||
Provider::static_type()
|
||||
}
|
||||
fn get_n_items(&self, _list_model: &Self::Type) -> u32 {
|
||||
self.0.borrow().len() as u32
|
||||
}
|
||||
fn get_item(&self, _list_model: &Self::Type, position: u32) -> Option<glib::Object> {
|
||||
self.0
|
||||
.borrow()
|
||||
.get(position as usize)
|
||||
.map(|o| o.clone().upcast::<glib::Object>())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
glib_wrapper! {
|
||||
pub struct ProvidersModel(ObjectSubclass<imp::ProvidersModel>) @implements gio::ListModel;
|
||||
}
|
||||
|
||||
impl ProvidersModel {
|
||||
pub fn new() -> Self {
|
||||
let model = Self {
|
||||
model: gio::ListStore::new(Provider::static_type()),
|
||||
};
|
||||
let model: ProvidersModel = glib::Object::new(Self::static_type(), &[])
|
||||
.expect("Failed to create Model")
|
||||
.downcast()
|
||||
.expect("Created Model is of wrong type");
|
||||
model.init();
|
||||
model
|
||||
}
|
||||
|
||||
pub fn find_by_name(&self, name: &str) -> Option<Provider> {
|
||||
for pos in 0..self.count() {
|
||||
let obj = self.model.get_object(pos)?;
|
||||
for pos in 0..self.get_n_items() {
|
||||
let obj = self.get_object(pos)?;
|
||||
let provider = obj.downcast::<Provider>().unwrap();
|
||||
if provider.name() == name {
|
||||
return Some(provider);
|
||||
|
@ -31,8 +77,8 @@ impl ProvidersModel {
|
|||
}
|
||||
|
||||
pub fn find_by_id(&self, id: i32) -> Option<Provider> {
|
||||
for pos in 0..self.count() {
|
||||
let obj = self.model.get_object(pos)?;
|
||||
for pos in 0..self.get_n_items() {
|
||||
let obj = self.get_object(pos)?;
|
||||
let provider = obj.downcast::<Provider>().unwrap();
|
||||
if provider.id() == id {
|
||||
return Some(provider);
|
||||
|
@ -43,8 +89,8 @@ impl ProvidersModel {
|
|||
|
||||
pub fn completion_model(&self) -> gtk::ListStore {
|
||||
let store = gtk::ListStore::new(&[i32::static_type(), String::static_type()]);
|
||||
for pos in 0..self.count() {
|
||||
let obj = self.model.get_object(pos).unwrap();
|
||||
for pos in 0..self.get_n_items() {
|
||||
let obj = self.get_object(pos).unwrap();
|
||||
let provider = obj.downcast_ref::<Provider>().unwrap();
|
||||
store.set(
|
||||
&store.append(),
|
||||
|
@ -56,13 +102,19 @@ impl ProvidersModel {
|
|||
}
|
||||
|
||||
pub fn add_provider(&self, provider: &Provider) {
|
||||
self.model.insert_sorted(provider, Provider::compare);
|
||||
let self_ = imp::ProvidersModel::from_instance(self);
|
||||
let pos = {
|
||||
let mut data = self_.0.borrow_mut();
|
||||
data.push(provider.clone());
|
||||
(data.len() - 1) as u32
|
||||
};
|
||||
self.items_changed(pos, 0, 1);
|
||||
}
|
||||
|
||||
pub fn add_account(&self, account: &Account, provider: &Provider) -> Result<()> {
|
||||
let mut found = false;
|
||||
for pos in 0..self.count() {
|
||||
let obj = self.model.get_object(pos).unwrap();
|
||||
for pos in 0..self.get_n_items() {
|
||||
let obj = self.get_object(pos).unwrap();
|
||||
let p = obj.downcast_ref::<Provider>().unwrap();
|
||||
if p.id() == provider.id() {
|
||||
found = true;
|
||||
|
@ -78,8 +130,8 @@ impl ProvidersModel {
|
|||
}
|
||||
|
||||
pub fn remove_account(&self, account: &Account) -> Result<()> {
|
||||
for pos in 0..self.count() {
|
||||
let obj = self.model.get_object(pos).unwrap();
|
||||
for pos in 0..self.get_n_items() {
|
||||
let obj = self.get_object(pos).unwrap();
|
||||
let p = obj.downcast_ref::<Provider>().unwrap();
|
||||
if let Some(pos) = p.has_account(account) {
|
||||
p.remove_account(account, pos)?;
|
||||
|
@ -89,10 +141,6 @@ impl ProvidersModel {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
pub fn count(&self) -> u32 {
|
||||
self.model.get_n_items()
|
||||
}
|
||||
|
||||
fn init(&self) {
|
||||
// fill in the providers from the database
|
||||
let providers = Provider::load().unwrap();
|
||||
|
|
|
@ -11,7 +11,6 @@ use gtk::{prelude::*, CompositeTemplate};
|
|||
use libhandy::ActionRowExt;
|
||||
use once_cell::sync::OnceCell;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
||||
pub enum AccountAddAction {
|
||||
SetIcon(gio::File),
|
||||
|
@ -30,7 +29,7 @@ mod imp {
|
|||
pub global_sender: OnceCell<Sender<Action>>,
|
||||
pub sender: Sender<AccountAddAction>,
|
||||
pub receiver: RefCell<Option<Receiver<AccountAddAction>>>,
|
||||
pub model: OnceCell<Rc<ProvidersModel>>,
|
||||
pub model: OnceCell<ProvidersModel>,
|
||||
pub selected_provider: OnceCell<Provider>,
|
||||
pub actions: gio::SimpleActionGroup,
|
||||
|
||||
|
@ -129,7 +128,7 @@ glib_wrapper! {
|
|||
}
|
||||
|
||||
impl AccountAddDialog {
|
||||
pub fn new(model: Rc<ProvidersModel>, global_sender: Sender<Action>) -> Self {
|
||||
pub fn new(model: ProvidersModel, global_sender: Sender<Action>) -> Self {
|
||||
let dialog = glib::Object::new(Self::static_type(), &[])
|
||||
.expect("Failed to create AccountAddDialog")
|
||||
.downcast::<AccountAddDialog>()
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use super::{ProviderPage, ProviderPageMode};
|
||||
use crate::models::{Provider, ProvidersModel};
|
||||
use crate::models::{Provider, ProviderSorter, ProvidersModel};
|
||||
use gio::prelude::*;
|
||||
use gio::subclass::ObjectSubclass;
|
||||
use gio::ListModelExt;
|
||||
|
@ -8,7 +8,6 @@ use glib::{glib_object_subclass, glib_wrapper};
|
|||
use gtk::{prelude::*, CompositeTemplate};
|
||||
use libhandy::{LeafletExt, LeafletPageExt};
|
||||
use row::ProviderActionRow;
|
||||
use std::rc::Rc;
|
||||
|
||||
mod imp {
|
||||
use super::*;
|
||||
|
@ -78,7 +77,7 @@ glib_wrapper! {
|
|||
}
|
||||
|
||||
impl ProvidersDialog {
|
||||
pub fn new(model: Rc<ProvidersModel>) -> Self {
|
||||
pub fn new(model: ProvidersModel) -> Self {
|
||||
let dialog = glib::Object::new(Self::static_type(), &[])
|
||||
.expect("Failed to create ProvidersDialog")
|
||||
.downcast::<ProvidersDialog>()
|
||||
|
@ -89,10 +88,10 @@ impl ProvidersDialog {
|
|||
dialog
|
||||
}
|
||||
|
||||
fn setup_widgets(&self, model: Rc<ProvidersModel>) {
|
||||
fn setup_widgets(&self, model: ProvidersModel) {
|
||||
let self_ = imp::ProvidersDialog::from_instance(self);
|
||||
|
||||
self_.filter_model.set_model(Some(&model.model));
|
||||
self_.filter_model.set_model(Some(&model));
|
||||
self_
|
||||
.search_bar
|
||||
.get()
|
||||
|
@ -131,8 +130,10 @@ impl ProvidersDialog {
|
|||
});
|
||||
|
||||
self_.providers_list.get().set_factory(Some(&factory));
|
||||
let sorter = ProviderSorter::new();
|
||||
let sort_model = gtk::SortListModel::new(Some(&self_.filter_model), Some(&sorter));
|
||||
|
||||
let selection_model = gtk::NoSelection::new(Some(&self_.filter_model));
|
||||
let selection_model = gtk::NoSelection::new(Some(&sort_model));
|
||||
self_.providers_list.get().set_model(Some(&selection_model));
|
||||
|
||||
self_.providers_list.get().connect_activate(
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
use crate::models::{Provider, ProvidersModel};
|
||||
use crate::models::{Provider, ProviderSorter, ProvidersModel};
|
||||
use crate::widgets::providers::ProviderRow;
|
||||
use gio::{subclass::ObjectSubclass, ListModelExt};
|
||||
use glib::subclass::prelude::*;
|
||||
use glib::{glib_object_subclass, glib_wrapper};
|
||||
use gtk::{prelude::*, CompositeTemplate};
|
||||
use std::rc::Rc;
|
||||
|
||||
mod imp {
|
||||
use super::*;
|
||||
|
@ -64,14 +63,14 @@ impl ProvidersList {
|
|||
.expect("Created object is of wrong type")
|
||||
}
|
||||
|
||||
pub fn set_model(&self, model: Rc<ProvidersModel>) {
|
||||
pub fn set_model(&self, model: ProvidersModel) {
|
||||
let self_ = imp::ProvidersList::from_instance(self);
|
||||
let accounts_filter = gtk::CustomFilter::new(Some(Box::new(|object| {
|
||||
let provider = object.downcast_ref::<Provider>().unwrap();
|
||||
provider.has_accounts()
|
||||
})));
|
||||
self_.filter_model.set_filter(Some(&accounts_filter));
|
||||
self_.filter_model.set_model(Some(&model.model));
|
||||
self_.filter_model.set_model(Some(&model));
|
||||
}
|
||||
|
||||
pub fn refilter(&self) {
|
||||
|
@ -95,9 +94,10 @@ impl ProvidersList {
|
|||
|
||||
fn setup_widgets(&self) {
|
||||
let self_ = imp::ProvidersList::from_instance(self);
|
||||
|
||||
let sorter = ProviderSorter::new();
|
||||
let sort_model = gtk::SortListModel::new(Some(&self_.filter_model), Some(&sorter));
|
||||
self_.providers_list.get().bind_model(
|
||||
Some(&self_.filter_model),
|
||||
Some(&sort_model),
|
||||
Some(Box::new(move |obj| {
|
||||
let provider = obj.clone().downcast::<Provider>().unwrap();
|
||||
ProviderRow::new(provider).upcast::<gtk::Widget>()
|
||||
|
|
|
@ -11,7 +11,6 @@ use glib::{glib_object_subclass, glib_wrapper};
|
|||
use glib::{signal::Inhibit, Sender};
|
||||
use gtk::{prelude::*, CompositeTemplate};
|
||||
use libhandy::prelude::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
#[derive(PartialEq, Debug)]
|
||||
pub enum View {
|
||||
|
@ -92,7 +91,7 @@ glib_wrapper! {
|
|||
}
|
||||
|
||||
impl Window {
|
||||
pub fn new(model: Rc<ProvidersModel>, sender: Sender<Action>, app: &Application) -> Self {
|
||||
pub fn new(model: ProvidersModel, sender: Sender<Action>, app: &Application) -> Self {
|
||||
let window = glib::Object::new(Window::static_type(), &[("application", app)])
|
||||
.unwrap()
|
||||
.downcast::<Window>()
|
||||
|
@ -126,7 +125,7 @@ impl Window {
|
|||
self_.providers.clone()
|
||||
}
|
||||
|
||||
fn init(&self, model: Rc<ProvidersModel>) {
|
||||
fn init(&self, model: ProvidersModel) {
|
||||
let self_ = imp::Window::from_instance(self);
|
||||
self_.providers.set_model(model.clone());
|
||||
// load latest window state
|
||||
|
|
Loading…
Add table
Reference in a new issue