root/src/sidebar_booru_select.rs

use crate::booru::Booru;
use crate::data::*;
use crate::send;

use adw::prelude::*;

pub fn make_booru_selection_list(state: &State, wiki: bool) -> gtk::Box {
    let container = gtk::Box::new(gtk::Orientation::Vertical, 3);
    for b in &state.boorus {
        if !wiki || b.booru.has_wiki() {
            let booru_button = make_booru_button(&b.booru, state);
            container.append(&booru_button);
        }
    }

    container
}

fn make_booru_button(b: &std::boxed::Box<dyn Booru>, state: &State) -> gtk::Button {
    let booru_button = gtk::Button::new();
    let title = if b.get_domain() == "__builtin_localbooru" {
        "Your Downloads".to_string()
    } else {
        b.get_domain().to_owned()
    };
    booru_button.set_child(Some(&gtk::Label::new(Some(&title))));
    if Some(b.get_domain()) == state.active_booru.as_ref() {
        booru_button.add_css_class("selected-booru");
    }

    let b2 = b.clone_booru();
    let sender = state.sender.clone();
    booru_button.connect_clicked(move |_| {
        let cmd = Action::SetActiveBooru {
            booru: b2.clone_booru(),
        };
        send!(sender, cmd);
    });
    booru_button
}