adding visual to the desktop gui

This commit is contained in:
frostyripper1
2026-05-20 11:30:59 +02:00
parent 8128e8cb13
commit 364eb30a14
6 changed files with 104 additions and 1 deletions
+104 -1
View File
@@ -1,4 +1,4 @@
use eframe::egui::{self, RichText};
use eframe::egui::{self, Color32, RichText};
use serde_json::Value;
use std::sync::mpsc;
use std::thread;
@@ -10,6 +10,92 @@ fn pretty_json(text: &str) -> String {
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
enum GuiTheme {
Ocean,
Cyberpunk,
Venom,
Rick,
}
impl GuiTheme {
fn all() -> &'static [GuiTheme] {
&[GuiTheme::Ocean, GuiTheme::Cyberpunk, GuiTheme::Venom, GuiTheme::Rick]
}
fn name(&self) -> &'static str {
match self {
GuiTheme::Ocean => "Ocean",
GuiTheme::Cyberpunk => "Cyberpunk 2077",
GuiTheme::Venom => "Venom",
GuiTheme::Rick => "Rick",
}
}
fn colors(&self) -> (Color32, Color32, Color32, Color32, Color32, Color32) {
match self {
GuiTheme::Ocean => (
Color32::from_rgb(0x0a, 0x0a, 0x0f),
Color32::from_rgb(0x12, 0x12, 0x1a),
Color32::from_rgb(0x1a, 0x1a, 0x24),
Color32::from_rgb(0x2a, 0x2a, 0x3a),
Color32::from_rgb(0x00, 0xe5, 0xff),
Color32::from_rgb(0xe0, 0xe0, 0xe8),
),
GuiTheme::Cyberpunk => (
Color32::from_rgb(0x0a, 0x02, 0x08),
Color32::from_rgb(0x0f, 0x04, 0x16),
Color32::from_rgb(0x1a, 0x0a, 0x24),
Color32::from_rgb(0x2b, 0x4e, 0x76),
Color32::from_rgb(0xa7, 0x21, 0xbe),
Color32::from_rgb(0xe8, 0xe0, 0xea),
),
GuiTheme::Venom => (
Color32::from_rgb(0x00, 0x00, 0x00),
Color32::from_rgb(0x05, 0x05, 0x05),
Color32::from_rgb(0x0e, 0x0e, 0x0e),
Color32::from_rgb(0x1a, 0x1a, 0x1a),
Color32::from_rgb(0xea, 0xea, 0xea),
Color32::from_rgb(0xea, 0xea, 0xea),
),
GuiTheme::Rick => (
Color32::from_rgb(0x00, 0x00, 0x00),
Color32::from_rgb(0x02, 0x04, 0x02),
Color32::from_rgb(0x08, 0x0a, 0x06),
Color32::from_rgb(0x1a, 0x30, 0x14),
Color32::from_rgb(0x9d, 0xd6, 0x3b),
Color32::from_rgb(0xda, 0xf0, 0xc8),
),
}
}
fn apply(&self, ctx: &egui::Context) {
let (bg, surface, surface2, border, accent, text) = self.colors();
let mut v = egui::Visuals::dark();
v.override_text_color = Some(text);
v.extreme_bg_color = bg;
v.window_fill = surface;
v.panel_fill = surface;
v.faint_bg_color = surface2;
v.code_bg_color = surface2;
v.hyperlink_color = accent;
v.selection = egui::style::Selection {
bg_fill: accent.linear_multiply(0.3),
stroke: egui::Stroke::new(1.0, accent),
};
v.widgets.noninteractive.bg_fill = surface2;
v.widgets.noninteractive.weak_bg_fill = surface;
v.widgets.noninteractive.bg_stroke = egui::Stroke::new(1.0, border);
v.widgets.inactive.bg_fill = surface2;
v.widgets.inactive.weak_bg_fill = surface;
v.widgets.inactive.bg_stroke = egui::Stroke::new(1.0, border);
v.widgets.hovered.bg_fill = accent.linear_multiply(0.15);
v.widgets.hovered.bg_stroke = egui::Stroke::new(1.0, accent);
v.widgets.hovered.fg_stroke = egui::Stroke::new(1.5, accent);
v.widgets.active.bg_fill = accent.linear_multiply(0.25);
v.widgets.active.bg_stroke = egui::Stroke::new(1.0, accent);
v.widgets.active.fg_stroke = egui::Stroke::new(2.0, accent);
ctx.set_visuals(v);
}
}
pub fn run_gui(server_url: &str) {
let options = eframe::NativeOptions {
viewport: egui::ViewportBuilder::default()
@@ -71,6 +157,7 @@ type Msg = (String, GuiMsg);
struct AirustGui {
server_url: String,
mode: AppMode,
theme: GuiTheme,
active_tab: Tab,
chat_input: String,
chat_log: String,
@@ -106,6 +193,7 @@ impl AirustGui {
Self {
server_url: server_url.to_string(),
mode: AppMode::Startup,
theme: GuiTheme::Ocean,
active_tab: Tab::Chat,
chat_input: String::new(),
chat_log: String::from("AiRust — Cyber Operator\n\n"),
@@ -187,6 +275,8 @@ impl AirustGui {
impl eframe::App for AirustGui {
fn ui(&mut self, ui: &mut egui::Ui, _frame: &mut eframe::Frame) {
self.theme.apply(ui.ctx());
while let Ok((label, msg)) = self.rx.try_recv() {
let target = match msg {
GuiMsg::Set(t) => t,
@@ -284,6 +374,19 @@ impl AirustGui {
*active = *tab;
}
}
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
ui.label(RichText::new("Theme:").size(12.0));
egui::ComboBox::from_id_salt("theme_combo")
.selected_text(self.theme.name())
.width(130.0)
.show_ui(ui, |ui| {
for t in GuiTheme::all() {
if ui.selectable_label(*t == self.theme, t.name()).clicked() {
self.theme = *t;
}
}
});
});
});
});