re_redap_browser/
add_server_modal.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
use re_ui::modal::{ModalHandler, ModalWrapper};
use re_ui::UiExt as _;
use re_uri::Scheme;

use crate::context::Context;
use crate::servers::Command;

pub struct AddServerModal {
    modal: ModalHandler,

    scheme: Scheme,
    host: String,
    port: u16,
}

impl Default for AddServerModal {
    fn default() -> Self {
        Self {
            modal: Default::default(),
            scheme: Scheme::Rerun,
            host: String::new(),
            port: 443,
        }
    }
}

impl AddServerModal {
    pub fn open(&mut self) {
        self.scheme = Scheme::Rerun;
        self.port = 443;
        self.host = String::new();

        self.modal.open();
    }

    //TODO(ab): handle ESC and return
    pub fn ui(&mut self, ctx: &Context<'_>, ui: &egui::Ui) {
        self.modal.ui(
            ui.ctx(),
            || ModalWrapper::new("Add Server"),
            |ui, keep_open| {
                ui.warning_label(
                    "The dataplatform is very experimental and not generally \
                available yet. Proceed with caution!",
                );

                ui.label("Scheme:");

                egui::ComboBox::new("scheme", "")
                    .selected_text(if self.scheme == Scheme::RerunHttp {
                        "http"
                    } else {
                        "https"
                    })
                    .show_ui(ui, |ui| {
                        ui.selectable_value(&mut self.scheme, Scheme::RerunHttps, "https");
                        ui.selectable_value(&mut self.scheme, Scheme::RerunHttp, "http");
                    });

                ui.add_space(14.0);

                ui.label("Host name:");
                let host = url::Host::parse(&self.host);
                ui.scope(|ui| {
                    // make field red if host is invalid
                    if host.is_err() {
                        ui.visuals_mut().widgets.active.bg_stroke =
                            egui::Stroke::new(1.0, ui.visuals().error_fg_color);
                        ui.visuals_mut().widgets.hovered.bg_stroke =
                            egui::Stroke::new(1.0, ui.visuals().error_fg_color);
                        ui.visuals_mut().widgets.inactive.bg_stroke =
                            egui::Stroke::new(1.0, ui.visuals().error_fg_color);
                    }
                    ui.add(egui::TextEdit::singleline(&mut self.host).lock_focus(false));
                });

                ui.add_space(14.0);

                ui.label("Port:");
                ui.add(egui::DragValue::new(&mut self.port));

                let origin = host.map(|host| re_uri::Origin {
                    scheme: self.scheme,
                    host,
                    port: self.port,
                });

                ui.add_space(24.0);

                ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
                    if let Ok(origin) = origin {
                        if ui.button("Add").clicked() {
                            *keep_open = false;

                            let _ = ctx.command_sender.send(Command::AddServer(origin));
                        }
                    } else {
                        ui.add_enabled(false, egui::Button::new("Add"));
                    }

                    if ui.button("Cancel").clicked() {
                        *keep_open = false;
                    }
                });
            },
        );
    }
}