Skip to content

Commit f4b6967

Browse files
refactor: visualkind acts as visual identity
Signed-off-by: Maika Namuo <httpworldview@gmail.com>
1 parent 770608d commit f4b6967

5 files changed

Lines changed: 69 additions & 131 deletions

File tree

‎src/ui/app/message.rs‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,7 @@ pub(super) fn update(app: &mut UiApp, msg: Message) -> Task<Message> {
121121
app.sync_all_windows(),
122122
])
123123
}
124-
Message::Visuals(VisualsMessage::SettingsRequested { visual_id, kind }) => {
125-
app.open_settings_window(visual_id, kind)
126-
}
124+
Message::Visuals(VisualsMessage::SettingsRequested(kind)) => app.open_settings_window(kind),
127125
Message::Visuals(VisualsMessage::WindowDragRequested) if !app.main_window_is_layer => {
128126
window::drag(app.main_window_id)
129127
}

‎src/ui/app/windowing.rs‎

Lines changed: 23 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ use crate::persistence::settings::{BarAlignment, BarSettings, clamp_bar_height};
77
use crate::ui::pages::config::ConfigMessage;
88
use crate::ui::pages::visuals::{VisualsMessage, create_settings_panel};
99
use crate::ui::theme;
10-
use crate::visuals::registry::{
11-
VisualContent, VisualId, VisualKind, VisualMetadata, VisualSlotSnapshot,
12-
};
10+
use crate::visuals::registry::{VisualContent, VisualKind, VisualMetadata, VisualSlotSnapshot};
1311
use iced::widget::{container, mouse_area, text};
1412
use iced::{Element, Length, Size, Task, exit, window};
1513
use iced_layershell::actions::OutputSnapshotCallback;
@@ -142,7 +140,6 @@ pub(super) struct BarResizeState {
142140
}
143141

144142
pub(super) struct PopoutWindow {
145-
pub visual_id: VisualId,
146143
pub kind: VisualKind,
147144
pub original_index: usize,
148145
pub cached: Option<(VisualMetadata, VisualContent)>,
@@ -152,18 +149,15 @@ impl PopoutWindow {
152149
pub fn sync_from_snapshot(&mut self, snapshot: &[VisualSlotSnapshot]) {
153150
self.cached = snapshot
154151
.iter()
155-
.find(|slot| slot.id == self.visual_id && slot.enabled)
152+
.find(|slot| slot.kind == self.kind && slot.enabled)
156153
.map(|slot| (slot.metadata, slot.content.clone()));
157154
}
158155

159156
pub fn view(&self) -> Element<'_, VisualsMessage> {
160157
let Some((_, content)) = &self.cached else {
161158
return fill!(text("")).into();
162159
};
163-
let msg = VisualsMessage::SettingsRequested {
164-
visual_id: self.visual_id,
165-
kind: self.kind,
166-
};
160+
let msg = VisualsMessage::SettingsRequested(self.kind);
167161
mouse_area(fill!(content.render()))
168162
.on_right_press(msg)
169163
.into()
@@ -175,24 +169,15 @@ impl UiApp {
175169
let Some((_, panel)) = self.settings_window.as_mut() else {
176170
return;
177171
};
178-
let visual_id = panel.visual_id;
179-
let snapshot = self.visual_manager.snapshot();
180-
let Some(kind) = snapshot.iter().find(|s| s.id == visual_id).map(|s| s.kind) else {
181-
return;
182-
};
183-
*panel = create_settings_panel(visual_id, kind, &self.visual_manager);
172+
*panel = create_settings_panel(panel.kind, &self.visual_manager);
184173
}
185174

186-
pub(super) fn open_settings_window(
187-
&mut self,
188-
visual_id: VisualId,
189-
kind: VisualKind,
190-
) -> Task<Message> {
191-
let new_panel = create_settings_panel(visual_id, kind, &self.visual_manager);
175+
pub(super) fn open_settings_window(&mut self, kind: VisualKind) -> Task<Message> {
176+
let new_panel = create_settings_panel(kind, &self.visual_manager);
192177
let previous = self.settings_window.take();
193178
if previous
194179
.as_ref()
195-
.is_some_and(|(_, panel)| panel.visual_id == visual_id)
180+
.is_some_and(|(_, panel)| panel.kind == kind)
196181
{
197182
self.settings_window = previous.map(|(id, _)| (id, new_panel));
198183
return Task::none();
@@ -206,29 +191,23 @@ impl UiApp {
206191
}
207192
}
208193

209-
pub(super) fn open_popout_window(
210-
&mut self,
211-
visual_id: VisualId,
212-
kind: VisualKind,
213-
) -> Task<Message> {
194+
pub(super) fn open_popout_window(&mut self, kind: VisualKind) -> Task<Message> {
214195
if self
215196
.popout_windows
216197
.values()
217-
.any(|popout| popout.visual_id == visual_id)
198+
.any(|popout| popout.kind == kind)
218199
{
219200
return Task::none();
220201
}
221202
let snapshot = self.visual_manager.snapshot();
222-
let Some((index, slot)) = snapshot.iter().enumerate().find(|(_, s)| s.id == visual_id)
223-
else {
203+
let Some((index, slot)) = snapshot.iter().enumerate().find(|(_, s)| s.kind == kind) else {
224204
return Task::none();
225205
};
226206
let window_size = popout_window_size(&slot.metadata);
227207
let use_decorations = self.settings_handle.borrow().data.decorations;
228208
let (new_id, open_task) =
229209
open_base_window(self.use_layershell, window_size, use_decorations);
230210
let mut popout = PopoutWindow {
231-
visual_id,
232211
kind,
233212
original_index: index,
234213
cached: None,
@@ -249,8 +228,8 @@ impl UiApp {
249228
Task::none()
250229
}
251230

252-
pub(super) fn popped_out_ids(&self) -> Vec<VisualId> {
253-
self.popout_windows.values().map(|w| w.visual_id).collect()
231+
pub(super) fn popped_out_kinds(&self) -> Vec<VisualKind> {
232+
self.popout_windows.values().map(|w| w.kind).collect()
254233
}
255234

256235
pub(super) fn sync_all_windows(&mut self) -> Task<Message> {
@@ -260,7 +239,7 @@ impl UiApp {
260239
.take_if(|(_, panel)| {
261240
!snapshot
262241
.iter()
263-
.any(|slot| slot.id == panel.visual_id && slot.enabled)
242+
.any(|slot| slot.kind == panel.kind && slot.enabled)
264243
})
265244
.map(|(id, _)| window::close::<Message>(id));
266245
self.popout_windows
@@ -272,7 +251,7 @@ impl UiApp {
272251
.map(|(id, _)| id)
273252
.collect();
274253
self.visuals_page
275-
.apply_snapshot_excluding(&snapshot, &self.popped_out_ids());
254+
.apply_snapshot_excluding(&snapshot, &self.popped_out_kinds());
276255
Task::batch(
277256
close_settings_task
278257
.into_iter()
@@ -285,22 +264,22 @@ impl UiApp {
285264
return "OpenMeters".into();
286265
}
287266

288-
let (visual_id, suffix) = if let Some((_, panel)) = self
267+
let (kind, suffix) = if let Some((_, panel)) = self
289268
.settings_window
290269
.as_ref()
291270
.filter(|(id, _)| *id == window_id)
292271
{
293-
(panel.visual_id, " settings")
272+
(panel.kind, " settings")
294273
} else if let Some(popout) = self.popout_windows.get(&window_id) {
295-
(popout.visual_id, "")
274+
(popout.kind, "")
296275
} else {
297276
return "OpenMeters".into();
298277
};
299278

300279
self.visual_manager
301280
.snapshot()
302281
.iter()
303-
.find(|s| s.id == visual_id)
282+
.find(|s| s.kind == kind)
304283
.map_or_else(
305284
|| "OpenMeters".into(),
306285
|s| format!("{}{} - OpenMeters", s.metadata.display_name, suffix),
@@ -334,7 +313,7 @@ impl UiApp {
334313
if let Some(popout) = self.popout_windows.remove(&source_window) {
335314
self.visual_manager
336315
.borrow_mut()
337-
.restore_position(popout.visual_id, popout.original_index);
316+
.move_to(popout.kind, popout.original_index);
338317
self.sync_visuals_page();
339318
self.settings_handle.update(|settings| {
340319
settings.data.visuals.order = self
@@ -346,18 +325,18 @@ impl UiApp {
346325
});
347326
return window::close(source_window);
348327
}
349-
let Some((id, kind)) = self.visuals_page.hovered_visual() else {
328+
let Some(kind) = self.visuals_page.hovered_visual() else {
350329
return Task::none();
351330
};
352-
let task = self.open_popout_window(id, kind);
331+
let task = self.open_popout_window(kind);
353332
self.sync_visuals_page();
354333
task
355334
}
356335

357336
pub(super) fn sync_visuals_page(&mut self) {
358337
let snapshot = self.visual_manager.snapshot();
359338
self.visuals_page
360-
.apply_snapshot_excluding(&snapshot, &self.popped_out_ids());
339+
.apply_snapshot_excluding(&snapshot, &self.popped_out_kinds());
361340
}
362341

363342
pub(super) fn apply_bar_layout(
@@ -511,15 +490,10 @@ impl UiApp {
511490
let Some((old_id, panel)) = self.settings_window.take() else {
512491
return Task::none();
513492
};
514-
let visual_id = panel.visual_id;
515-
let snapshot = self.visual_manager.snapshot();
516-
let Some(slot) = snapshot.iter().find(|s| s.id == visual_id) else {
517-
return window::close(old_id);
518-
};
519493
let (new_id, open_task) = open_settings_base_window(self.use_layershell);
520494
self.settings_window = Some((
521495
new_id,
522-
create_settings_panel(visual_id, slot.kind, &self.visual_manager),
496+
create_settings_panel(panel.kind, &self.visual_manager),
523497
));
524498
Task::batch([open_task, window::close(old_id)])
525499
}

‎src/ui/pages/visuals.rs‎

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
use crate::persistence::settings::SettingsHandle;
55
use crate::ui::widgets::pane_grid::{self, Content as PaneContent, Pane};
66
use crate::visuals::registry::{
7-
VisualContent, VisualId, VisualKind, VisualManagerHandle, VisualSlotSnapshot,
7+
VisualContent, VisualKind, VisualManagerHandle, VisualSlotSnapshot,
88
};
99
pub mod settings;
1010
pub use settings::{ActiveSettings, SettingsMessage, create_panel as create_settings_panel};
@@ -18,16 +18,12 @@ pub enum VisualsMessage {
1818
PaneResized(pane_grid::ResizeWidths),
1919
PaneContextRequested(Pane),
2020
PaneHovered(Option<Pane>),
21-
SettingsRequested {
22-
visual_id: VisualId,
23-
kind: VisualKind,
24-
},
21+
SettingsRequested(VisualKind),
2522
WindowDragRequested,
2623
}
2724

2825
#[derive(Clone)]
2926
struct VisualPane {
30-
id: VisualId,
3127
kind: VisualKind,
3228
content: VisualContent,
3329
min_width: f32,
@@ -73,7 +69,7 @@ impl VisualsPage {
7369
if let Some(panes) = self.panes.as_mut()
7470
&& panes.move_to(pane, target)
7571
{
76-
let order: Vec<_> = panes.iter().map(|(_, p)| p.id).collect();
72+
let order: Vec<_> = panes.iter().map(|(_, p)| p.kind).collect();
7773
self.visual_manager.borrow_mut().reorder(&order);
7874
}
7975
}
@@ -89,23 +85,17 @@ impl VisualsPage {
8985
}
9086
VisualsMessage::PaneContextRequested(pane) => {
9187
if let Some(p) = self.panes.as_ref().and_then(|ps| ps.get(pane)) {
92-
return Task::done(VisualsMessage::SettingsRequested {
93-
visual_id: p.id,
94-
kind: p.kind,
95-
});
88+
return Task::done(VisualsMessage::SettingsRequested(p.kind));
9689
}
9790
}
9891
VisualsMessage::PaneHovered(pane) => self.hovered_pane = pane,
99-
VisualsMessage::SettingsRequested { .. } | VisualsMessage::WindowDragRequested => {}
92+
VisualsMessage::SettingsRequested(_) | VisualsMessage::WindowDragRequested => {}
10093
}
10194
Task::none()
10295
}
10396

104-
pub fn hovered_visual(&self) -> Option<(VisualId, VisualKind)> {
105-
self.panes
106-
.as_ref()?
107-
.get(self.hovered_pane?)
108-
.map(|p| (p.id, p.kind))
97+
pub fn hovered_visual(&self) -> Option<VisualKind> {
98+
self.panes.as_ref()?.get(self.hovered_pane?).map(|p| p.kind)
10999
}
110100

111101
pub fn view(&self, controls_visible: bool) -> Element<'_, VisualsMessage> {
@@ -142,11 +132,11 @@ impl VisualsPage {
142132
pub(crate) fn apply_snapshot_excluding(
143133
&mut self,
144134
snapshot: &[VisualSlotSnapshot],
145-
exclude: &[VisualId],
135+
exclude: &[VisualKind],
146136
) {
147137
let slots: Vec<_> = snapshot
148138
.iter()
149-
.filter(|s| s.enabled && !exclude.contains(&s.id))
139+
.filter(|s| s.enabled && !exclude.contains(&s.kind))
150140
.collect();
151141
if slots.is_empty() {
152142
self.panes = None;
@@ -156,16 +146,16 @@ impl VisualsPage {
156146
if self.panes.as_ref().is_none_or(|panes| {
157147
panes
158148
.iter()
159-
.map(|(_, p)| p.id)
160-
.ne(slots.iter().map(|s| s.id))
149+
.map(|(_, p)| p.kind)
150+
.ne(slots.iter().map(|s| s.kind))
161151
}) {
162152
self.panes = Some(self.build_panes(&slots));
163153
self.hovered_pane = None;
164154
return;
165155
}
166156
if let Some(panes) = self.panes.as_mut() {
167157
panes.for_each_mut(|_, p| {
168-
if let Some(s) = slots.iter().copied().find(|s| s.id == p.id) {
158+
if let Some(s) = slots.iter().copied().find(|s| s.kind == p.kind) {
169159
p.content = s.content.clone();
170160
p.min_width = s.metadata.min_width;
171161
}
@@ -195,7 +185,6 @@ impl VisualsPage {
195185
let saved_width_basis = &settings.data.visuals.width_basis;
196186
pane_grid::State::from_iter(slots.iter().map(|&slot| {
197187
VisualPane {
198-
id: slot.id,
199188
kind: slot.kind,
200189
content: slot.content.clone(),
201190
min_width: slot.metadata.min_width,

0 commit comments

Comments
 (0)