o
    AVbN5                     @   sn   d dl Z d dlZd dlZd dlmZ d dlmZ ddlmZ 	dddZ	G d	d
 d
eZ
G dd dejZdS )    N)Gtk)log   )
vmmGObjectTc           	      C   s   dd }||}||}|  d| | |pd  | | |r'|  | d}|rA|  }t|tjj	tjj
fv }|   |S dd }| d| |   |S )Nc                 S   sb   | s| S t | dkr| d d d } g }|  D ]}|s"|d q|t|d qd|S )Ni   z... P   
)len
splitlinesappendextendtextwrapwrapjoin)tretlinesline r   ,/usr/share/virt-manager/virtManager/error.pyfix_text   s   
z _launch_dialog.<locals>.fix_texttextFc                 S   s   |    d S N)destroy)srcignorer   r   r   response_destroy0   s   z(_launch_dialog.<locals>.response_destroyresponse)set_propertyformat_secondary_text	set_titleget_content_areaaddrunboolr   ResponseTypeYESOKr   connectshow)	dialogprimary_textsecondary_texttitlewidgetmodalr   resr   r   r   r   _launch_dialog   s$   
r0   c                   @   s   e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdddde	j
je	jjdfddZ	d&ddZdeddfddZdddde	jjfddZd'ddZd'ddZdd Zd(ddZd(dd Zdded!fd"d#Z				d)d$d%ZdS )*vmmErrorDialogc                 C   s   | j std | _ | j S r   )	_instancer1   )clsr   r   r   get_instance:   s   
zvmmErrorDialog.get_instancec                 C   s    t |  || _d | _d| _d S NF)r   __init___parent_simple_modal_default)selfparentr   r   r   r6   @   s   

zvmmErrorDialog.__init__c                 C   s   d S r   r   r:   r   r   r   _cleanupG   s   zvmmErrorDialog._cleanupc                 C   s
   || _ d S r   )r9   )r:   valr   r   r   set_modal_defaultJ   s   
z vmmErrorDialog.set_modal_defaultc                 C   s   | j S r   )r7   r<   r   r   r   
get_parentL   s   zvmmErrorDialog.get_parentNr   Tc	                 C   s   |d u r| j }|d u r#|}t d d ur"|ddt   7 }nt|}|rOd| }	|rJ||krJ|}
||rD|t	|d   }
|	d|
 7 }	t
|	 |tjjkr_||vr_|d | }t|  d||d}|j|||||dS )Nr   z

r   z error dialog message:
summary=%sz
details=%sr;   flagsmessage_typebuttons)r*   r+   detailsr,   r.   )r9   sysexc_infor   	traceback
format_excstripstr
startswithr	   r   debugr   MessageTypeERROR_errorDialogr@   show_dialog)r:   summaryrE   r,   r.   rM   dialog_typerD   text2debugmsgdetr)   r   r   r   show_errO   s8   

zvmmErrorDialog.show_errc           	      C   s^   t j|  t jj||d}| jr| j  || _| j d t	| j||p'd|p*d||dS )N)rB   rC   rD   
vmm dialogr   )r-   r.   )
r   MessageDialogr@   DialogFlagsDESTROY_WITH_PARENTr8   r   get_accessibleset_namer0   )	r:   rS   rD   text1rT   r,   r-   r.   r)   r   r   r   _simple_dialogz   s   

zvmmErrorDialog._simple_dialogzInput Errorc              	   C   s   t d| }|r|d| 7 }t|tst|trt| n| | tjj}tj	j
}| ||t||r8t|p9dt|d | dS )NzValidation Error: %sz %sr   F)_
isinstance	Exceptionr   	exception	_logtracer   rN   rO   ButtonsTyper&   r_   rK   )r:   r^   rT   r,   r.   logtextdtyperD   r   r   r   val_err   s   

zvmmErrorDialog.val_errc              	   C   s"   t jj}| ||||||| dS r5   )r   rN   INFOr_   )r:   r^   rT   r,   r-   r.   rD   rg   r   r   r   	show_info   s   zvmmErrorDialog.show_infoc                 C   "   t jj}t jj}| |||||S r   )r   rN   WARNINGre   YES_NOr_   r:   r^   rT   r,   rg   rD   r   r   r   yes_no      zvmmErrorDialog.yes_noc                 C   rk   r   )r   rN   rl   re   	OK_CANCELr_   rn   r   r   r   	ok_cancel   rp   zvmmErrorDialog.ok_cancelc                 C   s$   | j | jj| jjtdtdddS )zS
        Helper function for confirming whether to apply unapplied changes
        z>There are unapplied changes. Would you like to apply them now?zDon't warn me again.F)r^   chktextdefault)chkbox_helperconfigget_confirm_unappliedset_confirm_unappliedr`   r<   r   r   r   confirm_unapplied_changes   s   z(vmmErrorDialog.confirm_unapplied_changesc                 C   8   t jj}|p	t jj}t|  d||d}|j|||dS Nr   rA   )r*   r+   rs   )r   rN   rl   re   rq   rP   r@   rQ   r:   r^   rT   rs   rD   rg   chkboxr   r   r   warn_chkbox      zvmmErrorDialog.warn_chkboxc                 C   rz   r{   )r   rN   rO   re   r&   rP   r@   rQ   r|   r   r   r   
err_chkbox   r   zvmmErrorDialog.err_chkboxzDon't ask me againc                 C   s:   | }|s|S | j |||tjjd}|\}	}
||
  |	S )z
        Helper to prompt user about proceeding with an operation
        Returns True if the 'yes' or 'ok' button was selected, False otherwise

        @default: What value to return if getcb tells us not to prompt
        )r^   rT   rs   rD   )r~   r   re   rm   )r:   getcbsetcbr^   rT   rt   rs   	do_promptr/   r   skip_promptr   r   r   ru      s   	
zvmmErrorDialog.chkbox_helperc	                 C   sl  ddl }	d}
|ptjj}|tjjkr|du rtj}d}
|du r"tj}tj||  |tj	tj
j|tj
jfd}|tj
j |rD|| ||
 |duru|}d}t|tr^|d }|d }t }|d|  |rp|| || |r~| j||}|dur|	||	jr|| d}| tj
jkr| }|  |r|r|ds| j|	j !|| |S )	aE  
        Helper function for launching a filechooser

        @dialog_name: String to use in the title bar of the filechooser.
        @conn: vmmConnection used by calling class
        @start_folder: Folder the filechooser is viewing at startup
        @_type: File extension to filter by (e.g. "iso", "png")
        @dialog_type: Maps to FileChooserDialog 'action'
        @browse_reason: The vmmConfig.CONFIG_DIR* reason we are browsing.
            If set, this will override the 'folder' parameter with the gsettings
            value, and store the user chosen path.
        r   NFT)r,   r;   actionrD   r   z*.z/dev)"osr   FileChooserActionOPENSAVE
STOCK_SAVE
STOCK_OPENFileChooserDialogr@   STOCK_CANCELr$   CANCELACCEPTset_default_responseset_current_nameset_do_overwrite_confirmationra   tuple
FileFilteradd_patternr]   
set_filterrv   get_default_directoryaccessR_OKset_current_folderr"   get_filenamer   rL   set_default_directorypathdirname)r:   conndialog_namestart_folder_typerS   browse_reasonchoose_buttondefault_namer   overwrite_confirmfcdialogpatternnamefretr   r   r   browse_local   sb   





zvmmErrorDialog.browse_localNT)NN)NNN)NNNNNN)__name__
__module____qualname__classmethodr4   r6   r=   r?   r@   r   rN   rO   re   CLOSErW   r_   r`   rh   r&   rj   ro   rr   ry   r~   r   ru   r   r   r   r   r   r1   8   sB    

,






r1   c                   @   s8   e Zd ZdZdd Zdd Zdd Z				dd
dZdS )rP   zL
    Custom error dialog with optional check boxes or details drop down
    c                 O   s~   t jj| g|R i | | d |   D ]}t|dr$|d q|  	d d | _
|   d | _d | _|   d S )Nr   set_max_width_chars(   rX   )r   rY   r6   r   get_message_areaget_childrenhasattrr   r\   r]   chk_vboxinit_chkboxbufferbuf_expanderinit_details)r:   argskwargschildr   r   r   r6   >  s   


z_errorDialog.__init__c                 C   s<   t dd| _| jd | j  | j| jddd d S )NFr   )r   VBoxr   set_spacingshow_allvbox
pack_startr<   r   r   r   r   O  s   

z_errorDialog.init_chkboxc                 C   s   t  | _t jtd| _t  }|t j	j
 |dd |t jjt jj t j| j}|d |d |d |t jj |d || | j| | j| jddd | j  d S )NDetailsi     F   r   )r   
TextBufferr   Expandernewr`   r   ScrolledWindowset_shadow_type
ShadowTypeINset_size_request
set_policy
PolicyType	AUTOMATICTextViewnew_with_bufferset_editableset_overwriteset_cursor_visibleset_wrap_modeWrapModeWORDset_border_widthr!   r   r   r   )r:   swrE   r   r   r   r   X  s$   






z_errorDialog.init_detailsr   Tc           
      C   s   d }d }|    | j   | j D ]}	| j|	 q|r,| j| |p&d}| j  |r=t	|}| j
| |  t| ||pCd||d}|rP|| g}|S )Nr   )r.   )hider   r   r   remover   set_textr(   r   CheckButtonr!   r0   
get_active)
r:   r*   r+   r,   rE   rs   r.   r}   r/   cr   r   r   rQ   l  s,   


z_errorDialog.show_dialogN)r   r   r   r   T)r   r   r   __doc__r6   r   r   rQ   r   r   r   r   rP   :  s    	rP   r   )rF   r   rH   gi.repositoryr   virtinstr   	baseclassr   r0   r1   rY   rP   r   r   r   r   <module>   s   
'  