waytrogen 0.6.12

A GTK graphical user interface for changing your wallpapers on Wayland based compositors.
use crate::wallpaper_changers::{
    MpvPaperPauseModes, MpvPaperSlideshowSettings, WallpaperChanger, WallpaperChangers,
};
use gettextrs::gettext;
use gtk::{
    gio::Settings, glib::clone, prelude::*, Adjustment, Align, Box, DropDown, Entry, SpinButton,
    StringObject, Switch, TextBuffer,
};
use std::{
    path::{Path, PathBuf},
    process::Command,
};
pub fn change_mpvpaper_wallpaper(
    mpvpaper_changer: WallpaperChangers,
    image: PathBuf,
    monitor: &str,
) {
    if let WallpaperChangers::MpvPaper(pause_mode, slideshow, mpv_options) = mpvpaper_changer {
        log::debug!("{}", image.display());
        let mut command = Command::new("mpvpaper");
        let monitor = if monitor == gettext("All") {
            "*"
        } else {
            monitor
        };
        command.arg("-o").arg(mpv_options);
        match pause_mode {
            MpvPaperPauseModes::None => {}
            MpvPaperPauseModes::AutoPause => {
                command.arg("--auto-pause");
            }
            MpvPaperPauseModes::AutoStop => {
                command.arg("--auto-stop");
            }
        }
        if slideshow.enable {
            command.arg("-n").arg(slideshow.seconds.to_string());
        }
        command
            .arg(monitor)
            .arg(image)
            .spawn()
            .unwrap()
            .wait()
            .unwrap();
    }
}

pub fn generate_mpvpaper_changer_bar(changer_specific_options_box: &Box, settings: Settings) {
    let pause_options_dropdown = DropDown::from_strings(&[
        &gettext("none"),
        &gettext("auto-pause"),
        &gettext("auto-stop"),
    ]);
    pause_options_dropdown.set_margin_top(12);
    pause_options_dropdown.set_margin_start(12);
    pause_options_dropdown.set_margin_bottom(12);
    pause_options_dropdown.set_margin_end(12);
    pause_options_dropdown.set_halign(Align::Start);
    pause_options_dropdown.set_valign(Align::Center);
    settings
        .bind("mpvpaper-pause-option", &pause_options_dropdown, "selected")
        .build();
    changer_specific_options_box.append(&pause_options_dropdown);
    let slideshow_enable_switch = Switch::builder()
        .tooltip_text(gettext("Enable slideshow for the current folder."))
        .has_tooltip(true)
        .margin_top(12)
        .margin_start(12)
        .margin_bottom(12)
        .margin_end(12)
        .halign(Align::Start)
        .valign(Align::Center)
        .build();
    let adjustment = Adjustment::new(5.0, 1.0, f64::MAX, 1.0, 0.0, 0.0);
    let spin_button = SpinButton::builder()
        .adjustment(&adjustment)
        .numeric(true)
        .has_tooltip(true)
        .tooltip_text(gettext("Slideshow change interval"))
        .margin_top(12)
        .margin_start(12)
        .margin_bottom(12)
        .margin_end(12)
        .halign(Align::Start)
        .valign(Align::Center)
        .build();
    changer_specific_options_box.append(&slideshow_enable_switch);
    changer_specific_options_box.append(&spin_button);
    settings
        .bind(
            "mpvpaper-slideshow-enable",
            &slideshow_enable_switch,
            "active",
        )
        .build();
    settings
        .bind("mpvpaper-slideshow-interval", &spin_button, "value")
        .build();

    let mpv_options = create_mpv_options_textbox(&settings);
    changer_specific_options_box.append(&mpv_options);

    slideshow_enable_switch.connect_state_set(clone!(move |_, state| {
        if state {
            let pause_mode = pause_options_dropdown
                .selected_item()
                .and_downcast::<StringObject>()
                .unwrap()
                .string()
                .to_string()
                .parse::<MpvPaperPauseModes>()
                .unwrap();
            let interval = spin_button.value() as u32;
            let options = mpv_options.text().to_string();
            let slideshow_settings = MpvPaperSlideshowSettings {
                enable: state,
                seconds: interval,
            };
            let varient = WallpaperChangers::MpvPaper(pause_mode, slideshow_settings, options);
            let path = settings.string("wallpaper-folder").to_string();
            let monitor = settings.string("selected-monitor-item").to_string();
            log::debug!(
                "{}: {:#?} {} {}",
                gettext("Entered switch callback"),
                varient,
                path,
                monitor
            );
            varient.change(Path::new(&path).to_path_buf(), monitor);
        }
        false.into()
    }));
}

fn create_mpv_options_textbox(settings: &Settings) -> Entry {
    let mpv_options = Entry::builder()
        .placeholder_text(gettext("Additional mpv options"))
        .has_tooltip(true)
        .tooltip_text(gettext(
            "Additional command line options to be sent to mpv.",
        ))
        .margin_top(12)
        .margin_start(12)
        .margin_bottom(12)
        .margin_end(12)
        .hexpand(true)
        .halign(Align::Start)
        .valign(Align::Center)
        .build();
    let mpv_options_text_buffer = TextBuffer::builder().build();
    settings
        .bind(
            "mpvpaper-additional-options",
            &mpv_options_text_buffer,
            "text",
        )
        .build();

    mpv_options.connect_changed(clone!(
        #[strong]
        mpv_options_text_buffer,
        move |e| {
            let text = &e.text().to_string()[..];
            mpv_options_text_buffer.set_text(text);
        }
    ));
    mpv_options.set_text(
        mpv_options_text_buffer
            .text(
                &mpv_options_text_buffer.start_iter(),
                &mpv_options_text_buffer.end_iter(),
                false,
            )
            .as_str(),
    );
    mpv_options
}