From 7f94c8c0cc9eae6c8edd0b85dbcb245ade7bf53e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkan=20I=C5=9EIK?= Date: Wed, 24 Jun 2026 08:42:20 +0300 Subject: [PATCH] fix: make language selector combobox and dropdown theme-aware (dark/light) --- src/ui/combobox.rs | 14 +++++++-- src/ui/combobox_stil.rs | 67 +++++++++++++++++++++-------------------- 2 files changed, 47 insertions(+), 34 deletions(-) diff --git a/src/ui/combobox.rs b/src/ui/combobox.rs index f5b16b9..6225937 100644 --- a/src/ui/combobox.rs +++ b/src/ui/combobox.rs @@ -1,5 +1,5 @@ use eframe::egui::{self, Rect, Vec2}; -use super::combobox_stil::{draw_gradient_bg, DROPDOWN_TEXT_COLOR}; +use super::combobox_stil::draw_gradient_bg; /// Stil uygulanmış ComboBox oluşturur (genişlik ayarı yapılmaz, Grid içinde kullanım için). pub fn combo_box( @@ -48,13 +48,14 @@ pub fn selectable_value( draw_gradient_bg(ui, rect); + let text_color = combobox_stil_text_color(ui); let painter = ui.painter(); painter.text( egui::pos2(rect.left() + 6.0, rect.center().y), egui::Align2::LEFT_CENTER, label, egui::FontId::proportional(14.0), - DROPDOWN_TEXT_COLOR, + text_color, ); if response.clicked() { @@ -63,6 +64,15 @@ pub fn selectable_value( response.on_hover_cursor(egui::CursorIcon::PointingHand) } +fn combobox_stil_text_color(ui: &egui::Ui) -> egui::Color32 { + let bg = ui.visuals().panel_fill; + if bg.r() < 128 && bg.g() < 128 && bg.b() < 128 { + egui::Color32::from_rgb(230, 230, 240) + } else { + egui::Color32::from_rgb(50, 50, 50) + } +} + /// ComboBox dropdown öğesi — özel içerik çizmek için (ör. bayrak + metin). /// `add_contents` callback'i verilen `Rect` içine içerik ekler. pub fn selectable_value_custom( diff --git a/src/ui/combobox_stil.rs b/src/ui/combobox_stil.rs index 15eafb3..96f8480 100644 --- a/src/ui/combobox_stil.rs +++ b/src/ui/combobox_stil.rs @@ -1,64 +1,67 @@ use eframe::egui::{self, Color32, Rect, Stroke}; use egui::epaint::Mesh; -// ─── ComboBox Popup Renk Sabitleri ────────────────────────── -pub const WEAK_BG_INACTIVE: Color32 = Color32::from_rgb(224, 224, 224); -pub const WEAK_BG_HOVERED: Color32 = Color32::from_rgb(200, 200, 200); -pub const WEAK_BG_ACTIVE: Color32 = Color32::from_rgb(180, 180, 180); - -// ─── Gradient Dropdown Öğesi Renkleri ─────────────────────── -pub const GRADIENT_TOP: Color32 = Color32::from_rgb(249, 249, 249); -pub const GRADIENT_BOT: Color32 = Color32::from_rgb(233, 233, 233); - -// ─── ComboBox Metin Renkleri ──────────────────────────────── -/// Seçili metin rengi (ComboBox kapalıyken widget üzerinde görünen metin) -pub const COMBO_TEXT_COLOR: Color32 = Color32::from_rgb(50, 50, 50); -/// Açılır listedeki öğelerin metin rengi -pub const DROPDOWN_TEXT_COLOR: Color32 = Color32::from_rgb(50, 50, 50); - -// ─── ComboBox Kenarlık (border) Renkleri ──────────────────── -/// Üzerine gelindiğinde / tıklanınca kenarlık rengi -pub const COMBO_BORDER_ACCENT: Color32 = Color32::from_rgb(155, 155, 155); - /// Verilen `Visuals` yapısına ComboBox stillerini uygular. pub fn apply_visuals(v: &mut egui::Visuals) { - v.widgets.inactive.weak_bg_fill = WEAK_BG_INACTIVE; - v.widgets.hovered.weak_bg_fill = WEAK_BG_HOVERED; - v.widgets.active.weak_bg_fill = WEAK_BG_ACTIVE; + v.widgets.inactive.weak_bg_fill = Color32::from_rgb(224, 224, 224); + v.widgets.hovered.weak_bg_fill = Color32::from_rgb(200, 200, 200); + v.widgets.active.weak_bg_fill = Color32::from_rgb(180, 180, 180); - v.widgets.inactive.fg_stroke = Stroke::new(1.0, COMBO_TEXT_COLOR); + v.widgets.inactive.fg_stroke = Stroke::new(1.0, Color32::from_rgb(50, 50, 50)); v.widgets.hovered.fg_stroke = Stroke::new(1.5, Color32::WHITE); v.widgets.active.fg_stroke = Stroke::new(2.0, Color32::WHITE); - // Kenarlıklar - v.widgets.inactive.bg_stroke = Stroke::new(1.0, COMBO_BORDER_ACCENT); - v.widgets.hovered.bg_stroke = Stroke::new(1.0, COMBO_BORDER_ACCENT); - v.widgets.active.bg_stroke = Stroke::new(1.0, COMBO_BORDER_ACCENT); + v.widgets.inactive.bg_stroke = Stroke::new(1.0, Color32::from_rgb(155, 155, 155)); + v.widgets.hovered.bg_stroke = Stroke::new(1.0, Color32::from_rgb(155, 155, 155)); + v.widgets.active.bg_stroke = Stroke::new(1.0, Color32::from_rgb(155, 155, 155)); } -/// Açık gri gradyan mesh arkaplanı çizer (dropdown öğeleri için). +fn is_dark_ui(ui: &egui::Ui) -> bool { + let bg = ui.visuals().panel_fill; + bg.r() < 128 && bg.g() < 128 && bg.b() < 128 +} + +fn gradient_top(ui: &egui::Ui) -> Color32 { + if is_dark_ui(ui) { + Color32::from_rgb(40, 40, 45) + } else { + Color32::from_rgb(249, 249, 249) + } +} + +fn gradient_bot(ui: &egui::Ui) -> Color32 { + if is_dark_ui(ui) { + Color32::from_rgb(30, 30, 35) + } else { + Color32::from_rgb(233, 233, 233) + } +} + +/// Açık/koyu temaya uygun gradyan mesh arkaplanı çizer (dropdown öğeleri için). pub fn draw_gradient_bg(ui: &mut egui::Ui, rect: Rect) { + let top = gradient_top(ui); + let bot = gradient_bot(ui); let mut mesh = Mesh::default(); let idx = mesh.vertices.len() as u32; mesh.vertices.push(egui::epaint::Vertex { pos: egui::pos2(rect.left(), rect.top()), uv: egui::pos2(0.0, 0.0), - color: GRADIENT_TOP, + color: top, }); mesh.vertices.push(egui::epaint::Vertex { pos: egui::pos2(rect.right(), rect.top()), uv: egui::pos2(0.0, 0.0), - color: GRADIENT_TOP, + color: top, }); mesh.vertices.push(egui::epaint::Vertex { pos: egui::pos2(rect.right(), rect.bottom()), uv: egui::pos2(0.0, 0.0), - color: GRADIENT_BOT, + color: bot, }); mesh.vertices.push(egui::epaint::Vertex { pos: egui::pos2(rect.left(), rect.bottom()), uv: egui::pos2(0.0, 0.0), - color: GRADIENT_BOT, + color: bot, }); mesh.indices.extend_from_slice(&[idx, idx + 1, idx + 2, idx + 2, idx + 3, idx]); ui.painter().add(egui::Shape::mesh(mesh));