m8_files/
theme.rs

1use crate::reader::*;
2use crate::version::*;
3
4#[derive(PartialEq, Debug, Clone)]
5pub struct Theme {
6    pub background: RGB,
7    pub text_empty: RGB,
8    pub text_info: RGB,
9    pub text_default: RGB,
10    pub text_value: RGB,
11    pub text_title: RGB,
12    pub play_marker: RGB,
13    pub cursor: RGB,
14    pub selection: RGB,
15    pub scope_slider: RGB,
16    pub meter_low: RGB,
17    pub meter_mid: RGB,
18    pub meter_peak: RGB,
19}
20impl Theme {
21    const SIZE: usize = 39;
22
23    pub fn read(reader: &mut impl std::io::Read) -> M8Result<Self> {
24        let mut buf: Vec<u8> = vec![];
25        reader.read_to_end(&mut buf).unwrap();
26        let len = buf.len();
27        let mut reader = Reader::new(buf);
28
29        if len < Self::SIZE + Version::SIZE {
30            return Err(ParseError(
31                "File is not long enough to be a M8 Theme".to_string(),
32            ));
33        }
34        Version::from_reader(&mut reader)?;
35        Self::from_reader(&mut reader)
36    }
37
38    fn from_reader(reader: &mut Reader) -> M8Result<Self> {
39        Ok(Self {
40            background: RGB::from_reader(reader)?,
41            text_empty: RGB::from_reader(reader)?,
42            text_info: RGB::from_reader(reader)?,
43            text_default: RGB::from_reader(reader)?,
44            text_value: RGB::from_reader(reader)?,
45            text_title: RGB::from_reader(reader)?,
46            play_marker: RGB::from_reader(reader)?,
47            cursor: RGB::from_reader(reader)?,
48            selection: RGB::from_reader(reader)?,
49            scope_slider: RGB::from_reader(reader)?,
50            meter_low: RGB::from_reader(reader)?,
51            meter_mid: RGB::from_reader(reader)?,
52            meter_peak: RGB::from_reader(reader)?,
53        })
54    }
55}
56
57#[derive(PartialEq, Debug, Copy, Clone)]
58pub struct RGB {
59    pub r: u8,
60    pub g: u8,
61    pub b: u8,
62}
63
64impl RGB {
65    fn from_reader(reader: &mut Reader) -> M8Result<Self> {
66        Ok(Self {
67            r: reader.read(),
68            g: reader.read(),
69            b: reader.read(),
70        })
71    }
72}