ai_code_buddy/widget_states/
credits.rs

1use bevy::prelude::*;
2use ratatui::layout::{Position, Rect};
3use std::collections::HashMap;
4
5#[derive(Debug, Clone, Eq, PartialEq, Hash)]
6pub enum CreditsComponent {
7    BackToOverview,
8    ScrollUp,
9    ScrollDown,
10}
11
12#[derive(Debug, Clone, Resource)]
13pub struct CreditsWidgetState {
14    #[allow(dead_code)]
15    pub selected_component: CreditsComponent,
16    #[allow(dead_code)]
17    pub hovered_component: Option<CreditsComponent>,
18    pub registered_components: HashMap<CreditsComponent, Rect>,
19    pub scroll_offset: usize,
20    pub total_lines: usize,
21}
22
23impl Default for CreditsWidgetState {
24    fn default() -> Self {
25        Self {
26            selected_component: CreditsComponent::BackToOverview,
27            hovered_component: None,
28            registered_components: HashMap::new(),
29            scroll_offset: 0,
30            total_lines: 0,
31        }
32    }
33}
34
35impl CreditsWidgetState {
36    pub fn is_over(&self, component: CreditsComponent, x: u16, y: u16) -> bool {
37        if let Some(rect) = self.registered_components.get(&component) {
38            rect.contains(Position { x, y })
39        } else {
40            false
41        }
42    }
43
44    pub fn scroll_up(&mut self) {
45        if self.scroll_offset > 0 {
46            self.scroll_offset = self.scroll_offset.saturating_sub(5);
47        }
48    }
49
50    pub fn scroll_down(&mut self) {
51        if self.scroll_offset < self.total_lines.saturating_sub(20) {
52            self.scroll_offset += 5;
53        }
54    }
55}