132 lines
3.5 KiB
Rust
132 lines
3.5 KiB
Rust
use egui::{Align2, CentralPanel, RichText, Vec2, Window};
|
|
|
|
use crate::Damus;
|
|
|
|
use super::{
|
|
state_in_memory::{STATE_GLOBAL_POPUP, STATE_SIDE_PANEL},
|
|
AccountManagementView, View,
|
|
};
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
pub enum GlobalPopupType {
|
|
AccountManagement,
|
|
}
|
|
|
|
static ACCOUNT_MANAGEMENT_TITLE: &str = "Account Management";
|
|
|
|
impl GlobalPopupType {
|
|
pub fn title(&self) -> &'static str {
|
|
match self {
|
|
Self::AccountManagement => ACCOUNT_MANAGEMENT_TITLE,
|
|
}
|
|
}
|
|
}
|
|
|
|
pub trait FromApp<'a> {
|
|
fn from_app(app: &'a mut crate::Damus) -> Self
|
|
where
|
|
Self: Sized;
|
|
}
|
|
|
|
fn title(title_str: &'static str) -> RichText {
|
|
RichText::new(title_str).size(24.0)
|
|
}
|
|
|
|
fn overlay_window<'a>(
|
|
open: &'a mut bool,
|
|
window_size: Vec2,
|
|
title_str: &'static str,
|
|
) -> Window<'a> {
|
|
egui::Window::new(title(title_str))
|
|
.anchor(Align2::CENTER_CENTER, [0.0, 0.0])
|
|
.collapsible(false)
|
|
.auto_sized()
|
|
.movable(false)
|
|
.open(open)
|
|
.default_size(window_size)
|
|
}
|
|
|
|
static MARGIN: Vec2 = Vec2 { x: 100.0, y: 100.0 };
|
|
|
|
pub struct DesktopGlobalPopup<'a> {
|
|
app: &'a mut Damus,
|
|
}
|
|
|
|
impl<'a> View for DesktopGlobalPopup<'a> {
|
|
fn ui(&mut self, ui: &mut egui::Ui) {
|
|
DesktopGlobalPopup::global_popup(self.app, ui.ctx())
|
|
}
|
|
}
|
|
|
|
impl<'a> DesktopGlobalPopup<'a> {
|
|
pub fn new(app: &'a mut Damus) -> Self {
|
|
DesktopGlobalPopup { app }
|
|
}
|
|
pub fn global_popup(app: &mut Damus, ctx: &egui::Context) {
|
|
CentralPanel::default().show(ctx, |ui| {
|
|
let available_size = ui.available_size();
|
|
let window_size = available_size - MARGIN;
|
|
|
|
if let Some(popup) = STATE_SIDE_PANEL.get_state(ctx) {
|
|
let mut show_global_popup = STATE_GLOBAL_POPUP.get_state(ctx);
|
|
if show_global_popup {
|
|
overlay_window(&mut show_global_popup, window_size, popup.title()).show(
|
|
ctx,
|
|
|ui| {
|
|
match popup {
|
|
GlobalPopupType::AccountManagement => {
|
|
AccountManagementView::from_app(app).ui(ui)
|
|
}
|
|
};
|
|
},
|
|
);
|
|
|
|
// user could have closed the window, set the new state in egui memory
|
|
STATE_GLOBAL_POPUP.set_state(ctx, show_global_popup);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
mod preview {
|
|
use crate::{
|
|
test_data,
|
|
ui::{DesktopSidePanel, Preview, View},
|
|
Damus,
|
|
};
|
|
|
|
use super::DesktopGlobalPopup;
|
|
|
|
pub struct GlobalPopupPreview {
|
|
app: Damus,
|
|
}
|
|
|
|
impl<'a> Preview for DesktopGlobalPopup<'a> {
|
|
type Prev = GlobalPopupPreview;
|
|
|
|
fn preview() -> Self::Prev {
|
|
GlobalPopupPreview::new()
|
|
}
|
|
}
|
|
|
|
impl GlobalPopupPreview {
|
|
fn new() -> Self {
|
|
let mut app = Damus::mock(".");
|
|
let accounts = test_data::get_test_accounts();
|
|
accounts
|
|
.into_iter()
|
|
.for_each(|acc| app.account_manager.add_account(acc.key, || {}));
|
|
GlobalPopupPreview { app }
|
|
}
|
|
}
|
|
|
|
impl View for GlobalPopupPreview {
|
|
fn ui(&mut self, ui: &mut egui::Ui) {
|
|
let mut panel = DesktopSidePanel::new();
|
|
DesktopSidePanel::panel().show(ui.ctx(), |ui| panel.ui(ui));
|
|
DesktopGlobalPopup::new(&mut self.app).ui(ui);
|
|
}
|
|
}
|
|
}
|