Skip to content

Commit 16ce6c7

Browse files
committed
fix: multi window handling
1 parent d7750ff commit 16ce6c7

File tree

4 files changed

+83
-59
lines changed

4 files changed

+83
-59
lines changed

src/layout.rs

Lines changed: 58 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
use leptos::{html::*, *};
2-
3-
use crate::{
4-
footer, query_editor, query_table, sidebar,
5-
store::{self, editor::EditorStore},
2+
use thaw::{
3+
Button,
4+
Tab,
5+
//TabProps,
6+
Tabs,
7+
// TabsProps
68
};
79

10+
use crate::{footer, query_editor, query_table, sidebar, store::tabs};
11+
812
pub fn component() -> impl IntoView {
9-
let tabs = use_context::<store::tabs::Tabs>().unwrap();
10-
let mut editors = use_context::<EditorStore>().unwrap();
13+
let tabs = use_context::<tabs::Tabs>().unwrap();
1114

1215
div()
1316
.classes("flex h-screen")
@@ -19,39 +22,55 @@ pub fn component() -> impl IntoView {
1922
main()
2023
.classes("flex-1 overflow-y-scroll")
2124
.child(
22-
div()
23-
.classes("flex")
24-
.child(For(ForProps {
25-
each: move || (0..tabs.active_tabs.get()),
26-
key: |index| *index,
27-
children: move |index| {
28-
button()
29-
.classes("px-8 h-10 hover:bg-gray-200 border-b-2")
30-
.class("border-indigo-500", move || {
31-
index == tabs.selected_tab.get()
32-
})
33-
.on(ev::click, move |_| {
34-
tabs.selected_tab.update(|prev| *prev = index);
35-
})
36-
.child((index + 1).to_string())
37-
},
38-
}))
39-
.child(
40-
button()
41-
.classes("px-8 h-10 border-b-2 hover:bg-gray-200")
42-
.on(ev::click, move |_| {
43-
tabs.active_tabs.update(|prev| *prev += 1);
44-
tabs.selected_tab.update(|prev| *prev += 1);
45-
editors.add_editor();
46-
})
47-
.child("+"),
48-
),
49-
)
50-
.child(
51-
div()
52-
.child(query_editor::component(move || tabs.selected_tab.get()))
53-
.child(query_table::component()),
54-
),
25+
view! {
26+
<Tabs value=tabs.selected_tab>
27+
<For each=move || (0..tabs.active_tabs.get()) key=|index| index.to_string() let:index>
28+
<Tab key=index.to_string() label=(index + 1).to_string()>
29+
{query_editor::component()}
30+
{query_table::component()}
31+
</Tab>
32+
</For>
33+
</Tabs>
34+
<Button on_click=move |_| {
35+
tabs.active_tabs.update(|prev| *prev += 1);
36+
tabs.selected_tab.update(|prev| *prev = (tabs.active_tabs.get() - 1).to_string());
37+
}>"+1"</Button>
38+
}),
39+
// .child(Tabs(TabsProps {
40+
// value: tabs.selected_tab,
41+
// class: MaybeSignal::Static(String::new()),
42+
// children: Children::to_children(move || {
43+
// Fragment::new(vec![
44+
// For(ForProps {
45+
// each: move || (0..tabs.active_tabs.get()),
46+
// key: |index| index.to_string(),
47+
// children: move |index| {
48+
// Tab(TabProps {
49+
// class: MaybeSignal::Static(String::new()),
50+
// key: index.to_string(),
51+
// label: (index + 1).to_string(),
52+
// children: Children::to_children(move || {
53+
// Fragment::new(vec![
54+
// query_editor::component().into_view(),
55+
// query_table::component().into_view(),
56+
// ])
57+
// }),
58+
// })
59+
// },
60+
// })
61+
// .into_view(),
62+
// button()
63+
// .on(ev::click, move |_| {
64+
// tabs.active_tabs.update(|prev| *prev += 1);
65+
// tabs
66+
// .selected_tab
67+
// .update(|prev| *prev = (tabs.active_tabs.get() - 1).to_string());
68+
// })
69+
// .child("+")
70+
// .into_view(),
71+
// ])
72+
// }),
73+
// })),
5574
)
5675
.child(footer::component()),
5776
)

src/query_editor.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@ use crate::{
1515

1616
pub type ModelCell = Rc<RefCell<Option<CodeEditor>>>;
1717

18-
pub fn component<F>(index: F) -> impl IntoView
19-
where
20-
F: Fn() -> usize,
21-
{
18+
pub fn component() -> impl IntoView {
2219
let query_store = use_context::<QueryStore>().unwrap();
2320
let run_query = create_action(move |query_store: &QueryStore| {
2421
let query_store = *query_store;
@@ -32,7 +29,7 @@ where
3229
show.set(false);
3330
}
3431
});
35-
let mut editors = use_context::<EditorStore>().unwrap().editors;
32+
let mut editors = use_context::<EditorStore>().unwrap();
3633
let node_ref = create_node_ref();
3734
let _ = use_event_listener(node_ref, ev::keydown, move |event| {
3835
if event.key() == "Enter" && event.ctrl_key() {
@@ -64,12 +61,11 @@ where
6461

6562
// TODO: Fix this
6663
let e = Rc::new(RefCell::new(Some(e)));
67-
let e = create_rw_signal(e);
68-
editors.push(e);
64+
editors.add_editor(e);
6965
});
7066

7167
div()
72-
.classes("relative border-b-1 border-neutral-200 sticky")
68+
.classes("border-b-1 border-neutral-200 h-72 sticky")
7369
.node_ref(node_ref)
7470
.child(div().child(modals::custom_query::component(show)))
7571
.child(

src/store/editor.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
use leptos::{create_rw_signal, logging, use_context, RwSignal, SignalGetUntracked};
1+
use std::{cell::RefCell, rc::Rc};
2+
3+
use leptos::{create_rw_signal, use_context, RwSignal, SignalGetUntracked, SignalUpdate};
4+
use monaco::api::CodeEditor;
25

36
use crate::query_editor::ModelCell;
47

58
use super::tabs::Tabs;
69

710
#[derive(Clone, Debug)]
811
pub struct EditorStore {
9-
pub editors: Vec<RwSignal<ModelCell>>,
12+
pub editors: RwSignal<Vec<RwSignal<ModelCell>>>,
1013
}
1114

1215
impl Default for EditorStore {
@@ -18,29 +21,34 @@ impl Default for EditorStore {
1821
impl EditorStore {
1922
pub fn new() -> Self {
2023
Self {
21-
editors: vec![create_rw_signal(ModelCell::default())],
24+
editors: create_rw_signal(vec![create_rw_signal(ModelCell::default())]),
2225
}
2326
}
2427

25-
pub fn add_editor(&mut self) {
26-
self.editors.push(create_rw_signal(ModelCell::default()));
28+
pub fn add_editor(&mut self, editor: Rc<RefCell<Option<CodeEditor>>>) {
29+
self.editors.update(|prev| {
30+
prev.push(create_rw_signal(editor));
31+
});
2732
}
2833

2934
pub fn remove_editor(&mut self, index: usize) {
30-
self.editors.remove(index);
35+
self.editors.update(|prev| {
36+
prev.remove(index);
37+
});
3138
}
3239

3340
pub fn get_active_editor(&self) -> RwSignal<ModelCell> {
3441
let selected_tab = use_context::<Tabs>().unwrap().selected_tab.get_untracked();
35-
logging::log!("{:?}", selected_tab);
42+
let selected_tab = selected_tab.parse::<usize>().unwrap();
3643

37-
self.editors[selected_tab]
44+
self.editors.get_untracked()[selected_tab]
3845
}
3946

4047
pub fn get_editor_value(&self) -> String {
4148
let selected_tab = use_context::<Tabs>().unwrap().selected_tab.get_untracked();
49+
let selected_tab = selected_tab.parse::<usize>().unwrap();
4250

43-
self.editors[selected_tab]
51+
self.editors.get_untracked()[selected_tab]
4452
.get_untracked()
4553
.borrow()
4654
.as_ref()
@@ -52,8 +60,9 @@ impl EditorStore {
5260

5361
pub fn set_editor_value(&self, value: &str) {
5462
let selected_tab = use_context::<Tabs>().unwrap().selected_tab.get_untracked();
63+
let selected_tab = selected_tab.parse::<usize>().unwrap();
5564

56-
self.editors[selected_tab]
65+
self.editors.get_untracked()[selected_tab]
5766
.get_untracked()
5867
.borrow()
5968
.as_ref()

src/store/tabs.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use leptos::{create_rw_signal, RwSignal};
33
#[derive(Clone, Debug)]
44
pub struct Tabs {
55
pub active_tabs: RwSignal<usize>,
6-
pub selected_tab: RwSignal<usize>,
6+
pub selected_tab: RwSignal<String>,
77
}
88

99
impl Default for Tabs {
@@ -16,7 +16,7 @@ impl Tabs {
1616
pub fn new() -> Self {
1717
Self {
1818
active_tabs: create_rw_signal(1),
19-
selected_tab: create_rw_signal(0),
19+
selected_tab: create_rw_signal(String::from("0")),
2020
}
2121
}
2222
}

0 commit comments

Comments
 (0)