use egui::{Align2, Color32, FontFamily, FontId, Painter, Rect, Sense, Ui, Vec2, vec2};
use egui_phosphor::regular as ph;
pub type IconPainter = fn(&Painter, Rect, Color32);
#[derive(Debug, Clone, Copy)]
pub enum Icon {
Check,
Close,
Info,
Warning,
Error,
Success,
Question,
ChevronDown,
ChevronUp,
ChevronLeft,
ChevronRight,
ArrowUp,
ArrowDown,
ArrowLeft,
ArrowRight,
Home,
Plus,
Minus,
Trash,
Edit,
Copy,
Download,
Upload,
Save,
Send,
Refresh,
Search,
Filter,
Share,
DotsHorizontal,
DotsVertical,
Menu,
Server,
Database,
Cpu,
Cloud,
Globe,
Network,
Activity,
Lightning,
Package,
Rocket,
Recycle,
File,
FileCode,
FileText,
Folder,
FolderOpen,
Code,
Terminal,
Bug,
Brain,
GitBranch,
GitCommit,
GitPullRequest,
Lock,
Unlock,
Key,
Shield,
ShieldCheck,
Eye,
EyeSlash,
Bell,
BellOff,
Envelope,
Chat,
User,
Users,
UserCircle,
UserGear,
Clock,
Calendar,
Hourglass,
Timer,
Settings,
Heart,
Star,
Bookmark,
Flag,
Tag,
Pin,
Link,
Sun,
Moon,
Bullet,
Leaf,
Glyph(&'static str),
Custom(IconPainter),
}
impl Icon {
pub fn show(self, ui: &mut Ui, size: f32, color: Color32) -> Rect {
let (rect, _) = ui.allocate_exact_size(vec2(size, size), Sense::hover());
self.paint(ui.painter(), rect, color);
rect
}
pub fn paint(self, painter: &Painter, rect: Rect, color: Color32) {
let side = rect.width().min(rect.height());
let r = Rect::from_center_size(rect.center(), Vec2::splat(side));
match self {
Self::Custom(f) => f(painter, r, color),
other => paint_glyph(painter, r, color, other.codepoint()),
}
}
pub(crate) fn codepoint(self) -> &'static str {
match self {
Self::Check => ph::CHECK,
Self::Close => ph::X,
Self::Info => ph::INFO,
Self::Warning => ph::WARNING,
Self::Error => ph::WARNING_CIRCLE,
Self::Success => ph::CHECK_CIRCLE,
Self::Question => ph::QUESTION,
Self::ChevronDown => ph::CARET_DOWN,
Self::ChevronUp => ph::CARET_UP,
Self::ChevronLeft => ph::CARET_LEFT,
Self::ChevronRight => ph::CARET_RIGHT,
Self::ArrowUp => ph::ARROW_UP,
Self::ArrowDown => ph::ARROW_DOWN,
Self::ArrowLeft => ph::ARROW_LEFT,
Self::ArrowRight => ph::ARROW_RIGHT,
Self::Home => ph::HOUSE,
Self::Plus => ph::PLUS,
Self::Minus => ph::MINUS,
Self::Trash => ph::TRASH,
Self::Edit => ph::PENCIL,
Self::Copy => ph::COPY,
Self::Download => ph::DOWNLOAD,
Self::Upload => ph::UPLOAD,
Self::Save => ph::FLOPPY_DISK,
Self::Send => ph::PAPER_PLANE_TILT,
Self::Refresh => ph::ARROW_CLOCKWISE,
Self::Search => ph::MAGNIFYING_GLASS,
Self::Filter => ph::FUNNEL,
Self::Share => ph::SHARE,
Self::DotsHorizontal => ph::DOTS_THREE,
Self::DotsVertical => ph::DOTS_THREE_VERTICAL,
Self::Menu => ph::LIST,
Self::Server => ph::HARD_DRIVES,
Self::Database => ph::DATABASE,
Self::Cpu => ph::CPU,
Self::Cloud => ph::CLOUD,
Self::Globe => ph::GLOBE,
Self::Network => ph::NETWORK,
Self::Activity => ph::ACTIVITY,
Self::Lightning => ph::LIGHTNING,
Self::Package => ph::PACKAGE,
Self::Rocket => ph::ROCKET,
Self::Recycle => ph::RECYCLE,
Self::File => ph::FILE,
Self::FileCode => ph::FILE_CODE,
Self::FileText => ph::FILE_TEXT,
Self::Folder => ph::FOLDER,
Self::FolderOpen => ph::FOLDER_OPEN,
Self::Code => ph::CODE,
Self::Terminal => ph::TERMINAL_WINDOW,
Self::Bug => ph::BUG,
Self::Brain => ph::BRAIN,
Self::GitBranch => ph::GIT_BRANCH,
Self::GitCommit => ph::GIT_COMMIT,
Self::GitPullRequest => ph::GIT_PULL_REQUEST,
Self::Lock => ph::LOCK,
Self::Unlock => ph::LOCK_OPEN,
Self::Key => ph::KEY,
Self::Shield => ph::SHIELD,
Self::ShieldCheck => ph::SHIELD_CHECK,
Self::Eye => ph::EYE,
Self::EyeSlash => ph::EYE_SLASH,
Self::Bell => ph::BELL,
Self::BellOff => ph::BELL_SLASH,
Self::Envelope => ph::ENVELOPE,
Self::Chat => ph::CHAT_CIRCLE,
Self::User => ph::USER,
Self::Users => ph::USERS,
Self::UserCircle => ph::USER_CIRCLE,
Self::UserGear => ph::USER_GEAR,
Self::Clock => ph::CLOCK,
Self::Calendar => ph::CALENDAR,
Self::Hourglass => ph::HOURGLASS,
Self::Timer => ph::TIMER,
Self::Settings => ph::GEAR,
Self::Heart => ph::HEART,
Self::Star => ph::STAR,
Self::Bookmark => ph::BOOKMARK,
Self::Flag => ph::FLAG,
Self::Tag => ph::TAG,
Self::Pin => ph::PUSH_PIN,
Self::Link => ph::LINK,
Self::Sun => ph::SUN,
Self::Moon => ph::MOON,
Self::Bullet => ph::DOT,
Self::Leaf => ph::LEAF,
Self::Glyph(s) => s,
Self::Custom(_) => "?",
}
}
pub(crate) fn glyph(self) -> Option<&'static str> {
match self {
Self::Custom(_) => None,
other => Some(other.codepoint()),
}
}
}
fn paint_glyph(painter: &Painter, rect: Rect, color: Color32, codepoint: &str) {
let size = rect.width() * 0.95;
painter.text(
rect.center(),
Align2::CENTER_CENTER,
codepoint,
FontId::new(size, FontFamily::Proportional),
color,
);
}