@@ -7,8 +7,9 @@ use log::{debug, error, warn};
77use tauri:: { Manager , WebviewUrl } ;
88
99const AGENT_COMPANION_WINDOW_LABEL : & str = "agent-companion-pet" ;
10- const AGENT_COMPANION_WINDOW_WIDTH : f64 = 360.0 ;
11- const AGENT_COMPANION_WINDOW_HEIGHT : f64 = 180.0 ;
10+ const AGENT_COMPANION_WINDOW_MIN_SIZE : f64 = 96.0 ;
11+ const AGENT_COMPANION_WINDOW_MAX_WIDTH : f64 = 360.0 ;
12+ const AGENT_COMPANION_WINDOW_MAX_HEIGHT : f64 = 240.0 ;
1213const AGENT_COMPANION_WINDOW_MARGIN : i32 = 64 ;
1314
1415#[ derive( Debug , Clone ) ]
@@ -321,31 +322,104 @@ fn app_url(path: &str) -> WebviewUrl {
321322 }
322323}
323324
324- fn position_agent_companion_window ( app : & tauri:: AppHandle , window : & tauri:: WebviewWindow ) {
325+ fn agent_companion_default_position (
326+ app : & tauri:: AppHandle ,
327+ window : & tauri:: WebviewWindow ,
328+ ) -> Option < tauri:: LogicalPosition < f64 > > {
325329 let monitor: Option < tauri:: Monitor > = window
326330 . current_monitor ( )
327331 . ok ( )
328332 . flatten ( )
329333 . or_else ( || app. primary_monitor ( ) . ok ( ) . flatten ( ) ) ;
330334
331- let Some ( monitor) = monitor else {
332- return ;
333- } ;
335+ let monitor = monitor?;
334336
335337 let scale_factor = monitor. scale_factor ( ) ;
336338 let area = monitor. work_area ( ) ;
337339 let area_position = area. position . to_logical :: < f64 > ( scale_factor) ;
338340 let area_size = area. size . to_logical :: < f64 > ( scale_factor) ;
341+ let window_size = window
342+ . outer_size ( )
343+ . ok ( )
344+ . map ( |size| size. to_logical :: < f64 > ( scale_factor) ) ;
345+ let window_width = window_size
346+ . as_ref ( )
347+ . map ( |size| size. width )
348+ . unwrap_or ( AGENT_COMPANION_WINDOW_MIN_SIZE ) ;
349+ let window_height = window_size
350+ . as_ref ( )
351+ . map ( |size| size. height )
352+ . unwrap_or ( AGENT_COMPANION_WINDOW_MIN_SIZE ) ;
339353 let x = area_position. x + area_size. width
340- - AGENT_COMPANION_WINDOW_WIDTH
354+ - window_width
341355 - f64:: from ( AGENT_COMPANION_WINDOW_MARGIN ) ;
342356 let y = area_position. y + area_size. height
343- - AGENT_COMPANION_WINDOW_HEIGHT
357+ - window_height
344358 - f64:: from ( AGENT_COMPANION_WINDOW_MARGIN ) ;
345359
346- if let Err ( e ) = window . set_position ( tauri:: LogicalPosition :: new (
360+ Some ( tauri:: LogicalPosition :: new (
347361 x. max ( area_position. x ) ,
348362 y. max ( area_position. y ) ,
363+ ) )
364+ }
365+
366+ fn position_agent_companion_window ( app : & tauri:: AppHandle , window : & tauri:: WebviewWindow ) {
367+ let Some ( position) = agent_companion_default_position ( app, window) else {
368+ return ;
369+ } ;
370+
371+ if let Err ( e) = window. set_position ( position) {
372+ warn ! ( "Failed to position Agent companion window: {}" , e) ;
373+ }
374+ }
375+
376+ fn resize_agent_companion_window (
377+ app : & tauri:: AppHandle ,
378+ window : & tauri:: WebviewWindow ,
379+ width : f64 ,
380+ height : f64 ,
381+ ) {
382+ let monitor: Option < tauri:: Monitor > = window
383+ . current_monitor ( )
384+ . ok ( )
385+ . flatten ( )
386+ . or_else ( || app. primary_monitor ( ) . ok ( ) . flatten ( ) ) ;
387+ let scale_factor = monitor. as_ref ( ) . map ( |monitor| monitor. scale_factor ( ) ) ;
388+ let old_size = scale_factor. and_then ( |scale_factor| {
389+ window
390+ . outer_size ( )
391+ . ok ( )
392+ . map ( |size| size. to_logical :: < f64 > ( scale_factor) )
393+ } ) ;
394+ let old_position = scale_factor. and_then ( |scale_factor| {
395+ window
396+ . outer_position ( )
397+ . ok ( )
398+ . map ( |position| position. to_logical :: < f64 > ( scale_factor) )
399+ } ) ;
400+
401+ if let Err ( e) = window. set_size ( tauri:: LogicalSize :: new ( width, height) ) {
402+ warn ! ( "Failed to resize Agent companion window: {}" , e) ;
403+ return ;
404+ }
405+
406+ let next_position = old_position
407+ . zip ( old_size)
408+ . map ( |( position, size) | {
409+ tauri:: LogicalPosition :: new (
410+ position. x + size. width - width,
411+ position. y + size. height - height,
412+ )
413+ } )
414+ . or_else ( || agent_companion_default_position ( app, window) ) ;
415+
416+ let Some ( position) = next_position else {
417+ return ;
418+ } ;
419+
420+ if let Err ( e) = window. set_position ( tauri:: LogicalPosition :: new (
421+ position. x ,
422+ position. y ,
349423 ) ) {
350424 warn ! ( "Failed to position Agent companion window: {}" , e) ;
351425 }
@@ -366,17 +440,14 @@ pub async fn show_agent_companion_desktop_pet(app: tauri::AppHandle) -> Result<(
366440 let mut builder = tauri:: WebviewWindowBuilder :: new ( & app, AGENT_COMPANION_WINDOW_LABEL , url)
367441 . title ( "BitFun Agent Companion" )
368442 . inner_size (
369- AGENT_COMPANION_WINDOW_WIDTH ,
370- AGENT_COMPANION_WINDOW_HEIGHT ,
443+ AGENT_COMPANION_WINDOW_MIN_SIZE ,
444+ AGENT_COMPANION_WINDOW_MIN_SIZE ,
371445 )
372446 . max_inner_size (
373- AGENT_COMPANION_WINDOW_WIDTH ,
374- AGENT_COMPANION_WINDOW_HEIGHT ,
375- )
376- . min_inner_size (
377- AGENT_COMPANION_WINDOW_WIDTH ,
378- AGENT_COMPANION_WINDOW_HEIGHT ,
447+ AGENT_COMPANION_WINDOW_MAX_WIDTH ,
448+ AGENT_COMPANION_WINDOW_MAX_HEIGHT ,
379449 )
450+ . min_inner_size ( 1.0 , 1.0 )
380451 . resizable ( false )
381452 . decorations ( false )
382453 . transparent ( true )
@@ -404,6 +475,18 @@ pub async fn show_agent_companion_desktop_pet(app: tauri::AppHandle) -> Result<(
404475 Ok ( ( ) )
405476}
406477
478+ #[ tauri:: command]
479+ pub async fn resize_agent_companion_desktop_pet (
480+ app : tauri:: AppHandle ,
481+ width : f64 ,
482+ height : f64 ,
483+ ) -> Result < ( ) , String > {
484+ if let Some ( window) = app. get_webview_window ( AGENT_COMPANION_WINDOW_LABEL ) {
485+ resize_agent_companion_window ( & app, & window, width, height) ;
486+ }
487+ Ok ( ( ) )
488+ }
489+
407490#[ tauri:: command]
408491pub async fn hide_agent_companion_desktop_pet ( app : tauri:: AppHandle ) -> Result < ( ) , String > {
409492 if let Some ( window) = app. get_webview_window ( AGENT_COMPANION_WINDOW_LABEL ) {
0 commit comments