@@ -267,7 +267,16 @@ def _show_context_menu(self, global_pos):
267267 menu .exec (global_pos )
268268
269269 def _handle_drag_event (self , obj , event ):
270- if self ._is_interactive_drag_source (obj ):
270+ drag_active = (
271+ self ._drag_global_pos is not None or self ._using_system_move
272+ )
273+ if self ._is_interactive_drag_source (obj ) and not (
274+ drag_active
275+ or (
276+ self .isVisible ()
277+ and self ._is_window_side (event .globalPosition ().toPoint ())
278+ )
279+ ):
271280 self ._drag_global_pos = None
272281 self ._using_system_move = False
273282 return False
@@ -316,7 +325,7 @@ def _handle_resize_event(self, _obj, event):
316325 return True
317326 edges = self ._resize_edges_at (global_pos )
318327 if edges is not None :
319- self .setCursor (Qt . CursorShape . SizeHorCursor )
328+ self .setCursor (self . _resize_cursor ( edges ) )
320329 else :
321330 self .unsetCursor ()
322331 return False
@@ -346,12 +355,37 @@ def _handle_resize_event(self, _obj, event):
346355
347356 def _resize_edges_at (self , global_pos ):
348357 geometry = self .frameGeometry ()
349- if global_pos .x () <= geometry .left () + RESIZE_MARGIN :
350- return Qt .Edge .LeftEdge
351- if global_pos .x () >= geometry .right () - RESIZE_MARGIN :
352- return Qt .Edge .RightEdge
358+ left = global_pos .x () <= geometry .left () + RESIZE_MARGIN
359+ right = global_pos .x () >= geometry .right () - RESIZE_MARGIN
360+ top = global_pos .y () <= geometry .top () + RESIZE_MARGIN
361+ bottom = global_pos .y () >= geometry .bottom () - RESIZE_MARGIN
362+ if left and top :
363+ return Qt .Edge .LeftEdge | Qt .Edge .TopEdge
364+ if right and top :
365+ return Qt .Edge .RightEdge | Qt .Edge .TopEdge
366+ if left and bottom :
367+ return Qt .Edge .LeftEdge | Qt .Edge .BottomEdge
368+ if right and bottom :
369+ return Qt .Edge .RightEdge | Qt .Edge .BottomEdge
353370 return None
354371
372+ def _resize_cursor (self , edges ):
373+ if edges in (
374+ Qt .Edge .LeftEdge | Qt .Edge .TopEdge ,
375+ Qt .Edge .RightEdge | Qt .Edge .BottomEdge ,
376+ ):
377+ return Qt .CursorShape .SizeFDiagCursor
378+ return Qt .CursorShape .SizeBDiagCursor
379+
380+ def _is_window_side (self , global_pos ):
381+ geometry = self .frameGeometry ()
382+ return (
383+ global_pos .x () <= geometry .left () + RESIZE_MARGIN
384+ or global_pos .x () >= geometry .right () - RESIZE_MARGIN
385+ or global_pos .y () <= geometry .top () + RESIZE_MARGIN
386+ or global_pos .y () >= geometry .bottom () - RESIZE_MARGIN
387+ )
388+
355389 def _resize_manually (self , global_pos ):
356390 start_geometry = self ._resize_start_geometry
357391 start_pos = self ._resize_global_pos
@@ -360,19 +394,31 @@ def _resize_manually(self, global_pos):
360394
361395 delta_x = global_pos .x () - start_pos .x ()
362396 width = start_geometry .width ()
363- if self ._resize_edges == Qt .Edge .LeftEdge :
397+ height = start_geometry .height ()
398+ if self ._resize_edges & Qt .Edge .LeftEdge :
364399 width -= delta_x
365- else :
400+ elif self . _resize_edges & Qt . Edge . RightEdge :
366401 width += delta_x
402+ if self ._resize_edges & Qt .Edge .TopEdge :
403+ height -= global_pos .y () - start_pos .y ()
404+ elif self ._resize_edges & Qt .Edge .BottomEdge :
405+ height += global_pos .y () - start_pos .y ()
367406
368407 width = max (self .minimumWidth (), width )
369408 if self .maximumWidth () < 16777215 :
370409 width = min (self .maximumWidth (), width )
371- if self ._resize_edges == Qt .Edge .LeftEdge :
410+ height = max (self .minimumHeight (), height )
411+ if self .maximumHeight () < 16777215 :
412+ height = min (self .maximumHeight (), height )
413+ if self ._resize_edges & Qt .Edge .LeftEdge :
372414 x = start_geometry .right () - width + 1
373415 else :
374416 x = start_geometry .x ()
375- self .setGeometry (x , start_geometry .y (), width , self .height ())
417+ if self ._resize_edges & Qt .Edge .TopEdge :
418+ y = start_geometry .bottom () - height + 1
419+ else :
420+ y = start_geometry .y ()
421+ self .setGeometry (x , y , width , height )
376422
377423 def _start_system_move (self ):
378424 handle = self .windowHandle ()
@@ -443,7 +489,11 @@ def _is_chat_panel_child(self, obj):
443489 return False
444490
445491 def _resize_to_content (self ):
446- if self ._resizing_to_content :
492+ if (
493+ self ._resizing_to_content
494+ or self ._using_system_resize
495+ or self ._resize_start_geometry is not None
496+ ):
447497 return
448498 self ._resizing_to_content = True
449499 try :
0 commit comments