diff options
author | Ville Hakulinen <ville.hakulinen@gmail.com> | 2020-07-07 15:19:27 +0300 |
---|---|---|
committer | Ville Hakulinen <ville.hakulinen@gmail.com> | 2020-07-12 01:57:30 +0300 |
commit | a49e0ced15459ad19b70d2ad6bce1030202b7991 (patch) | |
tree | d276fbd869ee4b92c7d3c56305c5ae9e34409407 | |
parent | 47a6024839c0bfea51d5ab7e0ff0556522a402c1 (diff) |
Move window between parents when needed
-rw-r--r-- | src/ui/state.rs | 75 | ||||
-rw-r--r-- | src/ui/window.rs | 8 |
2 files changed, 52 insertions, 31 deletions
diff --git a/src/ui/state.rs b/src/ui/state.rs index 1d616d5..fbde150 100644 --- a/src/ui/state.rs +++ b/src/ui/state.rs @@ -528,14 +528,21 @@ impl UIState { let grid = self.grids.get(&evt.grid).unwrap(); let css_provider = self.css_provider.clone(); - let window = self.windows.entry(evt.grid).or_insert_with(|| { - Window::new( - NvimWindow::new(evt.win.clone(), nvim.clone()), - windows_container, - &grid, - Some(css_provider), - ) - }); + let window = self + .windows + .entry(evt.grid) + .and_modify(clone!(windows_container => move |w| { + // Set the parent window's to the windows container if needed. + w.set_parent(windows_container.upcast()); + })) + .or_insert_with(|| { + Window::new( + NvimWindow::new(evt.win.clone(), nvim.clone()), + windows_container, + &grid, + Some(css_provider), + ) + }); let grid_metrics = self.grids.get(&1).unwrap().get_grid_metrics(); let x = evt.start_col as f64 * grid_metrics.cell_width; @@ -549,37 +556,43 @@ impl UIState { grid.resize(&win, evt.width, evt.height, &self.hl_defs); } + fn get_float_anchor_pos(&self, evt: &WindowFloatPos) -> (f64, f64) { + if evt.anchor_grid == evt.grid { + warn!("Can't use a grid as its own float anchor. Defaulting to base grid."); + } + + if evt.anchor_grid == 1 || evt.anchor_grid == evt.grid { + (0.0, 0.0) + } else { + let anchor_window = self.windows.get(&evt.anchor_grid).unwrap(); + (anchor_window.x, anchor_window.y) + } + } + fn window_float_pos(&mut self, evt: WindowFloatPos, nvim: &GioNeovim) { let anchor_grid = self.grids.get(&evt.anchor_grid).unwrap(); - let (x_offset, y_offset) = { - if evt.anchor_grid == 1 { - (0.0, 0.0) - } else { - if evt.anchor_grid == evt.grid { - warn!("Can't use a grid as its own float anchor. Defaulting to (0, 0)"); - (0.0, 0.0) - } else { - let anchor_window = - self.windows.get(&evt.anchor_grid).unwrap(); - (anchor_window.x, anchor_window.y) - } - } - }; + let (x_offset, y_offset) = self.get_float_anchor_pos(&evt); let grid = self.grids.get(&evt.grid).unwrap(); let windows_float_container = self.windows_float_container.clone(); let css_provider = self.css_provider.clone(); - let window = self.windows.entry(evt.grid).or_insert_with(|| { - Window::new( - NvimWindow::new(evt.win.clone(), nvim.clone()), - windows_float_container, - &grid, - Some(css_provider), - ) - }); - // TODO(ville): Move window from possible container to float container. + let window = self + .windows + .entry(evt.grid) + .and_modify(clone!(windows_float_container => move |w| { + // Set the parent window's to the float container if needed. + w.set_parent(windows_float_container.upcast()); + })) + .or_insert_with(|| { + Window::new( + NvimWindow::new(evt.win.clone(), nvim.clone()), + windows_float_container, + &grid, + Some(css_provider), + ) + }); let anchor_metrics = anchor_grid.get_grid_metrics(); let grid_metrics = grid.get_grid_metrics(); diff --git a/src/ui/window.rs b/src/ui/window.rs index 496bd7b..3418980 100644 --- a/src/ui/window.rs +++ b/src/ui/window.rs @@ -101,6 +101,14 @@ impl Window { } } + pub fn set_parent(&mut self, fixed: gtk::Fixed) { + if self.fixed != fixed { + self.fixed.remove(&self.frame); + self.fixed = fixed; + self.fixed.put(&self.frame, 0, 0); + } + } + pub fn resize(&self, size: (i32, i32)) { self.frame.set_size_request(size.0, size.1); } |