fix: make language selector combobox and dropdown theme-aware (dark/light)

This commit is contained in:
Erkan IŞIK
2026-06-24 08:42:20 +03:00
parent 6d0e8fa9bf
commit 7f94c8c0cc
2 changed files with 47 additions and 34 deletions
+12 -2
View File
@@ -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<T: PartialEq>(
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<T: PartialEq>(
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<R>(
+35 -32
View File
@@ -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));