o
    \c`                     @   s   d dl m Z d dlmZ d dlZd dlZd dlmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ erpd dlmZ d dlmZ G dd deZG dd deZG dd deZ d Z!G dd deeZ"dS )    )gettext)
itemgetterN)ListTYPE_CHECKINGOptionalCallablecastUnion)Device)DBusNoSuchAdapterError)Notification)ServiceUUID)AppletPlugin)PowerManagerPowerStateListener)SubmenuItemDict)	TypedDictc                   @   s>   e Zd ZU eed< eed< eed< eed< eed< eed< dS )	_ItemBaseadapteraddressaliasiconnameuuidN__name__
__module____qualname__str__annotations__ r    r    D/usr/lib/python3/dist-packages/blueman/plugins/applet/RecentConns.pyr      s   
 r   c                   @   s.   e Zd ZU eed< ee ed< ee ed< dS )ItemtimedevicemitemN)r   r   r   floatr   r   r   r   r    r    r    r!   r"      s   
 r"   c                   @   s   e Zd ZU eed< dS )
StoredIconr#   Nr   r    r    r    r!   r'       s   
 r'   c                   @   sL  e Zd ZddgZdZedZdZdddZe	d	ed
eddde
dddZdZd:ddZdededdfddZd:ddZd:ddZdeddfddZdeddfdd Zdeddfd!d"Zdeddfd#d$Zdeddfd%d&Zd'ed(eddfd)d*Zd;d-d.Zd<d0d1Zded/ fd2d3Zd4ed5edee fd6d7Zded, fd8d9Z dS )=RecentConnsDBusServiceMenudocument-open-recent-symboliczIProvides a menu item that contains last used connections for quick accessWalmiszorg.blueman.plugins.recentconnsN)schemapath   zMaximum itemszAThe maximum number of items recent connections menu will display.)r/      )typedefaultr   descrangez[])r1   r2   )	max-itemsrecent-connectionsreturnc                 C   sB   g | _ | jjjj| dtdd d| jd| _| jjj| d d S )N4   zRecent _Connectionsu   …r+   )text	icon_namesubmenu_function5   )_RecentConns__menuitemsparentPluginsr*   add_get_menu_itemselfr    r    r!   on_load<   s   zRecentConns.on_loadmanagerstatec                 C      |    d S N_rebuild)rE   rG   rH   r    r    r!   on_power_state_changedD      z"RecentConns.on_power_state_changedc                 C   s   | j jj|  d S rJ   )r>   r?   r*   
unregisterrD   r    r    r!   	on_unloadG   s   zRecentConns.on_unloadc                    s   d j j v r j jj s jd d S    _t	 jdkr+ jd d S  jd  fdd jd  
d D  _ j jj  d S )Nr   Fr   Tc                    s   g | ]}  |qS r    )_build_menu_item).0itemrD   r    r!   
<listcomp>X   s    z(RecentConns._rebuild.<locals>.<listcomp>r5   )r>   r?   
get_loadedr   get_bluetooth_statusrC   set_sensitive
_get_items_itemslen
get_optionr=   r*   on_menu_changedrD   r    rD   r!   rL   J   s   
$zRecentConns._rebuildc                 C   s    |r|    d S | jd d S )NF)rL   rC   rW   )rE   rH   r    r    r!   on_manager_state_changed\   s   z$RecentConns.on_manager_state_changedr.   c                 C   rI   rJ   rK   rE   r.   r    r    r!   on_device_createdb   rN   zRecentConns.on_device_createdc                 C   rI   rJ   rK   r^   r    r    r!   on_device_removede   rN   zRecentConns.on_device_removedc                 C   rI   rJ   rK   r^   r    r    r!   on_adapter_addedh   rN   zRecentConns.on_adapter_addedc                 C   rI   rJ   rK   r^   r    r    r!   on_adapter_removedk   rN   zRecentConns.on_adapter_removedobject_pathr   c              	   C   s  t |d}t| d|  z| jj|d }W n ty)   td Y d S w |d |d |d |d t|j	|t
t d}| d	}|D ]&}|d
 |d
 krp|d |d krp|d |d krp|d |d< ||d<  nqJ|| | d	| |   d S )N)obj_path Adapterzadapter not foundAddressAliasIcon)r   r   r   r   r   r   r#   r6   r   r   r   r#   r$   )r
   logginginfor>   Managerget_adapterr   warningr   r   r   r#   r[   append
set_optionrL   )rE   rc   r   r$   r   rS   stored_itemsir    r    r!   notifyn   s8   





zRecentConns.notifyrS   r"   c                    s   t d d  d d    d d usJ d d d< jjj  d fd	d
}dtttf dd f fdd}jjj	
 d  d || d S )NzConnect r   re   r   r%   F	sensitiver7   c                      sX    d d usJ t tdtd d d   d d  d d d< jjj  d S )	Nr%   	ConnectedzConnected to %sr9   r   r:   Trt   )r   rA   showr>   r?   r*   r\   r    rS   rE   r    r!   reply   s   z,RecentConns.on_item_activated.<locals>.replyreasonc                    sR   t tdt| dd dd   d d usJ d d d< jjj  d S )	NzFailed to connectz: zdialog-errorrv   r%   Trt   )	r   rA   r   splitrw   r>   r?   r*   r\   )rz   rx   r    r!   err   s   z*RecentConns.on_item_activated.<locals>.errr$   r7   N)rj   rk   r>   r?   r*   r\   r	   	Exceptionr   r)   connect_service)rE   rS   ry   r}   r    rx   r!   on_item_activated   s    "zRecentConns.on_item_activatedr   c                    s   t d|d |d d d|d d ur|d d n|d |d	 d u|d	 d u r)d nt d
|d d ur8|d d nttg d f |f fdd	d}||d< |S )Nz%(service)s on %(device)sr   r   )servicer$   Tr%   r:   r   r$   z,Adapter for this connection is not availablecallbackc                    s
     | S rJ   )r   )itmrD   r    r!   <lambda>   s   
 z.RecentConns._build_menu_item.<locals>.<lambda>)r9   markupr:   rt   tooltipr   )rA   r   r   )rE   rS   r%   r    rD   r!   rQ      s   

zRecentConns._build_menu_itemc                 C   s   | j S rJ   )r=   rD   r    r    r!   rB      s   zRecentConns.get_menuadapter_pathr   c                 C   sP   z	| j j|}W n
 ty   Y d S w | j j|| }|d ur&| S d S rJ   )r>   rl   rm   r   find_deviceget_object_path)rE   r   r   r   r$   r    r    r!   _get_device_path   s   zRecentConns._get_device_pathc                    s>   dd j j D  t fdddD tdddS )	Nc                 S   s   h | ]}|d  qS )rg   r    )rR   r   r    r    r!   	<setcomp>   s    z)RecentConns._get_items.<locals>.<setcomp>c                 3   s    | ]?}|d   vs |d  |d r|d  |d |d |d |d |d t|d |d   v r; |d  |d nddd	V  qdS )	r   r   r   r   r   r   r#   N)	r   r   r   r   r   r   r#   r$   r%   )r   r&   )rR   rr   adapter_addressesrE   r    r!   	<genexpr>   s$     
z)RecentConns._get_items.<locals>.<genexpr>r6   r#   T)keyreverse)r>   rl   get_adapterssortedr[   r   rD   r    r   r!   rX      s   zRecentConns._get_itemsr~   )rS   r"   r7   N)rS   r"   r7   r   )!r   r   r   __depends____icon__rA   __description__
__author____gsettings__intlist__options__rY   rF   r   boolrM   rP   rL   r]   r   r_   r`   ra   rb   rs   r   rQ   r   rB   r   r   rX   r    r    r    r!   r(   &   s@    




#
	r(   )#r   rA   operatorr   r#   rj   typingr   r   r   r   r   r	   blueman.bluez.Devicer
   blueman.bluez.errorsr   blueman.gui.Notificationr   blueman.Sdpr   blueman.plugins.AppletPluginr   #blueman.plugins.applet.PowerManagerr   r   blueman.plugins.applet.Menur   typing_extensionsr   r   r"   r'   REGISTRY_VERSIONr(   r    r    r    r!   <module>   s&     