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
use std::collections::HashMap;
use anyhow::Result;
use config::Value;
use derive_builder::Builder;
use crate::remove_string_from_config;
/// A map from mouse buttons to panel events
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Default, Builder)]
pub struct Actions {
/// The event that should be run when the panel is left-clicked
#[builder(default = "String::new()")]
pub left: String,
/// The event that should be run when the panel is right-clicked
#[builder(default = "String::new()")]
pub right: String,
/// The event that should be run when the panel is middle-clicked
#[builder(default = "String::new()")]
pub middle: String,
/// The event that should be run when the panel is scrolled up
#[builder(default = "String::new()")]
pub up: String,
/// The event that should be run when the panel is scrolled down
#[builder(default = "String::new()")]
pub down: String,
}
impl Actions {
/// Attempts to parse an instance of this type from a subset of tthe global
/// [`Config`][config::Config].
///
/// Configuration options:
/// - `click_left`: The name of the event to run when the panel is
/// left-clicked.
/// - `click_right`: The name of the event to run when the panel is
/// right-clicked.
/// - `click_middle`: The name of the event to run when the panel is
/// middle-clicked.
/// - `scroll_up`: The name of the event to run when the panel is scrolled
/// up.
/// - `scroll_down`: The name of the event to run when the panel is scrolled
/// down.
pub fn parse<S: std::hash::BuildHasher>(
table: &mut HashMap<String, Value, S>,
) -> Result<Self> {
let mut builder = ActionsBuilder::default();
if let Some(left) = remove_string_from_config("click_left", table) {
builder.left(left);
}
if let Some(right) = remove_string_from_config("click_right", table) {
builder.right(right);
}
if let Some(middle) = remove_string_from_config("click_middle", table) {
builder.middle(middle);
}
if let Some(up) = remove_string_from_config("scroll_up", table) {
builder.up(up);
}
if let Some(down) = remove_string_from_config("scroll_down", table) {
builder.down(down);
}
Ok(builder.build()?)
}
}