@@ -457,7 +457,6 @@ def _perform_single_item_update(self, index):
457457
458458 def _perform_render_update (self ):
459459 """执行实际的渲染更新,由防抖计时器调用。"""
460- print (f"[_perform_render_update] 开始完全更新" )
461460 # Clear old region items safely
462461 for item in self ._region_items :
463462 try :
@@ -470,11 +469,9 @@ def _perform_render_update(self):
470469
471470 # Add a new item for each REGION
472471 regions = self .model .get_regions ()
473- print (f"[_perform_render_update] regions 数量: { len (regions )} " )
474472 for i , region_data in enumerate (regions ):
475473 if not region_data .get ('lines' ):
476474 continue
477- print (f"[_perform_render_update] 创建 item { i } " )
478475 item = RegionTextItem (
479476 region_data ,
480477 i ,
@@ -483,7 +480,6 @@ def _perform_render_update(self):
483480 item .setZValue (100 )
484481 self .scene .addItem (item )
485482 self ._region_items .append (item )
486- print (f"[_perform_render_update] 完成,共创建 { len (self ._region_items )} 个 items" )
487483
488484 # After updating items, recalculate all rendering data
489485 self .recalculate_render_data ()
@@ -598,9 +594,6 @@ def _update_text_visuals(self):
598594 item .update_text_pixmap (QPixmap (), QPointF (0 , 0 ))
599595
600596 # 无论是否有渲染结果,都设置绿框数据(即使 translation 为空)
601- print (f"[_update_single_region_text_visual] region { i } : 设置绿框, dst_points is None: { self ._dst_points_cache [i ] is None } " )
602- if self ._dst_points_cache [i ] is not None :
603- print (f"[_update_single_region_text_visual] region { i } : dst_points shape: { self ._dst_points_cache [i ].shape } " )
604597 item .set_dst_points (self ._dst_points_cache [i ])
605598
606599 def _recalculate_single_region_render_data (self , index ):
@@ -937,7 +930,6 @@ def mousePressEvent(self, event):
937930 # 如果有 item 处理了事件,event 会被 accept
938931 # 只有真正点击空白时,event 才不会被 accept
939932 if not event .isAccepted ():
940- print (f"[VIEW] Click on empty area (event not accepted), clearing selection" )
941933 self .model .set_selection ([])
942934
943935 def mouseMoveEvent (self , event ):
@@ -1109,7 +1101,11 @@ def _finish_drawing(self):
11091101 # Convert final mask to numpy and update model
11101102 ptr = mask_image .constBits ()
11111103 ptr .setsize (mask_image .sizeInBytes ())
1112- new_mask_np = np .array (ptr ).reshape (mask_image .height (), mask_image .width ())
1104+ # Use bytesPerLine to handle row padding correctly
1105+ bytes_per_line = mask_image .bytesPerLine ()
1106+ new_mask_np = np .array (ptr ).reshape (mask_image .height (), bytes_per_line )
1107+ # Crop to actual width if there's padding
1108+ new_mask_np = new_mask_np [:, :mask_image .width ()].copy ()
11131109
11141110 # --- Refactored to Command Pattern ---
11151111 from .commands import MaskEditCommand
@@ -1160,7 +1156,6 @@ def _on_brush_size_changed(self, size: int):
11601156
11611157 def _on_selection_changed (self , selected_indices : list ):
11621158 """同步model的selection到Qt item的selected状态"""
1163- print (f"[VIEW] _on_selection_changed called: selected_indices={ selected_indices } " )
11641159
11651160 # 先清除所有item的selection
11661161 for item in self ._region_items :
@@ -1170,9 +1165,7 @@ def _on_selection_changed(self, selected_indices: list):
11701165 # 设置新选中的items
11711166 for idx in selected_indices :
11721167 if 0 <= idx < len (self ._region_items ):
1173- print (f"[VIEW] Setting item { idx } selected=True" )
11741168 self ._region_items [idx ].setSelected (True )
1175- print (f"[VIEW] After setSelected, item.isSelected()={ self ._region_items [idx ].isSelected ()} " )
11761169
11771170 def _update_cursor (self ):
11781171 """Updates the cursor to match the selected tool and brush size."""
0 commit comments