Skip to content

Commit 7f9e886

Browse files
authored
Merge pull request #5 from dancixx:refactor/mutli-tab-support
fix: table handling
2 parents baa6c50 + 70513c0 commit 7f9e886

File tree

2 files changed

+31
-16
lines changed

2 files changed

+31
-16
lines changed

src/layout.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,13 @@ pub fn component() -> impl IntoView {
5353
disabled: MaybeSignal::default(),
5454
on_click: Some(Callback::from(move |_| {
5555
tabs.active_tabs.update(|prev| *prev += 1);
56-
tabs
57-
.selected_tab
58-
.update(|prev| *prev = (prev.parse::<usize>().unwrap() + 1).to_string());
56+
tabs.selected_tab.update(|prev| {
57+
*prev = if *prev == "0" {
58+
"1".to_string()
59+
} else {
60+
(tabs.active_tabs.get() - 1).to_string()
61+
}
62+
});
5963
})),
6064
children: Some(Box::new(move || {
6165
Fragment::new(vec![p().child("+").into_view()])

src/store/tabs.rs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{cell::RefCell, collections::BTreeMap, rc::Rc};
1+
use std::{cell::RefCell, rc::Rc};
22

33
use leptos::{
44
create_rw_signal, error::Result, use_context, RwSignal, SignalGet, SignalGetUntracked, SignalSet,
@@ -27,9 +27,9 @@ struct QueryInfo {
2727
pub struct TabsStore {
2828
pub active_tabs: RwSignal<usize>,
2929
pub selected_tab: RwSignal<String>,
30-
pub editors: RwSignal<BTreeMap<String, ModelCell>>,
30+
pub editors: RwSignal<Vec<ModelCell>>,
3131
#[allow(clippy::type_complexity)]
32-
pub sql_results: RwSignal<BTreeMap<String, (Vec<String>, Vec<Vec<String>>)>>,
32+
pub sql_results: RwSignal<Vec<(Vec<String>, Vec<Vec<String>>)>>,
3333
pub is_loading: RwSignal<bool>,
3434
}
3535

@@ -47,8 +47,8 @@ impl TabsStore {
4747
Self {
4848
active_tabs: create_rw_signal(1),
4949
selected_tab: create_rw_signal(String::from("0")),
50-
editors: create_rw_signal(BTreeMap::new()),
51-
sql_results: create_rw_signal(BTreeMap::new()),
50+
editors: create_rw_signal(Vec::new()),
51+
sql_results: create_rw_signal(Vec::new()),
5252
is_loading: create_rw_signal(false),
5353
}
5454
}
@@ -80,7 +80,11 @@ impl TabsStore {
8080
)
8181
.await?;
8282
self.sql_results.update(|prev| {
83-
prev.insert(self.selected_tab.get_untracked(), data);
83+
let index = self.convert_selected_tab_to_index();
84+
match prev.get_mut(index) {
85+
Some(sql_result) => *sql_result = data,
86+
None => prev.push(data),
87+
}
8488
});
8589
self.is_loading.set(false);
8690
Ok(())
@@ -101,28 +105,31 @@ impl TabsStore {
101105
self
102106
.sql_results
103107
.get()
104-
.get(&self.selected_tab.get())
108+
.get(self.convert_selected_tab_to_index())
105109
.cloned()
106110
}
107111

108112
pub fn add_editor(&mut self, editor: Rc<RefCell<Option<CodeEditor>>>) {
109113
self.editors.update(|prev| {
110-
prev.insert((self.active_tabs.get_untracked() - 1).to_string(), editor);
114+
prev.push(editor);
115+
});
116+
self.sql_results.update(|prev| {
117+
prev.push((Vec::new(), Vec::new()));
111118
});
112119
}
113120

114121
#[allow(dead_code)]
115-
pub fn remove_editor(&mut self, tab_key: &str) {
122+
pub fn remove_editor(&mut self, index: usize) {
116123
self.editors.update(|prev| {
117-
prev.remove(tab_key);
124+
prev.remove(index);
118125
});
119126
}
120127

121128
pub fn select_active_editor(&self) -> ModelCell {
122129
self
123130
.editors
124131
.get_untracked()
125-
.get(&self.selected_tab.get_untracked())
132+
.get(self.convert_selected_tab_to_index())
126133
.unwrap()
127134
.clone()
128135
}
@@ -131,7 +138,7 @@ impl TabsStore {
131138
self
132139
.editors
133140
.get_untracked()
134-
.get(&self.selected_tab.get_untracked())
141+
.get(self.convert_selected_tab_to_index())
135142
.unwrap()
136143
.borrow()
137144
.as_ref()
@@ -145,7 +152,7 @@ impl TabsStore {
145152
self
146153
.editors
147154
.get_untracked()
148-
.get(&self.selected_tab.get_untracked())
155+
.get(self.convert_selected_tab_to_index())
149156
.unwrap()
150157
.borrow()
151158
.as_ref()
@@ -155,6 +162,10 @@ impl TabsStore {
155162
.set_value(value);
156163
}
157164

165+
pub(self) fn convert_selected_tab_to_index(&self) -> usize {
166+
self.selected_tab.get().parse::<usize>().unwrap()
167+
}
168+
158169
// TODO: improve this
159170
pub(self) fn find_query_for_line(&self, queries: &str, line_number: f64) -> Option<QueryInfo> {
160171
let mut start_line = 1f64;

0 commit comments

Comments
 (0)