
    IiS?                        d Z ddlmZ ddlmZ ddlmZ ddlZ G d de      Z G d d	e      Z	 G d
 de      Z
 G d d      Z G d d      Z G d deej                        Z G d deej                        Zg dZy)a}  
Selection management for wxPython list controls.

Provides mixins and ready-to-use controls that automatically manage selection
state for list controls:
- Auto-focus first item when control gains focus with no selection
- Maintain valid selection after item deletion (configurable: previous/next)
- Optionally auto-focus newly added items

Includes:
- ListBoxSelectionManagerMixin: For wx.ListBox-style controls
- ListCtrlSelectionManagerMixin: For wx.ListCtrl/wx.ListView-style controls
- ManagedListBox: Ready-to-use non-checkable single-column list
- ManagedListCtrl: Ready-to-use non-checkable multi-column list

Requires: wxPython
    )annotations)Enum)AnyNc                      e Zd ZdZdZdZy)FocusAfterDeletez+Where to move focus after deleting an item.previousnextN)__name__
__module____qualname____doc__PREVIOUSNEXT     KC:\Users\dbart\PlayPalace11\clients\desktop\ui\enhance_wx\list_selection.pyr   r       s    5HDr   r   c                      e Zd ZdZdZdZy)FocusAfterAddz)Where to move focus after adding an item.newstayN)r
   r   r   r   NEW_ITEMSTAYr   r   r   r   r   '   s    3HDr   r   c                      e Zd ZdZdZdZdZy)ColumnWidthz%Column width modes for list controls.auto_contentauto_headerfillN)r
   r   r   r   AUTO_CONTENTAUTO_HEADERFILLr   r   r   r   r   .   s    /!LKDr   r   c                       e Zd ZdZej
                  ej                  d	 	 	 	 	 	 	 	 	 d
 fdZddZ	d fdZ
d fdZd fdZd fdZd fd	Z xZS )ListBoxSelectionManagerMixina+  
    Mixin that manages selection for wx.ListBox-style controls.

    Features:
    - Auto-selects first item when focused with no selection
    - Maintains valid selection when items are deleted
    - Optionally focuses new items when added

    Works with: wx.ListBox and subclasses.

    Note: While this mixin works with wx.CheckListBox, that control has
    accessibility limitations. For checkable lists, use AccessibleCheckListCtrl()
    instead, which provides this same selection management with better accessibility.

    Args:
        focus_after_delete: Where to focus after deleting an item.
            FocusAfterDelete.PREVIOUS (default) or FocusAfterDelete.NEXT
        focus_after_add: Where to focus after adding an item.
            FocusAfterAdd.NEW_ITEM (default) or FocusAfterAdd.STAY
    )focus_after_deletefocus_after_addc                   t        |   |i | || _        || _        d| _        | j                  t        j                  | j                         y )NF)	super__init__r#   r$   _suppress_auto_selectBindwxEVT_SET_FOCUS_on_focus_ensure_selection)selfr#   r$   argskwargs	__class__s        r   r'   z%ListBoxSelectionManagerMixin.__init__Q   sI     	$)&)"4.%*"		"""D$C$CDr   c                    |j                          | j                  ry| j                         dkD  r4| j                         t        j
                  k(  r| j                  d       yyy)BAuto-select first item when control gains focus with no selection.Nr   )Skipr(   GetCountGetSelectionr*   	NOT_FOUNDSetSelectionr-   evts     r   r,   z7ListBoxSelectionManagerMixin._on_focus_ensure_selection^   sP    
%%==?Q4#4#4#6",,#Fa  $Gr   c                H   | j                         |k(  }d| _        	 t        |   |       |rb| j	                         }|dkD  rM| j
                  t        j                  k(  rt        d|dz
        }nt        ||dz
        }| j                  |       d| _        y# d| _        w xY w))Delete item and maintain valid selection.Tr      FN)r5   r(   r&   Deleter4   r#   r   r   maxminr7   )r-   nwas_selected	new_countnew_selectionr0   s        r   r=   z#ListBoxSelectionManagerMixin.Deletef   s    ((*a/%)"	/GN1 MMO	q=..2B2K2KK(+Aq1u(+Ay1}(=%%m4).D&D&s   A3B 	B!c                "    t         |           y)zClear all items.N)r&   Clearr-   r0   s    r   rE   z"ListBoxSelectionManagerMixin.Clearw   s    r   c                    | j                         dk(  }t        | 	  |      }|s| j                  t        j
                  k(  r"| j                  | j                         dz
         |S )z%Append item and optionally select it.r   r<   )r4   r&   Appendr$   r   r   r7   )r-   item	was_emptyresultr0   s       r   rH   z#ListBoxSelectionManagerMixin.Append{   sU    MMOq(	%,,0F0FFdmmo12r   c                    | j                         dk(  }t        | 	  ||      }|s| j                  t        j
                  k(  r| j                  |       |S )%Insert item and optionally select it.r   )r4   r&   Insertr$   r   r   r7   )r-   rI   posrJ   rK   r0   s        r   rN   z#ListBoxSelectionManagerMixin.Insert   sL    MMOq(	c*,,0F0FFc"r   c                    | j                         }t        | 	  |       | j                         dkD  rE|t        j
                  k7  rt        || j                         dz
        }nd}| j                  |       yy)z5Replace all items and maintain selection if possible.r   r<   N)r5   r&   Setr4   r*   r6   r?   r7   )r-   itemsold_selectionrC   r0   s       r   rQ   z ListBoxSelectionManagerMixin.Set   sf    ))+E==?Q, #M4==?Q3F G !m, r   )
r.   r   r#   r   r$   r   r/   r   returnNoner9   zwx.FocusEventrT   rU   )r@   intrT   rU   )rT   rU   )rI   strrT   rW   )rI   rX   rO   rW   rT   rW   )rR   z	list[str]rT   rU   )r
   r   r   r   r   r   r   r   r'   r,   r=   rE   rH   rN   rQ   __classcell__r0   s   @r   r"   r"   ;   s{    0 0@/H/H)6)?)?	EE -E '	E
 E 
E!/"	- 	-r   r"   c                       e Zd ZU dZded<   ded<   ej                  ej                  f	 	 	 	 	 ddZ	ddZ
d fdZd fd	Zd fd
Z xZS )ListCtrlSelectionManagerMixinaV  
    Mixin that manages selection for wx.ListCtrl/wx.ListView-style controls.

    Features:
    - Auto-selects first item when focused with no selection
    - Maintains valid selection when items are deleted
    - Optionally focuses new items when added

    Works with: wx.ListCtrl, wx.ListView, and subclasses.

    Args:
        focus_after_delete: Where to focus after deleting an item.
            FocusAfterDelete.PREVIOUS (default) or FocusAfterDelete.NEXT
        focus_after_add: Where to focus after adding an item.
            FocusAfterAdd.NEW_ITEM (default) or FocusAfterAdd.STAY
    r   r#   r   r$   c                    || _         || _        d| _        | j                  t        j
                  | j                         y)z6Initialize selection manager. Call this from __init__.FN)r#   r$   r(   r)   r*   r+   r,   )r-   r#   r$   s      r   _init_selection_managerz5ListCtrlSelectionManagerMixin._init_selection_manager   s6     #5.%*"		"""D$C$CDr   c                    |j                          | j                  ry| j                         dkD  r7| j                         dk(  r#| j	                  d       | j                  d       yyy)r2   Nr   )r3   r(   GetItemCountGetFirstSelectedSelectFocusr8   s     r   r,   z8ListCtrlSelectionManagerMixin._on_focus_ensure_selection   sW    
%%"t'<'<'>"'DKKNJJqM (E"r   c                l   | j                  |      }d| _        	 t        |   |      }|ru|rs| j	                         }|dkD  r^| j
                  t        j                  k(  rt        d|dz
        }nt        ||dz
        }| j                  |       | j                  |       d| _        |S # d| _        w xY w)r;   Tr   r<   F)
IsSelectedr(   r&   
DeleteItemra   r#   r   r   r>   r?   rc   rd   )r-   rI   rA   rK   rB   rC   r0   s         r   rg   z(ListCtrlSelectionManagerMixin.DeleteItem   s    t,%)"	/W'-F, --/	q=..2B2K2KK(+Atax(8(+D)a-(@KK.JJ}-).D& */D&s   BB* *	B3c                     t         |          S )zDelete all items.)r&   DeleteAllItemsrF   s    r   ri   z,ListCtrlSelectionManagerMixin.DeleteAllItems   s    w%''r   c                    | j                         dk(  }t        |   |i |}|dk7  rA|s| j                  t        j
                  k(  r"| j                  |       | j                  |       |S )rM   r   r`   )ra   r&   
InsertItemr$   r   r   rc   rd   )r-   r.   r/   rJ   rK   r0   s        r   rk   z(ListCtrlSelectionManagerMixin.InsertItem   sd    %%'1,	#T4V4R<D00M4J4JJF#

6"r   )r#   r   r$   r   rT   rU   rV   )rI   rW   rT   bool)rT   rl   )r.   r   r/   r   rT   rW   )r
   r   r   r   __annotations__r   r   r   r   r^   r,   rg   ri   rk   rY   rZ   s   @r   r\   r\      si    $ )("" 0@/H/H)6)?)?	E,	E '	E 
		E&( r   r\   c                      e Zd ZdZy)ManagedListBoxa  
    A wx.ListBox with automatic selection management.

    RECOMMENDED: Use this for all non-checkable single-column lists.
    =================================================================
    This is the preferred control for simple lists without checkboxes.
    It's lightweight, uses the native platform listbox, and is already
    fully accessible to screen readers.

    Do NOT use ManagedListCtrl for simple single-column lists - that control
    is only appropriate for multi-column non-checkable lists.

    Features:
    - Auto-selects first item when focused with no selection
    - Maintains valid selection when items are deleted
    - Optionally focuses new items when added
    - Native platform appearance and full accessibility

    Args:
        parent: Parent window
        choices: Initial list of items (optional)
        focus_after_delete: Where to focus after deleting an item.
            FocusAfterDelete.PREVIOUS (default) or FocusAfterDelete.NEXT
        focus_after_add: Where to focus after adding an item.
            FocusAfterAdd.NEW_ITEM (default) or FocusAfterAdd.STAY
        name: Accessible name for the control (recommended for screen readers)

    Usage:
        fruits = ManagedListBox(
            parent,
            choices=["Apple", "Banana", "Cherry"],
            name="Fruit selection",
        )
        fruits.Append("Date")  # Auto-focuses new item
        fruits.Delete(0)       # Auto-focuses appropriate neighbor
    N)r
   r   r   r   r   r   r   ro   ro      s    #J 	r   ro   c                      e Zd ZdZej
                  ej                  ej                  ej                  e	j                  ej                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZej                  f	 	 	 	 	 ddZd	d
dZddZ xZS )ManagedListCtrla8  
    A wx.ListView with automatic selection management for multi-column lists.

    USE CASE: Multi-column non-checkable lists only.
    =================================================
    This control is for lists that need multiple columns but no checkboxes
    (e.g., file browsers with Name/Size/Date columns).

    For single-column non-checkable lists, use ManagedListBox instead.
    For any checkable list (single or multi-column), use AccessibleCheckListCtrl.

    Features:
    - Auto-selects first item when focused with no selection
    - Maintains valid selection when items are deleted
    - Optionally focuses new items when added
    - Auto-sizing columns with ColumnWidth enum
    - Configurable visible row count with SetVisibleRowCount()

    Args:
        parent: Parent window
        focus_after_delete: Where to focus after deleting an item.
            FocusAfterDelete.PREVIOUS (default) or FocusAfterDelete.NEXT
        focus_after_add: Where to focus after adding an item.
            FocusAfterAdd.NEW_ITEM (default) or FocusAfterAdd.STAY
        show_header: Whether to show column headers.
        name: Accessible name for the control (recommended for screen readers)

    Usage:
        files = ManagedListCtrl(parent, name="File list")
        files.AppendColumn("Name", ColumnWidth.AUTO_CONTENT)
        files.AppendColumn("Size", width=80)
        files.AppendColumn("Modified", ColumnWidth.FILL)
        files.InsertItem(0, "document.txt")
        files.SetItem(0, 1, "4 KB")
        files.SetItem(0, 2, "2024-01-15")
        files.AutoSizeColumns()
    Tc	                    |s|t         j                  z  }t        
|   |||||fi |	 | j	                  ||       d| _        g | _        || _        y )Nr   )r*   LC_NO_HEADERr&   r'   r^   _column_count_column_widths_show_header)r-   parentidrO   sizestyler#   r$   show_headerr/   r0   s             r   r'   zManagedListCtrl.__init__8  sY     R__$ES$@@$$%7I79'r   c                Z   t        |t              rK|t        j                  k(  rt        j                  }n)|t        j
                  k(  rt        j                  }nd}n|}| j                  | j                  ||       | j                  j                  |       | xj                  dz  c_        y)z
        Add a column to the list.

        Args:
            heading: Column header text
            width: Column width - can be int or ColumnWidth enum
        r`   )widthr<   N)
isinstancer   r   r*   LIST_AUTOSIZEr   LIST_AUTOSIZE_USEHEADERInsertColumnrt   ru   append)r-   headingr}   initial_widths       r   AppendColumnzManagedListCtrl.AppendColumnL  s     e[)000 " 0 0+111 " : : "!M$,,g]K""5)ar   c                B    t         j                        D ]  t         j                        k  r j                     nt        j
                  }t        |t              rw|t        j                  k(  rd j                         j                  }t         fdt         j                        D              }t        d||z
        } j                  |       |r! j                  t        j                          j                  t        j                          y)z(Resize all columns to fit their content.c              3  L   K   | ]  }|k7  s	j                  |        y w)N)GetColumnWidth).0ccolr-   s     r   	<genexpr>z2ManagedListCtrl.AutoSizeColumns.<locals>.<genexpr>o  s*      '4MqQRVYQYD''*4Ms   
$$2   N)rangert   lenru   r   r   r~   r    GetClientSizer}   sumr>   SetColumnWidthr*   r   r   )r-   
use_headeroriginal_widthtotal_widthother_cols_width
fill_widthr   s   `     @r   AutoSizeColumnszManagedListCtrl.AutoSizeColumnsd  s    ++,C T0011 ##C( --  .+6>[M]M];]"00288#& '49$:L:L4M' $  ![3C%CD
##C4##C)C)CD##C)9)9:# -r   c                   t        d|      }| j                         dkD  r| j                  d      }|j                  }nKt	        j
                  |       }|j                  | j                                |j                  d      d   dz   }d}| j                  rKt	        j
                  |       }|j                  | j                                |j                  d      d   dz   }||z  |z   dz   }| j                         }| j                  t	        j                  |j                  |             | j                  t	        j                  |j                  |             y)z8Set control height to show approximately this many rows.r<   r   Tg      N)r>   ra   GetItemRectheightr*   ClientDCSetFontGetFontGetTextExtentrv   GetSize
SetMinSizeSizer}   SetSize)r-   rows	item_rectitem_heightdcheader_heighttotal_heightcurrent_sizes           r   SetVisibleRowCountz"ManagedListCtrl.SetVisibleRowCounty  s   1d|"((+I#**KT"BJJt||~&**403a7KT"BJJt||~&,,T2159M{*m;a?||~ 2 2LABRWW\//>?r   )rw   z	wx.Windowrx   rW   rO   zwx.Pointry   zwx.Sizerz   rW   r#   r   r$   r   r{   rl   r/   r   rT   rU   )r   rX   r}   zint | ColumnWidthrT   rU   )F)r   rl   rT   rU   )r   rW   rT   rU   )r
   r   r   r   r*   ID_ANYDefaultPositionDefaultSize	LC_REPORTr   r   r   r   r'   r   r   r   r   r   rY   rZ   s   @r   rq   rq     s    $R ))**\\/?/H/H)6)?)? (( ( 	(
 ( ( -( '( ( ( 
(* 8C7O7O  #4 	 0;*@r   rq   )r   r   r   r"   r\   ro   rq   )r   
__future__r   enumr   typingr   r*   r   r   r   r"   r\   ListBoxro   ListViewrq   __all__r   r   r   <module>r      s   $ #   	t D $ Y- Y-xI Ib&	12:: &	R~@3R[[ ~@Br   