cosmic-applets/applets/cosmic-applet-network/src/main.rs

97 lines
2.9 KiB
Rust
Raw Normal View History

2022-05-26 11:57:41 -04:00
// SPDX-License-Identifier: GPL-3.0-or-later
2022-02-01 16:46:25 -05:00
#[macro_use]
extern crate relm4_macros;
pub mod task;
pub mod ui;
pub mod widgets;
2022-02-01 16:46:25 -05:00
2022-06-29 13:32:50 -07:00
use cosmic_panel_config::config::CosmicPanelConfig;
use gtk4::{gio::ApplicationFlags, glib, prelude::*, Orientation, Separator};
2022-02-01 16:46:25 -05:00
use once_cell::sync::Lazy;
use tokio::runtime::Runtime;
static RT: Lazy<Runtime> = Lazy::new(|| Runtime::new().expect("failed to build tokio runtime"));
2022-02-01 14:10:15 -05:00
2022-02-01 13:24:00 -05:00
fn main() {
2022-02-01 14:10:15 -05:00
let application = gtk4::Application::new(
Some("com.system76.cosmic.applets.network"),
ApplicationFlags::default(),
);
application.connect_activate(build_ui);
application.run();
}
fn build_ui(application: &gtk4::Application) {
2022-05-26 15:37:59 -04:00
let provider = gtk4::CssProvider::new();
provider.load_from_data(include_bytes!("style.css"));
gtk4::StyleContext::add_provider_for_display(
&gtk4::gdk::Display::default().expect("Could not connect to a display."),
&provider,
gtk4::STYLE_PROVIDER_PRIORITY_APPLICATION,
);
2022-02-01 14:10:15 -05:00
let window = gtk4::ApplicationWindow::builder()
.application(application)
.title("COSMIC Network Applet")
2022-05-26 01:04:17 -04:00
.decorated(false)
2022-05-26 15:37:59 -04:00
.resizable(false)
.width_request(1)
.height_request(1)
.css_classes(vec!["root_window".to_string()])
2022-02-01 14:10:15 -05:00
.build();
2022-02-01 16:46:25 -05:00
view! {
main_box = gtk4::Box {
set_orientation: Orientation::Vertical,
2022-02-02 11:05:47 -05:00
set_spacing: 10,
2022-02-01 16:46:25 -05:00
set_margin_top: 20,
set_margin_bottom: 20,
set_margin_start: 24,
set_margin_end: 24
}
}
2022-05-26 01:04:17 -04:00
let config = CosmicPanelConfig::load_from_env().unwrap_or_default();
let popover = gtk4::builders::PopoverBuilder::new()
.autohide(true)
.has_arrow(false)
.build();
let button = gtk4::Button::new();
button.add_css_class("panel_icon");
button.connect_clicked(glib::clone!(@weak popover => move |_| {
popover.show();
}));
// TODO cleanup
let image = gtk4::Image::from_icon_name("preferences-system-network");
image.add_css_class("panel_icon");
image.set_pixel_size(config.get_applet_icon_size().try_into().unwrap());
button.set_child(Some(&image));
view! {
icon_box = gtk4::Box {
set_orientation: Orientation::Vertical,
set_spacing: 0,
2022-05-26 15:37:59 -04:00
add_css_class: "icon_box",
2022-05-26 01:04:17 -04:00
}
}
popover.set_child(Some(&main_box));
icon_box.append(&button);
icon_box.append(&popover);
ui::current_networks::add_current_networks(&main_box, &image);
2022-02-07 14:14:55 -05:00
main_box.append(&Separator::new(Orientation::Horizontal));
ui::toggles::add_toggles(&main_box);
let available_wifi_separator = Separator::new(Orientation::Horizontal);
main_box.append(&available_wifi_separator);
available_wifi_separator.hide();
ui::available_wifi::add_available_wifi(&main_box, available_wifi_separator);
2022-05-26 01:04:17 -04:00
window.set_child(Some(&icon_box));
2022-02-01 16:46:25 -05:00
window.show();
2022-02-01 13:24:00 -05:00
}