aboutsummaryrefslogtreecommitdiffstats
path: root/default-plugins/session-manager/src/ui/welcome_screen.rs
blob: ccf20c50a0b07942aeb2ba74fa8c225beedefcb7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
static BANNER: &str = "
██╗  ██╗██╗    ███████╗██████╗  ██████╗ ███╗   ███╗    ███████╗███████╗██╗     ██╗     ██╗     ██╗██╗
██║  ██║██║    ██╔════╝██╔══██╗██╔═══██╗████╗ ████║    ╚══███╔╝██╔════╝██║     ██║     ██║     ██║██║
███████║██║    █████╗  ██████╔╝██║   ██║██╔████╔██║      ███╔╝ █████╗  ██║     ██║     ██║     ██║██║
██╔══██║██║    ██╔══╝  ██╔══██╗██║   ██║██║╚██╔╝██║     ███╔╝  ██╔══╝  ██║     ██║     ██║██   ██║╚═╝
██║  ██║██║    ██║     ██║  ██║╚██████╔╝██║ ╚═╝ ██║    ███████╗███████╗███████╗███████╗██║╚█████╔╝██╗
╚═╝  ╚═╝╚═╝    ╚═╝     ╚═╝  ╚═╝ ╚═════╝ ╚═╝     ╚═╝    ╚══════╝╚══════╝╚══════╝╚══════╝╚═╝ ╚════╝ ╚═╝
";

static SMALL_BANNER: &str = "
██╗  ██╗██╗    ██╗
██║  ██║██║    ██║
███████║██║    ██║
██╔══██║██║    ╚═╝
██║  ██║██║    ██╗
╚═╝  ╚═╝╚═╝    ╚═╝
";

static MEDIUM_BANNER: &str = "
██╗  ██╗██╗    ████████╗██╗  ██╗███████╗██████╗ ███████╗    ██╗
██║  ██║██║    ╚══██╔══╝██║  ██║██╔════╝██╔══██╗██╔════╝    ██║
███████║██║       ██║   ███████║█████╗  ██████╔╝█████╗      ██║
██╔══██║██║       ██║   ██╔══██║██╔══╝  ██╔══██╗██╔══╝      ╚═╝
██║  ██║██║       ██║   ██║  ██║███████╗██║  ██║███████╗    ██╗
╚═╝  ╚═╝╚═╝       ╚═╝   ╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝╚══════╝    ╚═╝                 
";

pub fn render_banner(x: usize, y: usize, rows: usize, cols: usize) {
    if rows >= 8 {
        if cols > 100 {
            println!("\u{1b}[{}H", y + rows.saturating_sub(8) / 2);
            for line in BANNER.lines() {
                println!("\u{1b}[{}C{}", x.saturating_sub(1), line);
            }
        } else if cols > 63 {
            println!("\u{1b}[{}H", y + rows.saturating_sub(8) / 2);
            let x = (cols.saturating_sub(63) as f64 / 2.0) as usize;
            for line in MEDIUM_BANNER.lines() {
                println!("\u{1b}[{}C{}", x, line);
            }
        } else {
            println!("\u{1b}[{}H", y + rows.saturating_sub(8) / 2);
            let x = (cols.saturating_sub(18) as f64 / 2.0) as usize;
            for line in SMALL_BANNER.lines() {
                println!("\u{1b}[{}C{}", x, line);
            }
        }
    } else if rows > 2 {
        println!(
            "\u{1b}[{};{}H\u{1b}[1mHi from Zellij!",
            (y + rows / 2) + 1,
            (x + cols.saturating_sub(15) / 2).saturating_sub(1)
        );
    }
}

pub fn render_welcome_boundaries(rows: usize, cols: usize) {
    let width_of_main_menu = std::cmp::min(cols, 101);
    let has_room_for_logos = cols.saturating_sub(width_of_main_menu) > 100;
    let left_boundary_x = (cols.saturating_sub(width_of_main_menu) as f64 / 2.0).floor() as usize;
    let right_boundary_x = left_boundary_x + width_of_main_menu;
    let y_starting_point = rows.saturating_sub(15) / 2;
    let middle_row =
        (y_starting_point + rows.saturating_sub(y_starting_point) / 2).saturating_sub(1);
    for i in y_starting_point..rows {
        if i == middle_row {
            if has_room_for_logos {
                print!("\u{1b}[{};{}H┤", i + 1, left_boundary_x + 1);
                print!(
                    "\u{1b}[m\u{1b}[{};{}H├\u{1b}[K",
                    i + 1,
                    right_boundary_x + 1
                );
                print!("\u{1b}[{};{}H", i + 1, left_boundary_x.saturating_sub(9));
                for _ in 0..10 {
                    print!("─");
                }
                print!("\u{1b}[{};{}H", i + 1, right_boundary_x + 2);
                for _ in 0..10 {
                    print!("─");
                }
            } else {
                print!("\u{1b}[{};{}H│", i + 1, left_boundary_x + 1);
                print!(
                    "\u{1b}[m\u{1b}[{};{}H│\u{1b}[K",
                    i + 1,
                    right_boundary_x + 1
                );
            }
        } else {
            if i == y_starting_point {
                print!("\u{1b}[{};{}H┌", i + 1, left_boundary_x + 1);
                print!(
                    "\u{1b}[m\u{1b}[{};{}H┐\u{1b}[K",
                    i + 1,
                    right_boundary_x + 1
                );
            } else if i == rows.saturating_sub(1) {
                print!("\u{1b}[{};{}H└", i + 1, left_boundary_x + 1);
                print!(
                    "\u{1b}[m\u{1b}[{};{}H┘\u{1b}[K",
                    i + 1,
                    right_boundary_x + 1
                );
            } else {
                print!("\u{1b}[{};{}H│", i + 1, left_boundary_x + 1);
                print!(
                    "\u{1b}[m\u{1b}[{};{}H│\u{1b}[K",
                    i + 1,
                    right_boundary_x + 1
                ); // this includes some
                   // ANSI magic to delete
                   // everything after this
                   // boundary in order to
                   // fix some rendering
                   // bugs in the legacy
                   // components of this
                   // plugin
            }
        }
    }
    if rows.saturating_sub(y_starting_point) > 25 && has_room_for_logos {
        for (i, line) in LOGO.lines().enumerate() {
            print!(
                "\u{1b}[{};{}H{}",
                middle_row.saturating_sub(12) + i,
                0,
                line
            );
        }
        for (i, line) in LOGO.lines().enumerate() {
            print!(
                "\u{1b}[{};{}H{}",
                middle_row.saturating_sub(12) + i,
                cols.saturating_sub(47),
                line
            );
        }
    }
}
static LOGO: &str = r#"                                                
                                                
                    _y$ y@g_                    
                 ya@@@@L4@@@@gy_                
               u@@@@@@F "@@@@@@@@y_             
          _a@@, @@@P~` __ ~T@@@@@@@@g           
      _yg@@@@@$ "~ _yg@@@@gy `~PR@F~_yggy_      
    y$@@@@@@PF  _y$@@@@@@@@@@gy_   4@@@@@@@y_   
   g@@@@@F~ _yg@@@@@@@@@@@@@@@@@@g_  ~F@@@@@@   
   $@@@F  yg@@@@@@@@@@@@@@@@@@@@@@@@gy  9@@F"   
   $@@@$ 4@@@@@@~@@@@@@@@@@@@@@@@@@@@@  "_yg$   
   $@@@$ 4@@@@@   ~@@@@@@@@@@@@@@@@@@@  g@@@@   
   $@@@$ 4@@@@@@y   ~@@@@@@@@@@@@@@@@@  $@@@F   
   $@@@$ 4@@@@@@@@y   ~@@@@@@@@@@@@@@@  `~_y_   
   $@@@$ 4@@@@@@@P`  _g@@@@@@@@@@@@@@@  y@@@@   
   $@@@$ 4@@@@@P`  _y@@@@@@@@@@@@@@@@@  4@@@@   
   $@@@$ 4@@@@$_  y@@@@@         $@@@@  4@@@@   
   $@@@$ 4@@@@@@g@@@@@@@@@@@@@@@@@@@@@   ~@@@   
   $@@P   7R@@@@@@@@@@@@@@@@@@@@@@@@P~ _@g_7@   
   ~~_yg@gy_ ~5@@@@@@@@@@@@@@@@@@F~ _yg@@@@y    
     R@@@@@@@   ~~@@@@@@@@@@@P~` ya@@@@@@@@F    
       ~5@@@@ 4@gy `~4@@@@F~   y@@@@@@@P~`      
          `~P 4@@@@gy_ `` _yr a@@@@@F~          
               5@@@@@@@gg@@~_g@@@~`             
                 ~~@@@@@@@^y@F~                 
                    `~4@F  ~                    
                                                
                                                "#;