ġiW:dZddlmZmZmZmZmZmZmZm Z m Z m Z m Z m Z mZmZddlmZmZddlmZmZddlmZddlmZddlmZmZmZGdd eZd S) zK Backup Restore Dialog - Allows selective restore of files and directories )QDialog QVBoxLayout QHBoxLayout QPushButton QTreeWidgetQTreeWidgetItemQLabel QMessageBox QFileDialog QGroupBox QRadioButton QLineEditQProgressDialogQFrame)QtQTimer)QFontQIcon)logger)Path)OptionalListDictceZdZdZddedeffd ZdZdZdZ d Z d Z d ed efd Z ded efdZ dedefdZdedefdZdedejfdZdZdZdZdeefdZdeefdZdZxZS) BackupRestoreDialogz#Dialog for selective backup restoreN backup_root backup_namecft|t||_||_|j|z |_||_g|_|d|| dd| | dS)NzRestore from: i iX) super__init__rrr backup_pathprofileselected_itemssetWindowTitleresize _setup_ui _show_loading_and_load_structure)selfparentrrr" __class__s ,C:\PYTHON\Frank\gui\backup_restore_dialog.pyr zBackupRestoreDialog.__init__s     ,,&+k9   :[::;;; C  --/////c< t|}|dddd|dtd}t }|d|d||||td|j }||t|_ |j dt|j }|ddddt|_ |j d||j |j d ||j t!d }t|}t#|_|jgd |jd d |jdd|jdd|jj|j||j||t!d}t|} t1d|_t1d|_|jd| |j| |jt9} t;|_|jd|j tCtEj#dz | |jtId} | j%|j&| | | '| ||t9} | (tId} | j%|j)| | tId}|j%|j*| |tId|_+|j+j%|j,|j+-d| |j+tId}|j%|j.| ||'| dS)zSetup dialog UIu)📁 Select items to restore from backup: TzBackup: zbQFrame { background-color: #fff3cd; border: 1px solid #ffc107; border-radius: 4px; padding: 4px; }FzBackup Contents)NameTypeSizeridzRestore DestinationzRestore to original locationzRestore to custom location:zSelect destination folder...restored_backupz Browse...z Select Allz Deselect Allu🔄 Restore SelectedCancelN)/rsetContentsMargins setSpacingr r setPointSizesetBoldsetFont addWidgetrrmissing_sources_frame setStyleSheetmissing_sources_label setWordWrap setVisibler rtreesetHeaderLabelssetColumnWidth itemChangedconnect_on_item_checkedr restore_original_radiorestore_custom_radio setCheckedrrdest_path_inputsetPlaceholderTextsetTextstrrhomerclicked_browse_destination addLayout addStretch _select_all _deselect_all restore_btn_restore_selected setDefaultreject)r(layout header_label header_font info_labelwarning_layout tree_group tree_layout dest_group dest_layout path_layout browse_btn button_layoutselect_all_btndeselect_all_btn cancel_btns r+r&zBackupRestoreDialog._setup_ui$sT""!!"b"b111"JKK gg   $$$D!!![)))&&&9t'799:: $$$&,XX" "00 p   %T%?@@))!Q1555%+XX" "..t444  !;<<< "--e4443444011 !*-- MM  !!":":":;;;   C(((   C(((   C((( %%d&;<<<di((($$$455 !*-- '33Q&R&R#$01N$O$O! !,,T222d9:::d7888"mm ({{ //0NOOO $$S7H)H%I%IJJJd2333 -- ""4#;<<<j)))k***$$$$   """$\22&&t'7888///&~66 (();<<< 0111&'>??  (()?@@@ ##D))) 0111 ** ""4;/// +++'''''r,cRtdddddtjjdddtj dfddS)z-Show loading dialog and load backup structurezLoading backup contents...NrLoadingr6c.SN)$_load_backup_structure_with_progress)progressr(sr+zFBackupRestoreDialog._show_loading_and_load_structure..st'P'PQY'Z'Zr,) rr$setWindowModalityrWindowModality WindowModalsetCancelButtonsetMinimumDurationsetValuer singleShotr(rqs`@r+r'z4BackupRestoreDialog._show_loading_and_load_structures##?q!TRR ***""2#4#@AAA  &&&##A&&&! #ZZZZZ[[[[[r,c ||dS#|wxYw)z9Load backup structure and close progress dialog when doneN)_load_backup_structurecloserzs r+rpz8BackupRestoreDialog._load_backup_structure_with_progresssE   ' ' ) ) ) NN     HNN    s ,AcZ |js tj|dd|jdSt |jD]m}|r"||j||j8| r!| |j||jn| dS#t$r;}tjd|tj|dd|Yd}~dSd}~wwxYw)z+Load and display backup directory structureErrorzBackup not found: Nz Error loading backup structure: z!Failed to load backup structure: )r!existsr criticalsortediterdiris_dir_add_directory_itemrEis_file_add_file_item_check_missing_sources Exceptionrerror)r(itemes r+r|z*BackupRestoreDialog._load_backup_structuresV Y#**,, $T74[IY4[4[\\\t/7799:: K K;;==K,,TYd>NOOOO\\^^K'' 49IJJJ  ' ' ) ) ) ) ) Y Y Y L?A?? @ @ @  w0WTU0W0W X X X X X X X X X Ys7C%B(C%% D*/0D%%D*c|jsdS ddl}|jdd}t|tr||n|}d|jDfd|D}|rNd|}|j d||j d dSdS#t$r"}tjd |Yd}~dSd}~wwxYw) zDShow warning if some profile sources are not present in this backup.Nrsourcesz[]cDh|]}||jS)rname).0rs r+ z=BackupRestoreDialog._check_missing_sources..s'[[[tT[[]][[[[r,c@g|]}t|jv|Sr)rr)rs backed_ups r+ z>BackupRestoreDialog._check_missing_sources..s+KKKQT!WW\-J-Jq-J-J-Jr,u • ua⚠ Sorgenti non incluse in questo backup (drive non disponibili al momento del backup): • Tz!Could not check missing sources: )r"jsonget isinstancerQloadsr!rjoinrBrPr@rDrrwarning)r(r sources_rawrmissinglinesrrs @r+rz*BackupRestoreDialog._check_missing_sourcess[|  F D KKK,**9d;;K1;K1M1M^djj---S^G\[t/?/G/G/I/I[[[IKKKK'KKKG <!w//*22&#&&*55d;;;;;  < < D D D NBqBB C C C C C C C C C DsC C D$DDdir_path root_pathc||}t|}|d|j|dd|dd|dt jj|dt j j t||dt j j d t| D]Y}|r||||.|r||||ZdS#t$$rYdSwxYw)zAdd directory item to treerr5 Directoryr7dirN) relative_torrPr setCheckStater CheckState UncheckedsetData ItemDataRoleUserRolerQrrrrrrPermissionError)r(r)rr relative_pathrsub_items r+rz'BackupRestoreDialog._add_directory_itemso ,,Y77 v&& Q &&& Q $$$ Q 1bm5666 Q0#m2D2DEEE Q0%888 "8#3#3#5#566 C C??$$C,,T8YGGGG%%''C''h BBB  C C     DD s+A;E(( E65E6 file_pathcJ||} |j}||}n #d}YnxYwt |}|d|j|dd|d||dtj j | dtj j t|| dtj j ddS)zAdd file item to treeUnknownrr5Filer7fileN)rstatst_size _format_sizerrPrrrrrrrrrQ)r(r)rrrsizesize_strrs r+rz"BackupRestoreDialog._add_file_items!--i88  !>>##+D((..HH ! HHHv&& Q ''' Q Q!!! 1bm5666 Q0#m2D2DEEE Q0&99999s .AA rreturncBdD]}|dkr |dd|cS|dz}|ddS)z)Format file size in human readable format)BKBMBGBg@z.1f z TBr)r(runits r+rz BackupRestoreDialog._format_sizesT+  Df}}+++T+++++ FNDDr,rcolumncl|dkrdS|d}|||dS)zHandle item check state changerN) checkState_set_children_check_state)r(rr check_states r+rJz$BackupRestoreDialog._on_item_checkeds? Q;; Fooa((  &&t[99999r,statect|D]C}||}|d||||DdS)z,Recursively set check state for all childrenrN)range childCountchildrr)r(rrirs r+rz-BackupRestoreDialog._set_children_check_stateskt(()) 9 9AJJqMME   5 ) ) )  * *5% 8 8 8 8 9 9r,c|j}t|D]<}||}|dt jj=dS)zSelect all items in treerN) rEinvisibleRootItemrrrrrrCheckedr(rootrrs r+rWzBackupRestoreDialog._select_allsmy**,,t(()) 9 9A::a==D   q"-"7 8 8 8 8 9 9r,c|j}t|D]<}||}|dt jj=dS)zDeselect all items in treerN) rErrrrrrrrrs r+rXz!BackupRestoreDialog._deselect_all smy**,,t(()) ; ;A::a==D   q"-"9 : : : : ; ;r,ctj|d|jtjj}|r|j|dSdS)z Browse for destination directoryzSelect Restore DestinationN)r getExistingDirectoryrNtextOption ShowDirsOnlyrP)r(dests r+rTz'BackupRestoreDialog._browse_destinationsf/  (  % % ' '   +     /  ( ( . . . . . / /r,chg}|j}||||S)zGet list of selected items)rEr_collect_checked_items)r(selectedrs r+_get_selected_itemsz'BackupRestoreDialog._get_selected_itemss5y**,, ##D(333r,rc2t|D]}||}|dtjjkrw|dtjj }|dtjj }| ||| dd|dtjj kr| ||dS)z!Recursively collect checked itemsrr5)pathtyperN)rrrrrrrdatarrappendrrr)r(r)rrrr item_types r+rz*BackupRestoreDialog._collect_checked_items"sv((**++ < >>++D(;;; < ???FNL&x00 & & T''))E!!#&&&%%&BDL&B&BCCC&F|u,,AJ%TYf%=%=PT 001A4r sk $#######$$$$$$$$''''''''''n`n`n`n`n`'n`n`n`n`n`r,