Skip to content

Commit b02e32f

Browse files
committed
Add dark/light theme toggle (light theme WIP)
1 parent c7a326b commit b02e32f

File tree

11 files changed

+185
-88
lines changed

11 files changed

+185
-88
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "objdiff"
3-
version = "0.3.3"
3+
version = "0.3.4"
44
edition = "2021"
55
rust-version = "1.65"
66
authors = ["Luke Street <luke@street.dev>"]

src/app.rs

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,21 @@ pub struct ViewConfig {
6868
pub code_font: FontId,
6969
pub diff_colors: Vec<Color32>,
7070
pub reverse_fn_order: bool,
71+
pub theme: eframe::Theme,
72+
#[serde(skip)]
73+
pub text_color: Color32, // GRAY
74+
#[serde(skip)]
75+
pub emphasized_text_color: Color32, // LIGHT_GRAY
76+
#[serde(skip)]
77+
pub deemphasized_text_color: Color32, // DARK_GRAY
78+
#[serde(skip)]
79+
pub highlight_color: Color32, // WHITE
80+
#[serde(skip)]
81+
pub replace_color: Color32, // LIGHT_BLUE
82+
#[serde(skip)]
83+
pub insert_color: Color32, // GREEN
84+
#[serde(skip)]
85+
pub delete_color: Color32, // RED
7186
}
7287

7388
impl Default for ViewConfig {
@@ -77,6 +92,14 @@ impl Default for ViewConfig {
7792
code_font: FontId { size: 14.0, family: FontFamily::Monospace },
7893
diff_colors: DEFAULT_COLOR_ROTATION.to_vec(),
7994
reverse_fn_order: false,
95+
theme: eframe::Theme::Dark,
96+
text_color: Color32::GRAY,
97+
emphasized_text_color: Color32::LIGHT_GRAY,
98+
deemphasized_text_color: Color32::DARK_GRAY,
99+
highlight_color: Color32::WHITE,
100+
replace_color: Color32::LIGHT_BLUE,
101+
insert_color: Color32::GREEN,
102+
delete_color: Color32::from_rgb(200, 40, 41),
80103
}
81104
}
82105
}
@@ -249,7 +272,7 @@ impl eframe::App for App {
249272
let Self { config, view_state, .. } = self;
250273

251274
{
252-
let config = &view_state.view_config;
275+
let config = &mut view_state.view_config;
253276
let mut style = (*ctx.style()).clone();
254277
style.text_styles.insert(TextStyle::Body, FontId {
255278
size: (config.ui_font.size * 0.75).floor(),
@@ -262,6 +285,28 @@ impl eframe::App for App {
262285
family: config.ui_font.family.clone(),
263286
});
264287
style.text_styles.insert(TextStyle::Monospace, config.code_font.clone());
288+
match config.theme {
289+
eframe::Theme::Dark => {
290+
style.visuals = egui::Visuals::dark();
291+
config.text_color = Color32::GRAY;
292+
config.emphasized_text_color = Color32::LIGHT_GRAY;
293+
config.deemphasized_text_color = Color32::DARK_GRAY;
294+
config.highlight_color = Color32::WHITE;
295+
config.replace_color = Color32::LIGHT_BLUE;
296+
config.insert_color = Color32::GREEN;
297+
config.delete_color = Color32::from_rgb(200, 40, 41);
298+
}
299+
eframe::Theme::Light => {
300+
style.visuals = egui::Visuals::light();
301+
config.text_color = Color32::GRAY;
302+
config.emphasized_text_color = Color32::DARK_GRAY;
303+
config.deemphasized_text_color = Color32::LIGHT_GRAY;
304+
config.highlight_color = Color32::BLACK;
305+
config.replace_color = Color32::DARK_BLUE;
306+
config.insert_color = Color32::DARK_GREEN;
307+
config.delete_color = Color32::from_rgb(200, 40, 41);
308+
}
309+
}
265310
ctx.set_style(style);
266311
}
267312

@@ -323,6 +368,20 @@ impl eframe::App for App {
323368
}
324369

325370
egui::Window::new("Config").open(&mut view_state.show_config).show(ctx, |ui| {
371+
egui::ComboBox::from_label("Theme")
372+
.selected_text(format!("{:?}", view_state.view_config.theme))
373+
.show_ui(ui, |ui| {
374+
ui.selectable_value(
375+
&mut view_state.view_config.theme,
376+
eframe::Theme::Dark,
377+
"Dark",
378+
);
379+
ui.selectable_value(
380+
&mut view_state.view_config.theme,
381+
eframe::Theme::Light,
382+
"Light",
383+
);
384+
});
326385
ui.label("UI font:");
327386
egui::introspection::font_id_ui(ui, &mut view_state.view_config.ui_font);
328387
ui.separator();
@@ -359,15 +418,15 @@ impl eframe::App for App {
359418
{
360419
ui.scope(|ui| {
361420
ui.style_mut().override_text_style = Some(TextStyle::Monospace);
362-
ui.colored_label(Color32::LIGHT_BLUE, &demangled);
421+
ui.colored_label(view_state.view_config.replace_color, &demangled);
363422
});
364423
if ui.button("Copy").clicked() {
365424
ui.output_mut(|output| output.copied_text = demangled);
366425
}
367426
} else {
368427
ui.scope(|ui| {
369428
ui.style_mut().override_text_style = Some(TextStyle::Monospace);
370-
ui.colored_label(Color32::LIGHT_RED, "[invalid]");
429+
ui.colored_label(view_state.view_config.replace_color, "[invalid]");
371430
});
372431
}
373432
});

src/diff.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,9 @@ pub fn diff_objs(left: &mut ObjInfo, right: &mut ObjInfo, _diff_config: &DiffCon
406406
}
407407
}
408408
} else {
409-
let Some(right_section) = right.sections.iter_mut().find(|s| s.name == left_section.name) else {
409+
let Some(right_section) =
410+
right.sections.iter_mut().find(|s| s.name == left_section.name)
411+
else {
410412
continue;
411413
};
412414
if left_section.kind == ObjSectionKind::Data {

src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ fn main() {
3737

3838
let exec_path: Rc<Mutex<Option<PathBuf>>> = Rc::new(Mutex::new(None));
3939
let exec_path_clone = exec_path.clone();
40-
let mut native_options = eframe::NativeOptions::default();
40+
let mut native_options =
41+
eframe::NativeOptions { follow_system_theme: false, ..Default::default() };
4142
match load_icon() {
4243
Ok(data) => {
4344
native_options.icon_data = Some(data);

src/views/config.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::sync::{Arc, RwLock};
55
#[cfg(windows)]
66
use anyhow::{Context, Result};
77
use const_format::formatcp;
8-
use egui::{output::OpenUrl, Color32};
8+
use egui::output::OpenUrl;
99
use self_update::cargo_crate_version;
1010

1111
use crate::{
@@ -79,7 +79,7 @@ pub fn config_ui(ui: &mut egui::Ui, config: &Arc<RwLock<AppConfig>>, view_state:
7979
if let Some(state) = &view_state.check_update {
8080
ui.label(format!("Latest version: {}", state.latest_release.version));
8181
if state.update_available {
82-
ui.colored_label(Color32::LIGHT_GREEN, "Update available");
82+
ui.colored_label(view_state.view_config.insert_color, "Update available");
8383
ui.horizontal(|ui| {
8484
if state.found_binary
8585
&& ui

src/views/data_diff.rs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
use std::{cmp::min, default::Default, mem::take};
22

3-
use egui::{text::LayoutJob, Align, Color32, Label, Layout, Sense, Vec2};
3+
use egui::{text::LayoutJob, Align, Label, Layout, Sense, Vec2};
44
use egui_extras::{Column, TableBuilder};
55
use time::format_description;
66

77
use crate::{
88
app::{SymbolReference, View, ViewConfig, ViewState},
99
jobs::Job,
1010
obj::{ObjDataDiff, ObjDataDiffKind, ObjInfo, ObjSection},
11-
views::{write_text, COLOR_RED},
11+
views::write_text,
1212
};
1313

1414
const BYTES_PER_ROW: usize = 16;
@@ -24,17 +24,17 @@ fn data_row_ui(ui: &mut egui::Ui, address: usize, diffs: &[ObjDataDiff], config:
2424
let mut job = LayoutJob::default();
2525
write_text(
2626
format!("{address:08X}: ").as_str(),
27-
Color32::GRAY,
27+
config.text_color,
2828
&mut job,
2929
config.code_font.clone(),
3030
);
3131
let mut cur_addr = 0usize;
3232
for diff in diffs {
3333
let base_color = match diff.kind {
34-
ObjDataDiffKind::None => Color32::GRAY,
35-
ObjDataDiffKind::Replace => Color32::LIGHT_BLUE,
36-
ObjDataDiffKind::Delete => COLOR_RED,
37-
ObjDataDiffKind::Insert => Color32::GREEN,
34+
ObjDataDiffKind::None => config.text_color,
35+
ObjDataDiffKind::Replace => config.replace_color,
36+
ObjDataDiffKind::Delete => config.delete_color,
37+
ObjDataDiffKind::Insert => config.insert_color,
3838
};
3939
if diff.data.is_empty() {
4040
let mut str = " ".repeat(diff.len);
@@ -58,15 +58,15 @@ fn data_row_ui(ui: &mut egui::Ui, address: usize, diffs: &[ObjDataDiff], config:
5858
let mut str = " ".to_string();
5959
str.push_str(" ".repeat(n).as_str());
6060
str.push_str(" ".repeat(n / 8).as_str());
61-
write_text(str.as_str(), Color32::GRAY, &mut job, config.code_font.clone());
61+
write_text(str.as_str(), config.text_color, &mut job, config.code_font.clone());
6262
}
63-
write_text(" ", Color32::GRAY, &mut job, config.code_font.clone());
63+
write_text(" ", config.text_color, &mut job, config.code_font.clone());
6464
for diff in diffs {
6565
let base_color = match diff.kind {
66-
ObjDataDiffKind::None => Color32::GRAY,
67-
ObjDataDiffKind::Replace => Color32::LIGHT_BLUE,
68-
ObjDataDiffKind::Delete => COLOR_RED,
69-
ObjDataDiffKind::Insert => Color32::GREEN,
66+
ObjDataDiffKind::None => config.text_color,
67+
ObjDataDiffKind::Replace => config.replace_color,
68+
ObjDataDiffKind::Delete => config.delete_color,
69+
ObjDataDiffKind::Insert => config.insert_color,
7070
};
7171
if diff.data.is_empty() {
7272
write_text(
@@ -163,7 +163,8 @@ fn data_table_ui(
163163

164164
pub fn data_diff_ui(ui: &mut egui::Ui, view_state: &mut ViewState) -> bool {
165165
let mut rebuild = false;
166-
let (Some(result), Some(selected_symbol)) = (&view_state.build, &view_state.selected_symbol) else {
166+
let (Some(result), Some(selected_symbol)) = (&view_state.build, &view_state.selected_symbol)
167+
else {
167168
return rebuild;
168169
};
169170

@@ -188,7 +189,10 @@ pub fn data_diff_ui(ui: &mut egui::Ui, view_state: &mut ViewState) -> bool {
188189
ui.scope(|ui| {
189190
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
190191
ui.style_mut().wrap = Some(false);
191-
ui.colored_label(Color32::WHITE, &selected_symbol.symbol_name);
192+
ui.colored_label(
193+
view_state.view_config.highlight_color,
194+
&selected_symbol.symbol_name,
195+
);
192196
ui.label("Diff target:");
193197
});
194198
},

0 commit comments

Comments
 (0)