openaws-vpn-client 0.1.6

Unofficial open-source AWS VPN client written in Rust
use crate::consts::*;
use crate::log::Log;
use crate::State;
use gtk::glib::idle_add_once;
use gtk::prelude::*;
use gtk::{Button, Label};
use std::cell::RefCell;
use std::rc::Rc;
use std::sync::Arc;

#[derive(Clone)]
pub struct StateManager {
    pub label: Rc<Label>,
    pub log: Arc<Log>,
    pub btn: Rc<Button>,
    pub state: RefCell<State>,
}

unsafe impl Send for StateManager {}
unsafe impl Sync for StateManager {}

impl StateManager {
    pub fn new(label: Rc<Label>, log: Arc<Log>, btn: Rc<Button>) -> StateManager {
        let manager = StateManager {
            label,
            log,
            btn,
            state: RefCell::new(State::Disconnected),
        };
        return manager;
    }

    pub fn change_state<F>(f: F)
    where
        F: Fn() + std::marker::Send + 'static,
    {
        idle_add_once(move || {
            f();
        });
    }
}

impl StateManager {
    pub fn set_connecting(&self) {
        self.state.replace(State::Connecting);
        self.label.set_label(CONNECTING);
        self.btn.set_label(BTN_DISCONNECT);
    }

    pub fn set_disconnected(&self) {
        self.state.replace(State::Disconnected);
        self.label.set_label(DISCONNECTED);
        self.btn.set_label(BTN_CONNECT);
    }

    pub fn set_connected(&self) {
        self.state.replace(State::Connected);
        self.label.set_label(CONNECTED);
        self.btn.set_label(BTN_DISCONNECT);
    }
}