Skip to main content

iris_hub/ui/components/
header.rs

1//! # Header Component
2//! 
3//! Componente de cabeçalho da aplicação.
4//! Inclui logo, título, campo de busca e botão de nova aplicação.
5
6use eframe::egui::{self, RichText};
7use crate::ui::theme::ThemeColors;
8
9/// Resultado das interações com o header
10pub struct HeaderActions {
11    pub add_app_clicked: bool,
12    pub export_clicked: bool,
13    pub import_clicked: bool,
14}
15
16impl Default for HeaderActions {
17    fn default() -> Self {
18        Self {
19            add_app_clicked: false,
20            export_clicked: false,
21            import_clicked: false,
22        }
23    }
24}
25
26/// Renderiza o cabeçalho da aplicação.
27/// 
28/// # Argumentos
29/// * `ui` - Contexto de UI do egui
30/// * `search_filter` - Referência mutável ao filtro de busca
31/// 
32/// # Retorno
33/// `HeaderActions` com os botões que foram clicados
34pub fn render_header(ui: &mut egui::Ui, search_filter: &mut String) -> HeaderActions {
35    let mut actions = HeaderActions::default();
36    
37    ui.horizontal(|ui| {
38        // Logo e título
39        ui.heading(RichText::new("🌈").size(32.0));
40        ui.add_space(8.0);
41        ui.vertical(|ui| {
42            ui.add_space(2.0);
43            ui.label(
44                RichText::new("Iris")
45                    .size(24.0)
46                    .strong()
47                    .color(ThemeColors::TEXT_PRIMARY),
48            );
49            ui.label(
50                RichText::new("Mensageira dos Devs")
51                    .size(11.0)
52                    .color(egui::Color32::from_rgb(140, 140, 150)),
53            );
54        });
55
56        ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
57            // Botão Nova Aplicação
58            let add_btn = egui::Button::new(
59                RichText::new("➕  Nova Aplicação")
60                    .size(14.0)
61                    .color(ThemeColors::TEXT_PRIMARY),
62            )
63            .fill(ThemeColors::BTN_PRIMARY)
64            .rounding(10.0)
65            .min_size(egui::vec2(140.0, 38.0));
66            
67            if ui.add(add_btn).clicked() {
68                actions.add_app_clicked = true;
69            }
70
71            ui.add_space(8.0);
72
73            // Menu de configurações
74            ui.menu_button(
75                RichText::new("⚙")
76                    .size(16.0)
77                    .color(ThemeColors::TEXT_SECONDARY),
78                |ui| {
79                    ui.set_min_width(160.0);
80                    
81                    if ui.button("📤  Exportar configurações").clicked() {
82                        actions.export_clicked = true;
83                        ui.close_menu();
84                    }
85                    
86                    if ui.button("📥  Importar configurações").clicked() {
87                        actions.import_clicked = true;
88                        ui.close_menu();
89                    }
90                    
91                    ui.separator();
92                    
93                    ui.label(
94                        RichText::new("Compartilhe suas configurações!")
95                            .size(10.0)
96                            .color(egui::Color32::from_rgb(120, 120, 130))
97                    );
98                }
99            );
100
101            ui.add_space(16.0);
102
103            // Campo de busca
104            egui::Frame::none()
105                .fill(ThemeColors::BG_INPUT)
106                .rounding(10.0)
107                .inner_margin(egui::Margin::symmetric(12.0, 8.0))
108                .show(ui, |ui| {
109                    ui.horizontal(|ui| {
110                        ui.label(
111                            RichText::new("🔍")
112                                .size(14.0)
113                                .color(egui::Color32::from_rgb(120, 120, 130)),
114                        );
115                        ui.add(
116                            egui::TextEdit::singleline(search_filter)
117                                .desired_width(180.0)
118                                .frame(false)
119                                .hint_text(
120                                    RichText::new("Buscar aplicações...")
121                                        .color(ThemeColors::TEXT_MUTED)
122                                ),
123                        );
124                    });
125                });
126        });
127    });
128    
129    actions
130}