ai_code_buddy/widget_states/
credits.rs1use 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}