
    cik                     X   d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
 ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z! ddl"m#Z# ddl$m%Z%  ejL                  ejN                          ejP                  e)      Z* G d	 d
e      Z+ G d de      Z, G d de      Z-	 d3dee.e	f   de.fdZ/e)dk(  rhddddddddddddddd d!d"d#d$d%g d&d'	d(d)d*d+d,d-d.d/dd0	d1Z0 eejb                        Z2 e/e0d2      Z3e3r! ejh                  e2jk                                yyy)4ug   
可编辑的字典树形显示器
支持字符串编辑时的文件保存/读取和路径选择功能
    N)Path)DictAnyUnion)QApplicationQMainWindowQTreeWidgetQTreeWidgetItemQVBoxLayoutQWidgetQHBoxLayoutQPushButton	QTextEdit	QSplitterQLabelQFileDialogQMessageBoxQDialogQDialogButtonBox	QComboBoxQTextBrowser	QGroupBox	QLineEditQSpinBoxQDoubleSpinBox	QCheckBox)Qt)QFont)levelc                   n     e Zd ZdZ	 	 d fd	Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZdedefdZ xZS )StringInputDialogu3   字符串输入对话框，支持多种输入方式c                     t         |   |       | j                  |       | j                  dd       || _        || _        || _        | j                          y )NX    )super__init__setWindowTitlesetMinimumSizecurrent_valuekey_nameresult_valuesetup_ui)selfparenttitler)   r*   	__class__s        @   D:\pyccd\极耳翻折-拆分\utilswidget\editable_tree_viewer.pyr&   zStringInputDialog.__init__   sN     E"C%* )    c                 	   t        |       }| j                  rSt        d| j                         }|j                  t	        ddt        j
                               |j                  |       t        d      }t        |      }t               }|j                  t        d             t               | _
        | j                  j                  g d       | j                  j                  j                  | j                         |j                  | j                         |j                  |       t               }t!        d      | _        | j"                  j$                  j                  | j&                         | j"                  j)                  d       |j                  | j"                         t!        d	      | _        | j*                  j$                  j                  | j,                         | j*                  j)                  d       |j                  | j*                         t!        d
      | _        | j.                  j$                  j                  | j0                         | j.                  j)                  d       |j                  | j.                         t!        d      | _        | j2                  j$                  j                  | j4                         |j                  | j2                         |j7                          |j                  |       |j                  |       t        d      }t        |      }t9               | _        | j:                  j=                  | j>                         | j:                  j@                  j                  | jB                         |j                  | j:                         |j                  |       t        d      }	t        |	      }
tE               | _#        | jF                  jI                  d       | jK                          |
j                  | jF                         |j                  |	       tM        tL        jN                  tL        jP                  z        | _)        | jR                  jT                  j                  | jV                         | jR                  jX                  j                  | jZ                         |j                  | jR                         y)   设置UI界面   编辑键:  
   u   输入方式u   选择输入方式:)u   手动输入   从文件读取   选择文件路径   选择文件夹路径u   选择并读取文件Fr9   r:   u   保存到文件u   内容编辑u   内容预览d   N).r   r*   r   setFontr   Bold	addWidgetr   r   r   method_comboaddItemscurrentTextChangedconnecton_method_changed	addLayoutr   load_file_btnclickedload_from_file
setVisibleselect_file_btnselect_file_pathselect_dir_btnselect_dir_pathsave_file_btnsave_to_file
addStretchr   	text_editsetPlainTextr)   textChangedon_text_changedr   preview_textsetMaximumHeightupdate_previewr   OkCancel
button_boxacceptedacceptrejectedreject)r-   layout	key_labelinput_groupinput_layoutmethod_layoutbutton_layout
edit_groupedit_layoutpreview_grouppreview_layouts              r1   r,   zStringInputDialog.setup_ui'   s   T" ==T]]O<=IeBEJJ78Y'  /";/ $'< =>%K""#uv,,44T5K5KL 1 12}- $()@A""**4+>+>?%%e, 2 23*+?@$$,,T-B-BC''. 4 45)*AB##++D,@,@A&&u- 3 34():;""**4+<+<= 2 23  "}-% ~.
!*-"##D$6$67""**4+?+?@dnn-$ ".1$]3(N**3/  !2!23' +"2"9"99
 	  ((5  ((5)r2   c                 l   | j                   j                  d       | j                  j                  d       | j                  j                  d       |dk(  r| j                   j                  d       y|dk(  r| j                  j                  d       y|dk(  r| j                  j                  d       yy)u   输入方式改变时的处理Fr8   Tr9   r:   N)rE   rH   rI   rK   )r-   method_names     r1   rC   z#StringInputDialog.on_method_changedy   s     	%%e,''.&&u- ++))$/00  ++D133**40 4r2   c                 b    | j                   j                         | _        | j                          y)u$   文本改变时更新预览和结果N)rP   toPlainTextr+   rV   r-   s    r1   rS   z!StringInputDialog.on_text_changed   s#     NN668r2   c                     | j                   j                         }t        |      dkD  r	|dd dz   }n|}| j                  j	                  dt        |       d|        y)u   更新预览内容   N...u   内容长度: u    字符
内容预览: )rP   rk   lenrT   rQ   )r-   contentpreviews      r1   rV   z StringInputDialog.update_preview   s]    ..,,.w<#dsme+GG&&G~E\]d\e'fgr2   c           	         t        j                  | ddd      \  }}|r^	 t        |dd      5 }|j                         }ddd       | j                  j                         t        j                  | dd	|        yy# 1 sw Y   @xY w# t        $ r-}t        j                  | d
dt        |              Y d}~yd}~ww xY w)u   从文件读取内容u   选择要读取的文件r6   =   文本文件 (*.txt);;JSON文件 (*.json);;所有文件 (*.*)rutf-8encodingN   成功u   已从文件读取内容:
   错误u   读取文件失败:
)r   getOpenFileNameopenreadrP   rQ   r   information	Exceptionwarningstr)r-   	file_path_frq   es         r1   rG   z StringInputDialog.load_from_file   s    "22&K	
	1 V)S7;qffhG <++G4''h:UV_U`8ab ;;  V##D(6KCPQF84TUUVs-   B	 A==B	 =BB	 		B?#B::B?c                     t        j                  | d dd      \  }}|rL| j                  |      }| j                  j	                  |       d| d| }t        j                  | d|       yy)r9   r6   u   所有文件 (*.*)u   已选择文件路径:
原始:    
格式化: ry   N)r   r{   format_pathrP   rQ   r   r~   )r-   r   r   formatted_pathmessages        r1   rJ   z"StringInputDialog.select_file_path   s~    "22  	
	1 !--i8NNN''7""+ -%%3$46G ##D(G< r2   c                     t        j                  | d       }|rL| j                  |      }| j                  j	                  |       d| d| }t        j                  | d|       yy)r:   u"   已选择文件夹路径:
原始: r   ry   N)r   getExistingDirectoryr   rP   rQ   r   r~   )r-   dir_pathr   r   s       r1   rL   z!StringInputDialog.select_dir_path   st    33#

 !--h7NNN''7""* ,%%3$46G ##D(G< r2   c           	         | j                   j                         }|j                         st        j                  | dd       yt        j                  | ddd      \  }}|rD	 t        |dd	      5 }|j                  |       ddd       t        j                  | d
d|        yy# 1 sw Y   %xY w# t        $ r-}t        j                  | ddt        |              Y d}~yd}~ww xY w)u   保存内容到文件   警告u   内容为空，无法保存!Nu   保存文件r6   rt   wrv   rw   ry   u   内容已保存到:
rz   u   保存文件失败:
)rP   rk   stripr   r   r   getSaveFileNamer|   writer~   r   r   )r-   rq   r   r   r   r   s         r1   rN   zStringInputDialog.save_to_file   s    ..,,.}}h0NO"22K	
	1 V)S7;qGGG$ <''h:OPY{8[\	 ;;  V##D(6KCPQF84TUUVs0   !B1 /B%"B1 %B.*B1 1	C':#C""C'c                     | j                   S u   获取编辑结果r+   rl   s    r1   	get_valuezStringInputDialog.get_value          r2   path_strreturnc                    |rt        |t              s|S |j                  dd      }|j                  dd      }t        |      dk\  rB|d   dk(  r:t        |      dk(  r|dz  }|S |dd dk7  r|dd dz   |dd j	                  d      z   }|S )	u   
        格式化文件路径，将路径中的单斜杠替换为双斜杠
        
        Args:
            path_str: 原始路径字符串
            
        Returns:
            str: 格式化后的路径字符串
        \///      :   N
isinstancer   replacerp   lstrip)r-   r   normalized_pathr   s       r1   r   zStringInputDialog.format_path   s     z(C8O #**45 )00d; ~!#q(9S(@ >"a'$&   !$,"0!"4t"; .qr 2 9 9# >#? r2   )Nu   编辑字符串r6   r6   )__name__
__module____qualname____doc__r&   r,   rC   rS   rV   rG   rJ   rL   rN   r   r   r   __classcell__r0   s   @r1   r!   r!      sV    =*;,.	P*d1
hV$=&="V,!C C r2   r!   c                   X     e Zd ZdZ	 	 d fd	Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Z xZS )ValueEditDialogu3   通用值编辑对话框，支持不同数据类型c                 p   t         |   |       | j                  |       || _        || _        |xs t        |      | _        || _        | j                  t        k(  r%| j                  dd       | j                  dd       n$| j                  dd       | j                  dd       | j                          y )Ni  r$   r#   ,  i  ^  )r%   r&   r'   r)   r*   type
value_typer+   r   r(   resizer,   )r-   r.   r/   r)   r*   r   r0   s         r1   r&   zValueEditDialog.__init__  s     E"* $;](;) ??c!S)KKS!S)KKS!r2   c                 B   t        |       }t               }t        |      }|j                  dddd       | j                  rSt	        d| j                         }|j                  t        ddt        j                               |j                  |       t	        d| j                  j                         }|j                  t        dd             |j                  |       |j                  d       |j                  |       t        d      }t        |      }| j                  t        k(  rt               | _        | j                  j!                  t        | j"                               | j                  j%                  d	       | j                  j&                  j)                  | j*                         n| j                  t,        k(  rt/               | _        | j                  j1                  d
d       | j                  j3                  | j"                  t-        | j"                        nd       | j                  j%                  d       | j                  j4                  j)                  | j6                         n| j                  t8        k(  rt;               | _        | j                  j1                  dd       | j                  j=                  d       | j                  j3                  | j"                  t9        | j"                        nd       | j                  j%                  d       | j                  j4                  j)                  | j>                         n1| j                  t@        k(  rtC        d      | _        | j                  jE                  | j"                  tA        | j"                        nd       | j                  j%                  d       | j                  jF                  j)                  | jH                         nt               | _        | j                  j!                  t        | j"                               | j                  j%                  d	       | j                  j&                  j)                  | j*                         |j                  | j                         |j                  |d       t        d      }tK        |      }	|	j                  t	        d             tM               | _'        | jN                  jQ                  g d       | jN                  jS                  | j                  j                         | jN                  jT                  j)                  | jV                         |	j                  | jN                         |	jY                          |j                  d       |j                  |       t        d      }
t        |
      }t	               | _-        | jZ                  j]                  d       | jZ                  j_                  t`        jb                         | je                          |j                  | jZ                         |
j                  d       |j                  |
       tg        tf        jh                  tf        jj                  z        | _6        | jl                  jn                  j)                  | jp                         | jl                  jr                  j)                  | jt                         |j                  | jl                         y)r4   r   r5   r6   r7   u   数据类型: 	   <   u	   值编辑x   i   iN   g    _g    _B           z
True/FalseFr   u   类型转换u
   转换为:)r   intfloatboolu   预览Tr;   );r   r   setContentsMarginsr*   r   r<   r   r=   r>   r   r   rU   r   r   r   edit_widgetrQ   r)   setMinimumHeightrR   rB   rS   r   r   setRangesetValuevalueChangedon_int_changedr   r   setDecimalson_float_changedr   r   
setCheckedstateChangedon_bool_changedr   r   
type_combor@   setCurrentTextrA   on_type_changedrO   preview_labelsetWordWrapsetAlignmentr   AlignToprV   r   rW   rX   rY   rZ   r[   r\   r]   )r-   r^   header_widgetheader_layoutr_   
type_labelrd   re   convert_groupconvert_layoutrf   rg   s               r1   r,   zValueEditDialog.setup_ui  s-   T"  	#M2((Aq!4==T]]O<=IeBEJJ78##I.nT__-E-E,FGH
5Q<(
+&&r*' {+
!*-??c!({D))#d.@.@*AB--c2((001E1EF__#'zD%%k:>%%ASASA_c$*<*<&=efg--b1))11$2E2EF__%-/D%%eT2((,%%4CUCUCaeD,>,>&?gjk--b1))11$2G2GH__$(6D''DDVDVDbT-?-?(@hmn--b1))11$2F2FG  ){D))#d.@.@*AB--c2((001E1EFd../Q' ".1$]3  !56#+  !@A&&t'?'?@**2243G3GH  1!!#&&r*' "(+$]3#X&&t,''4  !3!34&&s+' +"2"9"99
 	  ((5  ((5)r2   c                     t        | j                  t              r| j                  j                         | _        | j                          y)u   文本改变处理N)r   r   r   rk   r+   rV   rl   s    r1   rS   zValueEditDialog.on_text_changed}  s5    d&&	2 $ 0 0 < < >Dr2   c                 2    || _         | j                          y)u   整数改变处理Nr+   rV   r-   values     r1   r   zValueEditDialog.on_int_changed      !r2   c                 2    || _         | j                          y)u   浮点数改变处理Nr   r   s     r1   r   z ValueEditDialog.on_float_changed  r   r2   c                 8    |dk(  | _         | j                          y)u   布尔值改变处理r   Nr   )r-   states     r1   r   zValueEditDialog.on_bool_changed  s    !QJr2   c                    	 t        | j                        }|dk(  r|| _        n|dk(  r|rt        t        |            nd| _        nc|dk(  r|rt        |      nd| _        nI|dk(  rD|j	                         dv rd| _        n*|j	                         d	v rd
| _        nt        |      | _        | j                          y# t        t        f$ r0}t        j                  | dd| dt        |              Y d}~yd}~ww xY w)u   类型转换处理r   r   r   r   r   r   )true1yesonT)false0nooffFu   转换错误u   无法转换为 u	    类型: N)r   r+   r   r   lowerr   rV   
ValueError	TypeErrorr   r   )r-   	type_namecurrent_textr   s       r1   r   zValueEditDialog.on_type_changed  s    	gt001LE!$0!e#@LCl(;$<RS!g%;GE,$7S!f$%%'+EE(,D%!'')-HH(-D%(,\(:D%!I& 	gn8HS\]`ab]c\d6eff	gs   B8B; ;C:
&C55C:c                     dt        | j                         d}|dt        | j                        j                   dz  }|dt	        | j                         z  }| j
                  j                  |       y)u   更新预览u   当前值: 
   类型: u   字符串表示: N)reprr+   r   r   r   r   setText)r-   rT   s     r1   rV   zValueEditDialog.update_preview  ss    $T$*;*;%<$=R@(4(9(9#:#C#C"DBGG+C0A0A,B+CDD""<0r2   c                     | j                   S r   r   rl   s    r1   r   zValueEditDialog.get_value  r   r2   )Nu	   编辑值Nr6   N)r   r   r   r   r&   r,   rS   r   r   r   r   rV   r   r   r   s   @r1   r   r     s<    =*5=A(\*|


g.1!r2   r   c                       e Zd ZdZd)deeef   def fdZd Zd Z	de
eeef   ded	efd
ZdedefdZdefdZdefdZd	efdZd	edefdZd Zd	edefdZd Zd Zd Zd Zd Zd ZdedefdZd Zd	edefdZdedefd Z d! Z!deeef   fd"Z"deeef   fd#Z#deeef   fd$Z$defd%Z%d*d&eeef   fd'Z&deeef   fd(Z' xZ(S )+EditableTreeVieweru!   可编辑的字典树形查看器	data_dictr/   c                    t         |           || _        t        j                         | _        	 dd l}|j                  |      | _        | j                  |       | j                  dddd       | j                          | j                          y # t        $ r'}t        j                  d|       || _        Y d }~qd }~ww xY w)Nr   u"   无法创建原始数据副本: %sr;   i  i   )r%   r&   r   	threadingRLock
_data_lockcopydeepcopyoriginal_dictr   loggerr   r'   setGeometryr,   populate_tree)r-   r   r/   r   r   r0   s        r1   r&   zEditableTreeViewer.__init__  s    "#//+	+!%y!9D
 	E"c4-  	+NN?C!*D	+s   B 	CB<<Cc                    t               }| j                  |       t        |      }|j                  dddd       |j	                  d       t               }|j                  d       t        |      }|j                  dddd       |j	                  d       t        d      | _        | j                  j                  d       | j                  j                  d       | j                  j                  j                  | j                         |j                  | j                         t        d      | _        | j                  j                  d       | j                  j                  d       | j                  j                  j                  | j                          |j                  | j                         t        d	      | _        | j"                  j                  d       | j"                  j                  d
       | j"                  j                  j                  | j$                         |j                  | j"                         t'        d      }|j)                  d       |j                  |       t        d      | _        | j*                  j                  d       | j*                  j                  d       | j*                  j                  j                  | j,                         |j                  | j*                         t        d      | _        | j.                  j                  d       | j.                  j                  d       | j.                  j                  j                  | j0                         |j                  | j.                         t        d      | _        | j2                  j                  d       | j2                  j                  d       | j2                  j                  j                  | j4                         |j                  | j2                         |j7                          t'        d      | _        | j8                  j)                  d       |j                  | j8                         |j                  |       t;        t<        j>                        }tA               | _!        | jB                  jE                  g d       | jB                  jF                  j                  | jH                         | jB                  jK                  dd       | jB                  jK                  dd       | jB                  jK                  dd       |j                  | jB                         t               }t        |      }|j                  dddd       t'        d      }	|	jM                  tO        ddtN        jP                               |j                  |	       tS               | _*        | jT                  jW                  d       | jT                  jM                  tO        d d!             |j                  | jT                         t'        d"      }
|
jM                  tO        dd#             |
j)                  d$       |j                  |
       |j                  |       |jY                  d%d&g       |j                  |       | jB                  jZ                  j                  | j\                         | jB                  j_                  t<        j`                         | jB                  jb                  j                  | jd                         y')(u   设置用户界面      (      刷新r   u   刷新树形图显示u   展开u   展开所有节点u   折叠u   折叠所有节点|zcolor: #CCCCCC;u   保存   保存字典到文件u   加载   从文件加载字典u	   格式化P   u'   格式化选中路径为双斜杠格式u   就绪zcolor: #666666; font-size: 9pt;)u   键   值u   类型r      r   r   r   u   详细信息r6   r7   TConsolasr   u*   提示：双击值列的项目可以编辑   zcolor: #666666;i  r   N)3r   setCentralWidgetr   r   
setSpacingrU   r   r   refresh_btnsetMaximumWidth
setToolTiprF   rB   refresh_treer>   expand_all_btn
expand_allcollapse_all_btncollapse_allr   setStyleSheetsave_dict_btnsave_dict_to_fileload_dict_btnload_dict_from_fileformat_path_btnformat_selected_pathsrO   status_labelr   r   
Horizontalr	   tree_widgetsetHeaderLabelsitemDoubleClickedon_item_double_clickedsetColumnWidthr<   r   r=   r   details_textsetReadOnlysetSizesitemSelectionChangedon_selection_changedsetContextMenuPolicyCustomContextMenucustomContextMenuRequestedshow_context_menu)r-   central_widgetmain_layouttoolbar_widgettoolbar_layout	separatorsplitterdetails_widgetdetails_layoutdetails_title	tip_labels              r1   r,   zEditableTreeViewer.setup_ui  s    n- ".1&&q!Q2q! !''+$^4))!Q15!!!$ 'x0((,##$;<  (():):;  !1!12)(3++B/&&';<##++DOO<  !4!45 +H 5--b1(()=>%%--d.?.?@  !6!67 3K	 12  +(2**2.%%&=>""**4+A+AB  !3!34(2**2.%%&=>""**4+C+CD  !3!34  +;7,,R0''(QR$$,,T-G-GH  !5!56 	!!# #8,''(IJ  !2!23n- R]]+ '=(()AB**2243N3NO''3/''3/''2.4++, !$^4))!Q15 ~.eBEJJ78  /%K%%d+!!%
A"67  !2!23 GH	%A,' 12  +>*3*%h' 	--55d6O6OP 	--b.B.BC33;;""	$r2   c                    | j                   j                          | j                  r5| j                  | j                  | j                   j	                         g        | j
                  j                  dt        | j                         d       y)u   填充树形控件u
   已加载 u    个顶级项目N)r"  clearr   _add_dict_to_treeinvisibleRootItemr   r   rp   rl   s    r1   r  z EditableTreeViewer.populate_treeA  si     >>""4>>43C3C3U3U3WY[\!!Js4>>/B.CCS"TUr2   dataparent_itempathc                 H   t        |t              r|j                         D ]p  \  }}||gz   }t        |      }|j	                  dt        |             |j                  dt        j                  |       t        |t        t        f      rv|j	                  dt        |t              rdt        |       dndt        |       d       |j	                  dt        |t              rdnd	       | j                  |||       t        |      }t        |      d
kD  r|dd
 dz   }|j	                  d|       |j	                  dt        |      j                         t        |t        t        f      rP|j                  dt        j                  d       s yt        |t              r{t        |      D ]k  \  }	}||	gz   }t        |      }|j	                  dd|	 d       |j                  dt        j                  |       t        |t        t        f      rv|j	                  dt        |t              rdt        |       dndt        |       d       |j	                  dt        |t              rdnd	       | j                  |||       t        |      }t        |      d
kD  r|dd
 dz   }|j	                  d|       |j	                  dt        |      j                         t        |t        t        f      rK|j                  dt        j                  d       n yy)u'   递归添加字典数据到树形控件r   r   (u    项)[u    项]r   u   字典u   列表r;   Nro   editable])r   dictitemsr
   r   r   setDatar   UserRolelistrp   r<  r   r   	enumerate)
r-   r>  r?  r@  keyr   current_pathitemdisplay_valueis
             r1   r<  z$EditableTreeViewer._add_dict_to_treeH  s   dD!"jjl
U#se|&{3QC)Q\:edD\2LLZt=TaE
|5$9\]^abg^h]iinZopLL
5$0GHXV**5$E %(JM=)C/(5ds(;e(CLLM2LLDK$8$89 &edD\:QZ@+ +. d#%dO5#qcz&{3Q!A3a)Q\:edD\2LLZt=TaE
|5$9\]^abg^h]iinZopLL
5$0GHXV**5$E$'JM=)C/(5ds(;e(CLLM2LLDK$8$89 &edD\:QZ@) , $r2   rN  columnc                 z    |dk(  r6|j                  dt        j                        dk(  r| j                  |       yyy)u   处理项目双击事件r   rD  N)r>  r   rI  
edit_value)r-   rN  rQ  s      r1   r%  z)EditableTreeViewer.on_item_double_clickedy  s3    Q;499Q4
BOOD! C;r2   c           	         |j                  dt        j                        }| j                  |      }dj	                  d |D              }t        |t              r| j                  |       yt        | dt        |      j                   d||t        |            }|j                         t        j                  k(  r.|j                         }||k7  rd|v rEt        j!                  d       t        j!                  d	|        t        j!                  d
|        | j#                  ||       d|v r)| j                  |      }t        j!                  d|        t        |      }t%        |      dkD  r|dd dz   }|j'                  d|       |j'                  dt        |      j                         | j(                  j'                  d|        t        j!                  d|||       yyy)u'   编辑值（支持多种数据类型）r   r   c              3   2   K   | ]  }t        |        y wNr   .0ps     r1   	<genexpr>z0EditableTreeViewer.edit_value.<locals>.<genexpr>       1DqCFD   Nu   编辑r  u%   极耳裁切模型参数/模型路径u5   🔧 TreeViewer: 准备更新极耳裁切模型路径u   🔧 TreeViewer: 当前值: u   🔧 TreeViewer: 新值: u(   🔧 TreeViewer: 验证设置后的值: r;   ro   r   r      已更新: u#   已更新路径 %s 的值: %s -> %s)r>  r   rI  get_value_by_pathjoinr   r   edit_string_valuer   r   r   exec_r   Acceptedr   r   infoset_value_by_pathrp   r   r   )	r-   rN  r@  r)   r*   dialog	new_valueverify_valuerO  s	            r1   rS  zEditableTreeViewer.edit_value~  s   yyBKK(..t4881D11 mS)""4( !T-(112#6
 <<>W---((*IM):hFKK WXKK">}o NOKK";I; GH&&tY7 ;hF#'#9#9$#?LKK"J<. YZ !$I}%+$1$3$7%$?MQ.QY 8 89!!))Kz*BCA8]\ef- * .r2   c                 R   |j                  dt        j                        }| j                  |      }dj	                  d |D              }t        |t              st        j                  | dd       yt        | d ||      }|j                         t        j                  k(  r|j                         }||k7  rq| j                  ||       |}t        |      dkD  r|dd dz   }|j!                  d	|       | j"                  j!                  d
|        t$        j'                  d|       yyy)u   编辑字符串值r   r   c              3   2   K   | ]  }t        |        y wrV  rW  rX  s     r1   r[  z7EditableTreeViewer.edit_string_value.<locals>.<genexpr>  r\  r]  r   u"   只能编辑字符串类型的值!Nr;   ro   r   r^  u   已更新路径 %s 的值)r>  r   rI  r_  r`  r   r   r   r   r!   rb  r   rc  r   re  rp   r   r   r   rd  )r-   rN  r@  r)   r*   rf  rg  rO  s           r1   ra  z$EditableTreeViewer.edit_string_value  s   yyBKK(..t4881D11--h0TU" 	
 <<>W---((*IM)&&tY7 !*}%+$1$3$7%$?MQ.!!))Kz*BC7B * .r2   c                     | j                   5  | j                  }	 |D ]  }||   }	 |cddd       S # t        t        t        f$ r Y ddd       yw xY w# 1 sw Y   yxY w)u   根据路径获取值N)r   r   KeyError
IndexErrorr   )r-   r@  currentrL  s       r1   r_  z$EditableTreeViewer.get_value_by_path  s^    __nnGC%clG   _ j)4  _ _s&   A2AAAAAr   c           
      B   | j                   5  | j                  }	 |dd D ]  }||   }	 |||d   <   ddd       y# t        t        t        f$ rC}t
        j                  d|       t        j                  | ddt        |              Y d}~[d}~ww xY w# 1 sw Y   yxY w)u   根据路径设置值Nu   设置值失败: %srz   u   设置值失败: )
r   r   rl  rm  r   r   errorr   r   r   )r-   r@  r   rn  rL  r   s         r1   re  z$EditableTreeViewer.set_value_by_path  s    __nnGR9C%clG %$)R! _ j)4 R2A6##D(6GAx4PQQR _s,   B;B9BBBBBc                     | j                   j                         }|rL|d   }|j                  dt        j                        }|r$| j                  |      }| j                  ||       yyy)u   处理选择改变事件r   N)r"  selectedItemsr>  r   rI  r_  show_details)r-   selected_itemsrN  r@  r   s        r1   r+  z'EditableTreeViewer.on_selection_changed  sd    ))779!!$D99Q,D..t4!!$.  r2   c                    dj                  d |D              }t        |      j                  }d| d}|d| dz  }t        |t        t
        f      r|dt        |       dz  }|dz  }t        |t              rPt        |j                               D ]3  \  }\  }}|dk\  r|d	z  } n|d
| dt        |      j                   dz  }5 nht        |      D ]0  \  }}|dk\  r|d	z  } nK|d| dt        |      j                   dz  }2 n)t        |      }	t        |	      dkD  r|	dd dz   }	|d|	 z  }| j                  j                  |       y)u   显示详细信息r   c              3   2   K   | ]  }t        |        y wrV  rW  rX  s     r1   r[  z2EditableTreeViewer.show_details.<locals>.<genexpr>  r\  r]  u   路径: r   r   u   长度: u   内容概览:
r7   z  ...
z  z: z  [z]: i  Nro   u   值:
)r`  r   r   r   rF  rJ  rp   rK  rG  r   r'  rQ   )
r-   r@  r   r   r   detailsrP  kv	value_strs
             r1   rt  zEditableTreeViewer.show_details  sn   881D11%[))
XJb)Xj\,,edD\*#e*R00G)G%&!*5;;=!9IAv1Bw9,A3ba)9)9(:"==G	 ": &e,DAqBw9,QCs47+;+;*<B??G	 - E
I9~$%et,u4		{++G&&w/r2   c                 N   ddl m}m} | j                  j	                  |      }|sy ||       } |d|       }|j
                  j                  | j                         |j                  |        |d|       }|j
                  j                  | j                         |j                  |       |j                           |d|       }|j
                  j                  | j                         |j                  |       |j                  | j                  j                  |             y)u   显示右键菜单r   )QMenuQActionNu   格式化路径u   格式化全部路径r  )PyQt5.QtWidgetsr}  r~  r"  itemAt	triggeredrB   r  	addActionformat_all_pathsaddSeparatorr  rb  mapToGlobal)	r-   positionr}  r~  rN  menuformat_actionformat_all_actionrefresh_actions	            r1   r/  z$EditableTreeViewer.show_context_menu  s    2&&x0T{   148''(B(BC}% $$;TB##++D,A,AB() !40  (():):;~& 	

4##//9:r2   c                 Z    | j                          | j                  j                  d       y)u   刷新树形显示u   树形图已刷新N)r  r   r   rl   s    r1   r  zEditableTreeViewer.refresh_tree*  s#    !!"67r2   c                 n    | j                   j                          | j                  j                  d       y)u   展开所有项目u   已展开全部N)r"  	expandAllr   r   rl   s    r1   r  zEditableTreeViewer.expand_all/  s)    ""$!!"34r2   c                 n    | j                   j                          | j                  j                  d       y)u   折叠所有项目u   已折叠全部N)r"  collapseAllr   r   rl   s    r1   r  zEditableTreeViewer.collapse_all4  s)    $$&!!"34r2   c           	      B   t        j                  | d dd      \  }}|r	 ddl}| j                  5  |j	                  | j
                        }ddd       t        |dd      5 }t        j                  |dd	
       ddd       t        j                  | dd|        | j                  j                  dt        |      j                          yy# 1 sw Y   xY w# 1 sw Y   bxY w# t        $ r-}t        j                   | ddt#        |              Y d}~yd}~ww xY w)r  r6   '   JSON文件 (*.json);;所有文件 (*.*)r   Nr   rv   rw   Fr   )ensure_asciiindentry   u   字典已保存到:
u   已保存到: rz   u   保存失败:
)r   r   r   r   r   r   r|   jsondumpr   r~   r   r   r   namer   r   r   )r-   r   r   r   data_snapshotr   r   s          r1   r  z$EditableTreeViewer.save_dict_to_file9  s    "22#5	
	1 	P__$(MM$..$AM %)S7;qIImQU1M <''h:OPY{8[\!!))N4	?;O;O:P*QR  %_;;  P##D(oc!fX4NOOPsG   C( CC( !C;AC( CC( C%!C( (	D1#DDc           	         t        j                  | d dd      \  }}|r	 t        |dd      5 }t        j                  |      }ddd       | j
                  5  | j                  j                          | j                  j                         ddd       | j                          t        j                  | dd|        | j                  j                  d	t        |      j                          yy# 1 sw Y   xY w# 1 sw Y   rxY w# t         $ r-}t        j"                  | d
dt%        |              Y d}~yd}~ww xY w)r	  r6   r  ru   rv   rw   Nry   u   已从文件加载字典:
u   已加载: rz   u   加载失败:
)r   r{   r|   r  loadr   r   r;  updater  r   r~   r   r   r   r  r   r   r   )r-   r   r   r   new_datar   s         r1   r  z&EditableTreeViewer.load_dict_from_fileN  s   "22#5	
	1 P)S7;q#yy|H < __NN((*NN))(3 %
 ""$''h:UV_U`8ab!!))KY8L8L7M*NO ;; %_  P##D(oc!fX4NOOPsG   D
 C2D
 6C>A#D
 2C;7D
 >DD
 
	E #D;;E r   r   c                     |rt        |t              s|S |j                  dd      }t        |      dk\  r?|d   dk(  r7t        |      dk(  s|d   dk7  r!|dd dz   }|dd j	                  d      }||z   }|S )u   
        格式化文件路径，将Windows风格路径转换为双斜杠格式
        
        Args:
            path_str: 原始路径字符串
            
        Returns:
            str: 格式化后的路径字符串
        r   r   r   r   r   r   Nr   )r-   r   r   
drive_part	path_parts        r1   r   zEditableTreeViewer.format_pathi  s     z(C8O "))$5 ~!#q(9S(@>"a'>!+<+C+BQ/$6
*12.55c:	!+i!7r2   c                    | j                   j                         }|st        j                  | dd       yd}|D ]9  }|j	                  dt
        j                        }|s&|| j                  |      z  }; |dkD  rM| j                          | j                  j                  d| d       d| d}t        j                  | d	|       yt        j                  | dd
       y)u0   格式化选中项目中的所有路径字符串   提示u!   请先选择要格式化的项目Nr   u   已格式化 
    个路径u   成功格式化了     个路径字符串   完成-   没有找到需要格式化的路径字符串)r"  rs  r   r~   r>  r   rI  _format_path_recursiver  r   r   )r-   ru  formatted_countrN  r@  r   s         r1   r  z(EditableTreeViewer.format_selected_paths  s    ))779##D(4WX"D99Q,D4#>#>t#DD #
 Q %%o5Fj&QR+O+<<OPG##D(G<##D(4cdr2   c                    | j                  |      }d}t        |t              rW| j                  |      rD| j	                  |      }||k7  r.| j                  ||       |dz  }t        j                  d||       |S t        |t              r1|j                         D ]  }||gz   }|| j                  |      z  } |S t        |t              r3t        t        |            D ]  }||gz   }|| j                  |      z  } |S )u6   递归格式化指定路径下的所有路径字符串r   r   u   格式化路径: %s -> %s)r_  r   r   _is_path_stringr   re  r   rd  rF  keysr  rJ  rangerp   )r-   r@  r)   r  r   rL  
child_pathrP  s           r1   r  z)EditableTreeViewer._format_path_recursive  s   ..t4mS)##M2!%!1!1-!@!]2**4@#q(OKK ; -~?  t,$))+!SE\
4#>#>z#JJ ,  t,3}-.!QCZ
4#>#>z#JJ / r2   c                     rt              dk  rydv }dv }t              dk\  xr d   dk(  xr d   j                         }g d	}t        fd
|D              }|xs
 |xr |xs |S )u   
        判断字符串是否可能是文件路径
        
        Args:
            value: 要检查的字符串
            
        Returns:
            bool: 是否可能是路径字符串
        r  Fr   r   r   r   r   r   )z.txtz.jsonz.xmlz.logz.cfgz.iniz.sldasmz.sldprtz.dwgz.pdfz.docz.xlsz.pyz.jsz.htmlz.cssz.sqlz.batc              3   ^   K   | ]$  }|j                         j                         v  & y wrV  )r   )rY  extr   s     r1   r[  z5EditableTreeViewer._is_path_string.<locals>.<genexpr>  s*      :'8  IIK5;;=8'8s   *-)rp   isalphaany)r-   r   has_backslashhas_forward_slash	has_drivecommon_extensionshas_extensions    `     r1   r  z"EditableTreeViewer._is_path_string  s     E
Q 5L Z1_ (1X_(1X%%' 	


  :'8: :  EC 1 B]	Fr2   c                     | j                  g       }|dkD  rM| j                          | j                  j                  d| d       d| d}t	        j
                  | d|       y	t	        j
                  | dd       y	)
u6   格式化整个数据字典中的所有路径字符串r   u   已格式化全部 r  u%   成功格式化了整个数据中的 r  r  r  r  N)r  r  r   r   r   r~   )r-   r  r   s      r1   r  z#EditableTreeViewer.format_all_paths  sz    55b9Q %%(;O;LJ&WX=o=NNabG##D(G<##D(4cdr2   c                     	 ddl }| j                  5  |j                  | j                        cddd       S # 1 sw Y   yxY w# t        $ r,}t
        j                  d|       | j                  cY d}~S d}~ww xY w)u  
        获取经过编辑的数据字典
        返回当前数据字典的深拷贝，确保数据完整性
        线程安全：使用 _data_lock 保护，可被外部线程安全调用
        
        Returns:
            Dict[str, Any]: 编辑后的数据字典
        r   Nu   获取数据时发生错误: %s)r   r   r   r   r   r   rq  )r-   r   r   s      r1   get_datazEditableTreeViewer.get_data  sS    	"}}T^^4 ! 	"LL:A>>>!	"s6   A 7	A A A  A 	A8!A3-A83A8c                 "    | j                         S )u   
        导出数据的别名方法，与get_data功能相同
        
        Returns:
            Dict[str, Any]: 编辑后的数据字典
        )r  rl   s    r1   export_datazEditableTreeViewer.export_data  s     }}r2   c                    	 ddl }ddlm} | j                  5  |j                  | j                        }ddd       d	fd	       }t        |t              rt        |      }nd}|||t        |      j                  |j                         j                  d      ddS # 1 sw Y   oxY w# t        $ r/}t        j                  d|       | j                  i dcY d}~S d}~ww xY w)
u   
        获取修改后的数据，包含修改统计信息
        
        Returns:
            Dict[str, Any]: 包含数据和元信息的字典
        r   N)datetimec                    t        | t              rSt        |       }| j                         D ]3  \  }}t        |t        t        f      s|r| d| n|}| ||      z  }5 |S t        | t              rSt        |       }t        |       D ]8  \  }}t        |t        t        f      s|r| d| dnd| d}| ||      z  }: |S y)u   递归计算项目数量r   rC  rE  r   )r   rF  rp   rG  rJ  rK  )	objr@  countrL  r   key_pathrP  idx_pathcount_itemss	           r1   r  z9EditableTreeViewer.get_modified_data.<locals>.count_items  s    c4(HE&)iik
U%edD\::>$qCH![%AAE '2 !LT*HE$-cN5%edD\:9=$q1~Qqc8H![%AAE %3 !Lr2   z%Y-%m-%d %H:%M:%S)total_itemstop_level_keys	data_typeexport_timestamp)r>  metadatau(   获取修改后数据时发生错误: %s)r6   )r   r  r   r   r   r   rF  rp   r   r   nowstrftimer   r   rq  )r-   r   r  r  r  top_keysr   r  s          @r1   get_modified_dataz$EditableTreeViewer.get_modified_data  s    .	<) $dnn = !$ &m4K -.}- &#.&.!%m!4!=!=(0(?(?+)-		 	= !P  	<LLCQG NN;;	<s4   B/ B#A-B/ #B,(B/ /	C'8$C"C'"C'c                    	 ddl }| j                  5  |j                  | j                        }ddd       t	        j
                  t               y# 1 sw Y   %xY w# t        $ r }t        j                  d|       Y d}~yd}~ww xY w)uo   
        验证当前数据的完整性
        
        Returns:
            bool: 数据是否有效
        r   NdefaultTu   数据验证失败: %sF)
r   r   r   r   r  dumpsr   r   r   rq  )r-   r   snapshotr   s       r1   validate_dataz EditableTreeViewer.validate_data:  sd    		==8 !JJx- !  	LL115	s-   A A#A AA 	B'BBr  c           	         	 |K| j                   5  | j                  j                          | j                  j                  |       ddd       nlt	        | d      r`| j
                  rT| j                   5  | j                  j                          | j                  j                  | j
                         ddd       | j                          | j                  j                  d       t        j                  d       y# 1 sw Y   JxY w# 1 sw Y   VxY w# t        $ rC}t        j                  d|       t        j                  | ddt        |              Y d}~yd}~ww xY w)u   
        重置数据到指定状态或初始状态
        
        Args:
            new_data: 新的数据字典，如果为None则使用原始数据
        Nr   u   数据已重置u   重置数据时发生错误: %srz   u   重置数据失败: )r   r   r;  r  hasattrr   r  r   r   r   rd  r   rq  r   r   r   )r-   r  r   s      r1   
reset_datazEditableTreeViewer.reset_dataL  s	   	Q#__NN((*NN))(3 %_
 41d6H6H,,.--d.@.@A )
  %%&78KK)* %_ )  	QLL:A>h2Fs1vh0OPP	QsH   D 6C<-D 3A D3AD <DD DD 	E 9EE c                 $   	 dfd	 | j                         t        t        j                  | j                   t                    | j                         dS # t        $ r-}t        j                  d|       dt	        |      icY d}~S d}~ww xY w)us   
        获取数据概要信息
        
        Returns:
            Dict[str, Any]: 数据概要统计
        c                    ||kD  rd|dS t        | t              rbt        | j                               dd }i }|D ]  \  }} ||dz   |      ||<    dt	        |       t        | j                               dd |dS t        | t              r|g }| dd D ]&  }|j                  t        |      j                         ( t        t        |            }	g }| dd	 D ]  }|j                   ||dz   |               d
t	        |       |	|dS t        |       }
t	        |
      dkD  r	|
dd dz   }n|
}t        |       j                  |dS )u   分析数据结构u   深度限制)r   depthNr  r   rF  r7   )r   lengthr  	structurer  rJ  )r   r  typesr  r;   ro   )r   r   )r   rF  rJ  rG  rp   r  appendr   r   setr   )r  r  	max_depthitems_sampler  ry  rz  
item_typesrN  unique_typesobj_strrO  analyze_structures               r1   r  z>EditableTreeViewer.get_data_summary.<locals>.analyze_structurep  so   9$$2UCCc4(#'		#4Ra#8L "I ,1'8E!GY'O	! !- !'"%c( $SXXZ 0" 5%.	   T*!#J #CR"))$t**=*=> !)#'J#8L !#I #BQ!((-dE!GYGI !(
 !'"%c(!-%.	  "#hG7|c)(/(=(/ !%S	 2 2!. r2   r  )summary
total_sizeis_validu%   获取数据概要时发生错误: %srq  N)r   r  )	r   rp   r  r  r   r  r   r   rq  )r-   r   r  s     @r1   get_data_summaryz#EditableTreeViewer.get_data_summaryh  sy    :	%0f -T^^<!$**T^^S"IJ ..0 
  	%LL@!DSV$$	%s   AA 	B""B
B
Bu   可编辑字典查看器rV  ))r   r   r   r   r   r   r   r&   r,   r  r   rJ  r
   r<  r   r%  rS  ra  r_  re  r+  rt  r/  r  r  r  r  r  r   r  r  r   r  r  r  r  r  r  r  r  r   r   s   @r1   r   r     s   +$sCx.  (s$jV/AeD$O&< /A? /Abf /Ab"? "C "
,g ,g\Co C>	d 	
Rd 
R3 
R/0 0c 0@;<8
5
5
P*P6C C 4e.4 C :!FS !FT !FFe"$sCx. "&T#s(^ 5<4S> 5<nt $Q4S> Q8A%$sCx. A%r2   r   r   r/   c                     	 t        j                         }|t        t        j                        }t	        | |      }|j                          |S # t        $ r }t        j                  d|       Y d}~yd}~ww xY w)u!   显示可编辑的树形查看器Nu   创建树形查看器失败: %s)	r   instancesysargvr   showr   r   rq  )r   r/   appviewerr   s        r1   show_editable_tree_viewerr    sd    ##%;sxx(C#Iu5 6:s   AA 	A8A33A8__main__u   张三   g     e@Tzzhangsan@example.comu   E:\TO程庆宇\37\JRS_PDM\02_项目存档_BU3\2025\JC250037-数码卷绕机\01 项目文档\JC2500370+数码卷绕设备\JC2500370P+P辅助组件\01 3D模型\JC250370P.SLDASMu	   北京市u   朝阳区某某街道123号u/   D:\用户数据\备份\2025\personal_backup.zip)u   省份u   城市u   详细地址u   备份路径)u   姓名u   年龄u   身高u   是否已婚u   邮箱u   文档路径u   地址u   SolidWorks插件z1.0.0u   开发团队z,C:\Program Files\SolidWorks\Plugins\MyPluginz,C:\Users\Admin\AppData\Local\Temp\plugin.logi  g     >@F)u   配置1zC:\Config\config1.jsonzC:\Config\config2.json)	u   项目名称u   版本u   作者u   工作目录u   日志文件u	   端口号u   超时时间u   启用调试u   配置列表u   中文u   默认INFOzC:\Program Files (x86)\MyAppzE:\ProjectData\2025\CurrentzC:\Windows\Temp\MyAppr;   g      p@)	u   语言u   主题u   日志级别u   安装路径u   数据路径u   临时文件夹u   最大连接数u   缓存大小u   启用缓存)u   用户信息u   项目配置u   系统设置u'   字典编辑器 - 路径格式化测试r  )6r   r  r  loggingr   pathlibr   typingr   r   r   r  r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   PyQt5.QtCorer   PyQt5.QtGuir   basicConfigr  	getLoggerr   r   r!   r   r   r   r  	test_datar  r  r  exitrb   r2   r1   <module>r     s        # #          ',, '			8	$l l^j!g j!Zt% t%p ,Fc3h %($ z  ,R &% = U	
" /$NP !
  "<<9"! 

A+IZ sxx
 C&y2[\F c r2   