Bläddra i källkod

Implement a recent files list

Also add a bunch of icons.
Michael Pitidis 13 år sedan
förälder
incheckning
6bff3a6f1f
5 ändrade filer med 861 tillägg och 15 borttagningar
  1. BIN
      icons/file.png
  2. 819 0
      icons/labels.svg
  3. BIN
      icons/undo.png
  4. 40 15
      labelme.py
  5. 2 0
      resources.qrc

BIN
icons/file.png


+ 819 - 0
icons/labels.svg

@@ -0,0 +1,819 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
+
+<svg
+   xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
+   xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/"
+   xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"
+   xmlns:xap="http://ns.adobe.com/xap/1.0/"
+   xmlns:ns0="http://ns.adobe.com/SaveForWeb/1.0/"
+   xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+   xmlns:x="adobe:ns:meta/"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48pt"
+   height="48pt"
+   viewBox="0 0 256 256"
+   overflow="visible"
+   enable-background="new 0 0 256 256"
+   xml:space="preserve"
+   id="svg710"
+   sodipodi:version="0.32"
+   sodipodi:docname="application-text.svg"
+   version="1.1"
+   inkscape:version="0.48.1 r9760">
+  <defs
+   id="defs796">
+    
+    
+    
+    <linearGradient
+   y2="245.0005"
+   x2="128.9995"
+   y1="11"
+   x1="128.9995"
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_9_">
+      <stop
+   id="stop717"
+   style="stop-color:#494949"
+   offset="0" />
+      <stop
+   id="stop718"
+   style="stop-color:#000000"
+   offset="1" />
+      <a:midPointStop
+   id="midPointStop719"
+   style="stop-color:#494949"
+   offset="0" />
+      <a:midPointStop
+   id="midPointStop720"
+   style="stop-color:#494949"
+   offset="0.5" />
+      <a:midPointStop
+   id="midPointStop721"
+   style="stop-color:#000000"
+   offset="1" />
+    </linearGradient>
+    
+    
+    <linearGradient
+   y2="226.9471"
+   x2="226.9471"
+   y1="29.0532"
+   x1="29.0532"
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_10_">
+      <stop
+   id="stop725"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+      <stop
+   id="stop726"
+   style="stop-color:#DADADA"
+   offset="1" />
+      <a:midPointStop
+   id="midPointStop727"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+      <a:midPointStop
+   id="midPointStop728"
+   style="stop-color:#FFFFFF"
+   offset="0.5" />
+      <a:midPointStop
+   id="midPointStop729"
+   style="stop-color:#DADADA"
+   offset="1" />
+    </linearGradient>
+    
+    
+    
+    
+    
+    <linearGradient
+   gradientTransform="matrix(0.1991,0.98,-0.98,0.1991,91.6944,573.5653)"
+   y2="-164.2214"
+   x2="-360.2456"
+   y1="-94.4194"
+   x1="-481.7007"
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_11_">
+      <stop
+   id="stop736"
+   style="stop-color:#990000"
+   offset="0" />
+      <stop
+   id="stop737"
+   style="stop-color:#7C0000"
+   offset="1" />
+      <a:midPointStop
+   id="midPointStop738"
+   style="stop-color:#990000"
+   offset="0" />
+      <a:midPointStop
+   id="midPointStop739"
+   style="stop-color:#990000"
+   offset="0.5" />
+      <a:midPointStop
+   id="midPointStop740"
+   style="stop-color:#7C0000"
+   offset="1" />
+    </linearGradient>
+    
+    <linearGradient
+   gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-496.5172)"
+   y2="706.3217"
+   x2="-1355.0455"
+   y1="685.3809"
+   x1="-1375.9844"
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_12_">
+      <stop
+   id="stop743"
+   style="stop-color:#F8F1DC"
+   offset="0" />
+      <stop
+   id="stop744"
+   style="stop-color:#D6A84A"
+   offset="1" />
+      <a:midPointStop
+   id="midPointStop745"
+   style="stop-color:#F8F1DC"
+   offset="0" />
+      <a:midPointStop
+   id="midPointStop746"
+   style="stop-color:#F8F1DC"
+   offset="0.5" />
+      <a:midPointStop
+   id="midPointStop747"
+   style="stop-color:#D6A84A"
+   offset="1" />
+    </linearGradient>
+    
+    <linearGradient
+   y2="160.1823"
+   x2="137.6021"
+   y1="-0.7954"
+   x1="65.0947"
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_13_">
+      <stop
+   id="stop750"
+   style="stop-color:#FFA700"
+   offset="0" />
+      <stop
+   id="stop751"
+   style="stop-color:#FFD700"
+   offset="0.7753" />
+      <stop
+   id="stop752"
+   style="stop-color:#FF794B"
+   offset="1" />
+      <a:midPointStop
+   id="midPointStop753"
+   style="stop-color:#FFA700"
+   offset="0" />
+      <a:midPointStop
+   id="midPointStop754"
+   style="stop-color:#FFA700"
+   offset="0.5" />
+      <a:midPointStop
+   id="midPointStop755"
+   style="stop-color:#FFD700"
+   offset="0.7753" />
+      <a:midPointStop
+   id="midPointStop756"
+   style="stop-color:#FFD700"
+   offset="0.5" />
+      <a:midPointStop
+   id="midPointStop757"
+   style="stop-color:#FF794B"
+   offset="1" />
+    </linearGradient>
+    
+    
+    
+    
+    <linearGradient
+   gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-496.5172)"
+   y2="622.5333"
+   x2="-1325.3219"
+   y1="635.7949"
+   x1="-1336.4497"
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_14_">
+      <stop
+   id="stop763"
+   style="stop-color:#FFC957"
+   offset="0" />
+      <stop
+   id="stop764"
+   style="stop-color:#FF6D00"
+   offset="1" />
+      <a:midPointStop
+   id="midPointStop765"
+   style="stop-color:#FFC957"
+   offset="0" />
+      <a:midPointStop
+   id="midPointStop766"
+   style="stop-color:#FFC957"
+   offset="0.5" />
+      <a:midPointStop
+   id="midPointStop767"
+   style="stop-color:#FF6D00"
+   offset="1" />
+    </linearGradient>
+    
+    <linearGradient
+   gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-496.5172)"
+   y2="699.4763"
+   x2="-1354.6851"
+   y1="595.6309"
+   x1="-1401.459"
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_15_">
+      <stop
+   id="stop770"
+   style="stop-color:#FFA700"
+   offset="0" />
+      <stop
+   id="stop771"
+   style="stop-color:#FFD700"
+   offset="0.7753" />
+      <stop
+   id="stop772"
+   style="stop-color:#FF9200"
+   offset="1" />
+      <a:midPointStop
+   id="midPointStop773"
+   style="stop-color:#FFA700"
+   offset="0" />
+      <a:midPointStop
+   id="midPointStop774"
+   style="stop-color:#FFA700"
+   offset="0.5" />
+      <a:midPointStop
+   id="midPointStop775"
+   style="stop-color:#FFD700"
+   offset="0.7753" />
+      <a:midPointStop
+   id="midPointStop776"
+   style="stop-color:#FFD700"
+   offset="0.5" />
+      <a:midPointStop
+   id="midPointStop777"
+   style="stop-color:#FF9200"
+   offset="1" />
+    </linearGradient>
+    
+    <linearGradient
+   y2="115.5361"
+   x2="144.5898"
+   y1="115.5361"
+   x1="67.8452"
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_16_">
+      <stop
+   id="stop780"
+   style="stop-color:#7D7D99"
+   offset="0" />
+      <stop
+   id="stop781"
+   style="stop-color:#B1B1C5"
+   offset="0.1798" />
+      <stop
+   id="stop782"
+   style="stop-color:#BCBCC8"
+   offset="0.3727" />
+      <stop
+   id="stop783"
+   style="stop-color:#C8C8CB"
+   offset="0.6825" />
+      <stop
+   id="stop784"
+   style="stop-color:#CCCCCC"
+   offset="1" />
+      <a:midPointStop
+   id="midPointStop785"
+   style="stop-color:#7D7D99"
+   offset="0" />
+      <a:midPointStop
+   id="midPointStop786"
+   style="stop-color:#7D7D99"
+   offset="0.5" />
+      <a:midPointStop
+   id="midPointStop787"
+   style="stop-color:#B1B1C5"
+   offset="0.1798" />
+      <a:midPointStop
+   id="midPointStop788"
+   style="stop-color:#B1B1C5"
+   offset="0.2881" />
+      <a:midPointStop
+   id="midPointStop789"
+   style="stop-color:#CCCCCC"
+   offset="1" />
+    </linearGradient>
+    
+    
+    
+    
+    
+  <linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_16_"
+   id="linearGradient80060"
+   gradientUnits="userSpaceOnUse"
+   x1="67.8452"
+   y1="115.5361"
+   x2="144.5898"
+   y2="115.5361"
+   gradientTransform="translate(0,-25.600002)" /><linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_15_"
+   id="linearGradient80063"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-522.11722)"
+   x1="-1401.459"
+   y1="595.6309"
+   x2="-1354.6851"
+   y2="699.4763" /><linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_14_"
+   id="linearGradient80066"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-522.11722)"
+   x1="-1336.4497"
+   y1="635.7949"
+   x2="-1325.3219"
+   y2="622.5333" /><linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_13_"
+   id="linearGradient80072"
+   gradientUnits="userSpaceOnUse"
+   x1="65.0947"
+   y1="-0.7954"
+   x2="137.6021"
+   y2="160.1823"
+   gradientTransform="translate(0,-25.600002)" /><linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_12_"
+   id="linearGradient80075"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-522.11722)"
+   x1="-1375.9844"
+   y1="685.3809"
+   x2="-1355.0455"
+   y2="706.3217" /><linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_11_"
+   id="linearGradient80078"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.1991,0.98,-0.98,0.1991,91.6944,547.96528)"
+   x1="-481.7007"
+   y1="-94.4194"
+   x2="-360.2456"
+   y2="-164.2214" /><linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_10_"
+   id="linearGradient80085"
+   gradientUnits="userSpaceOnUse"
+   x1="29.0532"
+   y1="29.0532"
+   x2="226.9471"
+   y2="226.9471" /><linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_9_"
+   id="linearGradient80089"
+   gradientUnits="userSpaceOnUse"
+   x1="128.9995"
+   y1="11"
+   x2="128.9995"
+   y2="245.0005" /></defs>
+  <sodipodi:namedview
+   id="base"
+   showgrid="false"
+   inkscape:zoom="3.6203867"
+   inkscape:cx="24.932695"
+   inkscape:cy="18.484388"
+   inkscape:window-width="1280"
+   inkscape:window-height="766"
+   inkscape:window-x="0"
+   inkscape:window-y="20"
+   inkscape:window-maximized="0"
+   inkscape:current-layer="svg710" />
+  <metadata
+   id="metadata711">
+    <ns0:sfw>
+      <ns0:slices>
+        <ns0:slice
+   x="0"
+   y="0"
+   width="256"
+   height="256"
+   sliceID="124333141" />
+      </ns0:slices>
+      <ns0:sliceSourceBounds
+   x="0"
+   y="0"
+   width="256"
+   height="256"
+   bottomLeftOrigin="true" />
+      <ns0:optimizationSettings>
+        <ns0:targetSettings
+   fileFormat="PNG24Format"
+   targetSettingsID="0">
+          <ns0:PNG24Format
+   transparency="true"
+   includeCaption="false"
+   interlaced="false"
+   noMatteColor="false"
+   matteColor="#FFFFFF"
+   filtered="false" />
+        </ns0:targetSettings>
+      </ns0:optimizationSettings>
+    </ns0:sfw>
+    <xpacket
+   id="xpacket79197">begin='' id='W5M0MpCehiHzreSzNTczkc9d'    </xpacket>
+    <x:xmpmeta
+   x:xmptk="XMP toolkit 3.0-29, framework 1.6">
+      
+    <metadata
+   id="metadata79254"><rdf:RDF>
+        <rdf:Description
+   rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c">
+          <pdf:Producer>
+Adobe PDF library 5.00</pdf:Producer>
+        </rdf:Description>
+        <rdf:Description
+   rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c" />
+        <rdf:Description
+   rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c" />
+        <rdf:Description
+   rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c">
+          <xap:CreateDate>
+2004-01-26T11:58:28+02:00</xap:CreateDate>
+          <xap:ModifyDate>
+2004-03-28T20:41:40Z</xap:ModifyDate>
+          <xap:CreatorTool>
+Adobe Illustrator 10.0</xap:CreatorTool>
+          <xap:MetadataDate>
+2004-02-16T23:58:32+01:00</xap:MetadataDate>
+          <xap:Thumbnails>
+            <rdf:Alt>
+              <rdf:li
+   rdf:parseType="Resource">
+                <xapGImg:format>
+JPEG</xapGImg:format>
+                <xapGImg:width>
+256</xapGImg:width>
+                <xapGImg:height>
+256</xapGImg:height>
+                <xapGImg:image>
+/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
+AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
+DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
+Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
+AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
+AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
+UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
+1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
+qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
+obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
+0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
+FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlvmDzFo
+3l7TJdT1e5W1tItuTbszHoiKN2Y+AxV4j5g/5ydvTcMnl/SYlgU0Se/LOzDxMcTIF/4M4qk//QzP
+nv8A5YNL/wCRVx/2UYq7/oZnz3/ywaX/AMirj/soxV3/AEMz57/5YNL/AORVx/2UYq7/AKGZ89/8
+sGl/8irj/soxV3/QzPnv/lg0v/kVcf8AZRirv+hmfPf/ACwaX/yKuP8AsoxV3/QzPnv/AJYNL/5F
+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
+f//Z</xapGImg:image>
+              </rdf:li>
+            </rdf:Alt>
+          </xap:Thumbnails>
+        </rdf:Description>
+        <rdf:Description
+   rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c">
+          <xapMM:DocumentID>
+uuid:4ee3f24b-6ed2-4a2e-8f7a-50b762c8da8b</xapMM:DocumentID>
+        </rdf:Description>
+        <rdf:Description
+   rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c">
+          <dc:format>
+image/svg+xml</dc:format>
+          <dc:title>
+            <rdf:Alt>
+              <rdf:li
+   xml:lang="x-default">
+mime.ai</rdf:li>
+            </rdf:Alt>
+          </dc:title>
+        </rdf:Description>
+      <cc:Work
+   rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+     rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata></x:xmpmeta>
+    <xpacket
+   id="xpacket79199">end='w'    </xpacket>
+  </metadata>
+  <path
+   style="opacity:0.2"
+   inkscape:connector-curvature="0"
+   id="path713"
+   d="m 44,15.5 c -9.374,0 -17,7.626 -17,17 v 200 c 0,9.374 7.626,17 17,17 h 176 c 9.375,0 17,-7.626 17,-17 v -200 c 0,-9.374 -7.625,-17 -17,-17 H 44 z" /><path
+   style="opacity:0.2"
+   inkscape:connector-curvature="0"
+   id="path714"
+   d="m 42,13.5 c -9.374,0 -17,7.626 -17,17 v 200 c 0,9.374 7.626,17 17,17 h 176 c 9.375,0 17,-7.626 17,-17 v -200 c 0,-9.374 -7.625,-17 -17,-17 H 42 z" /><path
+   style="opacity:0.2"
+   inkscape:connector-curvature="0"
+   id="path715"
+   d="m 40,12.5 c -9.374,0 -17,7.626 -17,17 v 200 c 0,9.374 7.626,17 17,17 h 176 c 9.375,0 17,-7.626 17,-17 v -200 c 0,-9.374 -7.625,-17 -17,-17 H 40 z" /><path
+   inkscape:connector-curvature="0"
+   style="fill:url(#linearGradient80089)"
+   id="path722"
+   d="m 41,11 c -9.374,0 -17,7.626 -17,17 v 200 c 0,9.374 7.626,17 17,17 h 176 c 9.375,0 17,-7.626 17,-17 V 28 c 0,-9.374 -7.625,-17 -17,-17 H 41 z" /><path
+   style="fill:#ffffff"
+   inkscape:connector-curvature="0"
+   id="path723"
+   d="m 28,228 c 0,6.627 5.373,12 12,12 h 176 c 6.627,0 12,-5.373 12,-12 V 28 c 0,-6.627 -5.373,-12 -12,-12 H 40 c -6.627,0 -12,5.373 -12,12 v 200 z" /><path
+   inkscape:connector-curvature="0"
+   style="fill:url(#linearGradient80085)"
+   id="path730"
+   d="m 40,21 c -3.86,0 -7,3.14 -7,7 v 200 c 0,3.859 3.14,7 7,7 h 176 c 3.859,0 7,-3.141 7,-7 V 28 c 0,-3.86 -3.141,-7 -7,-7 H 40 z" /><path
+   style="opacity:0.2"
+   inkscape:connector-curvature="0"
+   id="path731"
+   d="m 191.924,170.38398 c -11.613,-36.12699 -13.717,-42.66999 -14.859,-44.06399 0.119,0.076 0.289,0.178 0.289,0.178 L 98.804,39.042999 c -4.195,-4.65 -14.005,0.356 -21.355,6.976 -7.283,6.542 -13.32,15.772999 -9.37,20.563999 l 78.944,87.542982 0.533,0.094 37.768,17.602 7.688,2.365 -1.088,-3.803 z" /><path
+   style="opacity:0.2"
+   inkscape:connector-curvature="0"
+   id="path732"
+   d="m 193.557,167.91598 c -11.611,-36.12499 -13.713,-42.66999 -14.855,-44.06399 0.117,0.072 0.287,0.178 0.287,0.178 L 100.444,36.574999 c -4.199,-4.651 -14.015,0.355 -21.361,6.975 -7.281,6.545 -13.32,15.772999 -9.368,20.565999 l 78.945,87.538982 0.533,0.1 37.77,17.598 7.682,2.367 -1.088,-3.804 z" /><path
+   style="opacity:0.2"
+   inkscape:connector-curvature="0"
+   id="path733"
+   d="M 186.773,165.44898 C 175.16,129.32199 173.06,122.77699 171.91,121.38099 c 0.121,0.074 0.295,0.18 0.295,0.18 L 93.653,34.103999 c -4.192,-4.65 -14.009,0.359 -21.354,6.978 -7.283,6.542 -13.321,15.770999 -9.369,20.564999 l 78.942,87.540982 0.535,0.096 37.768,17.598 7.686,2.367 -1.088,-3.8 z" /><path
+   style="fill:#ffffff"
+   inkscape:connector-curvature="0"
+   id="path734"
+   d="m 186.43,163.75498 c -11.613,-36.12499 -13.713,-42.66599 -14.863,-44.06099 0.123,0.072 0.293,0.18 0.293,0.18 L 93.314,32.415999 c -4.199,-4.651 -14.015,0.357 -21.359,6.977 -7.283,6.543 -13.322,15.773999 -9.37,20.565999 l 78.941,87.540982 0.535,0.098 37.771,17.598 7.686,2.363 -1.088,-3.804 z" /><path
+   inkscape:connector-curvature="0"
+   style="fill:url(#linearGradient80078)"
+   id="path741"
+   d="m 186.43,163.75498 c -11.613,-36.12499 -13.713,-42.66599 -14.863,-44.06099 0.123,0.072 0.293,0.18 0.293,0.18 L 93.314,32.415999 c -4.199,-4.651 -14.015,0.357 -21.359,6.977 -7.283,6.543 -13.322,15.773999 -9.37,20.565999 l 78.941,87.540982 0.535,0.098 37.771,17.598 7.686,2.363 -1.088,-3.804 z" /><path
+   inkscape:connector-curvature="0"
+   style="fill:url(#linearGradient80075)"
+   id="path748"
+   d="m 166.969,122.16199 13.723,38.12899 -36.371,-17.90199 0.168,-0.152 c -0.25,-0.08 -0.496,-0.178 -0.701,-0.316 l -0.125,0.121 -75.303,-83.569992 0.123,-0.104 c -2.246,-2.49 1.032,-9.093999 7.308,-14.751999 6.28,-5.652 13.18,-8.219 15.425,-5.733 l 75.292,83.564991 0.461,0.714 z" /><path
+   inkscape:connector-curvature="0"
+   style="fill:url(#linearGradient80072)"
+   id="path758"
+   d="m 148.652,144.52098 c 2.076,-0.369 4.635,-1.479 7.252,-3.13899 1.617,-1.018 3.279,-2.283 4.898,-3.744 1.455,-1.303 2.736,-2.666 3.84,-4.01 2.076,-2.531 3.322,-5.213 3.781,-7.424 l -1.455,-4.043 -0.463,-0.715 -74.798,-83.017991 c 0.608,2.24 -0.962,5.938 -4.063,9.74 -1.134,1.389 -2.441,2.789 -3.945,4.141 -1.574,1.418999 -3.195,2.651999 -4.767,3.653999 -4.493,2.871 -8.628,3.928 -10.548,2.486 l -0.025,0.021 75.303,83.569992 0.125,-0.121 c 0.205,0.139 0.451,0.236 0.701,0.316 l -0.168,0.152 4.332,2.13399 z" /><path
+   style="fill:#ffffff"
+   inkscape:connector-curvature="0"
+   id="path759"
+   d="m 68.083,57.809998 c 1.732,1.772 5.994,0.776 10.643,-2.194 1.541,-0.982 3.132,-2.193 4.677,-3.585999 1.476,-1.325 2.759,-2.701 3.872,-4.063 3.578,-4.388 5.091,-8.642 3.477,-10.584 l 0.023,-0.024 75.817,84.118991 c 0.635,2.262 -0.588,6.498 -3.754,10.357 -1.082,1.318 -2.34,2.656 -3.77,3.934 -1.588,1.434 -3.219,2.676 -4.807,3.676 -4.74,3.006 -9.303,4.19899 -11.016,2.301 -0.393,-0.439 -2.098,-2.336 -2.145,-2.406 l -73.255,-81.313992 0.238,-0.216 z" /><path
+   style="fill:#ffffff"
+   inkscape:connector-curvature="0"
+   id="path760"
+   d="m 75.79,43.614999 c 6.28,-5.652 13.18,-8.219 15.425,-5.733 l 16.961,18.827999 1.152,26.49 -17.973,0.784 -22.996,-25.513 0.123,-0.104 c -2.246,-2.49 1.032,-9.092999 7.308,-14.751999 z" /><path
+   style="fill:#ffffff"
+   inkscape:connector-curvature="0"
+   id="path761"
+   d="m 68.083,57.809998 c 1.732,1.772 5.994,0.776 10.643,-2.194 1.541,-0.982 3.132,-2.193 4.677,-3.585999 1.476,-1.325 2.759,-2.701 3.872,-4.063 3.578,-4.388 5.091,-8.642 3.477,-10.584 l 0.023,-0.024 75.817,84.118991 c 0.635,2.262 -0.588,6.498 -3.754,10.357 -1.082,1.318 -2.34,2.656 -3.77,3.934 -1.588,1.434 -3.219,2.676 -4.807,3.676 -4.74,3.006 -9.303,4.19899 -11.016,2.301 -0.393,-0.439 -2.098,-2.336 -2.145,-2.406 l -73.255,-81.313992 0.238,-0.216 z" /><path
+   inkscape:connector-curvature="0"
+   style="fill:url(#linearGradient80066)"
+   id="path768"
+   d="m 75.79,43.614999 c 6.28,-5.652 13.18,-8.219 15.425,-5.733 l 16.961,18.827999 1.152,26.49 -17.973,0.784 -22.996,-25.513 0.123,-0.104 c -2.246,-2.49 1.032,-9.092999 7.308,-14.751999 z" /><path
+   inkscape:connector-curvature="0"
+   style="fill:url(#linearGradient80063)"
+   id="path778"
+   d="m 68.083,57.809998 c 1.732,1.772 5.994,0.776 10.643,-2.194 1.541,-0.982 3.132,-2.193 4.677,-3.585999 1.476,-1.325 2.759,-2.701 3.872,-4.063 3.578,-4.388 5.091,-8.642 3.477,-10.584 l 0.023,-0.024 75.817,84.118991 c 0.635,2.262 -0.588,6.498 -3.754,10.357 -1.082,1.318 -2.34,2.656 -3.77,3.934 -1.588,1.434 -3.219,2.676 -4.807,3.676 -4.74,3.006 -9.303,4.19899 -11.016,2.301 -0.393,-0.439 -2.098,-2.336 -2.145,-2.406 l -73.255,-81.313992 0.238,-0.216 z" /><path
+   inkscape:connector-curvature="0"
+   style="fill:url(#linearGradient80060)"
+   id="path790"
+   d="m 74.357,65.112998 c 0,0 6.036,-0.212 10.685,-3.182 1.542,-0.983 3.132,-2.193 4.677,-3.586 1.477,-1.326 2.76,-2.701 3.873,-4.064 2.928,-3.588999 4.469,-7.087999 4.049,-9.306999 l -6.865,-7.617 -0.023,0.024 c 1.614,1.942 0.102,6.196 -3.477,10.584 -1.113,1.362 -2.396,2.738 -3.872,4.063 -1.545,1.392999 -3.136,2.603999 -4.677,3.585999 -4.648,2.971 -8.91,3.967 -10.643,2.194 l -0.238,0.217 73.256,81.310992 c 0.047,0.07 1.752,1.967 2.145,2.406 0.342,0.377 0.799,0.627 1.344,0.771 L 74.357,65.112998 z" /><path
+   style="fill:#003333"
+   inkscape:connector-curvature="0"
+   id="path791"
+   d="m 172.035,149.75398 c -1.635,1.477 -3.307,2.764 -4.949,3.84 l 13.605,6.697 -5.096,-14.156 c -1.058,1.218 -2.243,2.441 -3.56,3.619 z" /><path
+   style="opacity:0.5;fill:#ffffff"
+   inkscape:connector-curvature="0"
+   id="path792"
+   d="M 163.121,131.45299 86.968,48.329999 c 0.1,-0.12 0.213,-0.242 0.307,-0.364 1.428,-1.752 2.52,-3.49 3.225,-5.058 l 75.768,82.706991 c -0.553,1.824 -1.6,3.867 -3.147,5.838 z" /><path
+   style="opacity:0.5;fill:#ffffff"
+   inkscape:connector-curvature="0"
+   id="path793"
+   d="m 87.275,47.965999 c 0.634,-0.774 1.189,-1.548 1.694,-2.3 l 76.015,82.973991 c -0.578,1.063 -1.283,2.146 -2.146,3.193 -0.744,0.896 -1.566,1.805 -2.465,2.697 L 84.152,51.331999 c 1.164,-1.108 2.209,-2.24 3.123,-3.366 z" /><rect
+   style="fill:none"
+   y="0"
+   x="0"
+   height="256"
+   width="256"
+   id="_x3C_Slice_x3E_" />
+<rect
+   style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:4.26666689;stroke-opacity:1"
+   id="rect79256"
+   width="150.77966"
+   height="48.813557"
+   x="9.313406"
+   y="170.86343"
+   ry="0" /><text
+   xml:space="preserve"
+   style="font-size:42.66666794px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:justify;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Linux Libertine O C;-inkscape-font-specification:Linux Libertine O C"
+   x="24.554667"
+   y="207.10201"
+   id="text80094"
+   sodipodi:linespacing="125%"><tspan
+     sodipodi:role="line"
+     id="tspan80096"
+     x="24.554667"
+     y="207.10201"
+     style="font-style:italic;font-weight:bold;-inkscape-font-specification:Linux Libertine O C Bold Italic">Labels</tspan></text>
+</svg>

BIN
icons/undo.png


+ 40 - 15
labelme.py

@@ -13,7 +13,7 @@ from PyQt4.QtCore import *
 
 
 import resources
 import resources
 
 
-from lib import struct, newAction, addActions, labelValidator
+from lib import struct, newAction, newIcon, addActions, labelValidator
 from shape import Shape, DEFAULT_LINE_COLOR, DEFAULT_FILL_COLOR
 from shape import Shape, DEFAULT_LINE_COLOR, DEFAULT_FILL_COLOR
 from canvas import Canvas
 from canvas import Canvas
 from zoomWidget import ZoomWidget
 from zoomWidget import ZoomWidget
@@ -202,19 +202,20 @@ class MainWindow(QMainWindow, WindowMixin):
                 label=label, delete=delete, edit=edit, copy=copy,
                 label=label, delete=delete, edit=edit, copy=copy,
                 shapeLineColor=shapeLineColor, shapeFillColor=shapeFillColor,
                 shapeLineColor=shapeLineColor, shapeFillColor=shapeFillColor,
                 zoom=zoom, zoomIn=zoomIn, zoomOut=zoomOut, zoomOrg=zoomOrg,
                 zoom=zoom, zoomIn=zoomIn, zoomOut=zoomOut, zoomOrg=zoomOrg,
-                fitWindow=fitWindow, fitWidth=fitWidth)
+                fitWindow=fitWindow, fitWidth=fitWidth,
+                fileMenuActions=(open,save,close,quit))
 
 
         self.menus = struct(
         self.menus = struct(
                 file=self.menu('&File'),
                 file=self.menu('&File'),
                 edit=self.menu('&Polygons'),
                 edit=self.menu('&Polygons'),
                 view=self.menu('&View'),
                 view=self.menu('&View'),
                 labelList=labelMenu)
                 labelList=labelMenu)
-        addActions(self.menus.file, (open, save, close, quit))
         addActions(self.menus.edit, (label, color1, color2))
         addActions(self.menus.edit, (label, color1, color2))
         addActions(self.menus.view, (
         addActions(self.menus.view, (
             labels, None,
             labels, None,
             zoomIn, zoomOut, zoomOrg, None,
             zoomIn, zoomOut, zoomOrg, None,
             fitWindow, fitWidth))
             fitWindow, fitWidth))
+        self.menus.file.aboutToShow.connect(self.updateFileMenu)
 
 
         self.tools = self.toolbar('Tools')
         self.tools = self.toolbar('Tools')
         addActions(self.tools, (
         addActions(self.tools, (
@@ -228,7 +229,8 @@ class MainWindow(QMainWindow, WindowMixin):
         # Application state.
         # Application state.
         self.image = QImage()
         self.image = QImage()
         self.filename = filename
         self.filename = filename
-        self.recent_files = []
+        self.recentFiles = []
+        self.maxRecent = 5
         self.lineColor = None
         self.lineColor = None
         self.fillColor = None
         self.fillColor = None
         self.zoom_level = 100
         self.zoom_level = 100
@@ -238,7 +240,7 @@ class MainWindow(QMainWindow, WindowMixin):
         # Restore application settings.
         # Restore application settings.
         types = {
         types = {
             'filename': QString,
             'filename': QString,
-            'recent-files': QStringList,
+            'recentFiles': QStringList,
             'window/size': QSize,
             'window/size': QSize,
             'window/position': QPoint,
             'window/position': QPoint,
             'window/geometry': QByteArray,
             'window/geometry': QByteArray,
@@ -246,7 +248,7 @@ class MainWindow(QMainWindow, WindowMixin):
             'window/state': QByteArray,
             'window/state': QByteArray,
         }
         }
         self.settings = settings = Settings(types)
         self.settings = settings = Settings(types)
-        self.recent_files = settings['recent-files']
+        self.recentFiles = list(settings['recentFiles'])
         size = settings.get('window/size', QSize(600, 500))
         size = settings.get('window/size', QSize(600, 500))
         position = settings.get('window/position', QPoint(0, 0))
         position = settings.get('window/position', QPoint(0, 0))
         self.resize(size)
         self.resize(size)
@@ -259,7 +261,7 @@ class MainWindow(QMainWindow, WindowMixin):
         Shape.line_color = self.lineColor
         Shape.line_color = self.lineColor
         Shape.fill_color = self.fillColor
         Shape.fill_color = self.fillColor
 
 
-        # The file menu has default dynamically generated entries.
+        # Populate the File menu dynamically.
         self.updateFileMenu()
         self.updateFileMenu()
         # Since loading the file may take some time, make sure it runs in the background.
         # Since loading the file may take some time, make sure it runs in the background.
         self.queueEvent(partial(self.loadFile, self.filename))
         self.queueEvent(partial(self.loadFile, self.filename))
@@ -300,8 +302,33 @@ class MainWindow(QMainWindow, WindowMixin):
             return items[0]
             return items[0]
         return None
         return None
 
 
+    def addRecent(self, filename):
+        if filename in self.recentFiles:
+            self.recentFiles.remove(filename)
+        elif len(self.recentFiles) >= self.maxRecent:
+            self.recentFiles.pop()
+        self.recentFiles.insert(0, filename)
+
     ## Callbacks ##
     ## Callbacks ##
 
 
+    def updateFileMenu(self):
+        current = self.filename
+        def exists(filename):
+            return os.path.exists(unicode(filename))
+        menu = self.menus.file
+        menu.clear()
+        files = [f for f in self.recentFiles\
+                 if f != current and exists(f)]
+        addActions(menu, self.actions.fileMenuActions)
+        if files:
+            menu.addSeparator()
+            icon = newIcon('labels')
+            for i, f in enumerate(files):
+                action = QAction(
+                    icon, '&%d %s' % (i+1, QFileInfo(f).fileName()), self)
+                action.triggered.connect(partial(self.loadFile, f))
+                menu.addAction(action)
+
     def popLabelListMenu(self, point):
     def popLabelListMenu(self, point):
         self.menus.labelList.exec_(self.labelList.mapToGlobal(point))
         self.menus.labelList.exec_(self.labelList.mapToGlobal(point))
 
 
@@ -499,6 +526,8 @@ class MainWindow(QMainWindow, WindowMixin):
                 self.loadLabels(self.labelFile.shapes)
                 self.loadLabels(self.labelFile.shapes)
             self.setClean()
             self.setClean()
             self.canvas.setEnabled(True)
             self.canvas.setEnabled(True)
+            self.paintCanvas()
+            self.addRecent(self.filename)
             return True
             return True
         return False
         return False
 
 
@@ -512,7 +541,7 @@ class MainWindow(QMainWindow, WindowMixin):
         assert not self.image.isNull(), "cannot paint null image"
         assert not self.image.isNull(), "cannot paint null image"
         self.canvas.scale = 0.01 * self.zoomWidget.value()
         self.canvas.scale = 0.01 * self.zoomWidget.value()
         self.canvas.adjustSize()
         self.canvas.adjustSize()
-        self.canvas.repaint()
+        self.canvas.update()
 
 
     def adjustScale(self):
     def adjustScale(self):
         self.zoomWidget.setValue(int(100 * self.scalers[self.zoomMode]()))
         self.zoomWidget.setValue(int(100 * self.scalers[self.zoomMode]()))
@@ -544,12 +573,10 @@ class MainWindow(QMainWindow, WindowMixin):
         s['window/state'] = self.saveState()
         s['window/state'] = self.saveState()
         s['line/color'] = self.lineColor
         s['line/color'] = self.lineColor
         s['fill/color'] = self.fillColor
         s['fill/color'] = self.fillColor
+        s['recentFiles'] = self.recentFiles
         # ask the use for where to save the labels
         # ask the use for where to save the labels
         #s['window/geometry'] = self.saveGeometry()
         #s['window/geometry'] = self.saveGeometry()
 
 
-    def updateFileMenu(self):
-        """Populate menu with recent files."""
-
     ## User Dialogs ##
     ## User Dialogs ##
 
 
     def openFile(self, _value=False):
     def openFile(self, _value=False):
@@ -603,23 +630,21 @@ class MainWindow(QMainWindow, WindowMixin):
         return os.path.dirname(unicode(self.filename)) if self.filename else '.'
         return os.path.dirname(unicode(self.filename)) if self.filename else '.'
 
 
     def chooseColor1(self):
     def chooseColor1(self):
-       
         color = self.colorDialog.getColor(self.lineColor, u'Choose line color',
         color = self.colorDialog.getColor(self.lineColor, u'Choose line color',
                 default=DEFAULT_LINE_COLOR)
                 default=DEFAULT_LINE_COLOR)
         if color:
         if color:
             self.lineColor = color
             self.lineColor = color
             # Change the color for all shape lines:
             # Change the color for all shape lines:
             Shape.line_color = self.lineColor 
             Shape.line_color = self.lineColor 
-            self.canvas.repaint()
+            self.canvas.update()
 
 
     def chooseColor2(self):
     def chooseColor2(self):
-       
        color = self.colorDialog.getColor(self.fillColor, u'Choose fill color',
        color = self.colorDialog.getColor(self.fillColor, u'Choose fill color',
                 default=DEFAULT_FILL_COLOR)
                 default=DEFAULT_FILL_COLOR)
        if color:
        if color:
             self.fillColor = color
             self.fillColor = color
             Shape.fill_color = self.fillColor
             Shape.fill_color = self.fillColor
-            self.canvas.repaint()
+            self.canvas.update()
 
 
     def newLabel(self):
     def newLabel(self):
         self.canvas.deSelectShape()
         self.canvas.deSelectShape()

+ 2 - 0
resources.qrc

@@ -1,6 +1,8 @@
 <!DOCTYPE RCC><RCC version="1.0">
 <!DOCTYPE RCC><RCC version="1.0">
 <qresource>
 <qresource>
 
 
+<file alias="file">icons/file.png</file>
+<file alias="labels">icons/labels.svg</file>
 <file alias="new">icons/objects.png</file>
 <file alias="new">icons/objects.png</file>
 <file alias="close">icons/close.png</file>
 <file alias="close">icons/close.png</file>
 <file alias="fit-width">icons/fit-width.png</file>
 <file alias="fit-width">icons/fit-width.png</file>