Add mounter abstraction, enable minimal GVfs support
This commit is contained in:
parent
8913c4198b
commit
02b6cda872
8 changed files with 254 additions and 19 deletions
54
src/mounter/gvfs.rs
Normal file
54
src/mounter/gvfs.rs
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
use cosmic::widget;
|
||||
use gio::prelude::*;
|
||||
use gio::{Mount, ThemedIcon, Volume, VolumeMonitor};
|
||||
use std::{error::Error, path::PathBuf};
|
||||
|
||||
use super::{Mounter, MounterItem, MounterItems};
|
||||
|
||||
pub struct Gvfs {
|
||||
monitor: VolumeMonitor,
|
||||
}
|
||||
|
||||
impl Gvfs {
|
||||
pub fn new() -> Self {
|
||||
let monitor = VolumeMonitor::get();
|
||||
Self { monitor }
|
||||
}
|
||||
}
|
||||
|
||||
impl Mounter for Gvfs {
|
||||
fn items(&self) -> Result<MounterItems, Box<dyn Error>> {
|
||||
let mut items = MounterItems::new();
|
||||
for mount in self.monitor.mounts() {
|
||||
items.push(Box::new(mount));
|
||||
}
|
||||
Ok(items)
|
||||
}
|
||||
}
|
||||
|
||||
impl MounterItem for Mount {
|
||||
fn name(&self) -> String {
|
||||
MountExt::name(self).to_string()
|
||||
}
|
||||
|
||||
fn icon(&self, size: u16) -> widget::icon::Handle {
|
||||
let icon = MountExt::symbolic_icon(self);
|
||||
if let Some(themed_icon) = icon.downcast_ref::<ThemedIcon>() {
|
||||
for name in themed_icon.names() {
|
||||
let named = widget::icon::from_name(name.as_str()).size(size);
|
||||
if let Some(path) = named.path() {
|
||||
return widget::icon::from_path(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: handle more gio icon types
|
||||
widget::icon::from_name("folder-symbolic")
|
||||
.size(size)
|
||||
.handle()
|
||||
}
|
||||
|
||||
fn path(&self) -> Option<PathBuf> {
|
||||
MountExt::root(self).path()
|
||||
}
|
||||
}
|
||||
33
src/mounter/mod.rs
Normal file
33
src/mounter/mod.rs
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
use cosmic::widget;
|
||||
use std::error::Error;
|
||||
use std::{collections::BTreeMap, path::PathBuf, sync::Arc};
|
||||
|
||||
#[cfg(feature = "gvfs")]
|
||||
mod gvfs;
|
||||
|
||||
pub trait MounterItem {
|
||||
fn name(&self) -> String;
|
||||
fn icon(&self, size: u16) -> widget::icon::Handle;
|
||||
fn path(&self) -> Option<PathBuf>;
|
||||
}
|
||||
|
||||
pub type MounterItems = Vec<Box<dyn MounterItem>>;
|
||||
|
||||
pub trait Mounter {
|
||||
fn items(&self) -> Result<MounterItems, Box<dyn Error>>;
|
||||
}
|
||||
|
||||
pub type MounterKey = &'static str;
|
||||
pub type MounterMap = BTreeMap<MounterKey, Box<dyn Mounter>>;
|
||||
pub type Mounters = Arc<MounterMap>;
|
||||
|
||||
pub fn mounters() -> Mounters {
|
||||
let mut mounters = MounterMap::new();
|
||||
|
||||
#[cfg(feature = "gvfs")]
|
||||
{
|
||||
mounters.insert("gvfs", Box::new(gvfs::Gvfs::new()));
|
||||
}
|
||||
|
||||
Mounters::new(mounters)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue