subclass models as well

This commit is contained in:
Bilal Elmoussaoui 2020-12-05 20:43:52 +01:00
parent e75001d22f
commit a55ec88bc3
13 changed files with 206 additions and 88 deletions

72
Cargo.lock generated
View file

@ -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"

View file

@ -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"

View file

@ -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),

View file

@ -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',

View file

@ -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)

View file

@ -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;

View file

@ -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)

View 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")
}
}

View file

@ -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();

View file

@ -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>()

View file

@ -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(

View file

@ -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>()

View file

@ -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