1#![allow(unused_imports)]
2use crate::RatWidgetColor;
3use crate::palette::{Colors, Palette};
4use crate::theme::SalsaTheme;
5use crate::{StyleName, WidgetStyle};
6#[cfg(feature = "rat-widget")]
7use rat_widget;
8#[cfg(feature = "color-input")]
9use rat_widget_extra::color_input::ColorInputStyle;
10use ratatui_core::layout::Alignment;
11use ratatui_core::style::{Color, Style};
12use ratatui_core::symbols;
13use ratatui_core::symbols::border;
14use ratatui_widgets::block::Block;
15use ratatui_widgets::borders::Borders;
16use std::time::Duration;
17
18pub fn create_shell(p: Palette) -> SalsaTheme {
23 let mut th = SalsaTheme::new(p);
24
25 th.define_style(Style::LABEL_FG, th.p.fg_style_alias(Color::LABEL_FG));
26 th.define_style(Style::INPUT, th.p.style_alias(Color::INPUT_BG));
27 th.define_style(Style::FOCUS, th.p.high_style_alias(Color::FOCUS_BG));
28 th.define_style(Style::SELECT, th.p.style_alias(Color::SELECT_BG));
29 th.define_style(Style::DISABLED, th.p.style_alias(Color::DISABLED_BG));
30 th.define_style(Style::INVALID, th.p.style_alias(Color::INVALID_BG));
31 th.define_style(Style::HOVER, th.p.style_alias(Color::HOVER_BG));
32 th.define_style(
33 Style::TITLE,
34 th.p.fg_bg_style_alias(Color::TITLE_FG, Color::TITLE_BG),
35 );
36 th.define_style(
37 Style::HEADER,
38 th.p.fg_bg_style_alias(Color::HEADER_FG, Color::HEADER_BG),
39 );
40 th.define_style(
41 Style::FOOTER,
42 th.p.fg_bg_style_alias(Color::FOOTER_FG, Color::HEADER_BG),
43 );
44 th.define_style(
45 Style::WEEK_HEADER_FG,
46 th.p.fg_style_alias(Color::WEEK_HEADER_FG),
47 );
48 th.define_style(
49 Style::MONTH_HEADER_FG,
50 th.p.fg_style_alias(Color::MONTH_HEADER_FG),
51 );
52 th.define_style(Style::SHADOWS, th.p.style_alias(Color::SHADOW_BG));
53 th.define_style(
54 Style::INPUT_FOCUS,
55 th.p.high_style_alias(Color::INPUT_FOCUS_BG),
56 );
57 th.define_style(Style::INPUT_SELECT, th.p.style_alias(Color::SELECT_BG));
58 th.define_style(Style::KEY_BINDING, th.p.style_alias(Color::KEY_BINDING_BG));
59
60 th.define_style(Style::BUTTON_BASE, th.p.style_alias(Color::BUTTON_BASE_BG));
61 th.define_style(Style::MENU_BASE, th.p.style_alias(Color::MENU_BASE_BG));
62 th.define_style(Style::STATUS_BASE, th.p.style_alias(Color::STATUS_BASE_BG));
63
64 th.define_style(
65 Style::CONTAINER_BASE,
66 th.p.style_alias(Color::CONTAINER_BASE_BG),
67 );
68 th.define_style(
69 Style::CONTAINER_BORDER_FG,
70 th.p.fg_style_alias(Color::CONTAINER_BORDER_FG),
71 );
72 th.define_style(
73 Style::CONTAINER_ARROW_FG,
74 th.p.fg_style_alias(Color::CONTAINER_ARROW_FG),
75 );
76
77 th.define_style(
78 Style::DOCUMENT_BASE,
79 th.p.style_alias(Color::DOCUMENT_BASE_BG),
80 );
81 th.define_style(
82 Style::DOCUMENT_BORDER_FG,
83 th.p.fg_style_alias(Color::DOCUMENT_BORDER_FG),
84 );
85 th.define_style(
86 Style::DOCUMENT_ARROW_FG,
87 th.p.fg_style_alias(Color::DOCUMENT_ARROW_FG),
88 );
89
90 th.define_style(Style::POPUP_BASE, th.p.style_alias(Color::POPUP_BASE_BG));
91 th.define_style(
92 Style::POPUP_BORDER_FG,
93 th.p.fg_style_alias(Color::POPUP_BORDER_FG),
94 );
95 th.define_style(
96 Style::POPUP_ARROW_FG,
97 th.p.fg_style_alias(Color::POPUP_ARROW_FG),
98 );
99
100 th.define_style(Style::DIALOG_BASE, th.p.style_alias(Color::DIALOG_BASE_BG));
101 th.define_style(
102 Style::DIALOG_BORDER_FG,
103 th.p.fg_style_alias(Color::DIALOG_BORDER_FG),
104 );
105 th.define_style(
106 Style::DIALOG_ARROW_FG,
107 th.p.fg_style_alias(Color::DIALOG_ARROW_FG),
108 );
109
110 #[cfg(feature = "rat-widget")]
111 th.define_fn(WidgetStyle::BUTTON, button);
112 #[cfg(feature = "rat-widget")]
113 th.define_fn(WidgetStyle::CALENDAR, month);
114 #[cfg(feature = "rat-widget")]
115 th.define_fn(WidgetStyle::CHECKBOX, checkbox);
116 #[cfg(feature = "rat-widget")]
117 th.define_fn(WidgetStyle::CHOICE, choice);
118 #[cfg(feature = "rat-widget")]
119 th.define_fn(WidgetStyle::CLIPPER, clipper);
120 #[cfg(feature = "rat-widget")]
121 th.define_fn(WidgetStyle::COMBOBOX, combobox);
122 #[cfg(feature = "rat-widget")]
123 #[cfg(feature = "color-input")]
124 th.define_fn(WidgetStyle::COLOR_INPUT, color_input);
125 #[cfg(feature = "rat-widget")]
126 th.define_fn(WidgetStyle::DIALOG_FRAME, dialog_frame);
127 #[cfg(feature = "rat-widget")]
128 th.define_fn(WidgetStyle::FILE_DIALOG, file_dialog);
129 #[cfg(feature = "rat-widget")]
130 th.define_fn(WidgetStyle::FORM, form);
131 #[cfg(feature = "rat-widget")]
132 th.define_fn(WidgetStyle::LINE_NR, line_nr);
133 #[cfg(feature = "rat-widget")]
134 th.define_fn(WidgetStyle::LIST, list);
135 #[cfg(feature = "rat-widget")]
136 th.define_fn(WidgetStyle::MENU, menu);
137 #[cfg(feature = "rat-widget")]
138 th.define_fn(WidgetStyle::MONTH, month);
139 #[cfg(feature = "rat-widget")]
140 th.define_fn(WidgetStyle::MSG_DIALOG, msg_dialog);
141 #[cfg(feature = "rat-widget")]
142 th.define_fn(WidgetStyle::PARAGRAPH, paragraph);
143 #[cfg(feature = "rat-widget")]
144 th.define_fn(WidgetStyle::RADIO, radio);
145 #[cfg(feature = "rat-widget")]
146 th.define_fn(WidgetStyle::SCROLL, scroll);
147 #[cfg(feature = "rat-widget")]
148 th.define_fn(WidgetStyle::SCROLL_DIALOG, dialog_scroll);
149 #[cfg(feature = "rat-widget")]
150 th.define_fn(WidgetStyle::SCROLL_POPUP, popup_scroll);
151 #[cfg(feature = "rat-widget")]
152 th.define_fn(WidgetStyle::SHADOW, shadow);
153 #[cfg(feature = "rat-widget")]
154 th.define_fn(WidgetStyle::SLIDER, slider);
155 #[cfg(feature = "rat-widget")]
156 th.define_fn(WidgetStyle::SPLIT, split);
157 #[cfg(feature = "rat-widget")]
158 th.define_fn(WidgetStyle::STATUSLINE, statusline);
159 #[cfg(feature = "rat-widget")]
160 th.define_fn(WidgetStyle::TABBED, tabbed);
161 #[cfg(feature = "rat-widget")]
162 th.define_fn(WidgetStyle::TABLE, table);
163 #[cfg(feature = "rat-widget")]
164 th.define_fn(WidgetStyle::TEXT, text);
165 #[cfg(feature = "rat-widget")]
166 th.define_fn(WidgetStyle::TEXTAREA, textarea);
167 #[cfg(feature = "rat-widget")]
168 th.define_fn(WidgetStyle::TEXTVIEW, textview);
169 #[cfg(feature = "rat-widget")]
170 th.define_fn(WidgetStyle::TOOLBAR, toolbar);
171 #[cfg(feature = "rat-widget")]
172 th.define_fn(WidgetStyle::VIEW, view);
173
174 th
175}
176
177#[cfg(feature = "rat-widget")]
178fn button(th: &SalsaTheme) -> rat_widget::button::ButtonStyle {
179 rat_widget::button::ButtonStyle {
180 style: th.style(Style::BUTTON_BASE),
181 focus: Some(th.style(Style::FOCUS)),
182 armed: Some(th.style(Style::SELECT)),
183 hover: Some(th.p.style_alias(Color::HOVER_BG)),
184 armed_delay: Some(Duration::from_millis(50)),
185 ..Default::default()
186 }
187}
188
189#[cfg(feature = "rat-widget")]
190fn checkbox(th: &SalsaTheme) -> rat_widget::checkbox::CheckboxStyle {
191 rat_widget::checkbox::CheckboxStyle {
192 style: th.style(Style::INPUT),
193 focus: Some(th.style(Style::INPUT_FOCUS)),
194 ..Default::default()
195 }
196}
197
198#[cfg(feature = "rat-widget")]
199fn combobox(th: &SalsaTheme) -> rat_widget::combobox::ComboboxStyle {
200 rat_widget::combobox::ComboboxStyle {
201 choice: th.style(WidgetStyle::CHOICE),
202 text: th.style(WidgetStyle::TEXT),
203 ..Default::default()
204 }
205}
206
207#[cfg(feature = "rat-widget")]
208fn choice(th: &SalsaTheme) -> rat_widget::choice::ChoiceStyle {
209 rat_widget::choice::ChoiceStyle {
210 style: th.style(Style::INPUT),
211 select: Some(th.style(Style::INPUT_SELECT)),
212 focus: Some(th.style(Style::INPUT_FOCUS)),
213 popup_style: Some(th.style(Style::POPUP_BASE)),
214 popup_border: Some(th.style(Style::POPUP_BORDER_FG)),
215 popup_scroll: Some(th.style(WidgetStyle::SCROLL_POPUP)),
216 popup_block: Some(
217 Block::bordered()
218 .borders(Borders::LEFT | Borders::BOTTOM | Borders::RIGHT)
219 .border_set(border::Set {
220 top_left: "X",
221 top_right: "X",
222 bottom_left: "▀",
223 bottom_right: "▀",
224 vertical_left: "▌",
225 vertical_right: "▐",
226 horizontal_top: "X",
227 horizontal_bottom: "▀",
228 })
229 .border_style(th.style::<Style>(Style::POPUP_BORDER_FG)),
230 ),
231 ..Default::default()
232 }
233}
234
235#[cfg(feature = "rat-widget")]
236fn clipper(th: &SalsaTheme) -> rat_widget::clipper::ClipperStyle {
237 rat_widget::clipper::ClipperStyle {
238 style: th.style(Style::CONTAINER_BASE),
239 label_style: Some(th.style(Style::LABEL_FG)),
240 scroll: Some(th.style(WidgetStyle::SCROLL)),
241 ..Default::default()
242 }
243}
244
245#[cfg(feature = "rat-widget")]
246fn dialog_frame(th: &SalsaTheme) -> rat_widget::dialog_frame::DialogFrameStyle {
247 rat_widget::dialog_frame::DialogFrameStyle {
248 style: th.style(Style::DIALOG_BASE),
249 border_style: Some(th.style::<Style>(Style::DIALOG_BORDER_FG)),
250 button_style: Some(th.style(WidgetStyle::BUTTON)),
251 ..rat_widget::dialog_frame::DialogFrameStyle::default()
252 }
253}
254
255#[cfg(feature = "rat-widget")]
256fn file_dialog(th: &SalsaTheme) -> rat_widget::file_dialog::FileDialogStyle {
257 rat_widget::file_dialog::FileDialogStyle {
258 style: th.style(Style::DIALOG_BASE),
259 list: Some(th.style(WidgetStyle::LIST)),
260 roots: Some(rat_widget::list::ListStyle {
261 style: th.style(Style::DIALOG_BASE),
262 ..th.style(WidgetStyle::LIST)
263 }),
264 text: Some(th.style(WidgetStyle::TEXT)),
265 button: Some(th.style(WidgetStyle::BUTTON)),
266 block: Some(Block::bordered()),
267 ..Default::default()
268 }
269}
270
271#[cfg(feature = "rat-widget")]
272fn form(th: &SalsaTheme) -> rat_widget::form::FormStyle {
273 rat_widget::form::FormStyle {
274 style: th.style(Style::CONTAINER_BASE),
275 label_style: Some(th.style(Style::LABEL_FG)),
276 navigation: Some(th.style(Style::CONTAINER_ARROW_FG)),
277 navigation_hover: Some(th.style(Style::HOVER)),
278 block: Some(
279 Block::bordered()
280 .borders(Borders::TOP | Borders::BOTTOM)
281 .border_set(border::EMPTY)
282 .border_style(th.style::<Style>(Style::CONTAINER_BORDER_FG)),
283 ),
284 border_style: Some(th.style::<Style>(Style::CONTAINER_BORDER_FG)),
285 ..Default::default()
286 }
287}
288
289#[cfg(feature = "rat-widget")]
290fn line_nr(th: &SalsaTheme) -> rat_widget::line_number::LineNumberStyle {
291 rat_widget::line_number::LineNumberStyle {
292 style: th.style(Style::CONTAINER_BASE),
293 cursor: Some(th.style(Style::INPUT_SELECT)),
294 ..rat_widget::line_number::LineNumberStyle::default()
295 }
296}
297
298#[cfg(feature = "rat-widget")]
299fn list(th: &SalsaTheme) -> rat_widget::list::ListStyle {
300 rat_widget::list::ListStyle {
301 style: th.style(Style::CONTAINER_BASE),
302 select: Some(th.style(Style::SELECT)),
303 focus: Some(th.style(Style::FOCUS)),
304 scroll: Some(th.style(WidgetStyle::SCROLL)),
305 ..Default::default()
306 }
307}
308
309#[cfg(feature = "rat-widget")]
310fn menu(th: &SalsaTheme) -> rat_widget::menu::MenuStyle {
311 rat_widget::menu::MenuStyle {
312 style: th.style(Style::MENU_BASE),
313 title: Some(th.style(Style::TITLE)),
314 focus: Some(th.style(Style::FOCUS)),
315 right: Some(th.style(Style::KEY_BINDING)),
316 disabled: Some(th.style(Style::DISABLED)),
317 highlight: Some(Style::default().underlined()),
318 popup_block: Some(Block::bordered()),
319 popup: Default::default(),
320 popup_border: Some(th.style(Style::MENU_BASE)),
321 popup_style: Some(th.style(Style::MENU_BASE)),
322 popup_focus: Some(th.style(Style::FOCUS)),
323 popup_right: Some(th.style(Style::KEY_BINDING)),
324 popup_disabled: Some(th.style(Style::DISABLED)),
325 popup_highlight: Some(Style::default().underlined()),
326 ..Default::default()
327 }
328}
329
330#[cfg(feature = "rat-widget")]
331fn month(th: &SalsaTheme) -> rat_widget::calendar::CalendarStyle {
332 rat_widget::calendar::CalendarStyle {
333 style: th.style(Style::CONTAINER_BASE),
334 title: Some(th.style(Style::MONTH_HEADER_FG)),
335 weeknum: Some(th.style(Style::WEEK_HEADER_FG)),
336 weekday: Some(th.style(Style::WEEK_HEADER_FG)),
337 day: None,
338 select: Some(th.style(Style::SELECT)),
339 focus: Some(th.style(Style::FOCUS)),
340 ..rat_widget::calendar::CalendarStyle::default()
341 }
342}
343
344#[cfg(feature = "rat-widget")]
345fn msg_dialog(th: &SalsaTheme) -> rat_widget::msgdialog::MsgDialogStyle {
346 rat_widget::msgdialog::MsgDialogStyle {
347 style: th.style(Style::DIALOG_BASE),
348 button: Some(th.style(WidgetStyle::BUTTON)),
349 markdown_header_1: Some(th.style_style(Style::TITLE)),
350 markdown_header_n: Some(th.style_style(Style::HEADER)),
351 ..Default::default()
352 }
353}
354
355#[cfg(feature = "rat-widget")]
356fn paragraph(th: &SalsaTheme) -> rat_widget::paragraph::ParagraphStyle {
357 rat_widget::paragraph::ParagraphStyle {
358 style: th.style(Style::CONTAINER_BASE),
359 focus: Some(th.style(Style::FOCUS)),
360 scroll: Some(th.style(WidgetStyle::SCROLL)),
361 ..Default::default()
362 }
363}
364
365#[cfg(feature = "rat-widget")]
366fn radio(th: &SalsaTheme) -> rat_widget::radio::RadioStyle {
367 rat_widget::radio::RadioStyle {
368 layout: Some(rat_widget::radio::RadioLayout::Stacked),
369 style: th.style(Style::INPUT),
370 focus: Some(th.style(Style::INPUT_FOCUS)),
371 ..Default::default()
372 }
373}
374
375#[cfg(feature = "rat-widget")]
376fn scroll(th: &SalsaTheme) -> rat_widget::scrolled::ScrollStyle {
378 rat_widget::scrolled::ScrollStyle {
379 thumb_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
380 track_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
381 min_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
382 begin_style: Some(th.style(Style::CONTAINER_ARROW_FG)),
383 end_style: Some(th.style(Style::CONTAINER_ARROW_FG)),
384 horizontal: Some(rat_widget::scrolled::ScrollSymbols {
385 track: "▒",
386 thumb: symbols::block::FULL,
387 begin: "←",
388 end: "→",
389 min: "░",
390 }),
391 vertical: Some(rat_widget::scrolled::ScrollSymbols {
392 track: "▒",
393 thumb: symbols::block::FULL,
394 begin: "↑",
395 end: "↓",
396 min: "░",
397 }),
398 ..Default::default()
399 }
400}
401
402#[cfg(feature = "rat-widget")]
403fn popup_scroll(th: &SalsaTheme) -> rat_widget::scrolled::ScrollStyle {
404 rat_widget::scrolled::ScrollStyle {
405 thumb_style: Some(th.style(Style::POPUP_BORDER_FG)),
406 track_style: Some(th.style(Style::POPUP_BORDER_FG)),
407 min_style: Some(th.style(Style::POPUP_BORDER_FG)),
408 begin_style: Some(th.style(Style::POPUP_ARROW_FG)),
409 end_style: Some(th.style(Style::POPUP_ARROW_FG)),
410 horizontal: Some(rat_widget::scrolled::ScrollSymbols {
411 track: "▒",
412 thumb: symbols::block::FULL,
413 begin: "←",
414 end: "→",
415 min: "░",
416 }),
417 vertical: Some(rat_widget::scrolled::ScrollSymbols {
418 track: "▒",
419 thumb: symbols::block::FULL,
420 begin: "↑",
421 end: "↓",
422 min: "░",
423 }),
424 ..Default::default()
425 }
426}
427
428#[cfg(feature = "rat-widget")]
429fn dialog_scroll(th: &SalsaTheme) -> rat_widget::scrolled::ScrollStyle {
430 rat_widget::scrolled::ScrollStyle {
431 thumb_style: Some(th.style(Style::DIALOG_BORDER_FG)),
432 track_style: Some(th.style(Style::DIALOG_BORDER_FG)),
433 min_style: Some(th.style(Style::DIALOG_BORDER_FG)),
434 begin_style: Some(th.style(Style::POPUP_ARROW_FG)),
435 end_style: Some(th.style(Style::POPUP_ARROW_FG)),
436 horizontal: Some(rat_widget::scrolled::ScrollSymbols {
437 track: "▒",
438 thumb: symbols::block::FULL,
439 begin: "←",
440 end: "→",
441 min: "░",
442 }),
443 vertical: Some(rat_widget::scrolled::ScrollSymbols {
444 track: "▒",
445 thumb: symbols::block::FULL,
446 begin: "↑",
447 end: "↓",
448 min: "░",
449 }),
450 ..Default::default()
451 }
452}
453
454#[cfg(feature = "rat-widget")]
455fn shadow(th: &SalsaTheme) -> rat_widget::shadow::ShadowStyle {
456 rat_widget::shadow::ShadowStyle {
457 style: th.style(Style::SHADOWS),
458 dir: rat_widget::shadow::ShadowDirection::BottomRight,
459 ..rat_widget::shadow::ShadowStyle::default()
460 }
461}
462
463#[cfg(feature = "rat-widget")]
464fn slider(th: &SalsaTheme) -> rat_widget::slider::SliderStyle {
465 rat_widget::slider::SliderStyle {
466 style: th.style(Style::INPUT),
467 bounds: Some(th.style(Style::INPUT)),
468 knob: Some(th.style(Style::INPUT_SELECT)),
469 focus: Some(th.style(Style::INPUT_FOCUS)),
470 text_align: Some(Alignment::Center),
471 ..Default::default()
472 }
473}
474
475#[cfg(feature = "rat-widget")]
476fn split(th: &SalsaTheme) -> rat_widget::splitter::SplitStyle {
477 rat_widget::splitter::SplitStyle {
478 style: th.style(Style::CONTAINER_BORDER_FG),
479 arrow_style: Some(th.style(Style::CONTAINER_ARROW_FG)),
480 drag_style: Some(th.style(Style::HOVER)),
481 ..Default::default()
482 }
483}
484
485#[cfg(feature = "rat-widget")]
486fn statusline(th: &SalsaTheme) -> rat_widget::statusline::StatusLineStyle {
487 rat_widget::statusline::StatusLineStyle {
488 styles: vec![
489 th.style(Style::STATUS_BASE),
490 th.p.style(Colors::Blue, 3),
491 th.p.style(Colors::Blue, 2),
492 th.p.style(Colors::Blue, 1),
493 ],
494 ..Default::default()
495 }
496}
497
498#[cfg(feature = "rat-widget")]
499fn tabbed(th: &SalsaTheme) -> rat_widget::tabbed::TabbedStyle {
500 rat_widget::tabbed::TabbedStyle {
501 style: th.style(Style::CONTAINER_BASE),
502 border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
503 tab: Some(th.style(Style::CONTAINER_BASE)),
504 hover: Some(th.style(Style::HOVER)),
505 select: Some(th.style(Style::SELECT)),
506 focus: Some(th.style(Style::FOCUS)),
507 ..Default::default()
508 }
509}
510
511#[cfg(feature = "rat-widget")]
512fn table(th: &SalsaTheme) -> rat_widget::table::TableStyle {
513 rat_widget::table::TableStyle {
514 style: th.style(Style::CONTAINER_BASE),
515 select_row: Some(th.style(Style::SELECT)),
516 show_row_focus: true,
517 focus_style: Some(th.style(Style::FOCUS)),
518 border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
519 scroll: Some(th.style(WidgetStyle::SCROLL)),
520 header: Some(th.style(Style::HEADER)),
521 footer: Some(th.style(Style::FOOTER)),
522 show_empty: true,
523 ..Default::default()
524 }
525}
526
527#[cfg(feature = "color-input")]
528fn color_input(th: &SalsaTheme) -> ColorInputStyle {
529 ColorInputStyle {
530 text: rat_widget::text::TextStyle {
531 style: th.style(Style::INPUT),
532 focus: Some(th.style(Style::INPUT_FOCUS)),
533 select: Some(th.style(Style::INPUT_SELECT)),
534 invalid: Some(th.style(Style::INVALID)),
535 ..rat_widget::text::TextStyle::default()
536 },
537 ..Default::default()
538 }
539}
540
541#[cfg(feature = "rat-widget")]
542fn text(th: &SalsaTheme) -> rat_widget::text::TextStyle {
543 rat_widget::text::TextStyle {
544 style: th.style(Style::INPUT),
545 focus: Some(th.style(Style::INPUT_FOCUS)),
546 select: Some(th.style(Style::INPUT_SELECT)),
547 invalid: Some(th.style(Style::INVALID)),
548 ..rat_widget::text::TextStyle::default()
549 }
550}
551
552#[cfg(feature = "rat-widget")]
553fn textarea(th: &SalsaTheme) -> rat_widget::text::TextStyle {
554 rat_widget::text::TextStyle {
555 style: th.style(Style::INPUT),
556 focus: Some(th.style(Style::INPUT)),
557 select: Some(th.style(Style::INPUT_SELECT)),
558 scroll: Some(th.style(WidgetStyle::SCROLL)),
559 border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
560 ..rat_widget::text::TextStyle::default()
561 }
562}
563
564#[cfg(feature = "rat-widget")]
565fn textview(th: &SalsaTheme) -> rat_widget::text::TextStyle {
566 rat_widget::text::TextStyle {
567 style: th.style(Style::CONTAINER_BASE),
568 focus: Some(th.style(Style::CONTAINER_BASE)),
569 select: Some(th.style(Style::INPUT_SELECT)),
570 scroll: Some(th.style(WidgetStyle::SCROLL)),
571 border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
572 ..rat_widget::text::TextStyle::default()
573 }
574}
575
576#[cfg(feature = "rat-widget")]
577fn toolbar(th: &SalsaTheme) -> rat_widget::toolbar::ToolbarStyle {
578 rat_widget::toolbar::ToolbarStyle {
579 style: th.style_style(Style::MENU_BASE),
580 key_style: Some(th.style_style(Style::KEY_BINDING)),
581 button: Some(rat_widget::button::ButtonStyle {
582 style: th.style_style(Style::BUTTON_BASE),
583 armed: Some(th.style_style(Style::SELECT)),
584 hover: Some(th.style_style(Style::HOVER)),
585 ..Default::default()
586 }),
587 checkbox: Some(rat_widget::checkbox::CheckboxStyle {
588 style: th.style_style(Style::BUTTON_BASE),
589 behave_check: Some(rat_widget::checkbox::CheckboxCheck::SingleClick),
590 ..Default::default()
591 }),
592 choice: Some(rat_widget::choice::ChoiceStyle {
593 style: th.style_style(Style::BUTTON_BASE),
594 button: Some(th.style_style(Style::BUTTON_BASE)),
595 select: Some(th.style_style(Style::SELECT)),
596 focus: Some(th.style_style(Style::BUTTON_BASE)),
597 popup: rat_widget::popup::PopupStyle {
598 placement: Some(rat_widget::popup::Placement::BelowOrAbove),
599 ..Default::default()
600 },
601 popup_style: Some(th.style_style(Style::POPUP_BASE)),
602 popup_border: Some(th.style_style(Style::POPUP_BORDER_FG)),
603 behave_focus: Some(rat_widget::choice::ChoiceFocus::OpenOnFocusGained),
604 behave_select: Some(rat_widget::choice::ChoiceSelect::MouseClick),
605 behave_close: Some(rat_widget::choice::ChoiceClose::SingleClick),
606 ..Default::default()
607 }),
608 collapsed: Some(rat_widget::choice::ChoiceStyle {
609 style: th.style_style(Style::BUTTON_BASE),
610 button: Some(th.style_style(Style::BUTTON_BASE)),
611 select: Some(th.style_style(Style::SELECT)),
612 focus: Some(th.style_style(Style::BUTTON_BASE)),
613 popup: rat_widget::popup::PopupStyle {
614 placement: Some(rat_widget::popup::Placement::BelowOrAbove),
615 ..Default::default()
616 },
617 popup_style: Some(th.style_style(Style::POPUP_BASE)),
618 popup_border: Some(th.style_style(Style::POPUP_BORDER_FG)),
619 behave_focus: Some(rat_widget::choice::ChoiceFocus::OpenOnFocusGained),
620 behave_select: Some(rat_widget::choice::ChoiceSelect::MouseClick),
621 behave_close: Some(rat_widget::choice::ChoiceClose::SingleClick),
622 ..Default::default()
623 }),
624 ..Default::default()
625 }
626}
627
628#[cfg(feature = "rat-widget")]
629fn view(th: &SalsaTheme) -> rat_widget::view::ViewStyle {
630 rat_widget::view::ViewStyle {
631 scroll: Some(th.style(WidgetStyle::SCROLL)),
632 ..Default::default()
633 }
634}