mSiI~dZddlZddlmZmZmZmZmZmZm Z m Z ddl m Z ddl mZddlmZGddeZd Zd Zy) zK ProfileSelectorDialog - Dialog per selezione profilo filosofico all'avvio N)QDialog QVBoxLayout QHBoxLayout QPushButtonQLabel QButtonGroup QScrollAreaQWidget)Qt)QFont) ConfigManagercreZdZdZdfd ZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZxZS)ProfileSelectorDialogz.Dialog modale per selezione profilo filosoficoct||xsd|_d|_i|_|j |j y)Naurelio)super__init__selected_profileconfig_managerprofiles load_profilesinit_ui)self last_profile __class__s %desktop/ui/profile_selector_dialog.pyrzProfileSelectorDialog.__init__sA  , 9 #   c |j}t||_|jj|_|j |jvrYt d|j d|jr,t|jjd|_yd|_yy#t$r?}t d|t d|j|_d|_Yd}~yd}~wwxYw)z+Carica profili dinamicamente da config.yamlzrofileSelector] Profilo 'z+' non trovato, fallback a primo disponibilerrz.[ProfileSelector] Errore caricamento profili: z([ProfileSelector] Uso emergency defaultsN) _get_config_pathr rget_all_profilesrrprintsortedkeys Exception_get_emergency_defaults)r config_pathes rrz#ProfileSelectorDialog.load_profiless .//1K#0 " 2 3 t}}  !   [ )   \ *&&BC((,''(<(<=%% '  )%!!# + ""3'""4;;/  ,!'* ##C(t$##DKK0!! #    -( vrcddlm}m}ddg}|}|}|jd|j ddddj }|j |t}|jdtd} | jd| jjfd| jd |j | |vrntd } | jd| jjfd | jd | jd |j | |j||j||S)z;Crea card profilo con bottone selezione, modifica e eliminar)r rrwarrenu⚙️ Modifica#c&jSN) edit_profilerlrsrz.s):)::)Fra QPushButton { background-color: #f5f5f5; border: 1px solid #ddd; border-radius: 5px; padding: 6px; font-size: 11px; color: #666; } QPushButton:hover { background-color: #e0e0e0; border-color: #999; color: #333; } u🗑️ Eliminac&jSrw)delete_profile_requestrysrrzz.st/J/J:/VrzElimina profiloa QPushButton { background-color: #ffebee; border: 1px solid #ef9a9a; border-radius: 5px; padding: 6px; font-size: 11px; color: #c62828; } QPushButton:hover { background-color: #ef5350; border-color: #c62828; color: white; } )PyQt6.QtWidgetsr rrIrJ_create_profile_buttonrQrrrHr_r`rR setToolTipr^rZ) rrlr rSYSTEM_PROFILES containercontainer_layout profile_btnbuttons_layoutedit_btn delete_btns `` rr]z*ProfileSelectorDialog._create_profile_cardsX8$h/I &=##A&++Aq!Q711*= "";/%!!!$01!!"%  !FG     * _ ,$%67J  ' ' +    & &'V W  ! !"3 4  $ $&   $ $Z 0"">2,-rc j|}t}|jd|jd|j d|j |dd|dd|dd|dd|d  |j d |d d |d d |d d|jk(r|jd|jj|ffd |S)z#Crea bottone profilo con stile cardTr5z r3 r4r8r6aA QPushButton { background-color: white; border: 2px solid #ddd; border-radius: 10px; padding: 20px; text-align: center; font-size: 11px; } QPushButton:hover { border-color: r7z; background-color: #f9f9f9; } QPushButton:checked { border: 3px solid z$; background-color: z=22; font-weight: bold; } c&j|Srw)_on_profile_selected)checkedpidrs rrzz>ProfileSelectorDialog._create_profile_button..'sD.MockKernelc||_yrwactive_profile)rrs rrz?ProfileSelectorDialog.edit_profile..MockKernel.__init__:s &-#rN__name__ __module__ __qualname__rr:rr MockKernelr9s .rreditmodeparentzProfilo AggiornatozLe modifiche al profilo 'zH' sono state salvate. Le modifiche saranno applicate al prossimo avvio.N) desktop.ui.profile_editor_dialogrr}rexecr DialogCodeAccepted information)rrlrrr mock_kerneldialogs rrxz"ProfileSelectorDialog.edit_profile3srH/ . .!, $[vdK ;;=G..77 7  # #$+J<8DD  8rcddlm}ddlm}Gdd}|}||d|}|j t j jk(r4|j|j|j|dd y y ) z$Apri editor per creare nuovo profilorrrceZdZdZy)9ProfileSelectorDialog.add_new_profile..MockKernelcd|_yrwrr;s rrzBProfileSelectorDialog.add_new_profile..MockKernel.__init__Os &*#rNrr:rrrrNs +rrcreaterzProfilo Creatou\Nuovo profilo creato con successo! Il profilo è ora visibile nella lista e pronto all'uso.N) rrr}rrrrrr refresh_uir)rrrrrrs rraz%ProfileSelectorDialog.add_new_profileHsxH/ + +!l $[xM ;;=G..77 7    OO   # # K  8rc:|j}|ry|jrP|jd}|jr|jj |jrPt j ||jy)z=Ricostruisce UI dopo modifica profili (senza chiudere dialog)rN)rfcounttakeAtwidget deleteLaterr rZr)r old_layoutchilds rrz ProfileSelectorDialog.refresh_uiast[[] ""$"))!,<<>LLN..0""$ I   + rc 6ddlm}ddl}ddg}||vr|j|dd|dy|j |}t j j|}||}|j|jj|jd |jd |d d d g}|rH|jd|d|jd|jd|jd|jdj||j!|j"j$|j"j&z|j)|j"j&|j+|j"j$k7ry |j,j/||r |j7|t9d||j:|k(rd|_|j=|j?|jA|dd|dy#t0$r)} |j3|ddt5| Yd} ~ yd} ~ wwxYw#t0$r)} |j|ddt5| Yd} ~ d} ~ wwxYw)z Handler richiesta eliminazione profilo Mostra conferma con dettagli, elimina da config.yaml e directory, poi ricarica UI. rrNrrszOperazione Non Permessaz Il profilo 'u7' è un profilo di sistema e non può essere eliminato.zConferma Eliminazione Profiloz*Sei sicuro di voler eliminare il profilo 'z'?zVerranno eliminati:u!• Configurazione da config.yamlu• Directory /z4 - Documenti RAG (ChromaDB, doc_store, source_docs)z& - Memoria chat (memoria_chat.sqlite)z - LogrErrorez)Impossibile eliminare profilo da config: z'[ProfileSelector] Directory eliminata: zEliminazione Parzialez:Profilo rimosso da config ma errore eliminando directory: zProfilo Eliminatou"' è stato eliminato con successo.)!r}rshutilwarning_get_profile_directoryr,r-existssetIconIconWarningrErappendsetDetailedTextr0setStandardButtonsStandardButtonYesNosetDefaultButtonrrdelete_profiler$criticalstrrmtreer!rrrr) rrlrrr profile_dir dir_existsmsgdetailsr's rr|z,ProfileSelectorDialog.delete_profile_requestqs 0$h/  (   )zl*ab  11*= WW^^K0 $ K$$,,- :; @ BOP " /   NN^K=: ; NNQ R NNC D NN9 % DIIg./   & & * *[-G-G-J-J J  [77::; 88:3377 7      . .z :   k*? }MN  J .$-D !     :,&H I ;   ?LL ww~~l# lC( 0A vvx~~/  0 > 3;;x(* 52JJwwrwwz'BC ggll<=I '{3+<<> L,>>  "#5#:#:#<=a@M 1,?STaSbbcd e   E 0 0   8 > 8<==  >sI" F0.F# F0CG/1G#F-(F00 F=<F= G! GG!c^tjjd}tj|dtjj |d} t |d5}|j |dddy#1swYyxYw#t$r}td|Yd}~yd}~wwxYw)zSalva ultimo profilo usatorT)exist_okrwNz,[WARNING] Impossibile salvare last_profile: ) r,r-rmakedirsr0rwriter$r!) profile_namerrrr's rsave_last_profiler s##$67JKK T*77<< ,>?LB , $ " GGL ! " " " B rsF -FHGFHR/d Br