%i1ddlZddlZddlmZmZmZddlmZddlm Z m Z m Z m Z m Z mZddlmZmZejeZGdde ZdS)N)OptionalListDict)datetime) QTableWidgetQTableWidgetItem QHeaderViewQAbstractItemViewQFrame QSizePolicy)Qt pyqtSignalceZdZdZeeZfdZdeefdZ de eeffdZ e de eeffdZ deefdZdefdZdefd Zd"d edefd Zd ZdZdZdZdZdZdejfdZdejfdZdedefdZdededefdZdZdZdejfdZ dZ!defd Z"d!Z#xZ$S)#DetailTableBasez Base riusabile per le tabelle di dettaglio. Le sottoclassi devono definire intestazioni e mapping colonna->campo DataFrame. c t||_i|_d|_t jj|_ d|_ | | dSN) super__init___get_default_themethemestandard_widths sort_columnr SortOrderAscendingOrder sort_order original_data_setup_base_table_setup_connections)self __class__s 6C:\PYTHON\MyICR_Suite\app\widgets\detail_table_base.pyrzDetailTableBase.__init__sz ,,.. !,559     !!!!!returncgSNr s r" get_headerszDetailTableBase.get_headers r#ciSr&r'r(s r" get_mappingzDetailTableBase.get_mapping"r*r#c*|S)z Property per esporre il mapping colonne all'export Excel. Ritorna il mapping header_text -> df_column_name. )r,r(s r"column_mappingzDetailTableBase.column_mapping%s !!!r#cgSr&r'r(s r"get_center_aligned_headersz*DetailTableBase.get_center_aligned_headers-r*r#c tt|d}|ddd|ddS#t$rt|cYSwxYw)N.)strintzfill Exception)r values_vals r"format_time_valuez!DetailTableBase.format_time_value1sw E OO))!,,EBQBi..%!*.. .   u::    sAAA$#A$c t|tr@dD]<} tj||dcS#t $rY9wxYwn%t |dr|dStj|d}tj |r|dnt|S#t$rt|cYSwxYw)N)z%Y-%m-%d %H:%M:%Sz%Y-%m-%dz%d/%m/%Ystrftimecoerce)errors) isinstancer6rstrptimer> ValueErrorhasattrpd to_datetimenotnar9)r r:fmttss r"format_date_valuez!DetailTableBase.format_date_value8s  %%% 2<C'0<<EEjQQQQQ%  ++ 2~~j111h777B.0hrllJ2;;z***E J   u::    s;C 'AC  AC A(C SÌ1SYSITRUErW) rEisnar6r7replacefloatroundstripupperr9)r r:rLminutesss r"safe_format_valuez!DetailTableBase.safe_format_valueHsK 75>> U]2 \))3u::&]**e**((00c:::W$$,,,,44S#>>>...eE%LL4$788997||#Z''JJ$$&&,,..#BBBssJu::    u::    s0!D#*D#'*D#AD#AD#D##D?>D?c 0dddddddddd d d dd d dddS)NzSegoe UI )system primary_size small_size#0078D4#FFFFFF#F5F8FF#323130z#EAF4FF#EDEBE9#DEECF9) header_bg header_textrow_bg_primaryrow_bg_alternaterow_text row_hoverborder selected_bg selected_textr3)table_row_height border_radius)fontstable componentsr'r(s r"rz"DetailTableBase._get_default_theme\sL!+RrSS&y"+%I#I!* 13QHH   r#cd|p||_|dSr&)rr_apply_microsoft_styling)r rs r" set_themezDetailTableBase.set_themejs27d5577  %%'''''r#cX|}|t||||d|d|d |j n#t$rYnwxYw|j |j |}t|D]j\}}||tjj||jvr"|||j|U||k|d|t0jj|t0jj|t0jj |!tDj#j$|%tLj'j(tLj'j(|)dS)NTF)*r)setColumnCountlensetHorizontalHeaderLabelshorizontalHeadersetSectionsMovablesetHighlightSectionssetSortingEnabledsectionClicked disconnect TypeErrorconnect_on_header_clicked enumeratesetSectionResizeModer ResizeMode InteractiversetColumnWidthresizeColumnToContentsverticalHeader setVisiblesetSelectionBehaviorr SelectionBehavior SelectRowssetSelectionMode SelectionModeSingleSelectionsetEditTriggers EditTriggerNoEditTriggers setFrameShaper ShapeNoFrame setSizePolicyr Policy Expandingr)r headersheaderirqs r"rz!DetailTableBase._setup_base_tablensV""$$ CLL))) &&w/// 224888 44T::: u%%%   ! ! # # 2 = = ? ? ? ?    D  .66t7NOOO&&(('00 / /NA{  ' ';+A+M N N Nd222##At';K'HIIII++A.... ((/// !!"3"E"PQQQ /=MNNN .:IJJJ 6</000 ;-79K9UVVV %%'''''s0+C C)(C)c |}t|D]/\}}||jvr!|||j|0dS#t$rYdSwxYw)aRe-applica le larghezze standard alle colonne correnti. Da chiamare dopo aver impostato/aggiornato self.standard_widths nelle sottoclassi, per assicurare che le larghezze custom siano applicate dopo il setup iniziale della tabella. N)r)rrrr9)r rrrqs r"apply_standard_widthsz%DetailTableBase.apply_standard_widthss  &&((G"+G"4"4 N N;$"666''4+? +LMMM N N    DD sAA A%$A%c|jdi}|jdi}d|ddd|ddd |d d d |d dd|ddd|ddd|ddd|d d d|ddd|ddd}|||ddS)Nr}r|z> QTableWidget { background-color: rrrkz.; alternate-background-color: rsrlz$; border: 1px solid rvrnz; font-family: rgzSegoe UI, Arial, sans-serifz; font-size: rhrezpx; gridline-color: transparent; } QHeaderView::section { background-color: rprjz; color: rqz; padding: 8px; border: none; } QTableWidget::item { padding: 6px 8px; border-bottom: 1px solid z\; } QTableWidget::item:selected { background-color: rwrorxrmz; } T)rget setStyleSheetsetAlternatingRowColors)r table_colorsr| stylesheets r"rz(DetailTableBase._apply_microsoft_stylingsz~~gr22  w++ #/#3#34Di#P#P  .:-=-=>PR[-\-\  $0#3#3Hi#H#H   $ii2OPP   "IInb99   $0#3#3K#K#K  %(( BB  +7*:*:8Y*O*O!  &$0#3#3M9#M#M'  (%(()DD)   . :&&& $$T*****r#cD|j|jdSr&) itemClickedr_on_item_clickedr(s r"rz"DetailTableBase._setup_connectionss"   !677777r#datach |||jrdS||_|t |j||jdS#t$r*}t d|dYd}~dSd}~wwxYw)Nz Errore popolamento DetailTable: T)exc_info) clear_dataemptycopyr setRowCountr_populate_rows_directr9loggererror)r res r"populatezDetailTableBase.populates P OO   |tz|!%D    S!344 5 5 5  & &t'9 : : : : : P P P LL?A??$L O O O O O O O O O PsA=AA== B1B,,B1c|}|}t|D]\}\}}t|D]f\}}||} | rH| |vrC|| } ||} ||| | } t| } ||vr%| tj j n|dkr7| tj j tj jznq| dvr7| tj j tj jzn6| tj jtj jz|||| hdS)NRif.)rOrRrS)r)r,riterrowsr_resolve_item_type_format_value_for_headerrr0setTextAlignmentr AlignmentFlag AlignCenter AlignRight AlignVCenter AlignLeftsetItem)r rrmappingrow_idx_row_datacol_idxrq df_col_namer: item_type display_textitems r"rz%DetailTableBase._populate_rows_directs""$$""$$&/ &@&@ 9 9 "G]a(1'(:(: 9 9$%kk+66 9;(#:#:$[1E $ 7 7 D DI#'#@#@eU^#_#_L+L99D"d&E&E&G&GGG--b.>.JKKKK$..--b.>.IBL\Li.ijjjj$(RRR 11"2B2MPRP`Pm2mnnnn 11"2B2LrO_Ol2lmmmLL'4888# 9 9 9r#rqc|dkrdS|dvrdS|dkrdS|dkrdS|drd |vrd S|d rd Sd S)NAudiencerO)AnnorSharerRDatadaterVTvrTzDur.rSrK)r_ startswith)r rqs r"rz"DetailTableBase._resolve_item_types * $ $< * * *< ' ! !7 & 6      ) )# . . 4;3F3F:  ! !& ) ) %$$vr#rc|dvr||S|dkr||S|||S)N)z Ora IniziozOra Finer)r<rJrc)r rqr:rs r"rz(DetailTableBase._format_value_for_headersW 4 4 4))%00 0 & ))%00 0%%eY777r#cr|}ttt|}||vr9|dt jjdS|j |krB|j t jjkrt jj nt jj|_ n||_ t jj|_ ||j |j | |j |j dSr) r)listrangerrsetSortIndicatorr rrrrDescendingOrder_sort_by_column)r logical_indexr sortable_colss r"rz"DetailTableBase._on_header_clickeds""$$U3w<<0011  - -  ! ! # # 4 4R9T U U U F  } , ,>BoQSQ]Ql>l>lbl::rtr~sNDOO,D  l9DO 001A4?SSS T-t?????r#cl|j |jjrdS|}|}||}||}|r||jjvrdS|t jjk}|j ||d}| |dS)Nlast)by ascending na_position) rrr)r,rcolumnsr rr sort_values_repopulate_with_sorted_data) r column_indexorderrrrq data_columnr sorted_datas r"rzDetailTableBase._sort_by_columns   %);)A % F""$$""$$l+ kk+..  k1C1KKK Fbl99 (44 yfl4mm  ))+66666r#rcpd}|r:||d}|d|t ||||r||dSdSNr) selectedItemsr currentRowrKrrrselect_row_by_value)r rselected_values r"rz,DetailTableBase._repopulate_with_sorted_data s      D!YYt'8'8!<<AACCN  [))*** "";///  5  $ $^ 4 4 4 4 4 5 5r#c|sdS||d}|j|dSr)rrowrK row_selectedemit)r r row_values r"rz DetailTableBase._on_item_clickedsS  FIIdhhjj!,,1133  y)))))r#r:ct|D]\}||drD||d|kr||dS]dSr)rrowCountrrK selectRow)r r:rs r"rz#DetailTableBase.select_row_by_values))  Cyya   TYYsA%6%6%;%;%=%=%F%Fs###  r#c|dd|_d|_|r9|dt jjdSdS)Nrr)rrrrrr rrr(s r"rzDetailTableBase.clear_data st !  " " V  ! ! # # 4 4R9T U U U U U V Vr#)rK)%__name__ __module__ __qualname____doc__rr6rrrr)rr,propertyr.r0r<rJrcrrrrrrrE DataFramerrrrrrrrrr __classcell__)r!s@r"rr s:c??L"""""T#YT#s(^"S#X"""X"DI## 3C(    ((((((4   +++:888 PR\ P P P P9",9999. c c    8C838SV8888 @ @ @ 7 7 75 5555***  VVVVVVVr#r)loggingpandasrEtypingrrrrPyQt6.QtWidgetsrrr r r r PyQt6.QtCorer r getLoggerrrrr'r#r"rs''''''''''('''''''  8 $ $XVXVXVXVXVlXVXVXVXVXVr#