Skip to main content

iris_hub/ui/components/
empty_state.rs

1//! # Empty State Component
2//! 
3//! Componente exibido quando não há aplicações configuradas.
4//! Mostra uma mensagem de boas-vindas e botão para criar primeira app.
5
6use eframe::egui::{self, RichText};
7use crate::ui::theme::ThemeColors;
8
9/// Renderiza o estado vazio (quando não há aplicações).
10/// 
11/// # Argumentos
12/// * `ui` - Contexto de UI do egui
13/// 
14/// # Retorno
15/// `true` se o botão de criar app foi clicado
16pub fn render_empty_state(ui: &mut egui::Ui) -> bool {
17    let mut create_clicked = false;
18    
19    ui.vertical_centered(|ui| {
20        ui.add_space(80.0);
21        
22        // Ícone grande com container
23        egui::Frame::none()
24            .fill(egui::Color32::from_rgb(30, 30, 38))
25            .rounding(24.0)
26            .inner_margin(egui::Margin::same(32.0))
27            .show(ui, |ui| {
28                ui.label(RichText::new("🌈").size(56.0));
29            });
30        
31        ui.add_space(28.0);
32        
33        ui.label(
34            RichText::new("Bem-vindo ao Iris!")
35                .size(28.0)
36                .strong()
37                .color(ThemeColors::TEXT_PRIMARY),
38        );
39        
40        ui.add_space(8.0);
41        
42        ui.label(
43            RichText::new("Seu hub de aplicações está vazio")
44                .size(16.0)
45                .color(egui::Color32::from_rgb(140, 140, 150)),
46        );
47        
48        ui.add_space(24.0);
49        
50        // Botão de criar primeira app
51        let btn = egui::Button::new(
52            RichText::new("➕  Criar primeira aplicação")
53                .size(15.0)
54                .color(ThemeColors::TEXT_PRIMARY),
55        )
56        .fill(ThemeColors::BTN_PRIMARY)
57        .rounding(12.0)
58        .min_size(egui::vec2(220.0, 44.0));
59        
60        if ui.add(btn).clicked() {
61            create_clicked = true;
62        }
63        
64        ui.add_space(16.0);
65        
66        ui.label(
67            RichText::new("Configure comandos, escolha um ícone e execute com um clique!")
68                .size(12.0)
69                .color(ThemeColors::TEXT_MUTED),
70        );
71    });
72    
73    create_clicked
74}
75
76/// Renderiza o estado de busca vazia (nenhum resultado encontrado).
77/// 
78/// # Argumentos
79/// * `ui` - Contexto de UI do egui
80/// * `search_term` - Termo de busca que não retornou resultados
81pub fn render_no_results(ui: &mut egui::Ui, search_term: &str) {
82    ui.vertical_centered(|ui| {
83        ui.add_space(60.0);
84        
85        egui::Frame::none()
86            .fill(egui::Color32::from_rgb(28, 28, 35))
87            .rounding(16.0)
88            .inner_margin(egui::Margin::same(24.0))
89            .show(ui, |ui| {
90                ui.label(RichText::new("🔍").size(32.0));
91                ui.add_space(12.0);
92                ui.label(
93                    RichText::new("Nenhuma aplicação encontrada")
94                        .size(16.0)
95                        .color(ThemeColors::TEXT_SECONDARY),
96                );
97                ui.add_space(4.0);
98                ui.label(
99                    RichText::new(format!("Nenhum resultado para \"{}\".", search_term))
100                        .size(13.0)
101                        .color(ThemeColors::TEXT_MUTED),
102                );
103            });
104    });
105}