Add mounter abstraction, enable minimal GVfs support

This commit is contained in:
Jeremy Soller 2024-04-22 09:54:00 -06:00
parent 8913c4198b
commit 02b6cda872
No known key found for this signature in database
GPG key ID: D02FD439211AF56F
8 changed files with 254 additions and 19 deletions

54
src/mounter/gvfs.rs Normal file
View 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
View 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)
}