2022-05-12 15:34:02 +02:00
|
|
|
use crate::theme::{try_build_icon_path, THEMES};
|
2022-05-12 14:41:08 +02:00
|
|
|
use std::path::PathBuf;
|
|
|
|
|
|
|
|
|
|
pub mod theme;
|
|
|
|
|
|
2022-05-12 15:34:02 +02:00
|
|
|
pub fn lookup(name: &str) -> LookupBuilder {
|
|
|
|
|
LookupBuilder::new(name)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub struct LookupBuilder<'a> {
|
|
|
|
|
name: &'a str,
|
|
|
|
|
scale: u16,
|
|
|
|
|
size: u16,
|
|
|
|
|
theme: Option<&'a str>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<'a> LookupBuilder<'a> {
|
|
|
|
|
pub fn with_size(mut self, scale: u16) -> Self {
|
|
|
|
|
self.scale = scale;
|
|
|
|
|
self
|
2022-05-12 14:41:08 +02:00
|
|
|
}
|
|
|
|
|
|
2022-05-12 15:34:02 +02:00
|
|
|
pub fn with_scale(mut self, size: u16) -> Self {
|
|
|
|
|
self.size = size;
|
|
|
|
|
self
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn with_theme<'b: 'a>(mut self, theme: &'b str) -> Self {
|
|
|
|
|
self.theme = Some(theme);
|
|
|
|
|
self
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn new<'b: 'a>(name: &'b str) -> Self {
|
|
|
|
|
Self {
|
|
|
|
|
name,
|
|
|
|
|
scale: 1,
|
|
|
|
|
size: 24,
|
|
|
|
|
theme: None,
|
2022-05-12 14:41:08 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-12 15:34:02 +02:00
|
|
|
pub fn find_one(self) -> Option<PathBuf> {
|
|
|
|
|
let name = self.name;
|
|
|
|
|
let size = self.size;
|
|
|
|
|
let scale = self.scale;
|
|
|
|
|
|
|
|
|
|
// We have a theme name, lookup -> fallback - exit
|
|
|
|
|
if let Some(theme) = self.theme.and_then(|theme| THEMES.get(theme)) {
|
|
|
|
|
let icon = theme.try_get_icon(name, size, scale);
|
|
|
|
|
if icon.is_some() {
|
|
|
|
|
return icon;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// hicolor fallback
|
|
|
|
|
if let Some(fallback) = THEMES.get("hicolor") {
|
|
|
|
|
let icon = fallback.try_get_icon(name, size, scale);
|
|
|
|
|
if icon.is_some() {
|
|
|
|
|
return icon;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// No theme let's look everywhere
|
|
|
|
|
for theme in THEMES.values() {
|
|
|
|
|
let icon = theme.try_get_icon(name, size, scale);
|
|
|
|
|
if icon.is_some() {
|
|
|
|
|
return icon;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Last chance
|
|
|
|
|
try_build_icon_path(name, "/usr/share/pixmaps")
|
|
|
|
|
}
|
2022-05-12 14:41:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod test {
|
|
|
|
|
use crate::lookup;
|
|
|
|
|
use speculoos::prelude::*;
|
2022-05-12 15:34:02 +02:00
|
|
|
use std::path::PathBuf;
|
2022-05-12 14:41:08 +02:00
|
|
|
|
|
|
|
|
#[test]
|
2022-05-12 15:34:02 +02:00
|
|
|
fn simple_lookup() {
|
|
|
|
|
let firefox = lookup("firefox").find_one();
|
|
|
|
|
assert_that!(firefox).is_some();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn compare_to_linincon_with_theme() {
|
2022-05-12 14:41:08 +02:00
|
|
|
let lin_wireshark = linicon::lookup_icon("wireshark")
|
|
|
|
|
.next()
|
|
|
|
|
.unwrap()
|
|
|
|
|
.unwrap()
|
|
|
|
|
.path;
|
|
|
|
|
|
2022-05-12 15:34:02 +02:00
|
|
|
let wireshark = lookup("wireshark")
|
|
|
|
|
.with_size(16)
|
|
|
|
|
.with_scale(1)
|
|
|
|
|
.with_theme("Papirus")
|
|
|
|
|
.find_one();
|
2022-05-12 14:41:08 +02:00
|
|
|
|
|
|
|
|
assert_that!(wireshark).is_some().is_equal_to(lin_wireshark)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn compare_to_linicon_in_pixmap() {
|
2022-05-12 15:34:02 +02:00
|
|
|
let archlinux_logo = lookup("archlinux-logo")
|
|
|
|
|
.with_size(16)
|
|
|
|
|
.with_scale(1)
|
|
|
|
|
.with_theme("Papirus")
|
|
|
|
|
.find_one();
|
2022-05-12 14:41:08 +02:00
|
|
|
|
|
|
|
|
assert_that!(archlinux_logo)
|
|
|
|
|
.is_some()
|
2022-05-12 15:34:02 +02:00
|
|
|
.is_equal_to(PathBuf::from("/usr/share/pixmaps/archlinux-logo.png"));
|
2022-05-12 14:41:08 +02:00
|
|
|
}
|
|
|
|
|
}
|