Skip to main content

ferroui_dialogs/internal/
managed_file_chooser_item_view_model.rs

1use super::{FerroDialogsInternalViewModelBase, ManagedFileChooserItemType, ManagedFileChooserNavigationItem};
2use ferroui_base::data::model::{Event, INotifyPropertyChanged};
3use ferroui_base::ferro_markup_type;
4use ferroui_base::utilities::DateTime;
5use std::cell::{Cell, RefCell};
6use std::rc::Rc;
7
8/// An entry of the managed file chooser: a file, a folder or a volume.
9pub struct ManagedFileChooserItemViewModel {
10    base: FerroDialogsInternalViewModelBase,
11    display_name: RefCell<Option<String>>,
12    path: RefCell<Option<String>>,
13    modified: Cell<DateTime>,
14    type_: RefCell<Option<String>>,
15    size: Cell<i64>,
16    item_type: Cell<ManagedFileChooserItemType>,
17}
18
19impl PartialEq for ManagedFileChooserItemViewModel {
20    fn eq(&self, other: &Self) -> bool {
21        std::ptr::eq(self, other)
22    }
23}
24
25impl INotifyPropertyChanged for ManagedFileChooserItemViewModel {
26    fn property_changed(&self) -> &Event<str> {
27        self.base.property_changed()
28    }
29}
30
31impl ManagedFileChooserItemViewModel {
32    pub fn new() -> Rc<Self> {
33        Rc::new(Self {
34            base: FerroDialogsInternalViewModelBase::new(),
35            display_name: RefCell::new(None),
36            path: RefCell::new(None),
37            modified: Cell::new(DateTime::default()),
38            type_: RefCell::new(None),
39            size: Cell::new(0),
40            item_type: Cell::new(ManagedFileChooserItemType::File),
41        })
42    }
43
44    pub fn from_navigation_item(item: &ManagedFileChooserNavigationItem) -> Rc<Self> {
45        let this = Self::new();
46        this.set_item_type(item.item_type);
47        this.set_path(item.path.clone());
48        this.set_display_name(item.display_name.clone());
49        this
50    }
51
52    pub fn display_name(&self) -> Option<String> {
53        self.display_name.borrow().clone()
54    }
55
56    pub fn set_display_name(&self, value: Option<String>) {
57        self.base.raise_and_set_if_changed(&self.display_name, value, "DisplayName");
58    }
59
60    pub fn path(&self) -> Option<String> {
61        self.path.borrow().clone()
62    }
63
64    pub fn set_path(&self, value: Option<String>) {
65        self.base.raise_and_set_if_changed(&self.path, value, "Path");
66    }
67
68    pub fn modified(&self) -> DateTime {
69        self.modified.get()
70    }
71
72    pub fn set_modified(&self, value: DateTime) {
73        self.base.raise_and_set_if_changed_cell(&self.modified, value, "Modified");
74    }
75
76    /// The `Type` property: the extension of a file, or the kind of a
77    /// folder.
78    pub fn type_(&self) -> Option<String> {
79        self.type_.borrow().clone()
80    }
81
82    pub fn set_type(&self, value: Option<String>) {
83        self.base.raise_and_set_if_changed(&self.type_, value, "Type");
84    }
85
86    pub fn size(&self) -> i64 {
87        self.size.get()
88    }
89
90    pub fn set_size(&self, value: i64) {
91        self.base.raise_and_set_if_changed_cell(&self.size, value, "Size");
92    }
93
94    pub fn item_type(&self) -> ManagedFileChooserItemType {
95        self.item_type.get()
96    }
97
98    pub fn set_item_type(&self, value: ManagedFileChooserItemType) {
99        self.base.raise_and_set_if_changed_cell(&self.item_type, value, "ItemType");
100    }
101
102    /// The key of the icon of the entry in the icon resources of the theme.
103    pub fn icon_key(&self) -> String {
104        match self.item_type() {
105            ManagedFileChooserItemType::Folder => "Icon_Folder".to_string(),
106            ManagedFileChooserItemType::Volume => "Icon_Volume".to_string(),
107            _ => "Icon_File".to_string(),
108        }
109    }
110}
111
112ferro_markup_type!(class ManagedFileChooserItemViewModel {
113    this: Rc<ManagedFileChooserItemViewModel>,
114    handles: [
115        ManagedFileChooserItemViewModel,
116        Rc<ManagedFileChooserItemViewModel>,
117        Option<Rc<ManagedFileChooserItemViewModel>>
118    ],
119    constructors: [() => ManagedFileChooserItemViewModel::new],
120    properties: [
121        DisplayName: Option<String> {
122            get: ManagedFileChooserItemViewModel::display_name,
123            set: ManagedFileChooserItemViewModel::set_display_name
124        },
125        Path: Option<String> { get: ManagedFileChooserItemViewModel::path, set: ManagedFileChooserItemViewModel::set_path },
126        Modified: DateTime {
127            get: ManagedFileChooserItemViewModel::modified,
128            set: ManagedFileChooserItemViewModel::set_modified
129        },
130        Type: Option<String> { get: ManagedFileChooserItemViewModel::type_, set: ManagedFileChooserItemViewModel::set_type },
131        Size: i64 { get: ManagedFileChooserItemViewModel::size, set: ManagedFileChooserItemViewModel::set_size },
132        ItemType: ManagedFileChooserItemType {
133            get: ManagedFileChooserItemViewModel::item_type,
134            set: ManagedFileChooserItemViewModel::set_item_type
135        },
136        IconKey: String { get: ManagedFileChooserItemViewModel::icon_key },
137    ],
138    notify_property_changed: ManagedFileChooserItemViewModel,
139});