Skip to main content

perspective_viewer/components/
settings_panel.rs

1// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2// ┃ ██████ ██████ ██████       █      █      █      █      █ █▄  ▀███ █       ┃
3// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█  ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄  ▀█ █ ▀▀▀▀▀ ┃
4// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄   █ ▄▄▄▄▄ ┃
5// ┃ █      ██████ █  ▀█▄       █ ██████      █      ███▌▐███ ███████▄ █       ┃
6// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7// ┃ Copyright (c) 2017, the Perspective Authors.                              ┃
8// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9// ┃ This file is part of the Perspective library, distributed under the terms ┃
10// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
13use std::rc::Rc;
14
15use yew::prelude::*;
16
17use super::column_selector::ColumnSelector;
18use super::plugin_selector::PluginSelector;
19use crate::PerspectiveProperties;
20use crate::components::containers::sidebar_close_button::SidebarCloseButton;
21use crate::dragdrop::*;
22use crate::model::*;
23use crate::presentation::{ColumnLocator, Presentation};
24use crate::renderer::*;
25use crate::session::*;
26use crate::utils::*;
27
28#[derive(Clone, Properties, PerspectiveProperties!)]
29pub struct SettingsPanelProps {
30    pub on_close: Callback<()>,
31    pub on_resize: Rc<PubSub<()>>,
32    pub on_select_column: Callback<ColumnLocator>,
33    pub on_debug: Callback<()>,
34    pub is_debug: bool,
35
36    /// State
37    pub dragdrop: DragDrop,
38    pub session: Session,
39    pub renderer: Renderer,
40    pub presentation: Presentation,
41}
42
43impl PartialEq for SettingsPanelProps {
44    fn eq(&self, _rhs: &Self) -> bool {
45        false
46    }
47}
48
49#[function_component]
50pub fn SettingsPanel(props: &SettingsPanelProps) -> Html {
51    let SettingsPanelProps {
52        dragdrop,
53        presentation,
54        renderer,
55        session,
56        ..
57    } = &props;
58    let selected_column = props.get_current_column_locator();
59    html! {
60        <div id="settings_panel" class="sidebar_column noselect split-panel orient-vertical">
61            if selected_column.is_none() {
62                <SidebarCloseButton
63                    id="settings_close_button"
64                    on_close_sidebar={&props.on_close.clone()}
65                />
66            }
67            <SidebarCloseButton
68                id={if props.is_debug {"debug_close_button"} else {"debug_open_button"}}
69                on_close_sidebar={&props.on_debug}
70            />
71            <PluginSelector {presentation} {renderer} {session} />
72            <ColumnSelector
73                on_resize={&props.on_resize}
74                on_open_expr_panel={&props.on_select_column}
75                selected_column={selected_column.clone()}
76                {dragdrop}
77                {renderer}
78                {session}
79            />
80        </div>
81    }
82}