Skip to content

Commit 6f4788c

Browse files
Native: Add configuration window in Native UI
1 parent 29e731c commit 6f4788c

File tree

6 files changed

+105
-4
lines changed

6 files changed

+105
-4
lines changed

application/apps/indexer/gui/application/src/host/ui/menu.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
use egui::{MenuBar, Theme, Ui};
1+
use egui::{MenuBar, Popup, Theme, Ui};
22
use stypes::FileFormat;
33
use tokio::sync::mpsc::Sender;
44

5+
use super::state::HostState;
56
use crate::host::{
67
command::HostCommand,
78
common::{parsers::ParserNames, sources::StreamNames},
@@ -24,7 +25,7 @@ impl MainMenuBar {
2425
Self { cmd_tx }
2526
}
2627

27-
pub fn render(&mut self, ui: &mut Ui, actions: &mut UiActions) {
28+
pub fn render(&mut self, ui: &mut Ui, actions: &mut UiActions, state: &mut HostState) {
2829
self.handle_file_dialog(actions);
2930

3031
MenuBar::new().ui(ui, |ui| {
@@ -154,6 +155,12 @@ impl MainMenuBar {
154155
ui.ctx().set_theme(Theme::Light);
155156
}
156157
});
158+
159+
ui.menu_button("Settings", |ui| {
160+
if ui.button("Ai Configuration").clicked() {
161+
state.open_configuration();
162+
}
163+
});
157164
});
158165
}
159166

application/apps/indexer/gui/application/src/host/ui/mod.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use crate::{
2222
parsers::ParserConfig,
2323
sources::{ByteSourceConfig, ProcessConfig, StreamConfig},
2424
},
25+
settings::SystemSettingsView,
2526
tabs::TabType,
2627
},
2728
},
@@ -37,6 +38,7 @@ mod menu;
3738
pub mod multi_setup;
3839
mod notification;
3940
pub mod session_setup;
41+
mod settings;
4042
mod state;
4143
mod tabs;
4244

@@ -48,6 +50,7 @@ pub struct Host {
4850
senders: UiSenders,
4951
menu: MainMenuBar,
5052
notifications: NotificationUi,
53+
settings: SystemSettingsView,
5154
state: HostState,
5255
ui_actions: UiActions,
5356
}
@@ -78,6 +81,7 @@ impl Host {
7881
senders: ui_comm.senders,
7982
notifications: NotificationUi::default(),
8083
state: HostState::default(),
84+
settings: SystemSettingsView::default(),
8185
ui_actions: UiActions::new(tokio_handle),
8286
};
8387

@@ -186,9 +190,12 @@ impl Host {
186190

187191
fn render_menu(&mut self, ui: &mut Ui) {
188192
let Self {
189-
menu, ui_actions, ..
193+
menu,
194+
ui_actions,
195+
state,
196+
..
190197
} = self;
191-
menu.render(ui, ui_actions);
198+
menu.render(ui, ui_actions, state);
192199
}
193200

194201
fn render_tabs(&mut self, ui: &mut Ui) {
@@ -233,6 +240,8 @@ impl Host {
233240
.expect("Multiple files setups with provided ID from active tab must exist")
234241
.render_content(ui_actions, ui),
235242
}
243+
244+
self.settings.render_content(&mut self.state, ui);
236245
}
237246

238247
fn handle_ui_actions(&mut self, ctx: &Context) {
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
use crate::host::ui::state::HostState;
2+
use eframe::egui::Ui;
3+
4+
#[derive(Debug)]
5+
pub struct AiConfiguration {
6+
pub model: String,
7+
pub url: String,
8+
pub api_token: Option<String>,
9+
}
10+
11+
impl Default for AiConfiguration {
12+
fn default() -> Self {
13+
Self {
14+
model: "llama3.2".to_string(),
15+
url: "http://localhost:11434".to_string(),
16+
api_token: None,
17+
}
18+
}
19+
}
20+
21+
impl AiConfiguration {
22+
pub fn render_content(&mut self, state: &mut HostState, ui: &mut Ui) {
23+
if state.configuration_open {
24+
egui::Window::new("Configuration")
25+
.collapsible(false)
26+
.title_bar(true)
27+
.open(&mut state.configuration_open)
28+
.show(ui.ctx(), |ui| {
29+
ui.horizontal(|ui| {
30+
let label = ui.label("Model Name: ");
31+
ui.text_edit_singleline(&mut self.model)
32+
.labelled_by(label.id);
33+
});
34+
35+
ui.horizontal(|ui| {
36+
let label = ui.label("URL: ");
37+
ui.text_edit_singleline(&mut self.url).labelled_by(label.id);
38+
});
39+
40+
ui.horizontal(|ui| {
41+
let label = ui.label("API Token: ");
42+
let mut token = self.api_token.clone().unwrap_or_default();
43+
ui.text_edit_singleline(&mut token).labelled_by(label.id);
44+
self.api_token = if token.is_empty() { None } else { Some(token) };
45+
});
46+
});
47+
}
48+
}
49+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use egui::Ui;
2+
3+
use crate::host::ui::settings::ai_config::AiConfiguration;
4+
use crate::host::ui::state::HostState;
5+
6+
pub mod ai_config;
7+
8+
#[derive(Debug)]
9+
pub struct SystemSettingsView {
10+
pub configuration: AiConfiguration,
11+
}
12+
13+
impl Default for SystemSettingsView {
14+
fn default() -> Self {
15+
Self {
16+
configuration: AiConfiguration::default(),
17+
}
18+
}
19+
}
20+
21+
impl SystemSettingsView {
22+
pub fn render_content(&mut self, state: &mut HostState, ui: &mut Ui) {
23+
self.configuration.render_content(state, ui);
24+
}
25+
}

application/apps/indexer/gui/application/src/host/ui/state.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::{
99
ui::{
1010
multi_setup::{MultiFileSetup, state::MultiFileState},
1111
session_setup::{SessionSetup, state::SessionSetupState},
12+
settings::ai_config::AiConfiguration,
1213
tabs::TabType,
1314
},
1415
},
@@ -20,10 +21,12 @@ pub const HOME_TAB_IDX: usize = 0;
2021
#[derive(Debug)]
2122
pub struct HostState {
2223
pub active_tab_idx: usize,
24+
pub configuration_open: bool,
2325
pub tabs: Vec<TabType>,
2426
pub sessions: HashMap<Uuid, Session>,
2527
pub session_setups: HashMap<Uuid, SessionSetup>,
2628
pub multi_setups: HashMap<Uuid, MultiFileSetup>,
29+
pub ai_configuration: AiConfiguration,
2730
}
2831

2932
impl HostState {
@@ -161,6 +164,10 @@ impl HostState {
161164
self.multi_setups.remove(&setup_id);
162165
}
163166

167+
pub fn open_configuration(&mut self) {
168+
self.configuration_open = true;
169+
}
170+
164171
fn update_current_tab_on_close(&mut self, removed_idx: usize) {
165172
if self.active_tab_idx == removed_idx {
166173
self.active_tab_idx = HOME_TAB_IDX;
@@ -175,10 +182,12 @@ impl Default for HostState {
175182
fn default() -> Self {
176183
Self {
177184
active_tab_idx: 0,
185+
configuration_open: false,
178186
tabs: vec![TabType::Home],
179187
sessions: HashMap::new(),
180188
session_setups: HashMap::new(),
181189
multi_setups: HashMap::new(),
190+
ai_configuration: AiConfiguration::default(),
182191
}
183192
}
184193
}

application/apps/indexer/gui/application/src/host/ui/tabs.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ pub enum TabType {
2424
pub fn render_all_tabs(state: &mut HostState, actions: &mut UiActions, ui: &mut Ui) {
2525
let HostState {
2626
active_tab_idx,
27+
configuration_open,
2728
tabs,
2829
sessions,
2930
session_setups,
3031
multi_setups,
32+
ai_configuration,
3133
} = state;
3234

3335
for (idx, tab) in tabs.iter().enumerate() {

0 commit comments

Comments
 (0)