a
    )ÒycÞ ã                   @   sf  d dl Z d dlZd dlZd dlZd dlmZ d dlZ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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 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" 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( e	 )¡ Z*G dd„ dej+ƒZ,dS )é    N)ÚQtCore)ÚQt)ÚQtGui)Ú	QtWidgets)Ú__appname__)ÚPY2é   )Úutils)Ú
get_config)Ú	LabelFile)ÚLabelFileError)Úlogger)ÚShape)ÚBrightnessContrastDialog)ÚCanvas)ÚFileDialogPreview)ÚLabelDialog)ÚLabelListWidget)ÚLabelListWidgetItem)ÚToolBar)ÚUniqueLabelQListWidget)Ú
ZoomWidgetc                       s  e Zd Zd\ZZZd¸‡ fdd„	Zd¹dd„Zdºdd„Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zd»dd„Zdd„ Zd¼dd„Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd½d#d$„Zd¾d&d'„Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd¿d0d1„Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"dÀd@dA„Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dPdQ„ Z+dRdS„ Z,dTdU„ Z-dVdW„ Z.dXdY„ Z/dZd[„ Z0dÁd]d^„Z1d_d`„ Z2dÂdadb„Z3dÃdcdd„Z4dedf„ Z5dgdh„ Z6didj„ Z7dkdl„ Z8dÄdmdn„Z9‡ fdodp„Z:dqdr„ Z;dÅdtdu„Z<dvdw„ Z=dxdy„ Z>dzd{„ Z?d|d}„ Z@d~d„ ZAd€d„ ZBd‚dƒ„ ZCdÆd„d…„ZDdÇd†d‡„ZEdÈdˆd‰„ZFdÉdŠd‹„ZGdÊdŒd„ZHdËdŽd„ZIdd‘„ ZJd’d“„ ZKdÌd”d•„ZLd–d—„ ZMd˜d™„ ZNdšd›„ ZOdœd„ ZPdždŸ„ ZQd d¡„ ZRd¢d£„ ZSd¤d¥„ ZTd¦d§„ ZUd¨d©„ ZVdªd«„ ZWd¬d­„ ZXdÍd®d¯„ZYeZd°d±„ ƒZ[d²d³„ Z\dÎd´dµ„Z]d¶d·„ Z^‡  Z_S )ÏÚ
MainWindow)r   r   é   Nc           =   6      s  |d urt  d¡ |d u r|}|d u r,tƒ }|ˆ _tjˆ jd d Ž t_tjˆ jd d Ž t_tjˆ jd d Ž t_	tjˆ jd d Ž t_
tjˆ jd d Ž t_tjˆ jd d Ž t_ˆ jd d	 t_ttˆ ƒ ¡  ˆ  t¡ d
ˆ _d
ˆ _d ˆ _tˆ ˆ jd ˆ jd ˆ jd ˆ jd ˆ jd ˆ jd dˆ _tƒ ˆ _d ˆ _d  ˆ _ˆ _t ˆ  d¡ˆ ¡ˆ _ˆ j  d¡ t !¡ ˆ _|d r’ˆ  "dd„ |d D ƒ¡ ˆ j #ˆ j¡ ˆ jj$ %ˆ j&¡ ˆ jj' %ˆ j(¡ ˆ jj) %ˆ j*¡ ˆ jj$ %ˆ j+¡ ˆ jj, %ˆ j-¡ t ˆ  d¡ˆ ¡ˆ _.ˆ j.  d¡ ˆ j. #ˆ j¡ t/ƒ ˆ _0ˆ j0 1ˆ  d¡¡ ˆ jd rˆˆ jd D ]8}ˆ j0 2|¡}ˆ j0 3|¡ ˆ  4|¡}ˆ j0 5|||¡ qNt ˆ  d¡ˆ ¡ˆ _6ˆ j6  d¡ ˆ j6 #ˆ j0¡ t 7¡ ˆ _8ˆ j8 9ˆ  d¡¡ ˆ j8j: %ˆ j;¡ t !¡ ˆ _<ˆ j<j' %ˆ j=¡ t >¡ }	|	 ?dddd¡ |	 @d¡ |	 Aˆ j8¡ |	 Aˆ j<¡ t ˆ  d¡ˆ ¡ˆ _Bˆ jB  d¡ t C¡ }
|
 D|	¡ ˆ jB #|
¡ tEƒ ˆ _Fˆ  Gd¡ tHˆ jd ˆ jd  d! ˆ jd  d" ˆ jd  d# d$ ˆ _Iˆ j_Iˆ jIjJ %ˆ jJ¡ t K¡ }| #ˆ jI¡ | Ld¡ tMjN| O¡ tMjP| Q¡ iˆ _Rˆ jIjS %ˆ jS¡ ˆ jIjT %ˆ jT¡ ˆ jIjU %ˆ j&¡ ˆ jIjV %ˆ jW¡ ˆ jIjX %ˆ jY¡ ˆ  Z|¡ tj [¡ }d%D ]Ž}ˆ j| d& r”|tjj\B }ˆ j| d' r°|tjj]B }ˆ j| d( rÌ|tjj^B }t_ˆ |ƒ `|¡ ˆ j| d) d
u rtt_ˆ |ƒ ad
¡ qtˆ  btMjcˆ j¡ ˆ  btMjcˆ j6¡ ˆ  btMjcˆ j.¡ ˆ  btMjcˆ jB¡ td etfjgˆ ¡}ˆ jd* }|ˆ  d+¡ˆ jh|d, d,ˆ  d-¡ƒ}|ˆ  d.¡ˆ ji|d/ d/ˆ  d0¡ƒ}|ˆ  d1¡ˆ jj|d2 d/ˆ  d3¡ƒ}|ˆ  d4¡ˆ jk|d5 d6ˆ  d7¡d
d8}|ˆ  d9¡ˆ jl|d: d;ˆ  d<¡d
d8}|ˆ  d=¡ˆ jm|d> d>ˆ  d?¡d
d8}|ˆ  d@¡ˆ jn|dA dBˆ  dC¡d
d8}|ˆ  dD¡ˆ jo|dE dFˆ  dG¡d
d8}|ˆ  dH¡ˆ jp|dI d/ˆ  dJ¡dK}|ˆ  dL¡‡ fdMdN„d>ˆ  dO¡dddP}| qˆ jdQ ¡ |dRˆ jrdSdˆ jdT dU}|dVˆ js|dW dWdXƒ}|ˆ  dY¡ˆ jt|dZ d ˆ  d[¡dd\}| qˆ jd] ¡ |ˆ  d^¡‡ fd_dN„|d` daˆ  db¡d
d8}|ˆ  dc¡‡ fdddN„|de daˆ  df¡d
d8}|ˆ  dg¡‡ fdhdN„|di daˆ  dj¡d
d8}|ˆ  dk¡‡ fdldN„|dm daˆ  dn¡d
d8} |ˆ  do¡‡ fdpdN„|dq daˆ  dr¡d
d8}!|ˆ  ds¡‡ fdtdN„|du daˆ  dv¡d
d8}"|ˆ  dw¡ˆ ju|dx dyˆ  dz¡d
d8}#|ˆ  d{¡ˆ jv|d| d}ˆ  d~¡d
d8}$|ˆ  d¡ˆ jw|d€ dˆ  d‚¡d
d8}%|ˆ  dƒ¡ˆ jx|d„ d…ˆ  d†¡d
d8}&|ˆ  d‡¡ˆ jy|dˆ d‰ˆ  dŠ¡d
d8}'|ˆ  d‹¡ˆ jIjz|dŒ dˆ  dŽ¡d
d8}(|dˆ j{|d dyd‘d
d’})|ˆ  d“¡ˆ j||d dˆ  d”¡d
d8}*|ˆ  d•¡td eˆ j}d
¡d–ˆ  d—¡d
d˜}+|ˆ  d™¡td eˆ j}d¡d–ˆ  dš¡d
d˜},|ˆ  d›¡ˆ j~dœˆ  d¡dž}-t ˆ ¡}.|. €ˆ jF¡ ˆ jF t‚ˆ  dŸ¡ƒ ƒtf „d  ƒ|d¡ |d¢ ¡¡tf „ˆ  d£¡¡¡¡ ˆ jF …d
¡ |ˆ  d¤¡td eˆ j†d¥¡|d¡ d¦ˆ  d§¡d
d8}/|ˆ  d¨¡td eˆ j†d©¡|d¢ dªˆ  d«¡d
d8}0|ˆ  d¬¡td eˆ j‡d­¡|d® d¯ˆ  d°¡d
d8}1|ˆ  d±¡ˆ jˆˆ  d²¡dˆ jd³ dd´}2|ˆ  dµ¡ˆ j‰|d¶ d·ˆ  d¸¡dd
d¹}3|ˆ  dº¡ˆ jŠ|d» d¼ˆ  d½¡dd
d¹}4|d¾ˆ j‹d d¿dÀd
d8}5ˆ jF|/|0|1|3|4f}6ˆ jŒˆ _|3 qtMjŽ¡ ˆ jŒˆ jˆ jˆ j‘ˆ j’dÁdN„ iˆ _“|ˆ  dÂ¡ˆ j*|dÃ dyˆ  dÄ¡d
d8}7|ˆ  dÅ¡ˆ jIj”d d¿ˆ  dÆ¡ddd¹}8|8 •¡  t –¡ }9tf —|9|7|$f¡ ˆ j ˜tMj™¡ ˆ jjš %ˆ j›¡ tfjœ||||||||||$|7|%|&|'|(|*|)||#||| |!|"|.|/|0|1|2|3|4|5|6||||||||fdÇ|7|%|$d |*|(d |)d |f
|||| |!|"|#|7|%|&|'|$|*|(|)f||||| |!|"|#|5f	||+|,fdÈ)ˆ _ˆ jIjž %ˆ jjŸj…¡ tfjœˆ   ˆ  dÉ¡¡ˆ   ˆ  dÊ¡¡ˆ   ˆ  dË¡¡ˆ   ˆ  dÌ¡¡t –ˆ  dÍ¡¡|9dÎˆ _¡tf —ˆ j¡j¢||||ˆ j¡j£|||||||d |f¡ tf —ˆ j¡j¤|-f¡ tf —ˆ j¡j¥ˆ j ¦¡ ˆ j6 ¦¡ ˆ j. ¦¡ ˆ jB ¦¡ d |8d |+|,d |/|0|1|2d |3|4d |5f¡ ˆ j¡j¢j§ %ˆ j¨¡ tf —ˆ jIj¡d ˆ jj ¡ tf —ˆ jIj¡dÏ |dÐˆ j©ƒ|dÑˆ jªƒf¡ ˆ  «dÒ¡ˆ _¬||||||d ||#|%|&|'|$|*|5d |.|4fˆ j_­ˆ  ®¡  ¯t‚ˆ  dÓ¡ƒt ¡ ˆ  ®¡  °¡  |d ur¦ˆ jdQ r¦t  ±dÔ¡ |ˆ _²|ˆ _³t ´¡ ˆ _µd ˆ _¶g ˆ _£dÕˆ _·d ˆ _¸d­ˆ _¹d
ˆ _ºi ˆ _»i ˆ _¼tMjPi tMjNi iˆ _½|d ur$t¾ ¿|¡r$ˆ jÀ|d
dÖ n|ˆ _Á|d× rLˆ j8 Â|d× ¡ ˆ  ;¡  tÃ ÄdØdØ¡ˆ _Åˆ jÅ ÆdÙg ¡plg ˆ _£ˆ jÅ ÆdÚtÃ ÇdÛdÜ¡¡}:ˆ jÅ ÆdÝtÃ Èdd¡¡};ˆ jÅ ÆdÞtÃ É¡ ¡}<ˆ  Ê|:¡ ˆ  Ë|;¡ ˆ  Ì|<¡ ˆ  ¨¡  ˆ jÁd uröˆ  Ítd eˆ jÎˆ jÁ¡¡ ˆ jFjÏ %ˆ jÐ¡ ˆ  Ñ¡  d S )ßNz6argument output is deprecated, use output_file insteadÚshapeÚ
line_colorÚ
fill_colorÚselect_line_colorÚselect_fill_colorÚvertex_fill_colorÚhvertex_fill_colorÚ
point_sizeFÚlabelsÚsort_labelsZshow_label_text_fieldZlabel_completionÚfit_to_contentÚlabel_flags)Úparentr"   r#   Zshow_text_fieldZ
completionr$   ÚflagsZFlagsr'   c                 S   s   i | ]
}|d “qS ©F© ©Ú.0Úkr)   r)   úX/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/labelme/app.pyÚ
<dictcomp>w   ó    z'MainWindow.__init__.<locals>.<dictcomp>zPolygon LabelsZLabelszASelect label to start annotating for it. Press 'Esc' to deselect.z
Label ListzSearch Filenamer   z	File ListZFilesTÚepsilonÚcanvasÚdouble_clickÚnum_backupsÚ	crosshair)r0   r2   r3   r4   )Ú	flag_dockÚ
label_dockÚ
shape_dockÚ	file_dockZclosableZ	floatableZmovableÚshowÚ	shortcutsz&QuitÚquitzQuit applicationz&OpenÚopenzOpen image or label filez	&Open DirZopen_dirzOpen Dirz&Next ImageZ	open_nextÚnextz)Open next (hold Ctl+Shift to copy labels))Úenabledz&Prev ImageZ	open_prevÚprevz)Open prev (hold Ctl+Shift to copy labels)z&SaveÚsavezSave labels to filez&Save AsZsave_aszsave-aszSave labels to a different filez&Delete FileZdelete_fileÚdeletezDelete current label filez&Change Output DirZsave_toz)Change where annotations are loaded/saved)ÚslotÚshortcutÚiconÚtipzSave &Automaticallyc                    s   ˆ j j | ¡S ©N)ÚactionsÚsaveAutoÚ
setChecked)Úx©Úselfr)   r-   Ú<lambda>   r/   z%MainWindow.__init__.<locals>.<lambda>zSave automatically)ÚtextrB   rD   rE   Ú	checkabler>   Ú	auto_savezSave With Image DatazSave image data in label fileÚ
store_data)rN   rB   rE   rO   Úcheckedz&CloseÚclosezClose current filezKeep Previous AnnotationÚtoggle_keep_prev_modez%Toggle "keep pevious annotation" mode)rO   Ú	keep_prevzCreate Polygonsc                      s   ˆ j dddS )NFÚpolygon©Ú
createMode©ÚtoggleDrawModer)   rK   r)   r-   rM   D  r/   Zcreate_polygonZobjectszStart drawing polygonszCreate Rectanglec                      s   ˆ j dddS )NFÚ	rectanglerW   rY   r)   rK   r)   r-   rM   L  r/   Zcreate_rectanglezStart drawing rectangleszCreate Circlec                      s   ˆ j dddS )NFÚcirclerW   rY   r)   rK   r)   r-   rM   T  r/   Zcreate_circlezStart drawing circleszCreate Linec                      s   ˆ j dddS )NFÚlinerW   rY   r)   rK   r)   r-   rM   \  r/   Zcreate_linezStart drawing lineszCreate Pointc                      s   ˆ j dddS )NFÚpointrW   rY   r)   rK   r)   r-   rM   d  r/   Zcreate_pointzStart drawing pointszCreate LineStripc                      s   ˆ j dddS )NFÚ	linestriprW   rY   r)   rK   r)   r-   rM   l  r/   Zcreate_linestripz6Start drawing linestrip. Ctrl+LeftClick ends creation.zEdit PolygonsZedit_polygonÚeditz#Move and edit the selected polygonszDelete PolygonsZdelete_polygonÚcancelzDelete the selected polygonszDuplicate PolygonsZduplicate_polygonÚcopyz+Create a duplicate of the selected polygonszCopy PolygonsZcopy_polygonZcopy_clipboardz#Copy selected polygons to clipboardzPaste PolygonsZpaste_polygonÚpastezPaste copied polygonszUndo last pointZundo_last_pointÚundozUndo last drawn pointzRemove Selected PointZremove_selected_pointz"Remove selected point from polygon)rN   rB   rC   rD   rE   r>   ZUndozUndo last add and edit of shapez&Hide
PolygonsZeyezHide all polygons)rD   rE   r>   z&Show
PolygonszShow all polygonsz	&TutorialÚhelpzShow tutorial page)rD   rE   zLZoom in or out of the image. Also accessible with {} and {} from the canvas.z{},{}Zzoom_inZzoom_outz
Ctrl+WheelzZoom &Inçš™™™™™ñ?zzoom-inzIncrease zoom levelz	&Zoom OutçÍÌÌÌÌÌì?zzoom-outzDecrease zoom levelz&Original sizeéd   Zzoom_to_originalÚzoomzZoom to original sizez&Keep Previous ScalezKeep previous zoom scaleÚkeep_prev_scale)rE   rO   rR   r>   z&Fit WindowÚ
fit_windowz
fit-windowzZoom follows window size)rO   r>   z
Fit &WidthZ	fit_widthz	fit-widthzZoom follows window widthz&Brightness ContrastZcolorzAdjust brightness and contrastc                   S   s   dS ©Nr   r)   r)   r)   r)   r-   rM   %  r/   z&Edit LabelZ
edit_labelz(Modify the label of the selected polygonzFill Drawing PolygonzFill polygon while drawingr)   ))rH   ÚsaveWithImageDataÚchangeOutputDirr@   ÚsaveAsr<   rS   Ú
deleteFileÚtoggleKeepPrevModerA   r`   Ú	duplicaterb   rc   ÚundoLastPointrd   ÚremovePointrX   ÚeditModeÚcreateRectangleModeÚcreateCircleModeÚcreateLineModeÚcreatePointModeÚcreateLineStripModeri   ÚzoomInÚzoomOutÚzoomOrgÚkeepPrevScaleÚ	fitWindowÚfitWidthÚbrightnessContrastÚzoomActionsÚopenNextImgÚopenPrevImgZfileMenuActionsÚtoolÚeditMenuÚmenuÚonLoadActiveÚonShapesPresentz&Filez&Editz&Viewz&HelpzOpen &Recent)Úfiler`   Úviewre   ÚrecentFilesÚ	labelListr   z
&Copy herez
&Move hereZToolsz%s started.zƒIf `auto_save` argument is True, `output_file` argument is ignored and output filename is automatically set as IMAGE_BASENAME.json.é   ©ÚloadZfile_searchÚlabelmerŒ   úwindow/sizeiX  iô  úwindow/positionúwindow/state)Òr   Úwarningr
   Ú_configr   ÚQColorr   r   r   r   r   r   r    r!   Úsuperr   Ú__init__ÚsetWindowTitler   ÚdirtyÚ_noSelectionSlotÚ_copied_shapesr   ÚlabelDialogr   r   ÚlastOpenDirr5   Úflag_widgetr   ZQDockWidgetÚtrÚsetObjectNameZQListWidgetÚ	loadFlagsZ	setWidgetZitemChangedÚconnectÚsetDirtyZitemSelectionChangedÚlabelSelectionChangedZitemDoubleClickedÚ	editLabelÚlabelItemChangedZitemDroppedÚlabelOrderChangedr7   r   ÚuniqLabelListZ
setToolTipÚcreateItemFromLabelÚaddItemÚ_get_rgb_by_labelÚsetItemLabelr6   Z	QLineEditÚ
fileSearchZsetPlaceholderTextZtextChangedÚfileSearchChangedÚfileListWidgetÚfileSelectionChangedZQVBoxLayoutZsetContentsMarginsZ
setSpacingZ	addWidgetr8   ZQWidgetZ	setLayoutr   Ú
zoomWidgetZsetAcceptDropsr   r1   ÚzoomRequestZQScrollAreaZsetWidgetResizabler   ÚVerticalZverticalScrollBarÚ
HorizontalZhorizontalScrollBarÚ
scrollBarsÚscrollRequestÚnewShapeZ
shapeMovedZselectionChangedÚshapeSelectionChangedZdrawingPolygonÚtoggleDrawingSensitiveZsetCentralWidgetZDockWidgetFeaturesZDockWidgetClosableZDockWidgetFloatableZDockWidgetMovableÚgetattrZsetFeaturesZ
setVisibleZaddDockWidgetZRightDockWidgetAreaÚ	functoolsÚpartialr	   Z	newActionrS   ÚopenFileÚopenDirDialogrƒ   r„   ÚsaveFileÚ
saveFileAsrp   ÚchangeOutputDirDialogrI   ÚenableSaveImageWithDataÚ	closeFilerq   ÚsetEditModeÚdeleteSelectedShapeÚduplicateSelectedShapeÚcopySelectedShapeÚpasteSelectedShapers   ÚremoveSelectedPointÚundoShapeEditÚtogglePolygonsÚtutorialZQWidgetActionZsetDefaultWidgetZsetWhatsThisÚstrÚformatZfmtShortcutÚ
setEnabledÚaddZoomÚsetZoomÚenableKeepPrevScaleÚsetFitWindowÚsetFitWidthr   Ú
FIT_WINDOWÚzoomModeÚCheckedÚscaleFitWindowÚ	FIT_WIDTHÚscaleFitWidthÚMANUAL_ZOOMÚscalersZsetFillDrawingZtriggerZQMenuÚ
addActionsZsetContextMenuPolicyZCustomContextMenuZcustomContextMenuRequestedÚpopLabelListMenuÚstructrG   ZvertexSelectedrt   r‡   ÚmenusrŠ   rŒ   re   r‹   ZtoggleViewActionZaboutToShowÚupdateFileMenuÚ	copyShapeÚ	moveShapeÚtoolbarÚtoolsr…   Ú	statusBarÚshowMessager9   ÚwarnÚoutput_fileÚ
output_dirÚQImageÚimageÚ	imagePathÚ	maxRecentÚ	otherDataZ
zoom_levelrk   Úzoom_valuesÚbrightnessContrast_valuesÚscroll_valuesÚospÚisdirÚimportDirImagesÚfilenameÚsetTextr   Z	QSettingsÚsettingsÚvalueZQSizeZQPointZ
QByteArrayZresizeÚmoveZrestoreStateÚ
queueEventÚloadFileZvalueChangedÚpaintCanvasÚpopulateModeActions)=rL   Úconfigrø   Úoutputrë   rì   ÚlabelÚitemÚrgbZfileListLayoutr±   Z
scrollAreaZfeaturesZdockÚactionr:   r;   Úopen_Zopendirrƒ   r„   r@   ro   rp   rn   rH   rm   rS   rT   rX   rv   rw   rx   ry   rz   ru   rA   rr   rb   rc   rs   rt   rd   ZhideAllZshowAllre   ri   r{   r|   r}   r~   r   r€   r   r‚   r`   Zfill_drawingZ	labelMenuÚsizeÚpositionÚstate©Ú	__class__rK   r-   r™   3   s0   ÿÿÿÿÿ
ù



ÿÿÿ


ÿ


ü


þ


ûûûúúúú	ú	û
úûûú
ú
ú
ú
ú
ú
úú	úúúúúú	ú	ûûü
ÿÿÿ÷ÿúúúúù	ù	ú
ú
üú	ù	ÿöñ÷°Sú	òþíþ


þþîÿ
þ



zMainWindow.__init__c                 C   s"   |   ¡  |¡}|rt ||¡ |S rF   )ZmenuBarZaddMenur	   rß   )rL   ÚtitlerG   r‡   r)   r)   r-   r‡   4  s    zMainWindow.menuc                 C   sD   t |ƒ}| d| ¡ | tj¡ |r2t ||¡ |  tj|¡ |S )Nz	%sToolBar)	r   r¢   ZsetToolButtonStyler   ZToolButtonTextUnderIconr	   rß   Z
addToolBarZLeftToolBarArea)rL   r  rG   ræ   r)   r)   r-   ræ   :  s    zMainWindow.toolbarc                 C   s   t | jƒ S rF   )Úlenr   rK   r)   r)   r-   ÚnoShapesF  s    zMainWindow.noShapesc                 C   s¤   | j j| j j }}| j ¡  t | j|¡ | jjd  ¡  t | jjd |¡ | jj	 ¡  | j j
| j j| j j| j j| j j| j j| j jf}t | jj	|| j j ¡ d S ©Nr   )rG   r…   r‡   rç   Úclearr	   rß   r1   râ   r`   rX   rv   rw   rx   ry   rz   ru   r†   )rL   r…   r‡   rG   r)   r)   r-   r   I  s    
ù	zMainWindow.populateModeActionsc                 C   s¦   | j j | jj¡ | jd s(| j j ¡ rht 	| j
¡d d }| jrZt |¡}t | j|¡}|  |¡ d S d| _| j j d¡ t}| jd ur˜d || j¡}|  |¡ d S )NrP   r   ú.jsonTz{} - {}*)rG   rd   rÑ   r1   ÚisShapeRestorabler–   rH   Z	isCheckedrõ   Úsplitextrï   rì   ÚbasenameÚjoinÚ
saveLabelsr›   r@   r   rø   rÐ   rš   )rL   Ú
label_fileÚlabel_file_without_pathr  r)   r)   r-   r¥   [  s    


zMainWindow.setDirtyc                 C   s¸   d| _ | jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj	 d¡ t
}| jd ur„d || j¡}|  |¡ |  ¡ r¦| jj d¡ n| jj d¡ d S )NFTz{} - {})r›   rG   r@   rÑ   rX   rv   rw   rx   ry   rz   r   rø   rÐ   rš   ÚhasLabelFilerp   )rL   r  r)   r)   r-   ÚsetCleanm  s    

zMainWindow.setCleanTc                 C   s4   | j jD ]}| |¡ q| j jD ]}| |¡ q dS )z7Enable/Disable widgets which depend on an opened image.N)rG   r‚   rÑ   rˆ   )rL   rû   Úzr  r)   r)   r-   ÚtoggleActions€  s    zMainWindow.toggleActionsc                 C   s   t j d|¡ d S r  )r   ZQTimerZ
singleShot)rL   Úfunctionr)   r)   r-   rý   ‡  s    zMainWindow.queueEventéˆ  c                 C   s   |   ¡  ||¡ d S rF   )rè   ré   )rL   ÚmessageÚdelayr)   r)   r-   ÚstatusŠ  s    zMainWindow.statusc                 C   s6   | j  ¡  d | _d | _d | _d | _d | _| j ¡  d S rF   )	r   r  rø   rï   Ú	imageDataÚ	labelFilerñ   r1   Ú
resetStaterK   r)   r)   r-   r%    s    
zMainWindow.resetStatec                 C   s   | j  ¡ }|r|d S d S r  )r   ÚselectedItems)rL   Úitemsr)   r)   r-   ÚcurrentItem–  s    
zMainWindow.currentItemc                 C   sD   || j v r| j  |¡ nt| j ƒ| jkr2| j  ¡  | j  d|¡ d S r  )rŒ   Úremover  rð   ÚpopÚinsert©rL   rø   r)   r)   r-   ÚaddRecentFileœ  s
    

zMainWindow.addRecentFilec                 C   s8   | j  ¡  | j ¡  |  | j j¡ | jj | j j	¡ d S rF   )
r1   ZrestoreShaper   r  Ú
loadShapesÚshapesrG   rd   rÑ   r  rK   r)   r)   r-   rÌ   ¥  s    

zMainWindow.undoShapeEditc                 C   s   d}t  |¡ d S )Nz?https://github.com/wkentaro/labelme/tree/main/examples/tutorial)Ú
webbrowserr<   )rL   Úurlr)   r)   r-   rÎ   «  s    zMainWindow.tutorialc                 C   sB   | j j | ¡ | j j |¡ | j j | ¡ | j j | ¡ dS )zpToggle drawing sensitive.

        In the middle of drawing, toggling between modes should be disabled.
        N)rG   ru   rÑ   rs   rd   rA   )rL   Zdrawingr)   r)   r-   r»   ¯  s    z!MainWindow.toggleDrawingSensitiverV   c                 C   sÔ  | j  |¡ || j _|rp| jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj	 d¡ nP|dkrÐ| jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj	 d¡ nð|dkr2| jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj	 d¡ nŽ|dkr”| jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj	 d¡ n,|dkrô| jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj	 d¡ nÌ|dkrT| jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj	 d¡ nl|dkr´| jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj d¡ | jj	 d¡ nt
d	| ƒ‚| jj | ¡ d S )
NTrV   Fr[   r]   r^   r\   r_   zUnsupported createMode: %s)r1   Z
setEditingrX   rG   rÑ   rv   rw   rx   ry   rz   Ú
ValueErrorru   )rL   r`   rX   r)   r)   r-   rZ   ¹  sj    




zMainWindow.toggleDrawModec                 C   s   |   d¡ d S )NTrY   rK   r)   r)   r-   rÆ   ò  s    zMainWindow.setEditModec              	      s˜   | j ‰ dd„ ‰| jj}| ¡  ‡ ‡fdd„| jD ƒ}t|ƒD ]V\}}t d¡}t |d|d t	 
|¡ ¡ f | ¡}|j t | j|¡¡ | |¡ q<d S )Nc                 S   s   t  t| ƒ¡S rF   )rõ   ÚexistsrÏ   )rø   r)   r)   r-   r3  ø  s    z)MainWindow.updateFileMenu.<locals>.existsc                    s    g | ]}|ˆ krˆ|ƒr|‘qS r)   r)   )r+   Úf©Úcurrentr3  r)   r-   Ú
<listcomp>ý  r/   z-MainWindow.updateFileMenu.<locals>.<listcomp>r"   z&%d %sr   )rø   râ   rŒ   r  Ú	enumerater	   ZnewIconr   ZQActionr   Z	QFileInfoÚfileNameZ	triggeredr¤   r½   r¾   Ú
loadRecentZ	addAction)rL   r‡   ÚfilesÚir4  rD   r  r)   r5  r-   rã   õ  s    
ÿzMainWindow.updateFileMenuc                 C   s   | j j | j |¡¡ d S rF   )râ   r   Úexec_ZmapToGlobal)rL   r^   r)   r)   r-   rà     s    zMainWindow.popLabelListMenuc                 C   sZ   | j d d u rdS t| j ¡ ƒD ]4}| j |¡ tj¡}| j d dv r ||kr  dS q dS )NÚvalidate_labelT)ÚexactF)r–   Úrangerª   Úcountr  Údatar   ÚUserRole)rL   r  r<  Zlabel_ir)   r)   r-   ÚvalidateLabel	  s    zMainWindow.validateLabelc                 C   st  |rt |tƒstdƒ‚| j ¡ s$d S |s0|  ¡ }|d u r<d S | ¡ }|d u rPd S | jj|j	|j
|jd\}}}|d u rzd S |  |¡s®|  |  d¡|  d¡ || jd ¡¡ d S ||_	||_
||_|  |¡ |jd u r| djt |j	¡g|j ¡ d d… ¢R Ž ¡ n| d |j	|j¡¡ |  ¡  | j |j	¡d u rp| j |j	¡}| j |¡ |  |j	¡}| j ||j	|¡ d S )	Nz%item must be LabelListWidgetItem type)rN   r'   Úgroup_idúInvalid labelú,Invalid label '{}' with validation type '{}'r>  õ/   {} <font color="#{:02x}{:02x}{:02x}">â—</font>é   ú{} ({}))Ú
isinstancer   Ú	TypeErrorr1   Úeditingr(  r   rž   ÚpopUpr  r'   rE  rD  ÚerrorMessager¡   rÐ   r–   Ú_update_shape_colorrù   ÚhtmlÚescaper   ÚgetRgbr¥   rª   ÚfindItemByLabelr«   r¬   r­   r®   )rL   r  r   rN   r'   rE  r  r)   r)   r-   r§     sZ    
ý


ÿþ

ÿÿÿzMainWindow.editLabelc                 C   s   | j | j| j ¡ dd d S )NF)Úpatternr   )r÷   rŸ   r¯   rN   rK   r)   r)   r-   r°   E  s
    ýzMainWindow.fileSearchChangedc                 C   sd   | j  ¡ }|sd S |d }|  ¡ s&d S | j t| ¡ ƒ¡}|t| jƒk r`| j| }|r`|  |¡ d S r  )	r±   r&  ÚmayContinueÚ	imageListÚindexrÏ   rN   r  rþ   )rL   r'  r  Ú	currIndexrø   r)   r)   r-   r²   L  s    

zMainWindow.fileSelectionChangedc                 C   s²   d| _ | jjD ]
}d|_q| j ¡  || j_| jjD ].}d|_| j |¡}| j |¡ | j |¡ q4d| _ t	|ƒ}| j
j |¡ | j
j |¡ | j
j |¡ | j
j |dk¡ d S )NTFr   )rœ   r1   ÚselectedShapesÚselectedr   ÚclearSelectionÚfindItemByShapeZ
selectItemZscrollToItemr  rG   rA   rÑ   rr   rb   r`   )rL   Úselected_shapesr   r  Z
n_selectedr)   r)   r-   rº   \  s     
z MainWindow.shapeSelectionChangedc                 C   sâ   |j d u r|j}nd |j|j ¡}t||ƒ}| j |¡ | j |j¡d u r‚| j |j¡}| j |¡ |  	|j¡}| j 
||j|¡ | j |j¡ | jjD ]}| d¡ q˜|  |¡ | djt |¡g|j ¡ d d… ¢R Ž ¡ d S )NrJ  TrH  rI  )rE  r  rÐ   r   r   r¬   rª   rT  r«   r­   r®   rž   ZaddLabelHistoryrG   r‰   rÑ   rP  rù   rQ  rR  r   rS  )rL   r   rN   Zlabel_list_itemr  r  r  r)   r)   r-   ÚaddLabeln  s*    


ÿÿÿzMainWindow.addLabelc                 C   sz   |   |j¡\}}}t |||¡|_t |||¡|_t ddd¡|_t |||d¡|_t ddd¡|_t |||d¡|_	d S )Néÿ   é€   é›   )
r­   r  r   r—   r   r   r    r   r   r   )rL   r   ÚrÚgÚbr)   r)   r-   rP  …  s    zMainWindow._update_shape_colorc                 C   sÒ   | j d dkr†| j |¡}|d u rT| j |¡}| j |¡ |  |¡}| j |||¡ | j |¡ ¡ d }|| j d 7 }t	|t
t	ƒ  S | j d dkrº| j d rº|| j d v rº| j d | S | j d rÎ| j d S dS )	NZshape_colorÚautor   Zshift_auto_shape_colorZmanualZlabel_colorsZdefault_shape_color)r   r`  r   )r–   rª   rT  r«   r¬   r­   r®   ZindexFromItemÚrowÚLABEL_COLORMAPr  )rL   r  r  r  Zlabel_idr)   r)   r-   r­   Ž  s(    
ÿþý

zMainWindow._get_rgb_by_labelc                 C   s&   |D ]}| j  |¡}| j  |¡ qd S rF   )r   r]  Z
removeItem)rL   r/  r   r  r)   r)   r-   Ú	remLabels£  s    zMainWindow.remLabelsc                 C   s>   d| _ |D ]}|  |¡ q
| j ¡  d| _ | jj||d d S )NTF©Úreplace)rœ   r_  r   r\  r1   r.  )rL   r/  rk  r   r)   r)   r-   r.  ¨  s    
zMainWindow.loadShapesc                 C   sî   g }|D ]Ö}|d }|d }|d }|d }|d }|d }	|sBqt |||d}|D ]\}
}| t |
|¡¡ qT| ¡  i }| jd r¼| jd  ¡ D ]&\}}t ||¡r”|D ]}d	||< q¬q”||_	|j	 
|¡ |	|_| |¡ q|  |¡ d S )
Nr  ÚpointsÚ
shape_typer'   rE  Ú
other_data)r  rm  rE  r%   F)r   ZaddPointr   ZQPointFrS   r–   r'  ÚreÚmatchr'   Úupdatern  Úappendr.  )rL   r/  Úsr   r  rl  rm  r'   rE  rn  rJ   ÚyZdefault_flagsrU  ÚkeysÚkeyr)   r)   r-   Ú
loadLabels°  s:    ý
zMainWindow.loadLabelsc                 C   s`   | j  ¡  | ¡ D ]H\}}t |¡}| | ¡ tjB ¡ | 	|rFtj
ntj¡ | j  |¡ qd S rF   )r    r  r'  r   ÚQListWidgetItemÚsetFlagsr'   r   ZItemIsUserCheckableÚsetCheckStaterÙ   Ú	Uncheckedr¬   )rL   r'   rv  Úflagr  r)   r)   r-   r£   Ô  s    

zMainWindow.loadFlagsc              
      sz  t ƒ }dd„ ‰ ‡ fdd„| jD ƒ}i }t| j ¡ ƒD ].}| j |¡}| ¡ }| ¡ tj	k}|||< q4zÌt
 | jt
 |¡¡}	| jd rŠ| jnd }
t
 |¡r¸t
 t
 |¡¡s¸t t
 |¡¡ |j|||	|
| j ¡ | j ¡ | j|d || _| j | jtj¡}t|ƒdkr,t|ƒdkrtd	ƒ‚|d  tj	¡ W d
S  tyt } z*|   |  !d¡|  !d¡| ¡ W Y d }~dS d }~0 0 d S )Nc              	   S   sJ   | j  ¡ }| ttr | j d¡n| jdd„ | jD ƒ| j| j	| j
d¡ |S )Nzutf-8c                 S   s   g | ]}|  ¡ | ¡ f‘qS r)   )rJ   rt  )r+   Úpr)   r)   r-   r7  ä  r/   z?MainWindow.saveLabels.<locals>.format_shape.<locals>.<listcomp>)r  rl  rE  rm  r'   )rn  rb   rq  Údictr   r  Úencoderl  rE  rm  r'   )rs  rB  r)   r)   r-   Úformat_shapeß  s    
ûÿ	z+MainWindow.saveLabels.<locals>.format_shapec                    s   g | ]}ˆ |  ¡ ƒ‘qS r)   ©r   ©r+   r  ©r€  r)   r-   r7  ì  r/   z)MainWindow.saveLabels.<locals>.<listcomp>rQ   )rø   r/  rï   r#  ZimageHeightZ
imageWidthrñ   r'   r   r   zThere are duplicate files.TzError saving label dataz	<b>%s</b>F)"r   r   r@  r    rA  r  rN   Ú
checkStater   rÙ   rõ   Úrelpathrï   Údirnamer–   r#  r3  ÚosÚmakedirsr@   rî   ÚheightÚwidthrñ   r$  r±   Z	findItemsZMatchExactlyr  ÚRuntimeErrorrz  r   rO  r¡   )rL   rø   Úlfr/  r'   r<  r  rv  r|  rï   r#  r'  Úer)   rƒ  r-   r  Ü  sL    
ø
ÿÿzMainWindow.saveLabelsc                 C   s4   | j  ¡ }| j ¡  |D ]}|  |¡ q|  ¡  d S rF   )r1   ZduplicateSelectedShapesr   r\  r_  r¥   )rL   Zadded_shapesr   r)   r)   r-   rÈ     s
    

z!MainWindow.duplicateSelectedShapec                 C   s   | j | jdd |  ¡  d S )NFrj  )r.  r   r¥   rK   r)   r)   r-   rÊ     s    zMainWindow.pasteSelectedShapec                 C   s0   dd„ | j jD ƒ| _| jj t| jƒdk¡ d S )Nc                 S   s   g | ]}|  ¡ ‘qS r)   ©rb   )r+   rs  r)   r)   r-   r7    r/   z0MainWindow.copySelectedShape.<locals>.<listcomp>r   )r1   rZ  r   rG   rc   rÑ   r  rK   r)   r)   r-   rÉ     s    zMainWindow.copySelectedShapec                 C   sV   | j r
d S | j ¡ rRg }| j ¡ D ]}| | ¡ ¡ q"|rH| j |¡ n
| j ¡  d S rF   )	rœ   r1   rM  r   r&  rr  r   ZselectShapesZdeSelectShape)rL   r^  r  r)   r)   r-   r¦   "  s    
z MainWindow.labelSelectionChangedc                 C   s$   |  ¡ }| j || ¡ tjk¡ d S rF   )r   r1   ZsetShapeVisibler„  r   rÙ   )rL   r  r   r)   r)   r-   r¨   .  s    zMainWindow.labelItemChangedc                 C   s$   |   ¡  | j dd„ | jD ƒ¡ d S )Nc                 S   s   g | ]}|  ¡ ‘qS r)   r  r‚  r)   r)   r-   r7  4  r/   z0MainWindow.labelOrderChanged.<locals>.<listcomp>)r¥   r1   r.  r   rK   r)   r)   r-   r©   2  s    zMainWindow.labelOrderChangedc                 C   s  | j  ¡ }d}|r"|d  tj¡}i }d}| jd s8|sh| jj ¡ }| j 	|¡\}}}|sh| jj 
|¡ |r |  |¡s |  |  d¡|  d¡ || jd ¡¡ d}|r| j ¡  | j ||¡}||_|  |¡ | jj d¡ | jj d	¡ | jj d¡ |  ¡  n| j ¡  | jj ¡  dS )
zdPop-up and give focus to the label editor.

        position MUST be in global coordinates.
        Nr   Zdisplay_label_popuprF  rG  r>  Ú TF)rª   r&  rB  r   rC  r–   rž   r`   rN   rN  rù   rD  rO  r¡   rÐ   r   r\  r1   ZsetLastLabelrE  r_  rG   ru   rÑ   rs   rd   r¥   ZundoLastLineZshapesBackupsr*  )rL   r'  rN   r'   rE  Zprevious_textr   r)   r)   r-   r¹   8  s<    


ÿþ



zMainWindow.newShapec                 C   s8   | d }| j | }| ¡ | ¡ |  }|  ||¡ d S )Ngš™™™™™¹?)r·   rû   Z
singleStepÚ	setScroll)rL   ÚdeltaÚorientationÚunitsZbarrû   r)   r)   r-   r¸   ^  s    

zMainWindow.scrollRequestc                 C   s(   | j |  t|ƒ¡ || j| | j< d S rF   )r·   ÚsetValueÚintrô   rø   )rL   r’  rû   r)   r)   r-   r  d  s    zMainWindow.setScrollc                 C   sF   | j j d¡ | j j d¡ | j| _| j |¡ | j|f| j| j	< d S ©NF)
rG   r€   rI   r   rÝ   rØ   r³   r”  rò   rø   ©rL   rû   r)   r)   r-   rÓ   h  s
    zMainWindow.setZoomrf   c                 C   s:   | j  ¡ | }|dkr"t |¡}n
t |¡}|  |¡ d S rl   )r³   rû   ÚmathÚceilÚfloorrÓ   )rL   Z	incrementZ
zoom_valuer)   r)   r-   rÒ   o  s
    
zMainWindow.addZoomc           	      C   s®   | j  ¡ }d}|dk rd}|  |¡ | j  ¡ }||krª|| }t| ¡ | ƒ| ¡  }t| ¡ | ƒ| ¡  }|  tj| j	tj  
¡ | ¡ |  tj| j	tj  
¡ | ¡ d S )Nrf   r   rg   )r1   rŠ  rÒ   ÚroundrJ   rt  r  r   r¶   r·   rû   rµ   )	rL   r‘  ÚposZcanvas_width_oldr“  Zcanvas_width_newZcanvas_scale_factorZx_shiftZy_shiftr)   r)   r-   r´   w  s$    


þþzMainWindow.zoomRequestc                 C   s0   |r| j j d¡ |r| jn| j| _|  ¡  d S r–  )rG   r€   rI   r×   rÝ   rØ   ÚadjustScaler—  r)   r)   r-   rÕ   Ž  s    zMainWindow.setFitWindowc                 C   s0   |r| j j d¡ |r| jn| j| _|  ¡  d S r–  )rG   r   rI   rÛ   rÝ   rØ   r  r—  r)   r)   r-   rÖ   ”  s    zMainWindow.setFitWidthc                 C   s   || j d< | jj |¡ d S )Nrj   )r–   rG   r~   rI   ©rL   r>   r)   r)   r-   rÔ   š  s    
zMainWindow.enableKeepPrevScalec                 C   s   | j jtj |¡dd d S )NF)Zclear_shapes)r1   Ú
loadPixmapr   ÚQPixmapÚ	fromImage)rL   Zqimager)   r)   r-   ÚonNewBrightnessContrastž  s    ÿz"MainWindow.onNewBrightnessContrastc                 C   s„   t t | j¡| j| d}| j | jd¡\}}|d ur@|j 	|¡ |d urT|j
 	|¡ | ¡  |j ¡ }|j
 ¡ }||f| j| j< d S )N©r&   ©NN)r   r	   Úimg_data_to_pilr#  r¢  ró   Úgetrø   Úslider_brightnessr”  Úslider_contrastr=  rû   )rL   rû   ÚdialogÚ
brightnessÚcontrastr)   r)   r-   r   £  s     
ýÿ

zMainWindow.brightnessContrastc                 C   s&   | j D ]}| |rtjntj¡ qd S rF   )r   rz  r   rÙ   r{  )rL   rû   r  r)   r)   r-   rÍ   ¶  s    
zMainWindow.togglePolygonsc              
   C   s¾  || j v rB| j ¡ | j  |¡krB| j | j  |¡¡ | j ¡  dS |  ¡  | j d¡ |du rl| j	 
dd¡}t|ƒ}tj |¡s |  |  d¡|  d¡| ¡ dS |  t|  d¡ƒt t|ƒ¡ ¡ t |¡d d	 }| jròt |¡}t | j|¡}tj |¡r¦t |¡r¦zt|ƒ| _W n\ tyv } zB|  |  d¡|  d
¡||f ¡ |  |  d¡| ¡ W Y d}~dS d}~0 0 | jj| _t t |¡| jj¡| _| jj| _n t |¡| _| jrÀ|| _d| _t j! "| j¡}| #¡ r0dd„ t j$ %¡ D ƒ}|  |  d¡|  d¡ &|d |¡¡¡ |  |  d¡| ¡ dS || _'|| _(| j)d rP| jj*}| j +t j, -|¡¡ dd„ | j)d pxg D ƒ}| jr°|  .| jj*¡ | jj/dur°| 0| jj/¡ |  1|¡ | j)d rè|  2¡ rè| j3|dd |  4¡  n|  5¡  | j d¡ | j6 }	| j(| j6v r<| j6| j( d | _7|  8| j6| j( d ¡ n|	sN| j)d sZ| j9dd | j:D ]0}
| j(| j:|
 v r`|  ;|
| j:|
 | j( ¡ q`t<t= >| j¡| j?| d}| j@ A| j(d¡\}}| j)d rê| jBrê| j@ A| jBd d¡\}}| j)d r| jBr| j@ A| jBd d¡\}}|dur,|jC D|¡ |durB|jE D|¡ ||f| j@| j(< |dusf|durp| Fd¡ |  G¡  |  H| j(¡ |  Id¡ | j J¡  |  t|  d¡ƒt t|ƒ¡ ¡ dS )z9Load the specified file, or the last opened file if None.NFrø   r  zError opening filezNo such file: <b>%s</b>zLoading %s...r   r  z=<p><b>%s</b></p><p>Make sure <i>%s</i> is a valid label file.zError reading %sc                 S   s   g | ]}d   | ¡  ¡ ¡‘qS ©z*.{}©rÐ   rB  Údecode©r+   Úfmtr)   r)   r-   r7  õ  s   ÿz'MainWindow.loadFile.<locals>.<listcomp>zS<p>Make sure <i>{0}</i> is a valid image file.<br/>Supported image formats: {1}</p>ú,rU   c                 S   s   i | ]
}|d “qS r(   r)   r*   r)   r)   r-   r.     r/   z'MainWindow.loadFile.<locals>.<dictcomp>r'   rj  Tr   rj   )Úinitialr£  r¤  Zkeep_prev_brightnessZkeep_prev_contrastz	Loaded %s)KrW  r±   Z
currentRowrX  ÚsetCurrentRowÚrepaintr%  r1   rÑ   rú   rû   rÏ   r   ÚQFiler3  rO  r¡   r"  rõ   r  r  rì   r  r   Úis_label_filer$  r   r#  r†  rï   rñ   Zload_image_filer   rí   ZfromDataÚisNullÚQImageReaderÚsupportedImageFormatsrÐ   rî   rø   r–   r/  rŸ  r   r¡  rw  r'   rq  r£   r  r.  r¥   r  rò   rØ   rÓ   r  rô   r  r   r	   r¥  r¢  ró   r¦  rŒ   r§  r”  r¨  Z
onNewValuerÿ   r-  r  ZsetFocus)rL   rø   r  r  r  rî   ÚformatsZprev_shapesr'   Zis_initial_loadr’  r©  rª  r«  Ú_r)   r)   r-   rþ   º  sò    
ÿ
þÿ
ÿÿüþ
þ
þÿ
ýþ


ÿ
ýÿ
ÿ
ÿ




"zMainWindow.loadFilec                    s8   | j r$| j ¡ s$| j| jkr$|  ¡  tt| ƒ |¡ d S rF   )	r1   rî   r·  rØ   rÝ   r  r˜   r   ÚresizeEvent©rL   Úeventr  r)   r-   r¼  ?  s    ÿþ
ýzMainWindow.resizeEventc                 C   s<   | j  ¡ rJ dƒ‚d| j ¡  | j_| j ¡  | j ¡  d S )Nzcannot paint null imageg{®Gáz„?)rî   r·  r³   rû   r1   ZscaleZ
adjustSizerq  rK   r)   r)   r-   rÿ   H  s    
zMainWindow.paintCanvasFc                 C   sF   | j |r| jn| j ƒ }td| ƒ}| j |¡ | j|f| j| j< d S )Nrh   )rÞ   r×   rØ   r•  r³   r”  rò   rø   )rL   r²  rû   r)   r)   r-   r  N  s    zMainWindow.adjustScalec                 C   sl   d}|   ¡  ¡ | }|   ¡  ¡ | }|| }| jj ¡ d }| jj ¡ d }|| }||krd|| S || S )z9Figure out the size of the pixmap to fit the main widget.ç       @g        )ÚcentralWidgetrŠ  r‰  r1   Úpixmap)rL   r  Zw1Zh1Za1Zw2Zh2Za2r)   r)   r-   rÚ   T  s    zMainWindow.scaleFitWindowc                 C   s    |   ¡  ¡ d }|| jj ¡  S )Nr¿  )rÀ  rŠ  r1   rÁ  )rL   Úwr)   r)   r-   rÜ   `  s    zMainWindow.scaleFitWidthc                 C   s   || j d< | jj |¡ d S )NrQ   )r–   rG   rm   rI   rž  r)   r)   r-   rÄ   e  s    
z"MainWindow.enableSaveImageWithDatac                 C   st   |   ¡ s| ¡  | j d| jr$| jnd¡ | j d|  ¡ ¡ | j d|  ¡ ¡ | j d|  ¡ ¡ | j d| j¡ d S )Nrø   r  r’   r“   r”   rŒ   )	rV  Úignorerú   r”  rø   r  rœ  Z	saveStaterŒ   r½  r)   r)   r-   Ú
closeEventi  s    ÿzMainWindow.closeEventc                    sb   dd„ t j ¡ D ƒ‰ | ¡  ¡ rVdd„ | ¡  ¡ D ƒ}t‡ fdd„|D ƒƒr^| ¡  n| ¡  d S )Nc                 S   s    g | ]}d |  ¡  ¡  ¡  ‘qS ©z.%s©rB  r®  Úlowerr¯  r)   r)   r-   r7  w  s   ÿz-MainWindow.dragEnterEvent.<locals>.<listcomp>c                 S   s   g | ]}|  ¡ ‘qS r)   ©ZtoLocalFile©r+   r<  r)   r)   r-   r7  |  r/   c                    s   g | ]}|  ¡  tˆ ƒ¡‘qS r)   )rÇ  ÚendswithÚtuplerÉ  ©Ú
extensionsr)   r-   r7  }  r/   )	r   r¸  r¹  ÚmimeDataZhasUrlsÚurlsÚanyÚacceptrÃ  ©rL   r¾  r'  r)   rÌ  r-   ÚdragEnterEventv  s    þ
zMainWindow.dragEnterEventc                 C   s8   |   ¡ s| ¡  d S dd„ | ¡  ¡ D ƒ}|  |¡ d S )Nc                 S   s   g | ]}|  ¡ ‘qS r)   rÈ  rÉ  r)   r)   r-   r7  †  r/   z(MainWindow.dropEvent.<locals>.<listcomp>)rV  rÃ  rÎ  rÏ  ÚimportDroppedImageFilesrÒ  r)   r)   r-   Ú	dropEvent‚  s
    zMainWindow.dropEventc                 C   s   |   ¡ r|  |¡ d S rF   )rV  rþ   r,  r)   r)   r-   r:  ‹  s    zMainWindow.loadRecentc                 C   sš   | j d }tj ¡ tjtjB kr*d| j d< |  ¡ s6d S t| j	ƒdkrHd S | j
d u rVd S | j	 | j
¡}|d dkrŒ| j	|d  }|rŒ|  |¡ || j d< d S )NrU   Tr   r   ©r–   r   ZQApplicationZkeyboardModifiersr   ZControlModifierZShiftModifierrV  r  rW  rø   rX  rþ   )rL   Ú_valuerU   rY  rø   r)   r)   r-   r„     s"    

ÿ


zMainWindow.openPrevImgc                 C   sÆ   | j d }tj ¡ tjtjB kr*d| j d< |  ¡ s6d S t| j	ƒdkrHd S d }| j
d u rb| j	d }n:| j	 | j
¡}|d t| j	ƒk r’| j	|d  }n
| j	d }|| _
| j
r¸|r¸|  | j
¡ || j d< d S )NrU   Tr   r   éÿÿÿÿrÖ  )rL   r×  r   rU   rø   rY  r)   r)   r-   rƒ   §  s(    

ÿ



zMainWindow.openNextImgc                 C   sÈ   |   ¡ sd S | jr"t t| jƒ¡nd}dd„ tj ¡ D ƒ}|  d¡d 	|dt
j g ¡ }t| ƒ}| tj¡ | |¡ | |  d¡t ¡ | |¡ | tj¡ | ¡ rÄ| ¡ d }|rÄ|  |¡ d S )	NÚ.c                 S   s   g | ]}d   | ¡  ¡ ¡‘qS r¬  r­  r¯  r)   r)   r-   r7  È  s   ÿz'MainWindow.openFile.<locals>.<listcomp>zImage & Label files (%s)ú z*%sz%s - Choose Image or Label filer   )rV  rø   rõ   r†  rÏ   r   r¸  r¹  r¡   r  r   Úsuffixr   ZsetFileModeZExistingFileZsetNameFilterrš   r   ZsetWindowFilePathZsetViewModeZDetailr=  ZselectedFilesrþ   )rL   r×  Úpathrº  ÚfiltersZ
fileDialogr9  r)   r)   r-   r¿   Ä  s*    þÿ
ÿ
zMainWindow.openFilec                 C   sÚ   | j }|d u r | jr t | j¡}|d u r0|  ¡ }tj | |  d¡t	 |tjj
tjjB ¡}t|ƒ}|shd S || _ |  ¡  |  d¡d| j f ¡ |  ¡  ¡  | j}| j| jdd || jv rÖ| j | j |¡¡ | j ¡  d S )Nz'%s - Save/Load Annotations in Directoryz+%s . Annotations will be saved/loaded in %szChange Annotations DirFr   )rì   rø   rõ   r†  ÚcurrentPathr   ÚQFileDialogÚgetExistingDirectoryr¡   r   ÚShowDirsOnlyÚDontResolveSymlinksrÏ   rè   ré   r9   r÷   rŸ   rW  r±   r³  rX  r´  )rL   r×  Zdefault_output_dirrì   Zcurrent_filenamer)   r)   r-   rÃ   Ü  s<    ÿüÿÿ

ÿz MainWindow.changeOutputDirDialogc                 C   sV   | j  ¡ rJ dƒ‚| jr(|  | jj¡ n*| jrD|  | j¡ |  ¡  n|  |  ¡ ¡ d S ©Nzcannot save empty image)rî   r·  r$  Ú	_saveFilerø   rë   rS   ÚsaveFileDialog©rL   r×  r)   r)   r-   rÁ     s    
zMainWindow.saveFilec                 C   s$   | j  ¡ rJ dƒ‚|  |  ¡ ¡ d S rã  )rî   r·  rä  rå  ræ  r)   r)   r-   rÂ     s    zMainWindow.saveFileAsc                 C   s  |   d¡t }|   d¡tj }| jr8t | || j|¡}nt | ||  ¡ |¡}| tjdd … ¡ | 	tjj
¡ | tjjd¡ | tjjd¡ t t | j¡d ¡}| jrÀt | j|tj ¡}nt |  ¡ |tj ¡}| | |   d¡||   d¡tj ¡}t|tƒr|\}}|S )Nz%s - Choose FilezLabel files (*%s)r   Fr   zChoose File)r¡   r   r   rÛ  rì   r   rß  rÞ  ZsetDefaultSuffixZsetAcceptModeZ
AcceptSaveZ	setOptionZDontConfirmOverwriteZDontUseNativeDialogrõ   r  r  rø   r  ZgetSaveFileNamerK  rË  )rL   ZcaptionrÝ  Zdlgr  Zdefault_labelfile_namerø   r»  r)   r)   r-   rå    s<    
ÿÿÿÿüzMainWindow.saveFileDialogc                 C   s$   |r |   |¡r |  |¡ |  ¡  d S rF   )r  r-  r  r,  r)   r)   r-   rä  2  s    
zMainWindow._saveFilec                 C   sD   |   ¡ sd S |  ¡  |  ¡  |  d¡ | j d¡ | jj d¡ d S r–  )rV  r%  r  r  r1   rÑ   rG   ro   ræ  r)   r)   r-   rÅ   7  s    
zMainWindow.closeFilec                 C   s0   | j  ¡  d¡r| j }nt | j ¡d d }|S )Nr  r   )rø   rÇ  rÊ  rõ   r  ©rL   r  r)   r)   r-   ÚgetLabelFile@  s    zMainWindow.getLabelFilec                 C   sŠ   t j}|  d¡}| | |  d¡||j|jB ¡}||jkr<d S |  ¡ }t |¡r†t	 
|¡ t d |¡¡ | j ¡ }| tj¡ |  ¡  d S )NzDYou are about to permanently delete this label file, proceed anyway?Ú	AttentionzLabel file is removed: {})r   ÚQMessageBoxr¡   r•   ÚYesÚNorè  rõ   r3  r‡  r)  r   ÚinforÐ   r±   r(  rz  r   r{  r%  )rL   ÚmbÚmsgÚanswerr  r  r)   r)   r-   rp   H  s    ÿ



zMainWindow.deleteFilec                 C   s   |   ¡ r|  dd¡ dS dS )NzNo objects labeledz4You must label at least one object to save the file.FT)r  rO  rK   r)   r)   r-   Ú	hasLabels]  s    þzMainWindow.hasLabelsc                 C   s    | j d u rdS |  ¡ }t |¡S r–  )rø   rè  rõ   r3  rç  r)   r)   r-   r  f  s    
zMainWindow.hasLabelFilec                 C   sv   | j s
dS tj}|  d¡ | j¡}| | |  d¡||j|jB |j	B |j¡}||jkrXdS ||jkrn|  
¡  dS dS d S )NTz(Save annotations to "{}" before closing?zSave annotations?F)r›   r   rê  r¡   rÐ   rø   ZquestionZSaveZDiscardZCancelrÁ   )rL   rî  rï  rð  r)   r)   r-   rV  m  s&    
ÿû

zMainWindow.mayContinuec                 C   s   t j | |d||f ¡S )Nz<p><b>%s</b></p>%s)r   rê  Úcritical)rL   r  r   r)   r)   r-   rO  ƒ  s    ÿzMainWindow.errorMessagec                 C   s   | j rt t| j ƒ¡S dS )NrÙ  )rø   rõ   r†  rÏ   rK   r)   r)   r-   rÞ  ˆ  s    zMainWindow.currentPathc                 C   s   | j d  | j d< d S )NrU   )r–   rK   r)   r)   r-   rq   ‹  s    zMainWindow.toggleKeepPrevModec                 C   sj   | j  ¡  | j  ¡  | j jjs^| j  | j j¡ |  | j jg¡ |  ¡ r^| jj	D ]}| 
d¡ qN|  ¡  d S r–  )r1   rË   rq  ZhShaperl  ZdeleteShaperi  r  rG   r‰   rÑ   r¥   )rL   r  r)   r)   r-   rË   Ž  s    


zMainWindow.removeSelectedPointc                 C   sˆ   t jjt jj }}|  d¡ t| jjƒ¡}|t j 	| |  d¡|||B |¡kr„|  
| j ¡ ¡ |  ¡  |  ¡ r„| jjD ]}| d¡ qtd S )Nz@You are about to permanently delete {} polygons, proceed anyway?ré  F)r   rê  rë  rì  r¡   rÐ   r  r1   rZ  r•   ri  ZdeleteSelectedr¥   r  rG   r‰   rÑ   )rL   ÚyesÚnorï  r  r)   r)   r-   rÇ   ™  s    ÿ
ýÿzMainWindow.deleteSelectedShapec                 C   s<   | j jdd | j jD ]}|  |¡ q| j ¡  |  ¡  d S )NTrŽ  )r1   ÚendMoverZ  r_  r   r\  r¥   )rL   r   r)   r)   r-   rä   ¨  s
    
zMainWindow.copyShapec                 C   s   | j jdd |  ¡  d S )NFrŽ  )r1   rõ  r¥   rK   r)   r)   r-   rå   ¯  s    zMainWindow.moveShapec                 C   s‚   |   ¡ sd S |r|nd}| jr2t | j¡r2| j}n| jrDt | j¡nd}ttj 	| |  
d¡t |tjjtjjB ¡ƒ}|  |¡ d S )NrÙ  z%s - Open Directory)rV  rŸ   rõ   r3  rø   r†  rÏ   r   rß  rà  r¡   r   rá  râ  r÷   )rL   r×  ÚdirpathZdefaultOpenDirPathZtargetDirPathr)   r)   r-   rÀ   ³  s$    ÿÿüÿ	zMainWindow.openDirDialogc                 C   s6   g }t | j ¡ ƒD ]}| j |¡}| | ¡ ¡ q|S rF   )r@  r±   rA  r  rr  rN   )rL   Úlstr<  r  r)   r)   r-   rW  Ê  s
    zMainWindow.imageListc                 C   s   dd„ t j ¡ D ƒ}d | _|D ]ª}|| jv s| ¡  t|ƒ¡s@qt 	|¡d d }| j
rpt |¡}t | j
|¡}t |¡}| tjtjB ¡ tj |¡r°t |¡r°| tj¡ n| tj¡ | j |¡ qt| jƒdkrô| jj  d¡ | jj!  d¡ |  ¡  d S )Nc                 S   s    g | ]}d |  ¡  ¡  ¡  ‘qS rÅ  rÆ  r¯  r)   r)   r-   r7  Ó  s   ÿz6MainWindow.importDroppedImageFiles.<locals>.<listcomp>r   r  r   T)"r   r¸  r¹  rø   rW  rÇ  rÊ  rË  rõ   r  rì   r  r  r   rx  ry  r   ÚItemIsEnabledÚItemIsSelectabler   rµ  r3  r   r¶  rz  rÙ   r{  r±   r¬   r  rG   rƒ   rÑ   r„   )rL   Z
imageFilesrÍ  rŠ   r  r  r  r)   r)   r-   rÔ  Ò  s2    þÿ

ÿz"MainWindow.importDroppedImageFilesc                 C   sø   | j j d¡ | j j d¡ |  ¡ r(|s,d S || _d | _| j ¡  |  	|¡D ]š}|r^||vr^qLt
 |¡d d }| jrŽt
 |¡}t
 | j|¡}t |¡}| tjtjB ¡ tj |¡rÎt |¡rÎ| tj¡ n| tj¡ | j |¡ qL| j|d d S )NTr   r  r   )rG   rƒ   rÑ   r„   rV  rŸ   rø   r±   r  ÚscanAllImagesrõ   r  rì   r  r  r   rx  ry  r   rø  rù  r   rµ  r3  r   r¶  rz  rÙ   r{  r¬   )rL   rö  rU  r   rø   r  r  r  r)   r)   r-   r÷   ò  s.    


ÿzMainWindow.importDirImagesc           	      C   sn   dd„ t j ¡ D ƒ}g }t |¡D ]<\}}}|D ],}| ¡  t|ƒ¡r0t 	||¡}| 
|¡ q0q"t |¡}|S )Nc                 S   s    g | ]}d |  ¡  ¡  ¡  ‘qS rÅ  rÆ  r¯  r)   r)   r-   r7    s   ÿz,MainWindow.scanAllImages.<locals>.<listcomp>)r   r¸  r¹  r‡  ÚwalkrÇ  rÊ  rË  rõ   r  rr  ÚnatsortZ	os_sorted)	rL   Z
folderPathrÍ  ZimagesÚrootÚdirsr;  rŠ   ZrelativePathr)   r)   r-   rú    s    þ
zMainWindow.scanAllImages)NNNNN)N)N)T)r  )T)TrV   )N)T)rf   )T)T)N)F)F)FT)F)F)F)F)F)FN)NT)`Ú__name__Ú
__module__Ú__qualname__r×   rÛ   rÝ   r™   r‡   ræ   r  r   r¥   r  r  rý   r"  r%  r(  r-  rÌ   rÎ   r»   rZ   rÆ   rã   rà   rD  r§   r°   r²   rº   r_  rP  r­   ri  r.  rw  r£   r  rÈ   rÊ   rÉ   r¦   r¨   r©   r¹   r¸   r  rÓ   rÒ   r´   rÕ   rÖ   rÔ   r¢  r   rÍ   rþ   r¼  rÿ   r  rÚ   rÜ   rÄ   rÄ  rÓ  rÕ  r:  r„   rƒ   r¿   rÃ   rÁ   rÂ   rå  rä  rÅ   rè  rp   rñ  r  rV  rO  rÞ  rq   rË   rÇ   rä   rå   rÀ   ÚpropertyrW  rÔ  r÷   rú  Ú__classcell__r)   r)   r  r-   r   /   sÌ   
     ú      



		


9
0	
$7&



 	
	



%

"
		

 
r   )-r½   rQ  r˜  r‡  Úos.pathrÜ  rõ   ro  r0  Zimgvizrü  Zqtpyr   Zqtpy.QtCorer   r   r   r‘   r   r   r  r	   Zlabelme.configr
   Zlabelme.label_filer   r   Zlabelme.loggerr   Zlabelme.shaper   Zlabelme.widgetsr   r   r   r   r   r   r   r   r   Zlabel_colormaprh  ZQMainWindowr   r)   r)   r)   r-   Ú<module>   s>   	