fix: popup configuration resizing only once

This commit is contained in:
drendog 2025-12-28 22:51:30 +01:00
parent b0fae9867c
commit 0f5bd88742
Signed by: dwenya
GPG key ID: 8DD77074645332D0
3 changed files with 56 additions and 37 deletions

View file

@ -2,6 +2,7 @@ use super::renderable_window::{RenderState, RenderableWindow};
use crate::errors::{RenderingError, Result};
use crate::wayland::surfaces::popup_manager::OnCloseCallback;
use core::ops::Deref;
use layer_shika_domain::dimensions::LogicalSize;
use layer_shika_domain::value_objects::handle::PopupHandle;
use log::info;
use slint::{
@ -37,6 +38,7 @@ pub struct PopupWindow {
on_close: OnceCell<OnCloseCallback>,
popup_render_state: Cell<PopupRenderState>,
component_instance: RefCell<Option<ComponentInstance>>,
logical_size: Cell<LogicalSize>,
}
impl PopupWindow {
@ -54,6 +56,7 @@ impl PopupWindow {
on_close: OnceCell::new(),
popup_render_state: Cell::new(PopupRenderState::Unconfigured),
component_instance: RefCell::new(None),
logical_size: Cell::new(LogicalSize::default()),
}
})
}
@ -141,10 +144,21 @@ impl PopupWindow {
.dispatch_event(WindowEvent::WindowActiveChanged(true));
}
pub fn request_resize(&self, width: f32, height: f32) {
info!("Requesting popup resize to {}x{}", width, height);
pub fn request_resize(&self, width: f32, height: f32) -> bool {
let new_size = LogicalSize::from_raw(width, height);
let current_size = self.logical_size.get();
if current_size == new_size {
info!("Popup resize skipped - size unchanged: {}x{}", width, height);
return false;
}
info!("Requesting popup resize from {}x{} to {}x{}",
current_size.width(), current_size.height(), width, height);
self.logical_size.set(new_size);
self.set_size(WindowSize::Logical(slint::LogicalSize::new(width, height)));
RenderableWindow::request_redraw(self);
true
}
pub fn begin_repositioning(&self) {

View file

@ -903,8 +903,9 @@ impl EventDispatchContext<'_> {
})?;
if let Some(popup_surface) = popup_manager.get_popup_window(handle.key()) {
popup_surface.request_resize(width, height);
let size_changed = popup_surface.request_resize(width, height);
if size_changed {
#[allow(clippy::cast_possible_truncation)]
#[allow(clippy::cast_possible_wrap)]
let logical_width = width as i32;
@ -922,6 +923,7 @@ impl EventDispatchContext<'_> {
height
);
}
}
Ok(())
}
@ -1022,8 +1024,9 @@ impl EventDispatchContext<'_> {
if let Some(popup_manager) = popup_manager_weak.upgrade() {
if let Some(popup_surface) = popup_manager.get_popup_window(popup_key) {
popup_surface.request_resize(dimensions.width, dimensions.height);
let size_changed = popup_surface.request_resize(dimensions.width, dimensions.height);
if size_changed {
#[allow(clippy::cast_possible_truncation)]
#[allow(clippy::cast_possible_wrap)]
let logical_width = dimensions.width as i32;
@ -1045,6 +1048,7 @@ impl EventDispatchContext<'_> {
);
}
}
}
Value::Void
})
.map_err(|e| {

View file

@ -52,6 +52,7 @@ export component ExamplePopup inherits Window {
interval: 1ms;
running: true;
triggered => {
resize_timer.running = false;
root.resize_popup(root.preferred-width, root.preferred-height);
}
}