UI: File Browser Design Overhaul
authorJulian Eisel <eiseljulian@gmail.com>
Tue, 3 Sep 2019 13:43:38 +0000 (15:43 +0200)
committerJulian Eisel <eiseljulian@gmail.com>
Tue, 3 Sep 2019 14:10:40 +0000 (16:10 +0200)
This is a general redesign of the File Browser GUI and interaction
methods. For screenshots, check patch D5601.

Main changes in short:
* File Browser as floating window
* New layout of regions
* Popovers for view and filter options
* Vertical list view with interactive column header
* New and updated icons
* Keymap consistency fixes
* Many tweaks and fixes to the drawing of views

----

General:
* The file browser now opens as temporary floating window. It closes on
  Esc. The header is hidden then.
* When the file browser is opened as regular editor, the header remains
  visible.
* All file browser regions are now defined in Python (the button
  layout).
* Adjusted related operator UI names.

Keymap:
Keymap is now consistent with other list-based views in Blender, such as
the Outliner.
* Left click to select, double-click to open
* Right-click context menus
* Shift-click to fill selection
* Ctrl-click to extend selection

Operator options:
These previously overlapped with the source list, which caused numerous
issues with resizing and presenting many settings in a small panel area.
It was also generally inconsistent with Blender.
* Moved to new sidebar, which can easily be shown or hidden using a
  prominent Options toggle.
* IO operators have new layouts to match this new sidebar, using
  sub-panels. This will have to be committed separately (Add-on
  repository).
* If operators want to show the options by default, they have the option
  to do so (see `WM_FILESEL_SHOW_PROPS`, `hide_props_region`), otherwise
  they are hidden by default.

General Layout:
The layout has been changed to be simpler, more standard, and fits
better in with Blender 2.8.
* More conventional layout (file path at top, file name at the bottom,
  execute/cancel buttons in bottom right).
* Use of popovers to group controls, and allow for more descriptive
  naming.
* Search box is always live now, just like Outliner.

Views:
* Date Modified column combines both date and time, also uses user
  friendly strings for recent dates (i.e. "Yesterday", "Today").
* Details columns (file size, modification date/time) are now toggleable
  for all display types, they are not hardcoded per display type.
* File sizes now show as B, KB, MB, ... rather than B, KiB, MiB, … They
  are now also calculated using base 10 of course.
* Option to sort in inverse order.

Vertical List View:
* This view now used a much simpler single vertical list with columns
  for information.
* Users can click on the headers of these columns to order by that
  category, and click again to reverse the ordering.

Icons:
* Updated icons by Jendrzych, with better centering.
* Files and folders have new icons in Icon view.
* Both files and folders have reworked superimposed icons that show
  users the file/folder type.
* 3D file documents correctly use the 3d file icon, which was unused
  previously.
* Workspaces now show their icon on Link/Append - also when listed in
  the Outliner.

Minor Python-API breakage:
* `bpy.types.FileSelectParams.display_type`: `LIST_SHORT` and
  `LIST_LONG` are replaced by `LIST_VERTICAL` and `LIST_HORIZONTAL`.

Removes the feature where directories would automatically be created if
they are entered into the file path text button, but don't exist. We
were not sure if users use it enough to keep it. We can definitely bring
it back.

----

//Combined effort by @billreynish, @harley, @jendrzych, my university
colleague Brian Meisenheimer and myself.//

Differential Revision: https://developer.blender.org/D5601

Reviewers: Brecht, Bastien

33 files changed:
release/datafiles/prvicons.png
release/datafiles/prvicons.svg
release/datafiles/prvicons_update.py [changed mode: 0755->0644]
release/datafiles/userdef/userdef_default_theme.c
release/scripts/presets/keyconfig/keymap_data/blender_default.py
release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
release/scripts/startup/bl_ui/space_filebrowser.py
source/blender/blenlib/BLI_fileops.h
source/blender/blenlib/intern/BLI_filelist.c
source/blender/blenloader/intern/versioning_280.c
source/blender/blenloader/intern/versioning_userdef.c
source/blender/editors/include/ED_fileselect.h
source/blender/editors/interface/interface_icons.c
source/blender/editors/screen/area.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/sound/sound_ops.c
source/blender/editors/space_file/file_draw.c
source/blender/editors/space_file/file_intern.h
source/blender/editors/space_file/file_ops.c
source/blender/editors/space_file/file_panels.c
source/blender/editors/space_file/filelist.c
source/blender/editors/space_file/filelist.h
source/blender/editors/space_file/filesel.c
source/blender/editors/space_file/space_file.c
source/blender/editors/space_graph/graph_edit.c
source/blender/makesdna/DNA_space_types.h
source/blender/makesrna/intern/rna_space.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_event_system.c
source/blender/windowmanager/intern/wm_files.c
source/blender/windowmanager/intern/wm_files_link.c
source/blender/windowmanager/intern/wm_operator_props.c
source/blender/windowmanager/intern/wm_window.c

index edbffae420be99bdbb9b66d0bac00601919f73bf..dbc0f11124e9cf26c97fd3a8c2749038dbf1987e 100644 (file)
Binary files a/release/datafiles/prvicons.png and b/release/datafiles/prvicons.png differ
index 63cd8dc19544340837b4bb0ae708d54f09e95263..80929124251288f260e18345bc34ce186bfd28ea 100644 (file)
    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="192"
-   height="192"
+   width="1536"
+   height="256"
    id="svg2"
    sodipodi:version="0.32"
-   inkscape:version="0.92.2 2405546, 2018-03-11"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
    version="1.0"
    sodipodi:docname="prvicons.svg"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
    style="display:inline;enable-background:new"
-   inkscape:export-filename="blender_icons.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
+   inkscape:export-filename="prvicons.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
   <metadata
-     id="metadata2373">
+     id="metadata2699">
     <rdf:RDF>
       <cc:Work
          rdf:about="">
@@ -35,7 +35,7 @@
     </rdf:RDF>
   </metadata>
   <sodipodi:namedview
-     pagecolor="#ffffff"
+     pagecolor="#5b5b5b"
      bordercolor="#666666"
      borderopacity="1"
      objecttolerance="10"
      guidetolerance="10"
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
-     inkscape:window-width="1074"
-     inkscape:window-height="1896"
-     id="namedview2371"
-     showgrid="false"
-     inkscape:zoom="1.2291667"
-     inkscape:cx="60.20339"
-     inkscape:cy="13.830508"
-     inkscape:window-x="1080"
-     inkscape:window-y="0"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="layer1" />
+     inkscape:window-width="1920"
+     inkscape:window-height="1017"
+     id="namedview2697"
+     showgrid="true"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:snap-bbox-midpoints="true"
+     inkscape:zoom="0.70710678"
+     inkscape:cx="752.76338"
+     inkscape:cy="111.39186"
+     inkscape:window-x="1912"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1"
+     inkscape:snap-page="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-grids="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true"
+     showborder="true"
+     inkscape:showpageshadow="true"
+     inkscape:pagecheckerboard="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid6640"
+       color="#d3d3d3"
+       opacity="0.1254902"
+       empcolor="#ffffff"
+       empopacity="0.25098039"
+       spacingx="0.5"
+       spacingy="0.5"
+       empspacing="2"
+       originx="116"
+       originy="-514"
+       visible="true"
+       enabled="true" />
+    <inkscape:grid
+       type="xygrid"
+       id="grid5463"
+       enabled="false"
+       empspacing="0"
+       spacingx="256"
+       spacingy="256" />
+    <sodipodi:guide
+       position="256,68"
+       orientation="1,0"
+       id="guide5465"
+       inkscape:locked="false" />
+    <sodipodi:guide
+       position="512,77"
+       orientation="1,0"
+       id="guide5467"
+       inkscape:locked="false" />
+    <sodipodi:guide
+       position="768,27"
+       orientation="1,0"
+       id="guide5469"
+       inkscape:locked="false" />
+    <sodipodi:guide
+       position="1024,5.75"
+       orientation="1,0"
+       id="guide5471"
+       inkscape:locked="false" />
+    <sodipodi:guide
+       position="1280,-2.5"
+       orientation="1,0"
+       id="guide5473"
+       inkscape:locked="false" />
+    <inkscape:grid
+       type="xygrid"
+       id="grid5475"
+       spacingx="32"
+       spacingy="32"
+       enabled="false" />
+    <inkscape:grid
+       type="xygrid"
+       id="grid5500"
+       spacingx="8"
+       spacingy="8"
+       enabled="false" />
+  </sodipodi:namedview>
   <defs
      id="defs4">
     <linearGradient
        x2="24.25"
        y1="245"
        x1="22.75"
-       gradientTransform="translate(-61,0)"
+       gradientTransform="translate(-61)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23201"
        xlink:href="#linearGradient1610"
        x2="24.5"
        y1="245"
        x1="22.75"
-       gradientTransform="translate(-1,0)"
+       gradientTransform="translate(-1)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23199"
        xlink:href="#linearGradient1610"
        x2="424.75217"
        y1="77.44017"
        x1="441.98615"
-       gradientTransform="translate(0.01387,0)"
+       gradientTransform="translate(0.01387)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient22896"
        xlink:href="#linearGradient319"
        x2="424.75217"
        y1="78"
        x1="438.61115"
-       gradientTransform="translate(0.01387,0)"
+       gradientTransform="translate(0.01387)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient22846"
        xlink:href="#linearGradient319"
        x2="424.75217"
        y1="77"
        x1="437.98615"
-       gradientTransform="translate(0.01387,0)"
+       gradientTransform="translate(0.01387)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient22844"
        xlink:href="#linearGradient319"
        x2="336.72485"
        y1="143.70836"
        x1="349.04059"
-       gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,-241.7085,428.4841)"
+       gradientTransform="rotate(-45,396.37194,506.00979)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient15748"
        xlink:href="#linearGradient37542"
        x2="54.8125"
        y1="500"
        x1="108"
-       gradientTransform="translate(42,0)"
+       gradientTransform="translate(42)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient16638"
        xlink:href="#linearGradient1610"
        x2="26.561054"
        y1="501.74075"
        x1="85.874489"
-       gradientTransform="translate(42,0)"
+       gradientTransform="translate(42)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient16640"
        xlink:href="#linearGradient15809"
        x2="415.94211"
        y1="-34"
        x1="416.00461"
-       gradientTransform="translate(-0.004608,0)"
+       gradientTransform="translate(-0.004608)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient30243"
        xlink:href="#linearGradient24081"
        x2="416.5"
        y1="-29.933779"
        x1="416.5"
-       gradientTransform="translate(-0.004608,0)"
+       gradientTransform="translate(-0.004608)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient30245"
        xlink:href="#linearGradient16500"
        x2="416.46497"
        y1="-34.342831"
        x1="416.41162"
-       gradientTransform="translate(-1,0)"
+       gradientTransform="translate(-1)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient30247"
        xlink:href="#linearGradient20324"
        x2="415.45193"
        y1="-31.506163"
        x1="415.41223"
-       gradientTransform="translate(-0.004608,0)"
+       gradientTransform="translate(-0.004608)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient30340"
        xlink:href="#linearGradient1610"
        x2="416.5"
        y1="-29.933779"
        x1="416.5"
-       gradientTransform="translate(-0.004608,0)"
+       gradientTransform="translate(-0.004608)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient30342"
        xlink:href="#linearGradient16500"
        x2="416.46497"
        y1="-33.8125"
        x1="416.5"
-       gradientTransform="translate(-1,0)"
+       gradientTransform="translate(-1)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient30344"
        xlink:href="#linearGradient16500"
        x2="415.45193"
        y1="-31.506163"
        x1="415.41223"
-       gradientTransform="translate(-0.004608,0)"
+       gradientTransform="translate(-0.004608)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient30408"
        xlink:href="#linearGradient1610"
        x2="416.5"
        y1="-29.933779"
        x1="416.5"
-       gradientTransform="translate(-0.004608,0)"
+       gradientTransform="translate(-0.004608)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient30410"
        xlink:href="#linearGradient16500"
        x2="416.46497"
        y1="-33.8125"
        x1="416.5"
-       gradientTransform="translate(-1,0)"
+       gradientTransform="translate(-1)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient30412"
        xlink:href="#linearGradient16500"
        x2="-42.377892"
        y1="442.6875"
        x1="-51.6875"
-       gradientTransform="translate(18,0)"
+       gradientTransform="translate(18)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient17135"
        xlink:href="#linearGradient1610"
        inkscape:collect="always" />
     <linearGradient
        y2="-32.351803"
-       x2="4.8398785e-16"
+       x2="4.8398785e-016"
        y1="-29.678047"
        x1="4.9341426"
        gradientUnits="userSpaceOnUse"
        x2="476.76578"
        y1="163.08553"
        x1="480.09564"
-       gradientTransform="translate(-6,0)"
+       gradientTransform="translate(-6)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23241"
        xlink:href="#linearGradient19625"
        x2="475.50031"
        y1="163.08553"
        x1="480.09564"
-       gradientTransform="translate(-6,0)"
+       gradientTransform="translate(-6)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23445"
        xlink:href="#linearGradient23974"
        x2="60.155113"
        y1="253.5"
        x1="79.04213"
-       gradientTransform="translate(-21,0)"
+       gradientTransform="translate(-21)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient40967"
        xlink:href="#linearGradient32842"
        x2="476.68781"
        y1="163"
        x1="483.00034"
-       gradientTransform="translate(-6,0)"
+       gradientTransform="translate(-6)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient24543"
        xlink:href="#linearGradient1610"
        x2="284.9375"
        y1="200.66605"
        x1="268.21783"
-       gradientTransform="translate(0.01612278,0)"
+       gradientTransform="translate(0.01612278)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient41172"
        xlink:href="#linearGradient319"
        x2="265.70886"
        y1="215.3125"
        x1="276.39999"
-       gradientTransform="translate(0.01612278,0)"
+       gradientTransform="translate(0.01612278)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient42093"
        xlink:href="#linearGradient23974"
        x2="290.98389"
        y1="195"
        x1="265.98389"
-       gradientTransform="translate(0.01612278,0)"
+       gradientTransform="translate(0.01612278)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient42290"
        xlink:href="#linearGradient319"
        x2="388.78125"
        y1="410"
        x1="387"
-       gradientTransform="translate(-1,0)"
+       gradientTransform="translate(-1)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient22249"
        xlink:href="#linearGradient319"
        x2="389.14081"
        y1="409.84152"
        x1="386.88852"
-       gradientTransform="translate(-1,0)"
+       gradientTransform="translate(-1)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient22251"
        xlink:href="#linearGradient319"
        x2="388.86676"
        y1="409.86362"
        x1="387"
-       gradientTransform="translate(-1,0)"
+       gradientTransform="translate(-1)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient22253"
        xlink:href="#linearGradient319"
        x2="145.5"
        y1="627.5"
        x1="145.5"
-       gradientTransform="matrix(0,1,-1,0,850,297)"
+       gradientTransform="rotate(90,276.5,573.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23177"
        xlink:href="#linearGradient20324"
        x2="145.5"
        y1="627.5"
        x1="145.5"
-       gradientTransform="matrix(-1,0,0,-1,366,1072)"
+       gradientTransform="rotate(180,183,536)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23179"
        xlink:href="#linearGradient20324"
        x2="145.5"
        y1="627.5"
        x1="145.5"
-       gradientTransform="matrix(0,-1,1,0,-409,588)"
+       gradientTransform="rotate(-90,89.5,498.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23181"
        xlink:href="#linearGradient20324"
        x2="150.5"
        y1="647.75"
        x1="150.5"
-       gradientTransform="matrix(0,1,-1,0,870,292)"
+       gradientTransform="rotate(90,289,581)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23187"
        xlink:href="#linearGradient37623"
        x2="150.5"
        y1="647.75"
        x1="150.5"
-       gradientTransform="matrix(0,-1,1,0,-429,593)"
+       gradientTransform="rotate(-90,82,511)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23191"
        xlink:href="#linearGradient37623"
        x2="145.5"
        y1="627.5"
        x1="145.5"
-       gradientTransform="matrix(0,1,-1,0,850,297)"
+       gradientTransform="rotate(90,276.5,573.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23580"
        xlink:href="#linearGradient20324"
        x2="145.5"
        y1="627.5"
        x1="145.5"
-       gradientTransform="matrix(-1,0,0,-1,366,1072)"
+       gradientTransform="rotate(180,183,536)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23582"
        xlink:href="#linearGradient20324"
        x2="145.5"
        y1="627.5"
        x1="145.5"
-       gradientTransform="matrix(0,-1,1,0,-409,588)"
+       gradientTransform="rotate(-90,89.5,498.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23587"
        xlink:href="#linearGradient20324"
        x2="150.5"
        y1="647.75"
        x1="150.5"
-       gradientTransform="matrix(0,1,-1,0,870,292)"
+       gradientTransform="rotate(90,289,581)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23593"
        xlink:href="#linearGradient37623"
        x2="150.5"
        y1="647.75"
        x1="150.5"
-       gradientTransform="matrix(0,-1,1,0,-429,593)"
+       gradientTransform="rotate(-90,82,511)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23600"
        xlink:href="#linearGradient37623"
        x2="145.5"
        y1="627.5"
        x1="145.5"
-       gradientTransform="matrix(0,1,-1,0,850,297)"
+       gradientTransform="rotate(90,276.5,573.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23813"
        xlink:href="#linearGradient24632"
        x2="145.5"
        y1="627.5"
        x1="145.5"
-       gradientTransform="matrix(-1,0,0,-1,366,1072)"
+       gradientTransform="rotate(180,183,536)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23815"
        xlink:href="#linearGradient24632"
        x2="145.5"
        y1="627.5"
        x1="145.5"
-       gradientTransform="matrix(0,-1,1,0,-409,588)"
+       gradientTransform="rotate(-90,89.5,498.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23817"
        xlink:href="#linearGradient24632"
        x2="150.5"
        y1="647.75"
        x1="150.5"
-       gradientTransform="matrix(0,1,-1,0,870,292)"
+       gradientTransform="rotate(90,289,581)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23823"
        xlink:href="#linearGradient24642"
        x2="150.5"
        y1="647.75"
        x1="150.5"
-       gradientTransform="matrix(0,-1,1,0,-429,593)"
+       gradientTransform="rotate(-90,82,511)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient23827"
        xlink:href="#linearGradient24642"
        x2="269.3085"
        y1="279.72827"
        x1="248.69196"
-       gradientTransform="translate(-1,0)"
+       gradientTransform="translate(-1)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient62436"
        xlink:href="#linearGradient319"
        x2="327.92044"
        y1="283.61511"
        x1="354.50601"
-       gradientTransform="matrix(0,-1,1,0,59,638)"
+       gradientTransform="rotate(-90,348.5,289.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient62560"
        xlink:href="#linearGradient319"
        x2="344.5"
        y1="288.5"
        x1="342"
-       gradientTransform="matrix(0,1,-1,0,638,-40)"
+       gradientTransform="rotate(90,339,299)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient25383"
        xlink:href="#linearGradient1610"
        x2="344.5"
        y1="288.5"
        x1="342"
-       gradientTransform="matrix(-1,0,0,-1,699,599)"
+       gradientTransform="rotate(180,349.5,299.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient25385"
        xlink:href="#linearGradient1610"
        x2="344.5"
        y1="288.5"
        x1="342"
-       gradientTransform="matrix(0,-1,1,0,60,660)"
+       gradientTransform="rotate(-90,360,300)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient25387"
        xlink:href="#linearGradient1610"
        x2="344.5"
        y1="288.5"
        x1="342"
-       gradientTransform="matrix(0,1,-1,0,638,-40)"
+       gradientTransform="rotate(90,339,299)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient25575"
        xlink:href="#linearGradient1610"
        x2="344.5"
        y1="288.5"
        x1="342"
-       gradientTransform="matrix(-1,0,0,-1,699,599)"
+       gradientTransform="rotate(180,349.5,299.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient25577"
        xlink:href="#linearGradient1610"
        x2="344.5"
        y1="288.5"
        x1="342"
-       gradientTransform="matrix(0,-1,1,0,60,660)"
+       gradientTransform="rotate(-90,360,300)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient25579"
        xlink:href="#linearGradient1610"
        x2="99.628899"
        y1="114.71685"
        x1="112.18942"
-       gradientTransform="translate(19.367382,0)"
+       gradientTransform="translate(19.367382)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient27771"
        xlink:href="#linearGradient13973"
        x2="353.72073"
        y1="314.11398"
        x1="352.98236"
-       gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,-346.7085,428.4841)"
+       gradientTransform="rotate(-45,343.872,632.75601)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient53127"
        xlink:href="#linearGradient37542"
        x2="-14.000002"
        y1="448"
        x1="-22.902081"
-       gradientTransform="translate(2e-6,0)"
+       gradientTransform="translate(2e-6)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient50870"
        xlink:href="#linearGradient23178"
        x2="452.63602"
        y1="89.363937"
        x1="458.99997"
-       gradientTransform="matrix(0.7071068,-0.7071068,0.7071067,0.7071067,-140.04288,401.30258)"
+       gradientTransform="rotate(-45,414.39357,369.69801)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient33585"
        xlink:href="#linearGradient9030"
        x2="332.88193"
        y1="126.23978"
        x1="387.30396"
-       gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,-241.7085,428.4841)"
+       gradientTransform="rotate(-45,396.37194,506.00979)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient37636"
        xlink:href="#linearGradient37542"
        x2="353.72073"
        y1="314.11398"
        x1="352.98236"
-       gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,-346.7085,428.4841)"
+       gradientTransform="rotate(-45,343.872,632.75601)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient37638"
        xlink:href="#linearGradient37542"
        x2="-20"
        y1="283"
        x1="-20"
-       gradientTransform="translate(-2,0)"
+       gradientTransform="translate(-2)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient38570"
        xlink:href="#linearGradient1610"
        x2="97.75"
        y1="84.25"
        x1="101"
-       gradientTransform="translate(21,0)"
+       gradientTransform="translate(21)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient39843-3"
        xlink:href="#linearGradient1610-8"
        x2="96.592278"
        y1="81.439644"
        x1="87.44548"
-       gradientTransform="translate(21,0)"
+       gradientTransform="translate(21)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient39845-2"
        xlink:href="#linearGradient319-77"
        x2="424.75217"
        y1="77"
        x1="437.98615"
-       gradientTransform="translate(0.01387,0)"
+       gradientTransform="translate(0.01387)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient41672"
        xlink:href="#linearGradient319"
        x2="424.75217"
        y1="78"
        x1="438.61115"
-       gradientTransform="translate(0.01387,0)"
+       gradientTransform="translate(0.01387)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient41674"
        xlink:href="#linearGradient319"
        x2="424.75217"
        y1="77.44017"
        x1="441.98615"
-       gradientTransform="translate(0.01387,0)"
+       gradientTransform="translate(0.01387)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient41676"
        xlink:href="#linearGradient319"
        x2="99.628899"
        y1="113.45913"
        x1="111.46314"
-       gradientTransform="translate(19.367382,0)"
+       gradientTransform="translate(19.367382)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient38724"
        xlink:href="#linearGradient13973"
        x2="-28.177105"
        y1="-121.58411"
        x1="-70.605209"
-       gradientTransform="translate(22,0)"
+       gradientTransform="translate(22)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient39686-1"
        xlink:href="#linearGradient1610-3-7"
        x2="-55.5975"
        y1="-124"
        x1="-74"
-       gradientTransform="translate(22,0)"
+       gradientTransform="translate(22)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient39688-9"
        xlink:href="#linearGradient319-5-9-4"
        x2="-88"
        y1="408"
        x1="-97"
-       gradientTransform="translate(6,0)"
+       gradientTransform="translate(6)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient38695"
        xlink:href="#linearGradient16500"
        x2="-88"
        y1="413.51562"
        x1="-90.5"
-       gradientTransform="matrix(-1,0,0,-1,-157,821.03125)"
+       gradientTransform="rotate(180,-78.5,410.51562)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient38706"
        xlink:href="#linearGradient319"
        x2="-88"
        y1="408"
        x1="-97"
-       gradientTransform="translate(8,0)"
+       gradientTransform="translate(8)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient38723"
        xlink:href="#linearGradient16500"
        x2="-86.75"
        y1="413.98114"
        x1="-89.75"
-       gradientTransform="matrix(-1,0,0,-1,-156,821.03125)"
+       gradientTransform="rotate(180,-78,410.51562)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient38729"
        xlink:href="#linearGradient319"
        x2="-86.75"
        y1="413.98114"
        x1="-89.75"
-       gradientTransform="matrix(-1,0,0,-1,-156,824.54874)"
+       gradientTransform="rotate(180,-78,412.27437)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient38736"
        xlink:href="#linearGradient319"
        x2="-88"
        y1="408"
        x1="-97"
-       gradientTransform="translate(6,0)"
+       gradientTransform="translate(6)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient39203"
        xlink:href="#linearGradient16500"
        x2="-88"
        y1="408"
        x1="-97"
-       gradientTransform="translate(6,0)"
+       gradientTransform="translate(6)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient39252"
        xlink:href="#linearGradient16500"
        x2="58.680996"
        y1="641.73358"
        x1="39.102718"
-       gradientTransform="translate(-20,0)"
+       gradientTransform="translate(-20)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient39508"
        xlink:href="#linearGradient319-46"
        x2="99.628899"
        y1="112.62726"
        x1="111.2239"
-       gradientTransform="translate(19.367382,0)"
+       gradientTransform="translate(19.367382)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient40639-1-2-1"
        xlink:href="#linearGradient13973-3-7-8"
        x2="336.40625"
        y1="108.35222"
        x1="351.15625"
-       gradientTransform="matrix(-1,0,0,-1,698,183)"
+       gradientTransform="rotate(180,349,91.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient44944"
        xlink:href="#linearGradient44939-8"
        x2="353.72073"
        y1="314.11398"
        x1="352.98236"
-       gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,-346.7085,428.4841)"
+       gradientTransform="rotate(-45,343.872,632.75601)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient25449"
        xlink:href="#linearGradient37542"
          id="stop37546-94" />
     </linearGradient>
     <linearGradient
-       gradientTransform="matrix(0,1,-1,0,634.98585,-146.00607)"
+       gradientTransform="rotate(90,390.49596,244.48989)"
        y2="247.99998"
        x2="392.0101"
        y1="222.99998"
        x2="752"
        y1="402"
        x1="743"
-       gradientTransform="matrix(0,-1,1,0,-239.00001,1286)"
+       gradientTransform="rotate(-90,523.5,762.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient28583"
        xlink:href="#linearGradient16500"
        inkscape:collect="always" />
     <linearGradient
-       gradientTransform="matrix(0,1,-1,0,574.99991,384.00001)"
+       gradientTransform="rotate(90,95.49995,479.49996)"
        y2="406.47784"
        x2="161.83331"
        y1="413.87982"
        x2="163.11441"
        y1="544.21143"
        x1="148.56801"
-       gradientTransform="matrix(0,1,-1,0,719.99999,383.00001)"
+       gradientTransform="rotate(90,168.49999,551.5)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient28600"
        xlink:href="#linearGradient319"
        x2="85.347076"
        y1="100.22395"
        x1="85.548706"
-       gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,257.1483,118.6716)"
+       gradientTransform="rotate(-45,271.82331,-251.06972)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient31019"
        xlink:href="#linearGradient319"
        x2="85.347076"
        y1="100.22395"
        x1="85.548706"
-       gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,257.1483,118.6716)"
+       gradientTransform="rotate(-45,271.82331,-251.06972)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient31055"
        xlink:href="#linearGradient319"
        x2="85.347076"
        y1="100.22395"
        x1="85.548706"
-       gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,257.1483,118.6716)"
+       gradientTransform="rotate(-45,271.82331,-251.06972)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient31151"
        xlink:href="#linearGradient319"
        x2="85.60022"
        y1="99.348953"
        x1="85.861206"
-       gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,257.14826,118.6716)"
+       gradientTransform="rotate(-45,271.82329,-251.06967)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient31155"
        xlink:href="#linearGradient30958"
        x2="-303.00003"
        y1="475"
        x1="-307"
-       gradientTransform="translate(-42,0)"
+       gradientTransform="translate(-42)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient52998-5-5"
        xlink:href="#linearGradient319-31-8-9-1"
        x2="-304.76843"
        y1="476.0105"
        x1="-308.7684"
-       gradientTransform="translate(-42,0)"
+       gradientTransform="translate(-42)"
        gradientUnits="userSpaceOnUse"
        id="linearGradient53000-3-9"
        xlink:href="#linearGradient319-31-8-9-1"
      d=""
      sodipodi:nodetypes="cc"
      id="path23417"
-     style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+     style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
   <path
      inkscape:connector-curvature="0"
      d=""
      sodipodi:nodetypes="cc"
      id="path23347"
-     style="fill:none;stroke:#ffffff;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+     style="fill:none;stroke:#ffffff;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
   <g
      inkscape:groupmode="layer"
      id="layer4"
      inkscape:label="sheet_layout"
-     style="display:inline" />
+     style="display:none"
+     transform="translate(116,578)" />
   <g
-     transform="translate(-872,-180)"
+     transform="translate(-756,398)"
      style="display:inline"
      id="layer1"
      inkscape:groupmode="layer"
      inkscape:label="ICONS">
+    <g
+       style="opacity:0.5"
+       id="g7488"
+       transform="translate(218)" />
     <g
        transform="translate(-211.20006,170)"
        id="g10203" />
     <g
        id="g17117" />
     <g
-       transform="translate(9,0)"
+       transform="translate(9)"
        id="g17121" />
     <g
        id="g17128"
        transform="translate(67,200.06499)"
        id="g22051" />
     <g
-       transform="translate(-23,0)"
+       transform="translate(-23)"
        id="g40816">
       <g
          id="g40830" />
        inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
        inkscape:export-xdpi="90"
        inkscape:export-ydpi="90"
-       transform="matrix(-1,0,0,-1,104.1613,262.99999)"
+       transform="rotate(180,52.08065,131.5)"
        style="display:inline;stroke:#ffffff">
       <path
          inkscape:connector-curvature="0"
        inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
        inkscape:export-xdpi="90"
        inkscape:export-ydpi="90" />
-    <rect
-       y="180"
-       x="872"
-       height="192"
-       width="192"
-       id="rect30285"
-       style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5.39191818;marker:none;enable-background:accumulate" />
     <g
        transform="translate(0,12)"
        id="g46790" />
        d=""
        inkscape:connector-curvature="0" />
     <g
-       id="g15770-4"
-       transform="translate(-1653.0047,902.99644)"
-       style="display:inline;opacity:0.6;enable-background:new">
-      <path
-         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-         d="m 2691.4961,-577 c -1.4585,10e-6 -2.8611,0.57961 -3.877,1.63477 L 2673.293,-561 h 14.705 c 0.5523,-6e-5 0.9999,-0.44774 1,-1 v -10.5 c 0,-1.94484 1.5551,-3.5 3.5,-3.5 0.6573,-0.009 0.9864,-0.50465 0.9864,-1 z"
-         id="path15766-8"
-         inkscape:connector-curvature="0" />
-      <path
-         sodipodi:nodetypes="cccccccc"
-         inkscape:connector-curvature="0"
-         d="m 2691.4963,-576.50002 h 19.9969 c 0.5523,-3e-5 1,0.44769 1.0015,0.99998 l 0.01,41.00357 c 0,0.55581 -0.4477,1.00353 -1,1 h -37.0035 c -0.5559,0.004 -1.0036,-0.44419 -1,-1 v -24.00355"
-         style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
-         id="path15768-2" />
-    </g>
-    <path
-       sodipodi:nodetypes="ccssssssccccscssscccccsscscsccccssccc"
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 875.49998,329 c -0.4167,0 -0.7749,0.19292 -1.041,0.45898 -0.2661,0.26607 -0.459,0.62435 -0.459,1.04102 v 32 c 0,3.03164 2.4684,5.5 5.5,5.5 H 912.5 c 3.0316,0 5.5,-2.46836 5.5,-5.5 v -20 c 0,-0.42425 -0.1991,-0.77237 -0.4648,-1.04883 -0.2658,-0.27646 -0.6395,-0.51191 -1.1055,-0.44531 l 0.07,-0.006 h -6.5 -27.50002 c -0.095,0 -0.1807,0.0361 -0.3223,0.17773 -0.1417,0.14177 -0.1777,0.22697 -0.1777,0.32227 v 21 c 0,1.20549 -0.8756,2.25014 -2.0625,2.46094 -1.1869,0.2108 -2.3701,-0.46784 -2.7852,-1.59961 -0.041,-0.1158 -0.061,-0.23824 -0.058,-0.36119 h 2.4062 v -0.008 c 0.03,-2.1e-4 0.058,0.005 0.088,0 0.2451,-0.0435 0.4121,-0.2432 0.4121,-0.49219 v -21 c 0,-0.74923 0.3782,-1.35083 0.7637,-1.73633 0.3856,-0.38565 0.9871,-0.76367 1.7363,-0.76367 h 27.50002 v -4.5 c 0,-0.41667 -0.1929,-0.77495 -0.459,-1.04102 -0.2661,-0.26606 -0.6243,-0.45898 -1.041,-0.45898 l -18.02732,0.0449 c -0.055,1.2e-4 -0.1892,-0.0544 -0.2989,-0.17383 -0.1114,-0.1193 -0.1738,-0.28349 -0.1738,-0.37109 v -2 c 0,-0.41667 -0.1929,-0.77495 -0.459,-1.04102 -0.2661,-0.26606 -0.6243,-0.45898 -1.041,-0.45898 z"
-       id="path15794"
-       inkscape:connector-curvature="0" />
-    <g
-       transform="translate(-1139.094,997)"
+       transform="translate(810,316.5)"
        style="display:inline;enable-background:new"
-       id="g16516">
-      <g
-         id="g15792"
-         transform="translate(-500,-182)"
-         style="opacity:0.6">
-        <path
-           sodipodi:nodetypes="cscssscssssssssssccsc"
-           inkscape:connector-curvature="0"
-           d="m 2564.8618,-451.50005 c 0.3211,0.5561 0.8787,0.91004 1.4878,0.98518 0.2496,0.0308 0.5078,0.0148 0.7619,-0.0533 0.8744,-0.23427 1.4824,-1.02663 1.4824,-1.93185 v -22 c 0,-0.4714 0.5286,-1 1,-1 l 34,2e-5 c 0.4667,-0.0667 1,0.52863 1,1.00003 v 22 c 0,2.76142 -2.2386,5 -5,5 h -33 c -2.7614,0 -5,-2.23858 -5,-5 v -33 c 0,-0.5 0.5,-1 1,-1 h 13 c 0.5,0 1,0.5 1,1 v 2 c 0,0.5 0.4872,1.0452 0.9723,1.0442 l 18.0277,-0.0442 c 0.5,0 1,0.5 1,1 v 2"
-           style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
-           id="path15787" />
-        <path
-           sodipodi:nodetypes="cc"
-           inkscape:connector-curvature="0"
-           id="path15790"
-           d="m 2596.5,-479.5 v 1.5"
-           style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      </g>
-      <g
-         id="g15799"
-         transform="matrix(0,1,1,0,2028.5,-908.5)"
-         style="display:inline;opacity:1;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"
-         inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png"
-         inkscape:export-xdpi="96"
-         inkscape:export-ydpi="96">
-        <path
-           id="path15797"
-           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"
-           d="m 271.5,63.5 v -5 c 0,-1.104569 -0.89543,-2 -2,-2 h -11 m 4,5 -5,-5 5,-5"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="ccccccc" />
-      </g>
-    </g>
+       id="g72880" />
+    <image
+       sodipodi:absref="C:\Users\Andrzej Ambroż\Desktop\a230341b4bf9a9d653c3e8062c4702e859d6d32f.png"
+       y="143.4964"
+       x="8460.25"
+       id="image7203"
+       xlink:href="file:///C:/Users/Andrzej%20Ambro%C5%BC/Desktop/a230341b4bf9a9d653c3e8062c4702e859d6d32f.png"
+       style="stroke-width:0.69403505;image-rendering:optimizeSpeed"
+       preserveAspectRatio="none"
+       height="487.00717"
+       width="1377.452" />
     <g
-       style="display:inline;opacity:0.6;enable-background:new"
-       transform="translate(-1653.0001,855.00002)"
-       id="g6937">
+       transform="translate(-30,-450)"
+       id="g7205" />
+    <g
+       id="g7480"
+       transform="matrix(8.4250411,0,0,8.2967687,-7333.563,3000.3193)"
+       style="stroke-width:0.1196078" />
+    <g
+       style="stroke-width:0.1196078"
+       transform="matrix(8.4250411,0,0,-8.2967687,-7336.563,-3470.4526)"
+       id="g7569" />
+    <g
+       id="g7599"
+       style="display:inline;opacity:1;enable-background:new"
+       transform="matrix(1.4999383,0,0,1.4999989,-371.4454,70.499748)">
       <path
+         sodipodi:nodetypes="ccccccccccc"
          inkscape:connector-curvature="0"
-         id="path6933"
-         d="m 2691.4961,-577 c -1.4585,10e-6 -2.8611,0.57961 -3.877,1.63477 L 2673.293,-561 h 14.705 c 0.5523,-6e-5 0.9999,-0.44774 1,-1 v -10.5 c 0,-1.94484 1.5551,-3.5 3.5,-3.5 0.6573,-0.009 0.9864,-0.50465 0.9864,-1 z"
-         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+         d="m 884,-165 c 0,0.55581 -0.4477,1.00353 -1,1 h -92.0036 c -0.5558,0.004 -1.0036,-0.44419 -1,-1 v -86 c 0,-1.32609 0.5269,-2.59785 1.4824,-3.51777 l 34,-34 c 0.9198,-0.95544 2.1916,-1.48222 3.5176,-1.48223 l 53.9911,2e-5 c 0.5523,-3e-5 1,0.44769 1.0015,0.99998 z"
+         style="display:inline;opacity:0.2;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
+         id="path7410" />
       <path
-         id="path6935"
-         style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
-         d="m 2691.4963,-576.50002 h 19.9969 c 0.5523,-3e-5 1,0.44769 1.0015,0.99998 l 0.01,41.00357 c 0,0.55581 -0.4477,1.00353 -1,1 h -37.0035 c -0.5559,0.004 -1.0036,-0.44419 -1,-1 v -24.00355"
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+         d="m 76.996094,21 c -1.59084,10e-6 -3.126431,0.634133 -4.238282,1.789062 L 38.785156,56.761719 C 37.630236,57.873629 36.996094,59.40902 36.996094,61 v 85.99414 c -0.007,1.09637 0.910592,2.01376 2.007812,2.00586 H 130.99414 C 132.09029,149.007 133,148.0928 133,147 L 132.9883,23 v -0.002 c -0.003,-1.09124 -0.90724,-1.998107 -2,-1.998047 z M 130.33323,146.33338 H 39.66283 V 62.999985 c 0.0019,-1.44306 0.588363,-2.666668 2.000083,-2.666668 h 32.001316 c 1.09262,-1.2e-4 2.666576,-0.914632 2.666776,-2.000002 v -32.66669 c 0,-1.411771 0.588253,-2.000002 2.000083,-2.000002 h 52.002142 z"
+         transform="translate(752,-312)"
+         id="path7412"
          inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cccccccc" />
+         sodipodi:nodetypes="cccscccccccccccsccsscc" />
     </g>
     <g
-       id="g6943"
-       transform="translate(-1701.0001,855.00002)"
-       style="display:inline;opacity:0.6;enable-background:new">
+       style="display:inline;stroke-width:0.10177074;enable-background:new"
+       id="g7452"
+       transform="matrix(14.821991,0,0,14.654739,-7507.9905,-1149.2844)">
+      <path
+         style="display:inline;opacity:0.2;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.20354147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
+         d="m 613.67414,61.535437 h 8.65173 c 0.57439,0 1.03681,0.46242 1.03681,1.036816 v 2.839759 c 0,0.574396 -0.46242,1.036815 -1.03681,1.036815 h -8.65173 c -0.57439,0 -1.03681,-0.462419 -1.03681,-1.036815 v -2.839759 c 0,-0.574396 0.46242,-1.036816 1.03681,-1.036816 z"
+         id="rect7450"
+         inkscape:connector-curvature="0" />
       <path
-         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-         d="m 2691.4961,-577 c -1.4585,10e-6 -2.8611,0.57961 -3.877,1.63477 L 2673.293,-561 h 14.705 c 0.5523,-6e-5 0.9999,-0.44774 1,-1 v -10.5 c 0,-1.94484 1.5551,-3.5 3.5,-3.5 0.6573,-0.009 0.9864,-0.50465 0.9864,-1 z"
-         id="path6939"
+         id="path7424"
+         transform="matrix(0.10118267,0,0,0.10236222,598.97766,126.33073)"
+         d="M 145.24609,-711 C 139.56927,-711 135,-706.4825 135,-700.87109 v 78 C 135,-628.4825 139.56927,-633 145.24609,-633 h 85.50782 c 5.67682,0 10.24609,4.5175 10.24609,10.12891 v -78 C 241,-706.4825 236.43073,-711 230.75391,-711 Z"
+         style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
          inkscape:connector-curvature="0" />
       <path
-         sodipodi:nodetypes="cccccccc"
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+         d="m 553.24414,21.003906 c -6.21668,0 -11.25391,4.978036 -11.25391,11.123047 v 78.001957 27.74414 c 0,6.14501 5.03723,11.12304 11.25391,11.12304 h 85.51172 c 2.7198,0 5.21303,-0.95235 7.1582,-2.53906 2.50094,-2.04005 4.09571,-5.12741 4.09571,-8.58398 V 110.12891 32.126953 c 0,-6.145011 -5.03723,-11.123047 -11.25391,-11.123047 z m 0,1.984375 h 85.51172 c 5.13704,0 9.24609,4.060861 9.24609,9.138672 v 71.667967 c -2.03176,-2.89305 -5.41213,-4.789061 -9.24609,-4.789061 h -85.51172 c -3.83396,0 -7.21433,1.896011 -9.24609,4.789061 V 32.126953 c 0,-5.077811 4.10905,-9.138672 9.24609,-9.138672 z m 0,78.001949 h 85.51172 c 5.13704,0 8.58679,4.26374 8.58679,9.34155 v 27.33166 c 0,5.07781 -3.53119,8.66614 -8.66823,8.66614 h -85.34878 c -5.13704,0 -8.66823,-3.58833 -8.66823,-8.66614 v -27.33166 c 0,-5.07781 3.44969,-9.34155 8.58673,-9.34155 z"
+         id="rect7426"
+         transform="matrix(0.10118267,0,0,0.10236222,557.69513,51.299216)"
          inkscape:connector-curvature="0"
-         d="m 2691.4963,-576.50002 h 19.9969 c 0.5523,-3e-5 1,0.44769 1.0015,0.99998 l 0.01,41.00357 c 0,0.55581 -0.4477,1.00353 -1,1 h -37.0035 c -0.5559,0.004 -1.0036,-0.44419 -1,-1 v -24.00355"
-         style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
-         id="path6941" />
-    </g>
-    <g
-       style="display:inline;opacity:0.6;enable-background:new"
-       transform="translate(-1749.0047,854.99644)"
-       id="g6949">
+         sodipodi:nodetypes="sscssscscsssssscsscsssssssssss" />
       <path
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.10177073;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+         d="m 621.91311,62.457001 c 0.22334,0 0.40429,0.180956 0.40429,0.404297 v 0.0098 c 0,0.22334 -0.18095,0.404297 -0.40429,0.404297 -0.22335,0 -0.40625,-0.180957 -0.40625,-0.404297 v -0.0098 c 0,-0.223341 0.1829,-0.404297 0.40625,-0.404297 z"
+         id="rect7434"
          inkscape:connector-curvature="0"
-         id="path6945"
-         d="m 2691.4961,-577 c -1.4585,10e-6 -2.8611,0.57961 -3.877,1.63477 L 2673.293,-561 h 14.705 c 0.5523,-6e-5 0.9999,-0.44774 1,-1 v -10.5 c 0,-1.94484 1.5551,-3.5 3.5,-3.5 0.6573,-0.009 0.9864,-0.50465 0.9864,-1 z"
-         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+         sodipodi:nodetypes="sssssss" />
       <path
-         id="path6947"
-         style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
-         d="m 2691.4963,-576.50002 h 19.9969 c 0.5523,-3e-5 1,0.44769 1.0015,0.99998 l 0.01,41.00357 c 0,0.55581 -0.4477,1.00353 -1,1 h -37.0035 c -0.5559,0.004 -1.0036,-0.44419 -1,-1 v -24.00355"
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.20354147;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+         d="m 613.57935,62.45579 c -0.056,0.0012 -0.10057,0.04747 -0.0996,0.103516 v 2.867187 c -0.01,0.144644 0.21266,0.144644 0.20312,0 v -2.867187 c 9.9e-4,-0.05757 -0.0459,-0.104503 -0.10351,-0.103516 z m 0.60742,0 c -0.056,0.0012 -0.10057,0.04747 -0.0996,0.103516 v 2.867187 c -0.01,0.144644 0.21266,0.144644 0.20312,0 v -2.867187 c 9.9e-4,-0.05757 -0.0459,-0.104503 -0.10351,-0.103516 z m 0.60742,0 c -0.0568,1.15e-4 -0.10253,0.04671 -0.10156,0.103516 v 2.867187 c 0,0.136713 0.20507,0.136713 0.20507,0 v -2.867187 c 9.9e-4,-0.05757 -0.0459,-0.104503 -0.10351,-0.103516 z m 0.60742,0 c -0.0568,1.15e-4 -0.10253,0.04671 -0.10156,0.103516 v 2.867187 c -0.01,0.144644 0.21266,0.144644 0.20312,0 v -2.867187 c 9.7e-4,-0.0568 -0.0447,-0.103401 -0.10156,-0.103516 z m 0.60547,0 c -0.056,0.0012 -0.10057,0.04747 -0.0996,0.103516 v 2.867187 c -0.01,0.144644 0.21266,0.144644 0.20312,0 v -2.867187 c 9.9e-4,-0.05757 -0.0459,-0.104503 -0.10351,-0.103516 z"
+         id="path7444"
          inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cccccccc" />
+         sodipodi:nodetypes="ccccccccccccccccssccccccccccccccc" />
     </g>
     <g
-       id="g6955"
-       transform="translate(-1797.0001,855.00002)"
-       style="display:inline;opacity:0.6;enable-background:new">
+       transform="matrix(12.319682,0,0,12.172353,-5727.9739,-984.34032)"
+       id="g7322"
+       style="display:inline;stroke-width:0.12309717;enable-background:new">
       <path
-         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-         d="m 2691.4961,-577 c -1.4585,10e-6 -2.8611,0.57961 -3.877,1.63477 L 2673.293,-561 h 14.705 c 0.5523,-6e-5 0.9999,-0.44774 1,-1 v -10.5 c 0,-1.94484 1.5551,-3.5 3.5,-3.5 0.6573,-0.009 0.9864,-0.50465 0.9864,-1 z"
-         id="path6951"
+         style="display:inline;opacity:0.2;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.24619435;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
+         d="m 613.67414,61.612633 h 8.65173 c 0.57439,0 1.03681,0.46242 1.03681,1.036815 v 2.762566 c 0,0.574395 -0.46242,1.036815 -1.03681,1.036815 h -8.65173 c -0.57439,0 -1.03681,-0.46242 -1.03681,-1.036815 v -2.762566 c 0,-0.574395 0.46242,-1.036815 1.03681,-1.036815 z"
+         id="rect7418"
          inkscape:connector-curvature="0" />
       <path
-         sodipodi:nodetypes="cccccccc"
+         style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.41910744;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
+         d="M 145.24609,-711 C 139.56928,-711.01185 135,-706.4825 135,-700.87109 v 78 c 0,-5.61141 4.56928,-10.14076 10.24609,-10.12891 l 85.17749,0.17786 c 5.67681,0.0118 10.24609,4.5175 10.24609,10.12891 v -78 c 0,-5.61141 -4.56928,-10.11706 -10.24609,-10.12891 l -42.58875,-0.0889 z"
+         transform="matrix(0.10118267,0,0,0.10236222,598.97766,126.33073)"
+         id="rect7413"
          inkscape:connector-curvature="0"
-         d="m 2691.4963,-576.50002 h 19.9969 c 0.5523,-3e-5 1,0.44769 1.0015,0.99998 l 0.01,41.00357 c 0,0.55581 -0.4477,1.00353 -1,1 h -37.0035 c -0.5559,0.004 -1.0036,-0.44419 -1,-1 v -24.00355"
-         style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
-         id="path6953" />
-    </g>
-    <g
-       id="g6961"
-       transform="translate(-1653.0001,807.00002)"
-       style="display:inline;opacity:0.6;enable-background:new">
-      <path
-         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-         d="m 2691.4961,-577 c -1.4585,10e-6 -2.8611,0.57961 -3.877,1.63477 L 2673.293,-561 h 14.705 c 0.5523,-6e-5 0.9999,-0.44774 1,-1 v -10.5 c 0,-1.94484 1.5551,-3.5 3.5,-3.5 0.6573,-0.009 0.9864,-0.50465 0.9864,-1 z"
-         id="path6957"
-         inkscape:connector-curvature="0" />
+         sodipodi:nodetypes="sscsscsscs" />
       <path
-         sodipodi:nodetypes="cccccccc"
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+         d="m 717.48242,42.996094 c -5.24135,0 -9.49414,4.190752 -9.49414,9.355468 v 65.017578 22.26953 c 0,5.16472 4.25279,9.35547 9.49414,9.35547 h 70.02539 c 5.24136,0 9.49414,-4.19075 9.49414,-9.35547 V 117.36914 52.351562 c 0,-5.164716 -4.25278,-9.355468 -9.49414,-9.355468 z m 0,1.984375 h 70.02539 c 4.15996,0 7.48047,3.271903 7.48047,7.371093 v 59.269528 c -1.73801,-2.19271 -4.43984,-3.60742 -7.48047,-3.60742 h -70.02539 c -3.04062,0 -5.74244,1.41471 -7.48047,3.60742 V 52.351562 c 0,-4.09919 3.32052,-7.371093 7.48047,-7.371093 z m 0,65.017581 h 70.02539 c 4.15996,0 6.83699,3.09749 6.83699,7.19667 v 22.52459 c 0,4.09919 -2.48286,6.62487 -6.64282,6.62487 h -70.41379 c -4.15995,0 -6.64281,-2.52568 -6.64281,-6.62487 v -22.52459 c 0,-4.09918 2.67709,-7.19667 6.83704,-7.19667 z"
+         transform="matrix(0.12219364,0,0,0.1240074,526.00203,48.095825)"
+         id="rect7312"
          inkscape:connector-curvature="0"
-         d="m 2691.4963,-576.50002 h 19.9969 c 0.5523,-3e-5 1,0.44769 1.0015,0.99998 l 0.01,41.00357 c 0,0.55581 -0.4477,1.00353 -1,1 h -37.0035 c -0.5559,0.004 -1.0036,-0.44419 -1,-1 v -24.00355"
-         style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
-         id="path6959" />
+         sodipodi:nodetypes="sscsssscsssssscsscssssssssscs" />
+      <g
+         id="g7411"
+         transform="matrix(-1,0,0,1,1235.8994,0)"
+         style="stroke-width:0.12309717">
+        <path
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.12309717;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+           d="m 613.88871,62.499044 c -0.23599,0 -0.42773,0.193143 -0.42773,0.429687 v 0.0098 c 0,0.236544 0.19174,0.429687 0.42773,0.429687 0.23599,0 0.42774,-0.193143 0.42774,-0.429687 v -0.0098 c 0,-0.236544 -0.19175,-0.429687 -0.42774,-0.429687 z"
+           id="rect7316"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="sssssss" />
+        <g
+           transform="translate(6.2733256)"
+           id="g7368"
+           style="display:inline;stroke-width:0.12309717;enable-background:new">
+          <path
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.24619435;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+             d="m 613.40672,62.503838 c -0.0633,0.0071 -0.11074,0.06131 -0.10937,0.125 V 65.4804 c 0,0.165367 0.24805,0.165367 0.24805,0 v -2.851562 c 0.002,-0.07532 -0.0639,-0.13455 -0.13868,-0.125 z m 0.64679,10e-7 c -0.0633,0.0071 -0.11074,0.06131 -0.10937,0.125 V 65.4804 c -0.005,0.169458 0.25158,0.169458 0.24609,0 v -2.851562 c 0.002,-0.07444 -0.0627,-0.133249 -0.13672,-0.124999 z m 0.64937,10e-7 c -0.0633,0.0071 -0.11074,0.06131 -0.10937,0.125 v 2.85156 c -0.005,0.169458 0.25158,0.169458 0.24609,0 v -2.851562 c 0.002,-0.07444 -0.0627,-0.133249 -0.13672,-0.124998 z m 0.65195,1e-6 c -0.0633,0.0071 -0.11075,0.06131 -0.10938,0.125 v 2.85156 c -0.005,0.169247 0.25137,0.169247 0.2461,0 v -2.851562 c 0.002,-0.07444 -0.0627,-0.133249 -0.13672,-0.124998 z m 0.64937,-3e-6 c -0.0633,0.0071 -0.11075,0.06131 -0.10938,0.125 V 65.4804 c -0.005,0.169248 0.25136,0.169248 0.2461,0 v -2.851563 c 0.002,-0.07444 -0.0627,-0.133249 -0.13672,-0.124999 z"
+             id="path7359"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccsscccccccccccccccccccccccccc" />
+        </g>
+      </g>
     </g>
     <g
-       style="display:inline;opacity:0.6;enable-background:new"
-       transform="translate(-1701.0001,807.00002)"
-       id="g6967">
+       id="g7565"
+       transform="matrix(1.4994746,0,0,1.4999989,314.92923,431.89982)">
       <path
+         id="path28027-5"
+         transform="translate(294.00001,-553.00001)"
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.00098109;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+         d="m 816.43612,111.73314 c 0,0.5515 0.7823,1.33328 1.3338,1.33333 h 10.0035 c 0.5538,-5e-5 1.3359,-0.77955 1.3338,-1.33333 v -8.00001 c -0.0108,-2.92338 -2.53774,-5.20733 -5.3352,-5.666667 l 3e-5,-63.33338 c -9e-4,-7.597621 -6.34645,-13.676694 -14.00685,-13.666674 l -44.01737,-3e-6 c -7.9872,0.0106 -13.99805,6.01116 -13.99805,14 v 9 l 2.07069,-0.06546 v -9 c 0,-7.01107 4.91866,-11.925191 11.93126,-11.934541 l 44.01542,3e-6 c 6.5948,-0.009 12.0041,5.153493 12.0049,11.666674 l -3e-5,63.331427 c -2.80192,0.45829 -5.33501,2.738541 -5.3359,5.668621 z m 2.0007,2.66667 v 5.33334 c 6e-5,0.55226 0.78364,1.33327 1.3359,1.33333 h 6 c 0.55226,-6e-5 1.33374,-0.78107 1.3338,-1.33333 v -5.33334 h -2.0007 v 4.66667 h -4.6683 v -4.66667 z"
          inkscape:connector-curvature="0"
-         id="path6963"
-         d="m 2691.4961,-577 c -1.4585,10e-6 -2.8611,0.57961 -3.877,1.63477 L 2673.293,-561 h 14.705 c 0.5523,-6e-5 0.9999,-0.44774 1,-1 v -10.5 c 0,-1.94484 1.5551,-3.5 3.5,-3.5 0.6573,-0.009 0.9864,-0.50465 0.9864,-1 z"
-         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
-      <path
-         id="path6965"
-         style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
-         d="m 2691.4963,-576.50002 h 19.9969 c 0.5523,-3e-5 1,0.44769 1.0015,0.99998 l 0.01,41.00357 c 0,0.55581 -0.4477,1.00353 -1,1 h -37.0035 c -0.5559,0.004 -1.0036,-0.44419 -1,-1 v -24.00355"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cccccccc" />
+         sodipodi:nodetypes="cccccccccsccsccccccccccccccccc" />
     </g>
     <g
-       id="g6973"
-       transform="translate(-1749.0047,806.99644)"
-       style="display:inline;opacity:0.6;enable-background:new">
+       id="g7749"
+       transform="matrix(1.4998278,0,0,1.4999989,-448.32862,-37.50017)"
+       style="display:inline;opacity:1;enable-background:new">
       <path
-         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-         d="m 2691.4961,-577 c -1.4585,10e-6 -2.8611,0.57961 -3.877,1.63477 L 2673.293,-561 h 14.705 c 0.5523,-6e-5 0.9999,-0.44774 1,-1 v -10.5 c 0,-1.94484 1.5551,-3.5 3.5,-3.5 0.6573,-0.009 0.9864,-0.50465 0.9864,-1 z"
-         id="path6969"
+         sodipodi:nodetypes="sssssssss"
+         id="path7747"
+         d="m 998.5,-179 h 121 c 1.385,0 2.5,1.115 2.5,2.5 v 66 c 0,1.385 -1.115,2.5 -2.5,2.5 h -121 c -1.385,0 -2.5,-1.115 -2.5,-2.5 v -66 c 0,-1.385 1.115,-2.5 2.5,-2.5 z"
+         style="opacity:0.2;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:105.70774078;stroke-opacity:1;marker:none;paint-order:fill markers stroke"
          inkscape:connector-curvature="0" />
       <path
-         sodipodi:nodetypes="cccccccc"
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:105.70774078;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         d="m 195.5,38 c -1.94642,0 -3.5,1.60898 -3.5,3.5 v 89 c 0,1.9217 1.5783,3.5 3.5,3.5 h 121 c 1.9217,0 3.5,-1.5783 3.5,-3.5 l 0.0147,-78.333361 c 0,-1.9217 -1.5783,-3.5 -3.5,-3.5 h -77 c -0.3983,10e-6 -0.77905,-0.157923 -1.06055,-0.439453 -0.2816,-0.2816 -0.43841,-0.662348 -0.43945,-1.060547 L 238,41.5 C 237.995,39.578306 236.4217,38 234.5,38 Z m -0.83305,27.333318 c 0,-0.8551 0.48518,-1.333334 1.33348,-1.333334 h 120.01378 c 0.8483,0 1.33349,0.485033 1.33349,1.333334 v 64.666712 c 0,0.84831 -0.48519,1.33334 -1.33349,1.33334 l -120.01378,0 c -0.8483,0 -1.33783,-0.48505 -1.33348,-1.33334"
+         transform="translate(803,-241)"
+         id="path7743"
          inkscape:connector-curvature="0"
-         d="m 2691.4963,-576.50002 h 19.9969 c 0.5523,-3e-5 1,0.44769 1.0015,0.99998 l 0.01,41.00357 c 0,0.55581 -0.4477,1.00353 -1,1 h -37.0035 c -0.5559,0.004 -1.0036,-0.44419 -1,-1 v -24.00355"
-         style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
-         id="path6971" />
+         sodipodi:nodetypes="sccssccsccsssscssssssc" />
     </g>
     <g
        style="display:inline;opacity:0.6;enable-background:new"
-       transform="translate(-1797.0001,807.00002)"
-       id="g6979">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6975"
-         d="m 2691.4961,-577 c -1.4585,10e-6 -2.8611,0.57961 -3.877,1.63477 L 2673.293,-561 h 14.705 c 0.5523,-6e-5 0.9999,-0.44774 1,-1 v -10.5 c 0,-1.94484 1.5551,-3.5 3.5,-3.5 0.6573,-0.009 0.9864,-0.50465 0.9864,-1 z"
-         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
-      <path
-         id="path6977"
-         style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
-         d="m 2691.4963,-576.50002 h 19.9969 c 0.5523,-3e-5 1,0.44769 1.0015,0.99998 l 0.01,41.00357 c 0,0.55581 -0.4477,1.00353 -1,1 h -37.0035 c -0.5559,0.004 -1.0036,-0.44419 -1,-1 v -24.00355"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cccccccc" />
-    </g>
-    <g
-       transform="translate(810,316.5)"
-       style="display:inline;enable-background:new"
-       id="g72880" />
-    <g
-       id="g3789">
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 996,189 v 0.75 h -1 v 3.5 h 1 V 194 h 2 v -1 -1.25 h -1 V 193 h -1 v -3 h 2 v -1 z"
-         id="path72434" />
-      <rect
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         id="rect72436"
-         width="1"
-         height="5"
-         x="1029"
-         y="189" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 954,189 v 4 h -1 v -1 h -1 v 1 h 0.75 v 1 h 1.5 v -1 H 955 v -4 z"
-         id="path72438" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 999,189 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z"
-         id="path72440" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 975,189 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z"
-         id="path72442" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 940,189 v 0.75 h -1 v 1.5 h 1 V 192 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 191 h -1 v -1 h 1.5 v -1 z"
-         id="path72446" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 964,189 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z"
-         id="path72448" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 943,189 v 4.25 h 1 V 194 h 2 v -0.75 h 1 V 189 h -1 v 4 h -2 v -4 z"
-         id="path72450" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 948,189 v 5 h 1 1 v -0.5 h 1 V 192 h -0.75 v -1 H 951 v -1.25 h -1 V 189 h -1 z m 1,1 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z"
-         id="path72452" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 961,189 v 0.75 h -1 v 3.5 h 1 V 194 h 2 v -1 h -2 v -3 h 2 v -1 z"
-         id="path72454" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 956,189 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z"
-         id="path72456" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path72458"
-         d="m 1019,189 v 5 h 1 2 v -1 h -2 v -4 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6" />
-      <path
-         id="path72460"
-         d="m 970,189 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 981,189 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z"
-         id="path72462" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 985,189 v 5 h 1 v -2 h 1 v 2 h 1 v -5 h -1 v 2 h -1 v -2 z"
-         id="path72464" />
-      <path
-         id="path72466"
-         d="m 989,189 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72468"
-         d="m 1004,189 v 4.25 h 1 V 194 h 2 v -0.75 h 1 V 189 h -1 v 4 h -2 v -4 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72470"
-         d="m 1012,189 v 0.75 h -1 v 3.5 h 1 V 194 h 2 v -1 -1.25 h -1 V 193 h -1 v -3 h 2 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1015,189 v 5 h 1 v -2 h 1.25 v -1 h 0.75 v -1.25 h -1 V 189 h -1 z m 1,1 h 1 v 1 h -1 z"
-         id="path72472" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1025,189 v 5 h 1 2 v -1 h -2 v -4 z"
-         id="path72474"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72476"
-         d="m 1032,189 v 0.75 h -1 v 3.5 h 1 V 194 h 2 v -1 h -2 v -3 h 2 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1035,189 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z"
-         id="path72478" />
-      <path
-         id="path72480"
-         d="m 1039,189 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72482"
-         d="m 1045,189 v 0.75 h -1 v 3.5 h 1 V 194 h 2 v -1 h -2 v -3 h 2 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72484"
-         d="m 1048,189 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1052.75,193 v 1 H 1052 v 1 h 1 v -1 h 1 v -1 z"
-         id="path72486" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 882,189 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z"
-         id="path32008-7"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 886,189 v 5 h 1 v -2 h 1 v 2 h 1 v -5 h -1 v 2 h -1 v -2 z"
-         id="path32010-4"
-         inkscape:connector-curvature="0" />
-      <rect
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         id="rect32012-0"
-         width="1"
-         height="5"
-         x="890"
-         y="189" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 893,189 v 0.75 h -1 v 1.5 h 1 V 192 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 191 h -1 v -1 h 1.5 v -1 z"
-         id="path32015-9"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 899,189 v 0.75 h -1 v 3.5 h 1 V 194 h 2 v -1 h -2 v -3 h 2 v -1 z"
-         id="path32017-4"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 907,189 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z"
-         id="path32019-8"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 903,189 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z"
-         id="path32021-8"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 912,189 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z"
-         id="path32023-2"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 916,189 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z"
-         id="path32026-4"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path32029-5"
-         d="m 920,189 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path32031-5"
-         d="m 925,189 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <rect
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         id="rect32033-1"
-         width="1"
-         height="5"
-         x="931"
-         y="189" />
-      <path
-         id="path32035-7"
-         d="m 934,189 v 0.75 h -1 v 1.5 h 1 V 192 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 191 h -1 v -1 h 1.5 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 888,197 v 5 h 1 v -2 h 1 v 2 h 1 v -5 h -1 v 2 h -1 v -2 z"
-         id="path72562" />
-      <rect
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         id="rect72564"
-         width="1"
-         height="5"
-         x="892"
-         y="197" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 882,197 v 3.25 h 1 V 202 h 1 v -1.75 h 1 V 202 h 1 v -1.75 h 1 V 197 h -1 v 3 h -1 v -2 h -1 v 2 h -1 v -3 z"
-         id="path72576" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 940,197 v 2.25 h 1 V 202 h 1 v -2.75 h 1 V 197 h -1 v 2 h -1 v -2 z"
-         id="path72578" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 904.75,197 v 1 H 904 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z"
-         id="path72580" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 895,197 v 0.75 h -1 v 3.5 h 1 V 202 h 2 v -1 h -2 v -3 h 2 v -1 z"
-         id="path72582" />
-      <path
-         id="path72588"
-         d="m 898,197 v 5 h 1 v -2 h 1 v 2 h 1 v -5 h -1 v 2 h -1 v -2 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72590"
-         d="m 909,197 v 0.75 h -1 v 3.5 h 1 V 202 h 2 v -1 h -2 v -3 h 2 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 913,197 v 0.75 h -1 v 3.5 h 1 V 202 h 2 v -1 h -2 v -3 h 2 v -1 z"
-         id="path72592" />
-      <path
-         id="path72594"
-         d="m 917,197 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 921,197 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 h -1 v 1 h -1 z"
-         id="path72596" />
-      <path
-         id="path72598"
-         d="m 927,197 v 5 h 1 v -2 h 1.25 v -1 H 930 v -1.25 h -1 V 197 h -1 z m 1,1 h 1 v 1 h -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72600"
-         d="m 931.75,197 v 1 H 931 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72602"
-         d="m 935,197 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <rect
-         y="197"
-         x="946"
-         height="5"
-         width="1"
-         id="rect72604"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6" />
-      <path
-         id="path72606"
-         d="m 948,197 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72608"
-         d="m 954.75,197 v 1 H 954 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 958,197 v 5 h 1 2 v -1 h -2 v -4 z"
-         id="path72610"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72612"
-         d="m 963,197 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72614"
-         d="m 967,197 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72616"
-         d="m 973,197 v 0.75 h -1 v 3.5 h 1 V 202 h 2 v -1 -1.25 h -1 V 201 h -1 v -3 h 2 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <rect
-         y="197"
-         x="984"
-         height="5"
-         width="1"
-         id="rect72618"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6" />
-      <path
-         id="path72620"
-         d="m 978,197 v 3.25 h 1 V 202 h 1 v -1.75 h 1 V 202 h 1 v -1.75 h 1 V 197 h -1 v 3 h -1 v -2 h -1 v 2 h -1 v -3 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         inkscape:connector-curvature="0" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 990,197 v 5 h 1 v -2 h 1 v 2 h 1 v -5 h -1 v 2 h -1 v -2 z"
-         id="path72622" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 986,197 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z"
-         id="path72624" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 997,197 v 0.75 h -1 v 3.5 h 1 V 202 h 2 v -1 h -2 v -3 h 2 v -1 z"
-         id="path32207-9-7"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1001,197 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z"
-         id="path32209-6-7"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1005,197 v 5 h 1 v -2 h 1.25 v -1 h 0.75 v -1.25 h -1 V 197 h -1 z m 1,1 h 1 v 1 h -1 z"
-         id="path32211-3-7"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1009,197 v 2.25 h 1 V 202 h 1 v -2.75 h 1 V 197 h -1 v 2 h -1 v -2 z"
-         id="path32213-7-3"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1013,197 v 5 h 1 v -2 h 1 v 2 h 1 v -2 h -0.75 v -1 h 0.75 v -1.25 h -1 V 197 h -1 z m 1,1 h 1 v 1 h -1 z"
-         id="path32216-8-3"
-         inkscape:connector-curvature="0" />
-      <rect
-         y="197"
-         x="1017"
-         height="5"
-         width="1"
-         id="rect32218-8-5"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1020,197 v 0.75 h -1 v 3.5 h 1 V 202 h 2 v -1 -1.25 h -1 V 201 h -1 v -3 h 2 v -1 z"
-         id="path32220-2-9"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1023,197 v 5 h 1 v -2 h 1 v 2 h 1 v -5 h -1 v 2 h -1 v -2 z"
-         id="path32222-9-9"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1027,197 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z"
-         id="path32224-1-8"
-         inkscape:connector-curvature="0" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1035,197 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z"
-         id="path72678" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path72680"
-         d="m 1045,197 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6" />
-      <rect
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         id="rect72682"
-         width="1"
-         height="5"
-         x="1033"
-         y="197" />
-      <rect
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         id="rect72684"
-         width="1"
-         height="1"
-         x="1049"
-         y="201" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate;opacity:0.6"
-         d="m 1040,197 v 5 h 1 v -2 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z"
-         id="path72686" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 1028.75,209 v 1 H 1028 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z"
-         id="path32244-2" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 1032,209 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 h -1 v 1 h -1 z"
-         id="path32246-0" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 1038,209 v 5 h 1 1 v -0.5 h 1 V 212 h -0.75 v -1 h 0.75 v -1.25 h -1 V 209 h -1 z m 1,1 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z"
-         id="path32248-9" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 1042,209 v 5 h 1 v -2 h 1 v 2 h 1 v -2 h -0.75 v -1 h 0.75 v -1.25 h -1 V 209 h -1 z m 1,1 h 1 v 1 h -1 z"
-         id="path32250-7" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 1047,209 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z"
-         id="path32252-3" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 1051,209 v 1 h 2 v 1 h 1 v -1 -1 z m 2,2 h -1 v 1 h 1 z m -1,1 h -1 v 1 1 h 3 v -1 h -2 z"
-         id="path32254-7" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 997.75,209 v 1 H 997 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z"
-         id="path32256-2" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path32258-6"
-         d="m 1001,209 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
+       transform="matrix(1.5,0,0,1.4999989,-192.5,-37.50017)"
+       id="g7067">
       <path
          inkscape:connector-curvature="0"
-         id="path32260-0"
-         d="m 1006,209 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 209 Z m 1,1 h 1 v 3 h -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
+         style="opacity:0.2;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:105.70774078;stroke-opacity:1;marker:none;paint-order:fill markers stroke"
+         d="m 998.5,-179 h 121 c 1.385,0 2.5,1.115 2.5,2.5 v 66 c 0,1.385 -1.115,2.5 -2.5,2.5 h -121 c -1.385,0 -2.5,-1.115 -2.5,-2.5 v -66 c 0,-1.385 1.115,-2.5 2.5,-2.5 z"
+         id="path7065"
+         sodipodi:nodetypes="sssssssss" />
       <path
+         sodipodi:nodetypes="sccssccsccsssscssssssc"
          inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 1010,209 v 5 h 1 v -2 h 1 v 2 h 1 v -2 h -0.75 v -1 h 0.75 v -1.25 h -1 V 209 h -1 z m 1,1 h 1 v 1 h -1 z"
-         id="path32262-1" />
+         id="path7063"
+         transform="translate(803,-241)"
+         d="m 195.5,38 c -1.94642,0 -3.5,1.60898 -3.5,3.5 v 89 c 0,1.9217 1.5783,3.5 3.5,3.5 h 121 c 1.9217,0 3.5,-1.5783 3.5,-3.5 l -0.0147,-78.333361 c 0,-1.9217 -1.5783,-3.5 -3.5,-3.5 h -77 c -0.3983,10e-6 -0.77905,-0.157923 -1.06055,-0.439453 -0.2816,-0.2816 -0.44049,-0.662348 -0.43945,-1.060547 L 238,41.5 c 0.005,-1.921694 -1.5783,-3.5 -3.5,-3.5 z m -0.83333,27.333318 c 0,-0.8551 0.48503,-1.333334 1.33333,-1.333334 l 120,0 c 0.8483,0 1.33333,0.485034 1.33333,1.333334 v 64.666712 c 0,0.8483 -0.48503,1.33334 -1.33333,1.33334 l -120,0 c -0.8483,0 -1.33771,-0.48505 -1.33333,-1.33334"
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:105.70774078;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
       <path
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.98361349;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+         d="m 1059.6667,-155 7.2318,7.13082 c 2.8203,2.82167 7.0528,-1.4088 4.2325,-4.23047 l -12.0157,-12.01562 c -0.5714,-0.57187 -1.3499,-0.88819 -2.1582,-0.87696 l -10e-5,4e-5 c -0.7802,0.0111 -1.5251,0.32646 -2.0761,0.87891 l -11.9844,12.01758 c -2.9422,2.82368 1.4208,7.17459 4.2363,4.22461 L 1054.3333,-155 v 22.00002 c 0,4.42612 3.2913,8.00779 7.6802,8.00779 h 12 c 4.0871,0.10004 4.4069,-5.44117 0.3198,-5.34113 h -12 c -0.9323,0 -2.6654,-1.70279 -2.6666,-2.66666 z"
+         id="path15797-7"
          inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 1014,209 v 1 h 2 v 1 h 1 v -1 -1 z m 2,2 h -1 v 1 h 1 z m -1,1 h -1 v 1 1 h 3 v -1 h -2 z"
-         id="path32264-6" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path32266-5"
-         d="m 1018,209 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
+         sodipodi:nodetypes="cccccccccccsccscc" />
+    </g>
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.99947333;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 2238.2815,-365.92073 c -5.52,0.36326 -8.7584,3.47967 -8.7584,8.43246 0,4.43345 3.2458,8.13054 7.4769,8.85937 V -335 c 0,9.91268 -7.251,17.99291 -17,18 l -15.3901,0.0264 v 2.96484 H 2220 c 11.4103,-0.008 20.0341,-9.52115 20.0341,-20.99121 v -13.6289 c 4.2339,-0.72648 7.4827,-4.42393 7.4827,-8.85937 0,-4.95279 -3.4428,-8.31926 -9.2353,-8.43249 z m 0.406,2.98323 c 3.3303,0 5.8304,2.11776 5.8304,5.44923 0,3.33147 -2.6676,6 -5.9979,6 -3.3304,0 -5.9979,-2.66853 -5.9979,-6 0,-3.33147 2.835,-5.44923 6.1654,-5.44923 z M 2247,-291 c -4.4432,-10e-6 -8.6177,3.4839 -9,7 h -34 l 1,4 h 33 c 0.7202,4.24251 4.561,7.00001 9,7 4.9511,10e-6 9,-4.04722 9,-9 0,-4.95279 -4.0489,-9.00001 -9,-9 z m 0,3 c 3.3304,0 6,2.66853 6,6 0,3.33146 -2.6696,6 -6,6 -3.3303,0 -6,-2.66854 -6,-6 0,-3.33147 2.6697,-6 6,-6 z m -42,37 v 4 h 15 c 9.749,0.007 17,8.08732 17,18 v 13 c -4.2311,0.72882 -7.0144,4.57086 -7.0144,9.00433 0,4.9528 4.0457,9.00001 8.9969,8.99999 4.9511,2e-5 8.9968,-4.04719 8.9968,-8.99999 0,-4.43545 -2.7454,-8.27785 -6.9793,-9.00433 v -14 c 0,-11.47007 -9.5897,-20.99166 -21,-21 z m 33.9825,38.00433 c 3.3303,0 5.9979,2.66852 5.9979,6 0,3.33148 -2.6676,6 -5.9979,6 -3.3304,0 -5.9979,-2.66852 -5.9979,-6 0,-3.33148 2.6675,-6 5.9979,-6 z"
+       id="circle7536"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cscsccccscscscsssccccccscscssscscscscscsccsssss" />
+    <g
+       transform="matrix(12.319682,0,0,12.172353,-5471.9739,-984.3403)"
+       id="g7322-0"
+       style="display:inline;stroke-width:0.12309717;enable-background:new">
       <path
          inkscape:connector-curvature="0"
-         id="path32268-7"
-         d="m 1024,209 v 4 h -1 v -1 h -1 v 1 h 0.75 v 1 h 1.5 v -1 h 0.75 v -4 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
-      <rect
-         y="207"
-         x="1052"
-         height="1"
-         width="1"
-         id="rect32270-5"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
+         style="display:inline;opacity:0.2;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.24619435;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
+         d="m 613.67414,61.612633 h 8.65173 c 0.57439,0 1.03681,0.46242 1.03681,1.036815 v 2.762566 c 0,0.574395 -0.46242,1.036815 -1.03681,1.036815 h -8.65173 c -0.57439,0 -1.03681,-0.46242 -1.03681,-1.036815 v -2.762566 c 0,-0.574395 0.46242,-1.036815 1.03681,-1.036815 z"
+         id="rect7418-6" />
       <path
+         style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.41910744;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"
+         d="M 145.24609,-711 C 139.56928,-711.01185 135,-706.4825 135,-700.87109 v 78 c 0,-5.61141 4.56928,-10.14076 10.24609,-10.12891 l 85.17749,0.17786 c 5.67681,0.0118 10.24609,4.5175 10.24609,10.12891 v -78 c 0,-5.61141 -4.56928,-10.11706 -10.24609,-10.12891 l -42.58875,-0.0889 z"
+         transform="matrix(0.10118267,0,0,0.10236222,598.97766,126.33073)"
+         id="rect7413-9"
          inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 969.96875,208 v 0.75 h -1 V 209 h -0.25 v 1 h -0.75 v 3 h 0.75 v 1 h 0.25 v 0.25 h 1 V 215 h 3 v -0.75 h 1 V 214 h 0.25 v -1 h 0.75 v -3 h -0.75 v -1 h -0.25 v -0.25 h -1 V 208 Z m 0,1 h 3 v 1 h 1 v 3 h -1 v 1 h -3 v -1 h -1 v -3 h 1 z"
-         id="path32272-1"
-         sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccc" />
+         sodipodi:nodetypes="sscsscsscs" />
       <path
          inkscape:connector-curvature="0"
-         id="path32274-2"
-         d="m 970.96875,210 v 0.75 h -1 v 1.5 h 1 V 213 h 1.25 v -1 h -1.25 v -1 h 1.25 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         sodipodi:nodetypes="ccccccccccccc" />
-      <path
-         id="path72688"
-         d="m 981.71875,209 v 1 h -0.75 v 3 h 0.75 v 1 h 1.5 v -1 h 0.75 v -3 h -0.75 v -1 z m 0.25,1 h 1 v 3 h -1 z m 0.25,1 v 1 h 0.5 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path72690"
-         d="m 985.96875,209 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         inkscape:connector-curvature="0" />
-      <path
-         inkscape:connector-curvature="0"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 976.96875,209 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 V 209 Z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z"
-         id="path72694" />
-      <path
-         id="path72696"
-         d="m 992.96875,210 v 1 h 1 v -1 z m -0.21875,3 v 1 H 992 v 1 h 1 v -1 h 1 v -1 z"
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         inkscape:connector-curvature="0" />
-      <path
-         style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
-         d="m 988.75,209 v 1 h -0.5 v 1 h 0.5 v 1 H 988 v 1 h 0.75 v 1 h 1.5 v -1 H 991 v -1 h -0.75 v -1 h 0.5 v -1 h -0.5 v -1 z m 0.25,1 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z"
-         id="path19551-18-1"
-         inkscape:connector-curvature="0" />
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.00080741;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+         d="m 717.48242,42.996094 c -5.24135,0 -9.49414,4.190752 -9.49414,9.355468 v 65.017578 22.26953 c 0,5.16472 4.25279,9.35547 9.49414,9.35547 h 70.02539 c 5.24136,0 9.49414,-4.19075 9.49414,-9.35547 V 117.36914 52.351562 c 0,-5.164716 -4.25278,-9.355468 -9.49414,-9.355468 z m 0,1.984375 h 70.02539 c 4.15996,0 7.48047,3.271903 7.48047,7.371093 v 59.269528 c -1.73801,-2.19271 -4.43984,-3.60742 -7.48047,-3.60742 h -70.02539 c -3.04062,0 -5.74244,1.41471 -7.48047,3.60742 V 52.351562 c 0,-4.09919 3.32052,-7.371093 7.48047,-7.371093 z m 0,65.017581 h 70.02539 c 4.15996,0 6.83699,3.09748 6.83699,7.19666 v 22.52458 c 0,4.09919 -3.14714,6.62488 -7.3071,6.62488 h -69.74951 c -4.15995,0 -6.64281,-2.52569 -6.64281,-6.62488 v -22.52458 c 0,-4.09918 2.67709,-7.19666 6.83704,-7.19666 z"
+         transform="matrix(0.12219364,0,0,0.1240074,526.00203,48.095825)"
+         id="rect7312-4"
+         sodipodi:nodetypes="sscsssscsssssscsscssssssssscs" />
+      <g
+         id="g7411-1"
+         transform="matrix(-1,0,0,1,1235.8994,0)"
+         style="stroke-width:0.12309717">
+        <path
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.12309717;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+           d="m 613.88871,62.499042 c -0.23599,0 -0.42773,0.193143 -0.42773,0.429687 v 0.0098 c 0,0.236544 0.19174,0.429687 0.42773,0.429687 0.23599,0 0.42774,-0.193143 0.42774,-0.429687 v -0.0098 c 0,-0.236544 -0.19175,-0.429687 -0.42774,-0.429687 z"
+           id="rect7316-4"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="sssssss" />
+        <g
+           transform="translate(6.2733256)"
+           id="g7368-5"
+           style="display:inline;stroke-width:0.12309717;enable-background:new">
+          <path
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.24619435;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
+             d="m 613.40672,62.503836 c -0.0633,0.0071 -0.11074,0.06131 -0.10937,0.125 v 2.851562 c 0,0.165367 0.24805,0.165367 0.24805,0 v -2.851562 c 0.002,-0.07532 -0.0639,-0.13455 -0.13868,-0.125 z m 0.64937,3e-6 c -0.0633,0.0071 -0.11074,0.06131 -0.10937,0.125 v 2.851562 c -0.005,0.169458 0.25158,0.169458 0.24609,0 v -2.851562 c 0.002,-0.07444 -0.0627,-0.133249 -0.13672,-0.125 z m 0.64936,3e-6 c -0.0633,0.0071 -0.11074,0.06131 -0.10937,0.125 v 2.851562 c -0.005,0.169458 0.25158,0.169458 0.24609,0 v -2.851562 c 0.002,-0.07444 -0.0627,-0.133249 -0.13672,-0.125 z m 0.64938,3e-6 c -0.0633,0.0071 -0.11075,0.06131 -0.10938,0.125 v 2.851562 c -0.005,0.169248 0.25136,0.169248 0.2461,0 v -2.851562 c 0.002,-0.07444 -0.0627,-0.133249 -0.13672,-0.125 z m 0.64937,-9e-6 c -0.0633,0.0071 -0.11075,0.06131 -0.10938,0.125 v 2.851562 c -0.005,0.169248 0.25136,0.169248 0.2461,0 v -2.851562 c 0.002,-0.07444 -0.0627,-0.133249 -0.13672,-0.125 z"
+             id="path7359-7"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccsscccccccccccccccccccccccccc" />
+        </g>
+      </g>
     </g>
   </g>
 </svg>
old mode 100755 (executable)
new mode 100644 (file)
index bc170b9..96306f0
@@ -1,23 +1,25 @@
-#!/usr/bin/env python3
-
-# This script updates icons from the SVG file
-import os
-import subprocess
-import sys
-
-BASEDIR = os.path.abspath(os.path.dirname(__file__))
-
-inkscape_path = 'inkscape'
-
-if sys.platform == 'darwin':
-    inkscape_app_path = '/Applications/Inkscape.app/Contents/Resources/script'
-    if os.path.exists(inkscape_app_path):
-        inkscape_path = inkscape_app_path
-
-cmd = (
-    inkscape_path,
-    os.path.join(BASEDIR, "prvicons.svg"),
-    "--without-gui",
-    "--export-png=" + os.path.join(BASEDIR, "prvicons.png"),
-)
-subprocess.check_call(cmd)
+#!/usr/bin/env python3\r
+\r
+# This script updates icons from the SVG file\r
+import os\r
+import subprocess\r
+import sys\r
+\r
+BASEDIR = os.path.abspath(os.path.dirname(__file__))\r
+\r
+inkscape_path = 'inkscape'\r
+\r
+if sys.platform == 'darwin':\r
+    inkscape_app_path = '/Applications/Inkscape.app/Contents/Resources/script'\r
+    if os.path.exists(inkscape_app_path):\r
+        inkscape_path = inkscape_app_path\r
+\r
+cmd = (\r
+    inkscape_path,\r
+    os.path.join(BASEDIR, "prvicons.svg"),\r
+    "--export-width=1536",\r
+    "--export-height=256",\r
+    "--without-gui",\r
+    "--export-png=" + os.path.join(BASEDIR, "prvicons.png"),\r
+)\r
+subprocess.check_call(cmd)\r
index 9f037fa4793a0b5335d3a880673b5526c5a6bef6..e9a855176474ad054c66e88dcbd9a013a3309d93 100644 (file)
@@ -370,7 +370,7 @@ const bTheme U_theme_default = {
     .paint_curve_handle = RGBA(0x7fff7f7f),
   },
   .space_file = {
-    .back = RGBA(0x35353500),
+    .back = RGBA(0x33333300),
     .title = RGBA(0xffffffff),
     .text = RGBA(0xe6e6e6ff),
     .text_hi = RGBA(0xffffffff),
@@ -381,13 +381,14 @@ const bTheme U_theme_default = {
     .tab_inactive = RGBA(0x2b2b2bff),
     .tab_back = RGBA(0x232323ff),
     .tab_outline = RGBA(0x232323ff),
-    .button = RGBA(0x424242ff),
+    .button = RGBA(0x4b4b4bff),
     .button_title = RGBA(0xffffffff),
     .button_text = RGBA(0xe5e5e5ff),
     .button_text_hi = RGBA(0xffffffff),
+    .execution_buts = RGBA(0x444444ff),
     .panelcolors = {
-      .header = RGBA(0x424242cc),
-      .back = RGBA(0x333333b3),
+      .header = RGBA(0x4b4b4bff),
+      .back = RGBA(0x404040ff),
       .sub_back = RGBA(0x0000003e),
     },
     .hilite = RGBA(0x4f76b3ff),
index ae2d2952f856ac64f7e65d8a16acc9337c87a87f..7cbea843ae821038528d08ba2afb5b1ea6a1c859 100644 (file)
@@ -1771,6 +1771,11 @@ def km_file_browser(_params):
     )
 
     items.extend([
+        *_template_space_region_type_toggle(
+            toolbar_key={"type": 'T', "value": 'PRESS'},
+        ),
+        ("screen.region_toggle", {"type": 'N', "value": 'PRESS'},
+         {"properties": [("region_type", 'TOOL_PROPS')]}),
         ("file.parent", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True}, None),
         ("file.previous", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True}, None),
         ("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True}, None),
@@ -1782,7 +1787,6 @@ def km_file_browser(_params):
          {"properties": [("data_path", 'space_data.params.show_hidden')]}),
         ("file.directory_new", {"type": 'I', "value": 'PRESS'}, None),
         ("file.smoothscroll", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
-        ("file.bookmark_toggle", {"type": 'T', "value": 'PRESS'}, None),
         ("file.bookmark_add", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
     ])
 
@@ -1801,17 +1805,13 @@ def km_file_browser_main(params):
         ("file.execute", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
          {"properties": [("need_active", True)]}),
         ("file.refresh", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
-        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'}, None),
-        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
+        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'},
+         {"properties": [("open", False)]}),
+        ("file.select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
+        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
          {"properties": [("extend", True)]}),
-        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True},
+        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
          {"properties": [("extend", True), ("fill", True)]}),
-        ("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK'},
-         {"properties": [("open", False)]}),
-        ("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK', "shift": True},
-         {"properties": [("extend", True), ("open", False)]}),
-        ("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK', "alt": True},
-         {"properties": [("extend", True), ("fill", True), ("open", False)]}),
         ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS'},
          {"properties": [("direction", 'UP')]}),
         ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
@@ -1843,8 +1843,11 @@ def km_file_browser_main(params):
         ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
         ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True},
          {"properties": [("mode", 'ADD')]}),
-        ("file.rename", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
+        ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True},
+         {"properties": [("mode", 'SUB')]}),
         ("file.highlight", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
+        ("file.sort_column_ui_context", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+        op_menu("FILEBROWSER_MT_context_menu", params.context_menu_event),
         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
          {"properties": [("increment", 1)]}),
         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
index 20f496adea9d1fa580352d26c0a8f1851cf49174..1125ddb3d8c8c28a635d04f7e9499ecc6e762585 100644 (file)
@@ -1196,10 +1196,11 @@ def km_file_browser_main(params):
         ("file.execute", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
          {"properties": [("need_active", True)]}),
         ("file.refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
-        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'}, None),
-        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
+        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'},
+         {"properties": [("open", False)]}),
+        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
          {"properties": [("extend", True)]}),
-        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True},
+        ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True,},
          {"properties": [("extend", True), ("fill", True)]}),
         ("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK'},
          {"properties": [("open", False)]}),
@@ -1239,6 +1240,8 @@ def km_file_browser_main(params):
         ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True},
          {"properties": [("mode", 'ADD')]}),
         ("file.highlight", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
+        ("file.sort_column_ui_context", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+        op_menu("FILEBROWSER_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
          {"properties": [("increment", 1)]}),
         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
index b939586ff811cd13abf18cdacc67950ccd96e69a..e9c11301909ee5d50bd9c1568cdc451a3e3830c8 100644 (file)
@@ -34,58 +34,131 @@ class FILEBROWSER_HT_header(Header):
 
         layout.menu("FILEBROWSER_MT_view")
 
-        row = layout.row(align=True)
-        row.operator("file.previous", text="", icon='BACK')
-        row.operator("file.next", text="", icon='FORWARD')
-        row.operator("file.parent", text="", icon='FILE_PARENT')
-        row.operator("file.refresh", text="", icon='FILE_REFRESH')
+        # can be None when save/reload with a file selector open
 
-        layout.operator_context = 'EXEC_DEFAULT'
-        layout.operator("file.directory_new", icon='NEWFOLDER', text="")
+        layout.separator_spacer()
 
-        layout.operator_context = 'INVOKE_DEFAULT'
+        layout.template_running_jobs()
+
+
+class FILEBROWSER_PT_display(Panel):
+    bl_space_type = 'FILE_BROWSER'
+    bl_region_type = 'HEADER'
+    bl_label = "Display"
 
+    @classmethod
+    def poll(cls, context):
         # can be None when save/reload with a file selector open
-        if params:
-            is_lib_browser = params.use_library_browsing
+        return context.space_data.params is not None
 
-            layout.prop(params, "display_type", expand=True, text="")
-            layout.prop(params, "sort_method", expand=True, text="")
-            layout.prop(params, "show_hidden", text="", icon='FILE_HIDDEN')
+    def draw(self, context):
+        layout = self.layout
 
-        layout.separator_spacer()
+        space = context.space_data
+        params = space.params
+        is_lib_browser = params.use_library_browsing
 
-        layout.template_running_jobs()
+        layout.label(text="Display as")
+        layout.column().prop(params, "display_type", expand=True)
 
-        if params:
-            layout.prop(params, "use_filter", text="", icon='FILTER')
+        layout.use_property_split = True
+        layout.use_property_decorate = False  # No animation.
 
-            row = layout.row(align=True)
-            row.active = params.use_filter
-            row.prop(params, "use_filter_folder", text="")
+        if params.display_type == 'THUMBNAIL':
+            layout.prop(params, "display_size", text="Size")
+        else:
+            layout.prop(params, "show_details_size", text="Size")
+            layout.prop(params, "show_details_datetime", text="Date")
 
-            if params.filter_glob:
-                # if st.active_operator and hasattr(st.active_operator, "filter_glob"):
-                #     row.prop(params, "filter_glob", text="")
-                row.label(text=params.filter_glob)
-            else:
-                row.prop(params, "use_filter_blender", text="")
-                row.prop(params, "use_filter_backup", text="")
-                row.prop(params, "use_filter_image", text="")
-                row.prop(params, "use_filter_movie", text="")
-                row.prop(params, "use_filter_script", text="")
-                row.prop(params, "use_filter_font", text="")
-                row.prop(params, "use_filter_sound", text="")
-                row.prop(params, "use_filter_text", text="")
+        layout.prop(params, "recursion_level", text="Recursions")
 
-            if is_lib_browser:
-                row.prop(params, "use_filter_blendid", text="")
-                if params.use_filter_blendid:
-                    row.separator()
-                    row.prop(params, "filter_id_category", text="")
+        layout.use_property_split = False
+        layout.separator()
+
+        layout.label(text="Sort by")
+        layout.column().prop(params, "sort_method", expand=True)
+        layout.prop(params, "use_sort_invert")
 
-            row.separator()
-            row.prop(params, "filter_search", text="", icon='VIEWZOOM')
+
+class FILEBROWSER_PT_filter(Panel):
+    bl_space_type = 'FILE_BROWSER'
+    bl_region_type = 'HEADER'
+    bl_label = "Filter"
+
+    @classmethod
+    def poll(cls, context):
+        # can be None when save/reload with a file selector open
+        return context.space_data.params is not None
+
+    def draw(self, context):
+        layout = self.layout
+
+        space = context.space_data
+        params = space.params
+        is_lib_browser = params.use_library_browsing
+
+        row = layout.row(align=True)
+        row.prop(params, "use_filter", text="", toggle=0)
+        row.label(text="Filter")
+
+        col = layout.column()
+        col.active = params.use_filter
+
+        row = col.row()
+        row.label(icon='FILE_FOLDER')
+        row.prop(params, "use_filter_folder", text="Folders", toggle=0)
+
+        if params.filter_glob:
+            col.label(text=params.filter_glob)
+        else:
+            row = col.row()
+            row.label(icon='FILE_BLEND')
+            row.prop(params, "use_filter_blender",
+                     text=".blend Files", toggle=0)
+            row = col.row()
+            row.label(icon='FILE_BACKUP')
+            row.prop(params, "use_filter_backup",
+                     text="Backup .blend Files", toggle=0)
+            row = col.row()
+            row.label(icon='FILE_IMAGE')
+            row.prop(params, "use_filter_image", text="Image Files", toggle=0)
+            row = col.row()
+            row.label(icon='FILE_MOVIE')
+            row.prop(params, "use_filter_movie", text="Movie Files", toggle=0)
+            row = col.row()
+            row.label(icon='FILE_SCRIPT')
+            row.prop(params, "use_filter_script",
+                     text="Script Files", toggle=0)
+            row = col.row()
+            row.label(icon='FILE_FONT')
+            row.prop(params, "use_filter_font", text="Font Files", toggle=0)
+            row = col.row()
+            row.label(icon='FILE_SOUND')
+            row.prop(params, "use_filter_sound", text="Sound Files", toggle=0)
+            row = col.row()
+            row.label(icon='FILE_TEXT')
+            row.prop(params, "use_filter_text", text="Text Files", toggle=0)
+
+        col.separator()
+
+        if is_lib_browser:
+            row = col.row()
+            row.label(icon='BLANK1')  # Indentation
+            row.prop(params, "use_filter_blendid",
+                     text="Blender IDs", toggle=0)
+            if params.use_filter_blendid:
+                row = col.row()
+                row.label(icon='BLANK1')  # Indentation
+                row.prop(params, "filter_id_category", text="")
+
+                col.separator()
+
+        layout.prop(params, "show_hidden")
+
+
+def panel_poll_is_upper_region(region):
+    # The upper region is left-aligned, the lower is split into it then.
+    return region.alignment == 'LEFT'
 
 
 class FILEBROWSER_UL_dir(UIList):
@@ -119,10 +192,13 @@ class FILEBROWSER_UL_dir(UIList):
 class FILEBROWSER_PT_bookmarks_volumes(Panel):
     bl_space_type = 'FILE_BROWSER'
     bl_region_type = 'TOOLS'
-    bl_options = {'DEFAULT_CLOSED'}
     bl_category = "Bookmarks"
     bl_label = "Volumes"
 
+    @classmethod
+    def poll(cls, context):
+        return panel_poll_is_upper_region(context.region)
+
     def draw(self, context):
         layout = self.layout
         space = context.space_data
@@ -141,7 +217,7 @@ class FILEBROWSER_PT_bookmarks_system(Panel):
 
     @classmethod
     def poll(cls, context):
-        return not context.preferences.filepaths.hide_system_bookmarks
+        return not context.preferences.filepaths.hide_system_bookmarks and panel_poll_is_upper_region(context.region)
 
     def draw(self, context):
         layout = self.layout
@@ -161,8 +237,10 @@ class FILEBROWSER_MT_bookmarks_context_menu(Menu):
         layout.operator("file.bookmark_cleanup", icon='X', text="Cleanup")
 
         layout.separator()
-        layout.operator("file.bookmark_move", icon='TRIA_UP_BAR', text="Move To Top").direction = 'TOP'
-        layout.operator("file.bookmark_move", icon='TRIA_DOWN_BAR', text="Move To Bottom").direction = 'BOTTOM'
+        layout.operator("file.bookmark_move", icon='TRIA_UP_BAR',
+                        text="Move To Top").direction = 'TOP'
+        layout.operator("file.bookmark_move", icon='TRIA_DOWN_BAR',
+                        text="Move To Bottom").direction = 'BOTTOM'
 
 
 class FILEBROWSER_PT_bookmarks_favorites(Panel):
@@ -171,6 +249,10 @@ class FILEBROWSER_PT_bookmarks_favorites(Panel):
     bl_category = "Bookmarks"
     bl_label = "Favorites"
 
+    @classmethod
+    def poll(cls, context):
+        return panel_poll_is_upper_region(context.region)
+
     def draw(self, context):
         layout = self.layout
         space = context.space_data
@@ -185,12 +267,15 @@ class FILEBROWSER_PT_bookmarks_favorites(Panel):
             col = row.column(align=True)
             col.operator("file.bookmark_add", icon='ADD', text="")
             col.operator("file.bookmark_delete", icon='REMOVE', text="")
-            col.menu("FILEBROWSER_MT_bookmarks_context_menu", icon='DOWNARROW_HLT', text="")
+            col.menu("FILEBROWSER_MT_bookmarks_context_menu",
+                     icon='DOWNARROW_HLT', text="")
 
             if num_rows > 1:
                 col.separator()
-                col.operator("file.bookmark_move", icon='TRIA_UP', text="").direction = 'UP'
-                col.operator("file.bookmark_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
+                col.operator("file.bookmark_move", icon='TRIA_UP',
+                             text="").direction = 'UP'
+                col.operator("file.bookmark_move", icon='TRIA_DOWN',
+                             text="").direction = 'DOWN'
         else:
             layout.operator("file.bookmark_add", icon='ADD')
 
@@ -203,7 +288,7 @@ class FILEBROWSER_PT_bookmarks_recents(Panel):
 
     @classmethod
     def poll(cls, context):
-        return not context.preferences.filepaths.hide_recent_locations
+        return not context.preferences.filepaths.hide_recent_locations and panel_poll_is_upper_region(context.region)
 
     def draw(self, context):
         layout = self.layout
@@ -227,7 +312,7 @@ class FILEBROWSER_PT_advanced_filter(Panel):
     @classmethod
     def poll(cls, context):
         # only useful in append/link (library) context currently...
-        return context.space_data.params.use_library_browsing
+        return context.space_data.params.use_library_browsing and panel_poll_is_upper_region(context.region)
 
     def draw(self, context):
         layout = self.layout
@@ -242,6 +327,133 @@ class FILEBROWSER_PT_advanced_filter(Panel):
                 col.prop(params, "filter_id")
 
 
+class FILEBROWSER_PT_options_toggle(Panel):
+    bl_space_type = 'FILE_BROWSER'
+    bl_region_type = 'TOOLS'
+    bl_label = "Options Toggle"
+    bl_options = {'HIDE_HEADER'}
+
+    @classmethod
+    def poll(cls, context):
+        sfile = context.space_data
+        return context.region.alignment == 'BOTTOM' and sfile.active_operator
+
+    def is_option_region_visible(self, context):
+        for region in context.area.regions:
+            if region.type == 'TOOL_PROPS' and region.width <= 1:
+                return False
+
+        return True
+
+    def draw(self, context):
+        layout = self.layout
+        label = "Hide Options" if self.is_option_region_visible(
+            context) else "Options"
+
+        layout.scale_x = 1.3
+        layout.scale_y = 1.3
+
+        layout.operator("screen.region_toggle",
+                        text=label).region_type = 'TOOL_PROPS'
+
+
+class FILEBROWSER_PT_directory_path(Panel):
+    bl_space_type = 'FILE_BROWSER'
+    bl_region_type = 'UI'
+    bl_label = "Directory Path"
+    bl_category = "Attributes"
+    bl_options = {'HIDE_HEADER'}
+
+    def is_header_visible(self, context):
+        for region in context.area.regions:
+            if region.type == 'HEADER' and region.height <= 1:
+                return False
+
+        return True
+
+    def draw(self, context):
+        layout = self.layout
+        space = context.space_data
+        params = space.params
+
+        layout.scale_x = 1.3
+        layout.scale_y = 1.3
+
+        row = layout.row()
+
+        subrow = row.row(align=True)
+        subrow.operator("file.previous", text="", icon='BACK')
+        subrow.operator("file.next", text="", icon='FORWARD')
+        subrow.operator("file.parent", text="", icon='FILE_PARENT')
+        subrow.operator("file.refresh", text="", icon='FILE_REFRESH')
+
+        row.operator("file.directory_new", icon='NEWFOLDER', text="")
+
+        subrow = row.row()
+        subrow.prop(params, "directory", text="")
+
+        subrow = row.row()
+        subrow.scale_x = 0.5
+        subrow.prop(params, "filter_search", text="", icon='VIEWZOOM')
+
+        # Uses prop_with_popover() as popover() only adds the triangle icon in headers.
+        row.prop_with_popover(
+            params,
+            "display_type",
+            panel="FILEBROWSER_PT_display",
+            text="",
+            icon_only=True,
+        )
+        row.prop_with_popover(
+            params,
+            "display_type",
+            panel="FILEBROWSER_PT_filter",
+            text="",
+            icon='FILTER',
+            icon_only=True,
+        )
+
+
+class FILEBROWSER_PT_file_operation(Panel):
+    bl_space_type = 'FILE_BROWSER'
+    bl_region_type = 'EXECUTE'
+    bl_label = "Execute File Operation"
+    bl_options = {'HIDE_HEADER'}
+
+    @classmethod
+    def poll(cls, context):
+        return context.space_data.active_operator
+
+    def draw(self, context):
+        import sys
+
+        layout = self.layout
+        space = context.space_data
+        params = space.params
+
+        layout.scale_x = 1.3
+        layout.scale_y = 1.3
+
+        row = layout.row()
+        sub = row.row()
+        sub.prop(params, "filename", text="")
+        sub = row.row()
+        sub.ui_units_x = 5
+
+        # subsub = sub.row(align=True)
+        # subsub.operator("file.filenum", text="", icon='ADD').increment = 1
+        # subsub.operator("file.filenum", text="", icon='REMOVE').increment = -1
+
+        # organize buttons according to the OS standard
+        if sys.platform != "win":
+            sub.operator("FILE_OT_cancel", text="Cancel")
+        subsub = sub.row()
+        subsub.active_default = True
+        subsub.operator("FILE_OT_execute", text=params.title)
+        if sys.platform == "win":
+            sub.operator("FILE_OT_cancel", text="Cancel")
+
+
 class FILEBROWSER_MT_view(Menu):
     bl_label = "View"
 
@@ -250,7 +462,7 @@ class FILEBROWSER_MT_view(Menu):
         st = context.space_data
         params = st.params
 
-        layout.prop(st, "show_region_toolbar")
+        layout.prop(st, "show_region_toolbar", text="Source List")
         layout.prop(st, "show_region_ui", text="File Path")
 
         layout.separator()
@@ -263,8 +475,46 @@ class FILEBROWSER_MT_view(Menu):
         layout.menu("INFO_MT_area")
 
 
+class FILEBROWSER_MT_context_menu(Menu):
+    bl_label = "Files Context Menu"
+
+    def draw(self, context):
+        layout = self.layout
+        st = context.space_data
+        params = st.params
+
+        layout.operator("file.previous", text="Back")
+        layout.operator("file.next", text="Forward")
+        layout.operator("file.parent", text="Go to Parent")
+        layout.operator("file.refresh", text="Refresh")
+
+        layout.separator()
+
+        layout.operator("file.filenum", text="Increase Number",
+                        icon='ADD').increment = 1
+        layout.operator("file.filenum", text="Decrease Number",
+                        icon='REMOVE').increment = -1
+
+        layout.separator()
+
+        layout.operator("file.rename", text="Rename")
+        # layout.operator("file.delete")
+        layout.operator("file.directory_new", text="New Folder")
+        layout.operator("file.bookmark_add", text="Add Bookmark")
+
+        layout.separator()
+
+        layout.prop_menu_enum(params, "display_type")
+        if params.display_type == 'THUMBNAIL':
+            layout.prop_menu_enum(params, "display_size")
+        layout.prop_menu_enum(params, "recursion_level", text="Recursions")
+        layout.prop_menu_enum(params, "sort_method")
+
+
 classes = (
     FILEBROWSER_HT_header,
+    FILEBROWSER_PT_display,
+    FILEBROWSER_PT_filter,
     FILEBROWSER_UL_dir,
     FILEBROWSER_PT_bookmarks_volumes,
     FILEBROWSER_PT_bookmarks_system,
@@ -272,7 +522,11 @@ classes = (
     FILEBROWSER_PT_bookmarks_favorites,
     FILEBROWSER_PT_bookmarks_recents,
     FILEBROWSER_PT_advanced_filter,
+    FILEBROWSER_PT_directory_path,
+    FILEBROWSER_PT_file_operation,
+    FILEBROWSER_PT_options_toggle,
     FILEBROWSER_MT_view,
+    FILEBROWSER_MT_context_menu,
 )
 
 if __name__ == "__main__":  # only for live edit.
index d8daa81b58d98e2604b6071d3a318747b0c1a422..d78f167a8fd8073684b1e974d44adae25920a2b4 100644 (file)
@@ -99,8 +99,13 @@ void BLI_filelist_entry_size_to_string(const struct stat *st,
 void BLI_filelist_entry_mode_to_string(
     const struct stat *st, const bool compact, char r_mode1[], char r_mode2[], char r_mode3[]);
 void BLI_filelist_entry_owner_to_string(const struct stat *st, const bool compact, char r_owner[]);
-void BLI_filelist_entry_datetime_to_string(
-    const struct stat *st, const int64_t ts, const bool compact, char r_time[], char r_date[]);
+void BLI_filelist_entry_datetime_to_string(const struct stat *st,
+                                           const int64_t ts,
+                                           const bool compact,
+                                           char r_time[],
+                                           char r_date[],
+                                           bool *r_is_today,
+                                           bool *r_is_yesterday);
 
 /* Files */
 
index a93632cca08fccd862ba606279038854f93fd89f..c92505acb54a42220127e5981481be1ff3042838 100644 (file)
@@ -261,36 +261,17 @@ unsigned int BLI_filelist_dir_contents(const char *dirname, struct direntry **r_
  */
 void BLI_filelist_entry_size_to_string(const struct stat *st,
                                        const uint64_t sz,
-                                       const bool compact,
+                                       /* Used to change MB -> M, etc. - is that really useful? */
+                                       const bool UNUSED(compact),
                                        char r_size[FILELIST_DIRENTRY_SIZE_LEN])
 {
-  double size;
-  const char *fmt;
-  const char *units[] = {"KiB", "MiB", "GiB", "TiB", NULL};
-  const char *units_compact[] = {"K", "M", "G", "T", NULL};
-  const char *unit = "B";
-
   /*
    * Seems st_size is signed 32-bit value in *nix and Windows.  This
    * will buy us some time until files get bigger than 4GB or until
    * everyone starts using __USE_FILE_OFFSET64 or equivalent.
    */
-  size = (double)(st ? st->st_size : sz);
-
-  if (size > 1024.0) {
-    const char **u;
-    for (u = compact ? units_compact : units, size /= 1024.0; size > 1024.0 && *(u + 1);
-         u++, size /= 1024.0) {
-      /* pass */
-    }
-    fmt = size > 100.0 ? "%.0f %s" : (size > 10.0 ? "%.1f %s" : "%.2f %s");
-    unit = *u;
-  }
-  else {
-    fmt = "%.0f %s";
-  }
-
-  BLI_snprintf(r_size, sizeof(*r_size) * FILELIST_DIRENTRY_SIZE_LEN, fmt, size, unit);
+  double size = (double)(st ? st->st_size : sz);
+  BLI_str_format_byte_unit(r_size, size, true);
 }
 
 /**
@@ -366,14 +347,45 @@ void BLI_filelist_entry_owner_to_string(const struct stat *st,
 
 /**
  * Convert given entry's time into human-readable strings.
+ *
+ * \param r_is_today: optional, returns true if the date matches today's.
+ * \param r_is_yesterday: optional, returns true if the date matches yesterday's.
  */
 void BLI_filelist_entry_datetime_to_string(const struct stat *st,
                                            const int64_t ts,
                                            const bool compact,
                                            char r_time[FILELIST_DIRENTRY_TIME_LEN],
-                                           char r_date[FILELIST_DIRENTRY_DATE_LEN])
+                                           char r_date[FILELIST_DIRENTRY_DATE_LEN],
+                                           bool *r_is_today,
+                                           bool *r_is_yesterday)
 {
-  time_t ts_mtime = ts;
+  int today_year = 0;
+  int today_yday = 0;
+  int yesterday_year = 0;
+  int yesterday_yday = 0;
+
+  if (r_is_today || r_is_yesterday) {
+    /* Localtime() has only one buffer so need to get data out before called again. */
+    const time_t ts_now = time(NULL);
+    struct tm *today = localtime(&ts_now);
+
+    today_year = today->tm_year;
+    today_yday = today->tm_yday;
+    /* Handle a yesterday that spans a year */
+    today->tm_mday--;
+    mktime(today);
+    yesterday_year = today->tm_year;
+    yesterday_yday = today->tm_yday;
+
+    if (r_is_today) {
+      *r_is_today = false;
+    }
+    if (r_is_yesterday) {
+      *r_is_yesterday = false;
+    }
+  }
+
+  const time_t ts_mtime = ts;
   const struct tm *tm = localtime(st ? &st->st_mtime : &ts_mtime);
   const time_t zero = 0;
 
@@ -385,12 +397,20 @@ void BLI_filelist_entry_datetime_to_string(const struct stat *st,
   if (r_time) {
     strftime(r_time, sizeof(*r_time) * FILELIST_DIRENTRY_TIME_LEN, "%H:%M", tm);
   }
+
   if (r_date) {
     strftime(r_date,
              sizeof(*r_date) * FILELIST_DIRENTRY_DATE_LEN,
-             compact ? "%d/%m/%y" : "%d-%b-%y",
+             compact ? "%d/%m/%y" : "%d %b %Y",
              tm);
   }
+
+  if (r_is_today && (tm->tm_year == today_year) && (tm->tm_yday == today_yday)) {
+    *r_is_today = true;
+  }
+  else if (r_is_yesterday && (tm->tm_year == yesterday_year) && (tm->tm_yday == yesterday_yday)) {
+    *r_is_yesterday = true;
+  }
 }
 
 /**
index ae98d3e0e15ffdaeb3a92b3ff5d128420bd4dd66..a9f369908e768d17a4d8d7e7fd37ce771f699921 100644 (file)
@@ -3722,5 +3722,39 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
 
   {
     /* Versioning code until next subversion bump goes here. */
+
+    for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) {
+      for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+        for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+          if (sl->spacetype == SPACE_FILE) {
+            SpaceFile *sfile = (SpaceFile *)sl;
+            ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase;
+            ARegion *ar_ui = do_versions_find_region(regionbase, RGN_TYPE_UI);
+            ARegion *ar_header = do_versions_find_region(regionbase, RGN_TYPE_HEADER);
+            ARegion *ar_toolprops = do_versions_find_region_or_null(regionbase,
+                                                                    RGN_TYPE_TOOL_PROPS);
+
+            /* Reinsert UI region so that it spawns entire area width */
+            BLI_remlink(regionbase, ar_ui);
+            BLI_insertlinkafter(regionbase, ar_header, ar_ui);
+
+            ar_ui->flag |= RGN_FLAG_DYNAMIC_SIZE;
+
+            if (ar_toolprops && (ar_toolprops->alignment == (RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV))) {
+              SpaceType *stype = BKE_spacetype_from_id(sl->spacetype);
+
+              /* Remove empty region at old location. */
+              BLI_assert(sfile->op == NULL);
+              BKE_area_region_free(stype, ar_toolprops);
+              BLI_freelinkN(regionbase, ar_toolprops);
+            }
+
+            if (sfile->params) {
+              sfile->params->details_flags |= FILE_DETAILS_SIZE | FILE_DETAILS_DATETIME;
+            }
+          }
+        }
+      }
+    }
   }
 }
index 8bbfc29131e9722497b895cd78a0d0a5c475966b..67b8ce1d0defbff7af4df6394d11e92ff0d961af 100644 (file)
@@ -150,6 +150,7 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
    * Include next version bump.
    */
   {
+    FROM_DEFAULT_V4_UCHAR(space_file.execution_buts);
   }
 
 #undef FROM_DEFAULT_V4_UCHAR
index 7273f857a41ca8e3504a7cb21d9a6b6d50ea86b4..dc42237d80462dabfd821199639274ce3cf974e0 100644 (file)
@@ -34,17 +34,32 @@ struct wmWindowManager;
 #define FILE_LAYOUT_HOR 1
 #define FILE_LAYOUT_VER 2
 
-#define MAX_FILE_COLUMN 4
-
-typedef enum FileListColumns {
+typedef enum FileAttributeColumnType {
+  COLUMN_NONE = -1,
   COLUMN_NAME = 0,
-  COLUMN_DATE,
-  COLUMN_TIME,
+  COLUMN_DATETIME,
   COLUMN_SIZE,
-} FileListColumns;
+
+  ATTRIBUTE_COLUMN_MAX
+} FileAttributeColumnType;
+
+typedef struct FileAttributeColumn {
+  /** UI name for this column */
+  const char *name;
+
+  float width;
+  /* The sort type to use when sorting by this column. */
+  int sort_type; /* eFileSortType */
+
+  /* Alignment of column texts, header text is always left aligned */
+  int text_align; /* eFontStyle_Align */
+} FileAttributeColumn;
 
 typedef struct FileLayout {
   /* view settings - XXX - move into own struct */
+  int offset_top;
+  /* Height of the header for the different FileAttributeColumn's. */
+  int attribute_column_header_h;
   int prv_w;
   int prv_h;
   int tile_w;
@@ -54,13 +69,17 @@ typedef struct FileLayout {
   int prv_border_x;
   int prv_border_y;
   int rows;
-  int columns;
+  /* Those are the major layout columns the files are distributed across, not to be confused with
+   * 'attribute_columns' array below. */
+  int flow_columns;
   int width;
   int height;
   int flag;
   int dirty;
   int textheight;
-  float column_widths[MAX_FILE_COLUMN];
+  /* The columns for each item (name, modification date/time, size). Not to be confused with the
+   * 'flow_columns' above. */
+  FileAttributeColumn attribute_columns[ATTRIBUTE_COLUMN_MAX];
 
   /* When we change display size, we may have to update static strings like size of files... */
   short curr_size;
@@ -72,6 +91,7 @@ typedef struct FileSelection {
 } FileSelection;
 
 struct rcti;
+struct View2D;
 
 struct FileSelectParams *ED_fileselect_get_params(struct SpaceFile *sfile);
 
@@ -87,6 +107,17 @@ int ED_fileselect_layout_numfiles(FileLayout *layout, struct ARegion *ar);
 int ED_fileselect_layout_offset(FileLayout *layout, int x, int y);
 FileSelection ED_fileselect_layout_offset_rect(FileLayout *layout, const struct rcti *rect);
 
+void ED_fileselect_layout_maskrect(const FileLayout *layout,
+                                   const struct View2D *v2d,
+                                   struct rcti *r_rect);
+bool ED_fileselect_layout_is_inside_pt(const FileLayout *layout,
+                                       const struct View2D *v2d,
+                                       int x,
+                                       int y);
+bool ED_fileselect_layout_isect_rect(const FileLayout *layout,
+                                     const struct View2D *v2d,
+                                     const struct rcti *rect,
+                                     struct rcti *r_dst);
 void ED_fileselect_layout_tilepos(FileLayout *layout, int tile, int *x, int *y);
 
 void ED_operatormacros_file(void);
index 524474cce8804e654e41635310a16625fdcb49a1..7ada4755a642770d0feb21d13a2009f82c945a14 100644 (file)
@@ -2244,6 +2244,8 @@ int UI_idcode_icon_get(const int idcode)
       return ICON_FONT_DATA;
     case ID_WO:
       return ICON_WORLD_DATA;
+    case ID_WS:
+      return ICON_WORKSPACE;
     default:
       return ICON_NONE;
   }
index a0f493d001103a36ac8ad118723e25f70ad4a080..b0c9e3b93782557fc8604f97e88e3367a3d40c3e 100644 (file)
@@ -1265,9 +1265,6 @@ static void region_rect_recursive(
   else if (ED_area_is_global(sa)) {
     prefsizey = ED_region_global_size_y();
   }
-  else if (ar->regiontype == RGN_TYPE_UI && sa->spacetype == SPACE_FILE) {
-    prefsizey = UI_UNIT_Y * 2 + (UI_UNIT_Y / 2);
-  }
   else {
     prefsizey = UI_DPI_FAC * (ar->sizey > 1 ? ar->sizey + 0.5f : ar->type->prefsizey);
   }
index 0ab21990086ca75964dd7b0efaf814fc98c87d93..50e5597ac0c99b9ca37f66ca6425600978fef2a0 100644 (file)
@@ -3935,6 +3935,65 @@ static void SCREEN_OT_region_quadview(wmOperatorType *ot)
 
 /** \} */
 
+/* -------------------------------------------------------------------- */
+/** \name Region Toggle Operator
+ * \{ */
+
+static int region_toggle_exec(bContext *C, wmOperator *op)
+{
+  PropertyRNA *prop = RNA_struct_find_property(op->ptr, "region_type");
+  ARegion *region;
+
+  if (RNA_property_is_set(op->ptr, prop)) {
+    region = BKE_area_find_region_type(CTX_wm_area(C), RNA_property_enum_get(op->ptr, prop));
+  }
+  else {
+    region = CTX_wm_region(C);
+  }
+
+  if (region) {
+    ED_region_toggle_hidden(C, region);
+  }
+  ED_region_tag_redraw(region);
+
+  return OPERATOR_FINISHED;
+}
+
+static bool region_toggle_poll(bContext *C)
+{
+  ScrArea *area = CTX_wm_area(C);
+
+  /* don't flip anything around in topbar */
+  if (area && area->spacetype == SPACE_TOPBAR) {
+    CTX_wm_operator_poll_msg_set(C, "Toggling regions in the Top-bar is not allowed");
+    return 0;
+  }
+
+  return ED_operator_areaactive(C);
+}
+
+static void SCREEN_OT_region_toggle(wmOperatorType *ot)
+{
+  /* identifiers */
+  ot->name = "Toggle Region";
+  ot->idname = "SCREEN_OT_region_toggle";
+  ot->description = "Hide or unhide the region";
+
+  /* api callbacks */
+  ot->exec = region_toggle_exec;
+  ot->poll = region_toggle_poll;
+  ot->flag = 0;
+
+  RNA_def_enum(ot->srna,
+               "region_type",
+               rna_enum_region_type_items,
+               0,
+               "Region Type",
+               "Type of the region to toggle");
+}
+
+/** \} */
+
 /* -------------------------------------------------------------------- */
 /** \name Region Flip Operator
  * \{ */
@@ -5361,6 +5420,7 @@ void ED_operatortypes_screen(void)
   WM_operatortype_append(SCREEN_OT_area_swap);
   WM_operatortype_append(SCREEN_OT_region_quadview);
   WM_operatortype_append(SCREEN_OT_region_scale);
+  WM_operatortype_append(SCREEN_OT_region_toggle);
   WM_operatortype_append(SCREEN_OT_region_flip);
   WM_operatortype_append(SCREEN_OT_header_toggle_menus);
   WM_operatortype_append(SCREEN_OT_region_context_menu);
index 51231ccf634c23d0685b81df1ee50e74ca85925c..4e710d31cbb087d77e7b89e45caa5c55a41f0b10 100644 (file)
@@ -710,7 +710,7 @@ static void SOUND_OT_mixdown(wmOperatorType *ot)
                                  FILE_TYPE_FOLDER | FILE_TYPE_SOUND,
                                  FILE_SPECIAL,
                                  FILE_SAVE,
-                                 WM_FILESEL_FILEPATH | WM_FILESEL_RELPATH,
+                                 WM_FILESEL_FILEPATH | WM_FILESEL_RELPATH | WM_FILESEL_SHOW_PROPS,
                                  FILE_DEFAULTDISPLAY,
                                  FILE_SORT_ALPHA);
 #ifdef WITH_AUDASPACE
index 3a6d59c1dbf63feeb5f271f27580a2e812b94000..0083fc244d8fb19f4b42be3eda1ce7fadbfc5dee 100644 (file)
@@ -26,6 +26,7 @@
 #include <errno.h>
 
 #include "BLI_blenlib.h"
+#include "BLI_fileops_types.h"
 #include "BLI_utildefines.h"
 #include "BLI_math.h"
 
@@ -77,234 +78,6 @@ static char *file_draw_tooltip_func(bContext *UNUSED(C), void *argN, const char
   return BLI_strdup(dyn_tooltip);
 }
 
-/* Note: This function uses pixelspace (0, 0, winx, winy), not view2d.
- * The controls are laid out as follows:
- *
- * -------------------------------------------
- * | Directory input               | execute |
- * -------------------------------------------
- * | Filename input        | + | - | cancel  |
- * -------------------------------------------
- *
- * The input widgets will stretch to fill any excess space.
- * When there isn't enough space for all controls to be shown, they are
- * hidden in this order: x/-, execute/cancel, input widgets.
- */
-void file_draw_buttons(const bContext *C, ARegion *ar)
-{
-  /* Button layout. */
-  const int max_x = ar->winx - 10;
-  const int line1_y = ar->winy - (IMASEL_BUTTONS_HEIGHT / 2 + IMASEL_BUTTONS_MARGIN);
-  const int line2_y = line1_y - (IMASEL_BUTTONS_HEIGHT / 2 + IMASEL_BUTTONS_MARGIN);
-  const int input_minw = 20;
-  const int btn_h = UI_UNIT_Y;
-  const int btn_fn_w = UI_UNIT_X;
-  const int btn_minw = 80;
-  const int btn_margin = 20;
-  const int separator = 4;
-
-  /* Additional locals. */
-  char uiblockstr[32];
-  int loadbutton;
-  int fnumbuttons;
-  int min_x = 10;
-  int chan_offs = 0;
-  int available_w = max_x - min_x;
-  int line1_w = available_w;
-  int line2_w = available_w;
-
-  uiBut *but;
-  uiBlock *block;
-  SpaceFile *sfile = CTX_wm_space_file(C);
-  FileSelectParams *params = ED_fileselect_get_params(sfile);
-  ARegion *artmp;
-  const bool is_browse_only = (sfile->op == NULL);
-
-  /* Initialize UI block. */
-  BLI_snprintf(uiblockstr, sizeof(uiblockstr), "win %p", (void *)ar);
-  block = UI_block_begin(C, ar, uiblockstr, UI_EMBOSS);
-
-  /* exception to make space for collapsed region icon */
-  for (artmp = CTX_wm_area(C)->regionbase.first; artmp; artmp = artmp->next) {
-    if (artmp->regiontype == RGN_TYPE_TOOLS && artmp->flag & RGN_FLAG_HIDDEN) {
-      chan_offs = 16;
-      min_x += chan_offs;
-      available_w -= chan_offs;
-    }
-  }
-
-  /* Is there enough space for the execute / cancel buttons? */
-
-  if (is_browse_only) {
-    loadbutton = 0;
-  }
-  else {
-    const uiFontStyle *fstyle = UI_FSTYLE_WIDGET;
-    loadbutton = UI_fontstyle_string_width(fstyle, params->title) + btn_margin;
-    CLAMP_MIN(loadbutton, btn_minw);
-    if (available_w <= loadbutton + separator + input_minw) {
-      loadbutton = 0;
-    }
-  }
-
-  if (loadbutton) {
-    line1_w -= (loadbutton + separator);
-    line2_w = line1_w;
-  }
-
-  /* Is there enough space for file number increment/decrement buttons? */
-  fnumbuttons = 2 * btn_fn_w;
-  if (!loadbutton || line2_w <= fnumbuttons + separator + input_minw) {
-    fnumbuttons = 0;
-  }
-  else {
-    line2_w -= (fnumbuttons + separator);
-  }
-
-  /* Text input fields for directory and file. */
-  if (available_w > 0) {
-    const struct FileDirEntry *file = sfile->files ?
-                                          filelist_file(sfile->files, params->active_file) :
-                                          NULL;
-    int overwrite_alert = file_draw_check_exists(sfile);
-    const bool is_active_dir = file && (file->typeflag & FILE_TYPE_FOLDER);
-
-    /* callbacks for operator check functions */
-    UI_block_func_set(block, file_draw_check_cb, NULL, NULL);
-
-    but = uiDefBut(block,
-                   UI_BTYPE_TEXT,
-                   -1,
-                   "",
-                   min_x,
-                   line1_y,
-                   line1_w - chan_offs,
-                   btn_h,
-                   params->dir,
-                   0.0,
-                   (float)FILE_MAX,
-                   0,
-                   0,
-                   TIP_("File path"));
-    UI_but_func_complete_set(but, autocomplete_directory, NULL);
-    UI_but_flag_enable(but, UI_BUT_NO_UTF8);
-    UI_but_flag_disable(but, UI_BUT_UNDO);
-    UI_but_funcN_set(but, file_directory_enter_handle, NULL, but);
-
-    /* TODO, directory editing is non-functional while a library is loaded
-     * until this is properly supported just disable it. */
-    if (sfile->files && filelist_lib(sfile->files)) {
-      UI_but_flag_enable(but, UI_BUT_DISABLED);
-    }
-
-    if ((params->flag & FILE_DIRSEL_ONLY) == 0) {
-      but = uiDefBut(
-          block,
-          UI_BTYPE_TEXT,
-          -1,
-          "",
-          min_x,
-          line2_y,
-          line2_w - chan_offs,
-          btn_h,
-          is_active_dir ? (char *)"" : params->file,
-          0.0,
-          (float)FILE_MAXFILE,
-          0,
-          0,
-          TIP_(overwrite_alert ? N_("File name, overwrite existing") : N_("File name")));
-      UI_but_func_complete_set(but, autocomplete_file, NULL);
-      UI_but_flag_enable(but, UI_BUT_NO_UTF8);
-      UI_but_flag_disable(but, UI_BUT_UNDO);
-      /* silly workaround calling NFunc to ensure this does not get called
-       * immediate ui_apply_but_func but only after button deactivates */
-      UI_but_funcN_set(but, file_filename_enter_handle, NULL, but);
-
-      /* check if this overrides a file and if the operator option is used */
-      if (overwrite_alert) {
-        UI_but_flag_enable(but, UI_BUT_REDALERT);
-      }
-    }
-
-    /* clear func */
-    UI_block_func_set(block, NULL, NULL, NULL);
-  }
-
-  /* Filename number increment / decrement buttons. */
-  if (fnumbuttons && (params->flag & FILE_DIRSEL_ONLY) == 0) {
-    UI_block_align_begin(block);
-    but = uiDefIconButO(block,
-                        UI_BTYPE_BUT,
-                        "FILE_OT_filenum",
-                        0,
-                        ICON_REMOVE,
-                        min_x + line2_w + separator - chan_offs,
-                        line2_y,
-                        btn_fn_w,
-                        btn_h,
-                        TIP_("Decrement the filename number"));
-    RNA_int_set(UI_but_operator_ptr_get(but), "increment", -1);
-
-    but = uiDefIconButO(block,
-                        UI_BTYPE_BUT,
-                        "FILE_OT_filenum",
-                        0,
-                        ICON_ADD,
-                        min_x + line2_w + separator + btn_fn_w - chan_offs,
-                        line2_y,
-                        btn_fn_w,
-                        btn_h,
-                        TIP_("Increment the filename number"));
-    RNA_int_set(UI_but_operator_ptr_get(but), "increment", 1);
-    UI_block_align_end(block);
-  }
-
-  /* Execute / cancel buttons. */
-  if (loadbutton) {
-    const struct FileDirEntry *file = sfile->files ?
-                                          filelist_file(sfile->files, params->active_file) :
-                                          NULL;
-    char const *str_exec;
-
-    if (file && FILENAME_IS_PARENT(file->relpath)) {
-      str_exec = IFACE_("Parent Directory");
-    }
-    else if (file && file->typeflag & FILE_TYPE_DIR) {
-      str_exec = IFACE_("Open Directory");
-    }
-    else {
-      str_exec = params->title; /* params->title is already translated! */
-    }
-
-    but = uiDefButO(block,
-                    UI_BTYPE_BUT,
-                    "FILE_OT_execute",
-                    WM_OP_EXEC_REGION_WIN,
-                    str_exec,
-                    max_x - loadbutton,
-                    line1_y,
-                    loadbutton,
-                    btn_h,
-                    "");
-    /* Just a display hint. */
-    UI_but_flag_enable(but, UI_BUT_ACTIVE_DEFAULT);
-
-    uiDefButO(block,
-              UI_BTYPE_BUT,
-              "FILE_OT_cancel",
-              WM_OP_EXEC_REGION_WIN,
-              IFACE_("Cancel"),
-              max_x - loadbutton,
-              line2_y,
-              loadbutton,
-              btn_h,
-              "");
-  }
-
-  UI_block_end(C, block);
-  UI_block_draw(C, block);
-}
-
 static void draw_tile(int sx, int sy, int width, int height, int colorid, int shade)
 {
   float color[4];
@@ -349,7 +122,7 @@ static void file_draw_string(int sx,
   rcti rect;
   char fname[FILE_MAXFILE];
 
-  if (string[0] == '\0') {
+  if (string[0] == '\0' || width < 1) {
     return;
   }
 
@@ -362,7 +135,7 @@ static void file_draw_string(int sx,
   /* no text clipping needed, UI_fontstyle_draw does it but is a bit too strict
    * (for buttons it works) */
   rect.xmin = sx;
-  rect.xmax = (int)(sx + ceil(width + 5.0f / UI_DPI_FAC));
+  rect.xmax = sx + round_fl_to_int(width);
   rect.ymin = sy - height;
   rect.ymax = sy;
 
@@ -404,8 +177,8 @@ static void file_draw_preview(uiBlock *block,
   float scaledx, scaledy;
   float scale;
   int ex, ey;
-  bool use_dropshadow = !is_icon && (typeflags & FILE_TYPE_IMAGE);
-  float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+  bool use_dropshadow = !is_icon &&
+                        (typeflags & (FILE_TYPE_IMAGE | FILE_TYPE_MOVIE | FILE_TYPE_BLENDER));
 
   BLI_assert(imb != NULL);
 
@@ -442,13 +215,27 @@ static void file_draw_preview(uiBlock *block,
 
   /* shadow */
   if (use_dropshadow) {
-    UI_draw_box_shadow(220, (float)xco, (float)yco, (float)(xco + ex), (float)(yco + ey));
+    UI_draw_box_shadow(128, (float)xco, (float)yco, (float)(xco + ex), (float)(yco + ey));
   }
 
   GPU_blend(true);
 
-  /* the image */
-  if (!is_icon && typeflags & FILE_TYPE_FTFONT) {
+  /* the large image */
+
+  float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+  if (is_icon) {
+    /*  File and Folder icons draw with lowered opacity until we add themes */
+    col[3] = 0.6f;
+    /*  Use dark images if background is light */
+    float bg[3];
+    UI_GetThemeColor3fv(TH_BACK, bg);
+    if (rgb_to_grayscale(bg) > 0.5f) {
+      col[0] = 0;
+      col[1] = 0;
+      col[2] = 0;
+    }
+  }
+  else if (typeflags & FILE_TYPE_FTFONT) {
     UI_GetThemeColor4fv(TH_TEXT, col);
   }
 
@@ -477,30 +264,61 @@ static void file_draw_preview(uiBlock *block,
   GPU_blend_set_func_separate(
       GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
 
-  if (icon) {
-    UI_icon_draw_ex((float)xco + (7 * UI_DPI_FAC),
-                    (float)yco + (7 * UI_DPI_FAC),
-                    icon,
-                    icon_aspect,
-                    1.0f,
-                    0.0f,
-                    NULL,
-                    false);
+  if (icon && (icon != ICON_FILE_FONT)) {
+    /* size of center icon is scaled to fit container and UI scale */
+    float icon_x, icon_y;
+
+    if (is_icon) {
+      const float icon_size = 16.0f / icon_aspect * U.dpi_fac;
+      float icon_opacity = MIN2(icon_aspect, 0.7);
+      uchar icon_color[4] = {255, 255, 255, 255};
+      float bg[3];
+      /*  base this off theme color of file or folder later */
+      UI_GetThemeColor3fv(TH_BACK, bg);
+      if (rgb_to_grayscale(bg) > 0.5f) {
+        icon_color[0] = 0;
+        icon_color[1] = 0;
+        icon_color[2] = 0;
+      }
+      icon_x = xco + (ex / 2.0f) - (icon_size / 2.0f);
+      icon_y = yco + (ey / 2.0f) - (icon_size * ((typeflags & FILE_TYPE_DIR) ? 0.78f : 0.65f));
+      UI_icon_draw_ex(
+          icon_x, icon_y, icon, icon_aspect / U.dpi_fac, icon_opacity, 0.0f, icon_color, false);
+    }
+    else {
+      const uchar dark[4] = {0, 0, 0, 255};
+      const uchar light[4] = {255, 255, 255, 255};
+
+      /* Smaller, fainter icon for preview image thumbnail. */
+      icon_x = xco + (2.0f * UI_DPI_FAC);
+      icon_y = yco + (2.0f * UI_DPI_FAC);
+
+      UI_icon_draw_ex(icon_x + 1, icon_y - 1, icon, 1.0f / U.dpi_fac, 0.2f, 0.0f, dark, false);
+      UI_icon_draw_ex(icon_x, icon_y, icon, 1.0f / U.dpi_fac, 0.6f, 0.0f, light, false);
+    }
   }
 
   /* border */
   if (use_dropshadow) {
     GPUVertFormat *format = immVertexFormat();
-    uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+    uint pos_attr = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+    uint col_attr = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
 
-    immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-    immUniformColor4f(0.0f, 0.0f, 0.0f, 0.4f);
-    imm_draw_box_wire_2d(pos, (float)xco, (float)yco, (float)(xco + ex), (float)(yco + ey));
+    immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
+    immBegin(GPU_PRIM_LINE_LOOP, 4);
+    immAttr4f(col_attr, 1.0f, 1.0f, 1.0f, 0.15f);
+    immVertex2f(pos_attr, (float)xco + 1, (float)(yco + ey));
+    immAttr4f(col_attr, 1.0f, 1.0f, 1.0f, 0.2f);
+    immVertex2f(pos_attr, (float)(xco + ex), (float)(yco + ey));
+    immAttr4f(col_attr, 0.0f, 0.0f, 0.0f, 0.2f);
+    immVertex2f(pos_attr, (float)(xco + ex), (float)yco + 1);
+    immAttr4f(col_attr, 0.0f, 0.0f, 0.0f, 0.3f);
+    immVertex2f(pos_attr, (float)xco + 1, (float)yco + 1);
+    immEnd();
     immUnbindProgram();
   }
 
   but = uiDefBut(block, UI_BTYPE_LABEL, 0, "", xco, yco, ex, ey, NULL, 0.0, 0.0, 0, 0, NULL);
-  UI_but_func_tooltip_set(but, file_draw_tooltip_func, BLI_strdup(path));
 
   /* dragregion */
   if (drag) {
@@ -557,6 +375,7 @@ static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname)
 
 static void draw_background(FileLayout *layout, View2D *v2d)
 {
+  const int item_height = layout->tile_h + (2 * layout->tile_border_y);
   int i;
   int sy;
 
@@ -565,9 +384,11 @@ static void draw_background(FileLayout *layout, View2D *v2d)
   immUniformThemeColorShade(TH_BACK, -7);
 
   /* alternating flat shade background */
-  for (i = 0; (i <= layout->rows); i += 2) {
-    sy = (int)v2d->cur.ymax - i * (layout->tile_h + 2 * layout->tile_border_y) -
-         layout->tile_border_y;
+  for (i = 2; (i <= layout->rows + 1); i += 2) {
+    sy = (int)v2d->cur.ymax - layout->offset_top - i * item_height - layout->tile_border_y;
+
+    /* Offsett pattern slightly to add scroll effect. */
+    sy += round_fl_to_int(item_height * (v2d->tot.ymax - v2d->cur.ymax) / item_height);
 
     immRectf(pos,
              v2d->cur.xmin,
@@ -632,6 +453,176 @@ static void draw_dividers(FileLayout *layout, View2D *v2d)
   }
 }
 
+static void draw_columnheader_background(const FileLayout *layout, const View2D *v2d)
+{
+  uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+
+  immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+  immUniformThemeColorShade(TH_BACK, 11);
+
+  immRectf(pos,
+           v2d->cur.xmin,
+           v2d->cur.ymax - layout->attribute_column_header_h,
+           v2d->cur.xmax,
+           v2d->cur.ymax);
+
+  immUnbindProgram();
+}
+
+static void draw_columnheader_columns(const FileSelectParams *params,
+                                      FileLayout *layout,
+                                      const View2D *v2d,
+                                      const uchar text_col[4])
+{
+  const float divider_pad = 0.2 * layout->attribute_column_header_h;
+  int sx = v2d->cur.xmin, sy = v2d->cur.ymax;
+
+  for (FileAttributeColumnType column_type = 0; column_type < ATTRIBUTE_COLUMN_MAX;
+       column_type++) {
+    if (!file_attribute_column_type_enabled(params, column_type)) {
+      continue;
+    }
+    const FileAttributeColumn *column = &layout->attribute_columns[column_type];
+
+    /* Active sort type triangle */
+    if (params->sort == column->sort_type) {
+      float tri_color[4];
+
+      rgba_uchar_to_float(tri_color, text_col);
+      UI_draw_icon_tri(sx + column->width - (0.3f * U.widget_unit) -
+                           ATTRIBUTE_COLUMN_PADDING / 2.0f,
+                       sy + (0.1f * U.widget_unit) - (layout->attribute_column_header_h / 2),
+                       (params->flag & FILE_SORT_INVERT) ? 't' : 'v',
+                       tri_color);
+    }
+
+    file_draw_string(sx + ATTRIBUTE_COLUMN_PADDING,
+                     sy - layout->tile_border_y,
+                     IFACE_(column->name),
+                     column->width - 2 * ATTRIBUTE_COLUMN_PADDING,
+                     layout->attribute_column_header_h - layout->tile_border_y,
+                     UI_STYLE_TEXT_LEFT,
+                     text_col);
+
+    /* Separator line */
+    if (column_type != COLUMN_NAME) {
+      uint pos = GPU_vertformat_attr_add(
+          immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+
+      immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+      immUniformThemeColorShade(TH_BACK, -10);
+      immBegin(GPU_PRIM_LINES, 2);
+      immVertex2f(pos, sx - 1, sy - divider_pad);
+      immVertex2f(pos, sx - 1, sy - layout->attribute_column_header_h + divider_pad);
+      immEnd();
+      immUnbindProgram();
+    }
+
+    sx += column->width;
+  }
+
+  /* Vertical separator lines line */
+  {
+    uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+    immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+    immUniformThemeColorShade(TH_BACK, -10);
+    immBegin(GPU_PRIM_LINES, 4);
+    immVertex2f(pos, v2d->cur.xmin, sy);
+    immVertex2f(pos, v2d->cur.xmax, sy);
+    immVertex2f(pos, v2d->cur.xmin, sy - layout->attribute_column_header_h);
+    immVertex2f(pos, v2d->cur.xmax, sy - layout->attribute_column_header_h);
+    immEnd();
+    immUnbindProgram();
+  }
+}
+
+/**
+ * Updates the stat string stored in file->entry if necessary.
+ */
+static const char *filelist_get_details_column_string(FileAttributeColumnType column,
+                                                      const FileDirEntry *file,
+                                                      const bool small_size,
+                                                      const bool update_stat_strings)
+{
+  switch (column) {
+    case COLUMN_DATETIME:
+      if (!(file->typeflag & FILE_TYPE_BLENDERLIB) && !FILENAME_IS_CURRPAR(file->relpath)) {
+        if ((file->entry->datetime_str[0] == '\0') || update_stat_strings) {
+          char date[FILELIST_DIRENTRY_DATE_LEN], time[FILELIST_DIRENTRY_TIME_LEN];
+          bool is_today, is_yesterday;
+
+          BLI_filelist_entry_datetime_to_string(
+              NULL, file->entry->time, small_size, time, date, &is_today, &is_yesterday);
+
+          if (is_today || is_yesterday) {
+            BLI_strncpy(date, is_today ? N_("Today") : N_("Yesterday"), sizeof(date));
+          }
+          BLI_snprintf(
+              file->entry->datetime_str, sizeof(file->entry->datetime_str), "%s %s", date, time);
+        }
+
+        return file->entry->datetime_str;
+      }
+      break;
+    case COLUMN_SIZE:
+      if ((file->typeflag & (FILE_TYPE_BLENDER | FILE_TYPE_BLENDER_BACKUP)) ||
+          !(file->typeflag & (FILE_TYPE_DIR | FILE_TYPE_BLENDERLIB))) {
+        if ((file->entry->size_str[0] == '\0') || update_stat_strings) {
+          BLI_filelist_entry_size_to_string(
+              NULL, file->entry->size, small_size, file->entry->size_str);
+        }
+
+        return file->entry->size_str;
+      }
+      break;
+    default:
+      break;
+  }
+
+  return NULL;
+}
+
+static void draw_details_columns(const FileSelectParams *params,
+                                 const FileLayout *layout,
+                                 const FileDirEntry *file,
+                                 const int pos_x,
+                                 const int pos_y,
+                                 const uchar text_col[4])
+{
+  const bool small_size = SMALL_SIZE_CHECK(params->thumbnail_size);
+  const bool update_stat_strings = small_size != SMALL_SIZE_CHECK(layout->curr_size);
+  int sx = pos_x - layout->tile_border_x - (UI_UNIT_X * 0.1f), sy = pos_y;
+
+  for (FileAttributeColumnType column_type = 0; column_type < ATTRIBUTE_COLUMN_MAX;
+       column_type++) {
+    const FileAttributeColumn *column = &layout->attribute_columns[column_type];
+
+    /* Name column is not a detail column (should already be drawn), always skip here. */
+    if (column_type == COLUMN_NAME) {
+      sx += column->width;
+      continue;
+    }
+    if (!file_attribute_column_type_enabled(params, column_type)) {
+      continue;
+    }
+
+    const char *str = filelist_get_details_column_string(
+        column_type, file, small_size, update_stat_strings);
+
+    if (str) {
+      file_draw_string(sx + ATTRIBUTE_COLUMN_PADDING,
+                       sy - layout->tile_border_y,
+                       IFACE_(str),
+                       column->width - 2 * ATTRIBUTE_COLUMN_PADDING,
+                       layout->tile_h,
+                       column->text_align,
+                       text_col);
+    }
+
+    sx += column->width;
+  }
+}
+
 void file_draw_list(const bContext *C, ARegion *ar)
 {
   SpaceFile *sfile = CTX_wm_space_file(C);
@@ -652,18 +643,14 @@ void file_draw_list(const bContext *C, ARegion *ar)
   bool is_icon;
   eFontStyle_Align align;
   bool do_drag;
-  int column_space = 0.6f * UI_UNIT_X;
   unsigned char text_col[4];
-  const bool small_size = SMALL_SIZE_CHECK(params->thumbnail_size);
-  const bool update_stat_strings = small_size != SMALL_SIZE_CHECK(layout->curr_size);
-  const float thumb_icon_aspect = sqrtf(64.0f / (float)(params->thumbnail_size));
+  const bool draw_columnheader = (params->display == FILE_VERTICALDISPLAY);
+  const float thumb_icon_aspect = MIN2(64.0f / (float)(params->thumbnail_size), 1.0f);
 
   numfiles = filelist_files_ensure(files);
 
   if (params->display != FILE_IMGDISPLAY) {
-
     draw_background(layout, v2d);
-
     draw_dividers(layout, v2d);
   }
 
@@ -679,13 +666,14 @@ void file_draw_list(const bContext *C, ARegion *ar)
     numfiles_layout += layout->rows;
   }
   else {
-    numfiles_layout += layout->columns;
+    numfiles_layout += layout->flow_columns;
   }
 
   filelist_file_cache_slidingwindow_set(files, numfiles_layout);
 
-  textwidth = (FILE_IMGDISPLAY == params->display) ? layout->tile_w :
-                                                     (int)layout->column_widths[COLUMN_NAME];
+  textwidth = (FILE_IMGDISPLAY == params->display) ?
+                  layout->tile_w :
+                  round_fl_to_int(layout->attribute_columns[COLUMN_NAME].width);
   textheight = (int)(layout->textheight * 3.0 / 2.0 + 0.5);
 
   align = (FILE_IMGDISPLAY == params->display) ? UI_STYLE_TEXT_CENTER : UI_STYLE_TEXT_LEFT;
@@ -719,11 +707,16 @@ void file_draw_list(const bContext *C, ARegion *ar)
 
   BLF_batch_draw_begin();
 
+  UI_GetThemeColor4ubv(TH_TEXT, text_col);
+
   for (i = offset; (i < numfiles) && (i < offset + numfiles_layout); i++) {
     unsigned int file_selflag;
     char path[FILE_MAX_LIBEXTRA];
+    int padx = 0.1f * UI_UNIT_X;
+    int icon_ofs = 0;
+
     ED_fileselect_layout_tilepos(layout, i, &sx, &sy);
-    sx += (int)(v2d->tot.xmin + 0.1f * UI_UNIT_X);
+    sx += (int)(v2d->tot.xmin + padx);
     sy = (int)(v2d->tot.ymax - sy);
 
     file = filelist_file(files, i);
@@ -737,15 +730,14 @@ void file_draw_list(const bContext *C, ARegion *ar)
         int colorid = (file_selflag & FILE_SEL_SELECTED) ? TH_HILITE : TH_BACK;
         int shade = (params->highlight_file == i) || (file_selflag & FILE_SEL_HIGHLIGHTED) ? 35 :
                                                                                              0;
+        const short width = ELEM(params->display, FILE_VERTICALDISPLAY, FILE_HORIZONTALDISPLAY) ?
+                                layout->tile_w - (2 * padx) :
+                                layout->tile_w;
 
         BLI_assert(i == 0 || !FILENAME_IS_CURRPAR(file->relpath));
 
-        draw_tile(sx,
-                  sy - 1,
-                  layout->tile_w + 4,
-                  sfile->layout->tile_h + layout->tile_border_y,
-                  colorid,
-                  shade);
+        draw_tile(
+            sx, sy - 1, width, sfile->layout->tile_h + layout->tile_border_y, colorid, shade);
       }
     }
     UI_draw_roundbox_corner_set(UI_CNR_NONE);
@@ -778,38 +770,28 @@ void file_draw_list(const bContext *C, ARegion *ar)
       file_draw_icon(block,
                      path,
                      sx,
-                     sy - (UI_UNIT_Y / 6),
+                     sy - layout->tile_border_y,
                      filelist_geticon(files, i, true),
                      ICON_DEFAULT_WIDTH_SCALE,
                      ICON_DEFAULT_HEIGHT_SCALE,
                      do_drag);
-      sx += ICON_DEFAULT_WIDTH_SCALE + 0.2f * UI_UNIT_X;
+      icon_ofs += ICON_DEFAULT_WIDTH_SCALE + 0.2f * UI_UNIT_X;
     }
 
-    UI_GetThemeColor4ubv(TH_TEXT, text_col);
-
     if (file_selflag & FILE_SEL_EDITING) {
       uiBut *but;
-      short width;
-
-      if (params->display == FILE_SHORTDISPLAY) {
-        width = layout->tile_w - (ICON_DEFAULT_WIDTH_SCALE + 0.2f * UI_UNIT_X);
-      }
-      else if (params->display == FILE_LONGDISPLAY) {
-        width = layout->column_widths[COLUMN_NAME] + (column_space * 3.5f);
-      }
-      else {
-        BLI_assert(params->display == FILE_IMGDISPLAY);
-        width = textwidth;
-      }
+      const short width = (params->display == FILE_IMGDISPLAY) ?
+                              textwidth :
+                              layout->attribute_columns[COLUMN_NAME].width -
+                                  ATTRIBUTE_COLUMN_PADDING;
 
       but = uiDefBut(block,
                      UI_BTYPE_TEXT,
                      1,
                      "",
-                     sx,
+                     sx + icon_ofs,
                      sy - layout->tile_h - 0.15f * UI_UNIT_X,
-                     width,
+                     width - icon_ofs,
                      textheight,
                      sfile->params->renamefile,
                      1.0f,
@@ -825,74 +807,19 @@ void file_draw_list(const bContext *C, ARegion *ar)
             sfile->files, file, FILE_SEL_REMOVE, FILE_SEL_EDITING, CHECK_ALL);
       }
     }
-
-    if (!(file_selflag & FILE_SEL_EDITING)) {
-      int tpos = (FILE_IMGDISPLAY == params->display) ? sy - layout->tile_h + layout->textheight :
-                                                        sy;
-      file_draw_string(sx + 1, tpos, file->name, (float)textwidth, textheight, align, text_col);
-    }
-
-    sx += (int)layout->column_widths[COLUMN_NAME] + column_space;
-    if (params->display == FILE_SHORTDISPLAY) {
-      if ((file->typeflag & (FILE_TYPE_BLENDER | FILE_TYPE_BLENDER_BACKUP)) ||
-          !(file->typeflag & (FILE_TYPE_DIR | FILE_TYPE_BLENDERLIB))) {
-        if ((file->entry->size_str[0] == '\0') || update_stat_strings) {
-          BLI_filelist_entry_size_to_string(
-              NULL, file->entry->size, small_size, file->entry->size_str);
-        }
-        file_draw_string(sx,
-                         sy,
-                         file->entry->size_str,
-                         layout->column_widths[COLUMN_SIZE],
-                         layout->tile_h,
-                         align,
-                         text_col);
-      }
-      sx += (int)layout->column_widths[COLUMN_SIZE] + column_space;
+    else {
+      const int txpos = (params->display == FILE_IMGDISPLAY) ? sx : sx + 1 + icon_ofs;
+      const int typos = (params->display == FILE_IMGDISPLAY) ?
+                            sy - layout->tile_h + layout->textheight :
+                            sy - layout->tile_border_y;
+      const int twidth = (params->display == FILE_IMGDISPLAY) ?
+                             textwidth :
+                             textwidth - 1 - icon_ofs - padx - layout->tile_border_x;
+      file_draw_string(txpos, typos, file->name, (float)twidth, textheight, align, text_col);
     }
-    else if (params->display == FILE_LONGDISPLAY) {
-      if (!(file->typeflag & FILE_TYPE_BLENDERLIB) && !FILENAME_IS_CURRPAR(file->relpath)) {
-        if ((file->entry->date_str[0] == '\0') || update_stat_strings) {
-          BLI_filelist_entry_datetime_to_string(
-              NULL, file->entry->time, small_size, file->entry->time_str, file->entry->date_str);
-        }
-        file_draw_string(sx,
-                         sy,
-                         file->entry->date_str,
-                         layout->column_widths[COLUMN_DATE],
-                         layout->tile_h,
-                         align,
-                         text_col);
-        sx += (int)layout->column_widths[COLUMN_DATE] + column_space;
-        file_draw_string(sx,
-                         sy,
-                         file->entry->time_str,
-                         layout->column_widths[COLUMN_TIME],
-                         layout->tile_h,
-                         align,
-                         text_col);
-        sx += (int)layout->column_widths[COLUMN_TIME] + column_space;
-      }
-      else {
-        sx += (int)layout->column_widths[COLUMN_DATE] + column_space;
-        sx += (int)layout->column_widths[COLUMN_TIME] + column_space;
-      }
 
-      if ((file->typeflag & (FILE_TYPE_BLENDER | FILE_TYPE_BLENDER_BACKUP)) ||
-          !(file->typeflag & (FILE_TYPE_DIR | FILE_TYPE_BLENDERLIB))) {
-        if ((file->entry->size_str[0] == '\0') || update_stat_strings) {
-          BLI_filelist_entry_size_to_string(
-              NULL, file->entry->size, small_size, file->entry->size_str);
-        }
-        file_draw_string(sx,
-                         sy,
-                         file->entry->size_str,
-                         layout->column_widths[COLUMN_SIZE],
-                         layout->tile_h,
-                         align,
-                         text_col);
-      }
-      sx += (int)layout->column_widths[COLUMN_SIZE] + column_space;
+    if (params->display != FILE_IMGDISPLAY) {
+      draw_details_columns(params, layout, file, sx, sy, text_col);
     }
   }
 
@@ -901,5 +828,11 @@ void file_draw_list(const bContext *C, ARegion *ar)
   UI_block_end(C, block);
   UI_block_draw(C, block);
 
+  /* Draw last, on top of file list. */
+  if (draw_columnheader) {
+    draw_columnheader_background(layout, v2d);
+    draw_columnheader_columns(params, layout, v2d, text_col);
+  }
+
   layout->curr_size = params->thumbnail_size;
 }
index bad25511dd5deeb2fcca62ecce17a618262c0359..61f13098783f45c6e532a5a806612e91a64b1087 100644 (file)
@@ -30,9 +30,11 @@ struct ARegion;
 struct ARegionType;
 struct FileSelectParams;
 struct SpaceFile;
+struct View2D;
 
 /* file_ops.c */
 struct ARegion *file_tools_region(struct ScrArea *sa);
+struct ARegion *file_tool_props_region(struct ScrArea *sa);
 
 /* file_draw.c */
 #define TILE_BORDER_X (UI_UNIT_X / 4)
@@ -42,9 +44,10 @@ struct ARegion *file_tools_region(struct ScrArea *sa);
 #define IMASEL_BUTTONS_HEIGHT (UI_UNIT_Y * 2)
 #define IMASEL_BUTTONS_MARGIN (UI_UNIT_Y / 6)
 
+#define ATTRIBUTE_COLUMN_PADDING (0.5f * UI_UNIT_X)
+
 #define SMALL_SIZE_CHECK(_size) ((_size) < 64) /* Related to FileSelectParams.thumbnail_size. */
 
-void file_draw_buttons(const bContext *C, ARegion *ar);
 void file_calc_previews(const bContext *C, ARegion *ar);
 void file_draw_list(const bContext *C, ARegion *ar);
 
@@ -64,6 +67,7 @@ typedef enum WalkSelectDirection {
 } WalkSelectDirections;
 
 void FILE_OT_highlight(struct wmOperatorType *ot);
+void FILE_OT_sort_column_ui_context(struct wmOperatorType *ot);
 void FILE_OT_select(struct wmOperatorType *ot);
 void FILE_OT_select_walk(struct wmOperatorType *ot);
 void FILE_OT_select_all(struct wmOperatorType *ot);
@@ -112,6 +116,16 @@ void file_operator_to_sfile(bContext *C, struct SpaceFile *sfile, struct wmOpera
 
 /* filesel.c */
 void fileselect_file_set(SpaceFile *sfile, const int index);
+bool file_attribute_column_type_enabled(const FileSelectParams *params,
+                                        FileAttributeColumnType column);
+bool file_attribute_column_header_is_inside(const struct View2D *v2d,
+                                            const FileLayout *layout,
+                                            int x,
+                                            int y);
+FileAttributeColumnType file_attribute_column_type_find_isect(const View2D *v2d,
+                                                              const FileSelectParams *params,
+                                                              FileLayout *layout,
+                                                              int x);
 float file_string_width(const char *str);
 
 float file_font_pointsize(void);
index eb5f02b6e1395d9669773ad435ad0da65a9e1297..bd018581d329b274ccdf37e4766e8672e890c69c 100644 (file)
@@ -78,7 +78,12 @@ static FileSelection find_file_mouse_rect(SpaceFile *sfile, ARegion *ar, const r
 
   BLI_rctf_rcti_copy(&rect_region_fl, rect_region);
 
+  /* Okay, manipulating v2d rects here is hacky...  */
+  v2d->mask.ymax -= sfile->layout->offset_top;
+  v2d->cur.ymax -= sfile->layout->offset_top;
   UI_view2d_region_to_view_rctf(v2d, &rect_region_fl, &rect_view_fl);
+  v2d->mask.ymax += sfile->layout->offset_top;
+  v2d->cur.ymax += sfile->layout->offset_top;
 
   BLI_rcti_init(&rect_view,
                 (int)(v2d->tot.xmin + rect_view_fl.xmin),
@@ -190,7 +195,6 @@ static FileSelect file_select_do(bContext *C, int selected_idx, bool do_diropen)
       const bool is_parent_dir = FILENAME_IS_PARENT(file->relpath);
 
       if (do_diropen == false) {
-        params->file[0] = '\0';
         retval = FILE_SELECT_DIR;
       }
       /* the path is too long and we are not going up! */
@@ -262,8 +266,8 @@ static void file_ensure_inside_viewbounds(ARegion *ar, SpaceFile *sfile, const i
     cur->ymax = cur->ymin + ar->winy;
   }
   /* up */
-  else if (cur->ymax < rect.ymax) {
-    cur->ymax = rect.ymax + layout->tile_border_y;
+  else if ((cur->ymax - layout->offset_top) < rect.ymax) {
+    cur->ymax = rect.ymax + layout->tile_border_y + layout->offset_top;
     cur->ymin = cur->ymax - ar->winy;
   }
   /* left - also use if tile is wider than viewbounds so view is aligned to file name */
@@ -278,7 +282,7 @@ static void file_ensure_inside_viewbounds(ARegion *ar, SpaceFile *sfile, const i
   }
   else {
     BLI_assert(cur->xmin <= rect.xmin && cur->xmax >= rect.xmax && cur->ymin <= rect.ymin &&
-               cur->ymax >= rect.ymax);
+               (cur->ymax - layout->offset_top) >= rect.ymax);
     changed = false;
   }
 
@@ -384,7 +388,7 @@ static int file_box_select_modal(bContext *C, wmOperator *op, const wmEvent *eve
   if (result == OPERATOR_RUNNING_MODAL) {
     WM_operator_properties_border_to_rcti(op, &rect);
 
-    BLI_rcti_isect(&(ar->v2d.mask), &rect, &rect);
+    ED_fileselect_layout_isect_rect(sfile->layout, &ar->v2d, &rect, &rect);
 
     sel = file_selection_get(C, &rect, 0);
     if ((sel.first != params->sel_first) || (sel.last != params->sel_last)) {
@@ -440,7 +444,7 @@ static int file_box_select_exec(bContext *C, wmOperator *op)
     file_deselect_all(sfile, FILE_SEL_SELECTED);
   }
 
-  BLI_rcti_isect(&(ar->v2d.mask), &rect, &rect);
+  ED_fileselect_layout_isect_rect(sfile->layout, &ar->v2d, &rect, &rect);
 
   ret = file_select(C, &rect, select ? FILE_SEL_ADD : FILE_SEL_REMOVE, false, false);
 
@@ -493,7 +497,7 @@ static int file_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
   rect.xmin = rect.xmax = event->mval[0];
   rect.ymin = rect.ymax = event->mval[1];
 
-  if (!BLI_rcti_isect_pt(&ar->v2d.mask, rect.xmin, rect.ymin)) {
+  if (!ED_fileselect_layout_is_inside_pt(sfile->layout, &ar->v2d, rect.xmin, rect.ymin)) {
     return OPERATOR_CANCELLED;
   }
 
@@ -691,7 +695,7 @@ static bool file_walk_select_do(bContext *C,
   if (has_selection) {
     ARegion *ar = CTX_wm_region(C);
     FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
-    const int idx_shift = (layout->flag & FILE_LAYOUT_HOR) ? layout->rows : layout->columns;
+    const int idx_shift = (layout->flag & FILE_LAYOUT_HOR) ? layout->rows : layout->flow_columns;
 
     if ((layout->flag & FILE_LAYOUT_HOR && direction == FILE_SELECT_WALK_UP) ||
         (layout->flag & FILE_LAYOUT_VER && direction == FILE_SELECT_WALK_LEFT)) {
@@ -1185,7 +1189,7 @@ int file_highlight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
   mx -= ar->winrct.xmin;
   my -= ar->winrct.ymin;
 
-  if (BLI_rcti_isect_pt(&ar->v2d.mask, mx, my)) {
+  if (ED_fileselect_layout_is_inside_pt(sfile->layout, v2d, mx, my)) {
     float fx, fy;
     int highlight_file;
 
@@ -1234,6 +1238,53 @@ void FILE_OT_highlight(struct wmOperatorType *ot)
   ot->poll = ED_operator_file_active;
 }
 
+static int file_column_sort_ui_context_invoke(bContext *C,
+                                              wmOperator *UNUSED(op),
+                                              const wmEvent *event)
+{
+  const ARegion *ar = CTX_wm_region(C);
+  SpaceFile *sfile = CTX_wm_space_file(C);
+
+  if (file_attribute_column_header_is_inside(
+          &ar->v2d, sfile->layout, event->mval[0], event->mval[1])) {
+    const FileAttributeColumnType column_type = file_attribute_column_type_find_isect(
+        &ar->v2d, sfile->params, sfile->layout, event->mval[0]);
+
+    if (column_type != COLUMN_NONE) {
+      const FileAttributeColumn *column = &sfile->layout->attribute_columns[column_type];
+
+      if (column->sort_type != FILE_SORT_NONE) {
+        if (sfile->params->sort == column->sort_type) {
+          /* Already sorting by selected column -> toggle sort invert (three state logic). */
+          sfile->params->flag ^= FILE_SORT_INVERT;
+        }
+        else {
+          sfile->params->sort = column->sort_type;
+          sfile->params->flag &= ~FILE_SORT_INVERT;
+        }
+
+        WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+      }
+    }
+  }
+
+  return OPERATOR_PASS_THROUGH;
+}
+
+void FILE_OT_sort_column_ui_context(wmOperatorType *ot)
+{
+  /* identifiers */
+  ot->name = "Sort from Column";
+  ot->description = "Change sorting to use column under cursor";
+  ot->idname = "FILE_OT_sort_column_ui_context";
+
+  /* api callbacks */
+  ot->invoke = file_column_sort_ui_context_invoke;
+  ot->poll = ED_operator_file_active;
+
+  ot->flag = OPTYPE_INTERNAL;
+}
+
 int file_cancel_exec(bContext *C, wmOperator *UNUSED(unused))
 {
   wmWindowManager *wm = CTX_wm_manager(C);
@@ -1713,7 +1764,7 @@ static int file_smoothscroll_invoke(bContext *C, wmOperator *UNUSED(op), const w
   /* Number of items in a block (i.e. lines in a column in horizontal layout, or columns in a line
    * in vertical layout).
    */
-  const int items_block_size = is_horizontal ? sfile->layout->rows : sfile->layout->columns;
+  const int items_block_size = is_horizontal ? sfile->layout->rows : sfile->layout->flow_columns;
 
   /* Scroll offset is the first file in the row/column we are editing in. */
   if (sfile->scroll_offset == 0) {
@@ -1998,7 +2049,6 @@ void FILE_OT_directory_new(struct wmOperatorType *ot)
   ot->idname = "FILE_OT_directory_new";
 
   /* api callbacks */
-  ot->invoke = WM_operator_confirm;
   ot->exec = file_directory_new_exec;
   ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
 
@@ -2260,10 +2310,29 @@ ARegion *file_tools_region(ScrArea *sa)
   arnew->regiontype = RGN_TYPE_TOOLS;
   arnew->alignment = RGN_ALIGN_LEFT;
 
-  ar = MEM_callocN(sizeof(ARegion), "tool props for file");
-  BLI_insertlinkafter(&sa->regionbase, arnew, ar);
-  ar->regiontype = RGN_TYPE_TOOL_PROPS;
-  ar->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
+  return arnew;
+}
+
+ARegion *file_tool_props_region(ScrArea *sa)
+{
+  ARegion *ar, *arnew;
+
+  if ((ar = BKE_area_find_region_type(sa, RGN_TYPE_TOOL_PROPS)) != NULL) {
+    return ar;
+  }
+
+  /* add subdiv level; after execute region */
+  ar = BKE_area_find_region_type(sa, RGN_TYPE_EXECUTE);
+
+  /* is error! */
+  if (ar == NULL) {
+    return NULL;
+  }
+
+  arnew = MEM_callocN(sizeof(ARegion), "tool props for file");
+  BLI_insertlinkafter(&sa->regionbase, ar, arnew);
+  arnew->regiontype = RGN_TYPE_TOOL_PROPS;
+  arnew->alignment = RGN_ALIGN_RIGHT;
 
   return arnew;
 }
@@ -2292,6 +2361,17 @@ void FILE_OT_bookmark_toggle(struct wmOperatorType *ot)
   ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
 }
 
+static bool file_filenum_poll(bContext *C)
+{
+  SpaceFile *sfile = CTX_wm_space_file(C);
+
+  if (!ED_operator_file_active(C)) {
+    return false;
+  }
+
+  return sfile->params && (sfile->params->action_type == FILE_SAVE);
+}
+
 /**
  * Looks for a string of digits within name (using BLI_stringdec) and adjusts it by add.
  */
@@ -2349,7 +2429,7 @@ void FILE_OT_filenum(struct wmOperatorType *ot)
 
   /* api callbacks */
   ot->exec = file_filenum_exec;
-  ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
+  ot->poll = file_filenum_poll;
 
   /* props */
   RNA_def_int(ot->srna, "increment", 1, -100, 100, "Increment", "", -100, 100);
index d9a6e70121ffa3483e0860b1cbef2bde0b4d9b5b..b41358f575fdeaf7e6e89c5f284f5b62f27466c6 100644 (file)
@@ -103,6 +103,7 @@ void file_panels_register(ARegionType *art)
   strcpy(pt->idname, "FILE_PT_operator");
   strcpy(pt->label, N_("Operator"));
   strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
+  pt->flag = PNL_NO_HEADER;
   pt->poll = file_panel_operator_poll;
   pt->draw_header = file_panel_operator_header;
   pt->draw = file_panel_operator;
index ee86a5839749997ec38ff4040c8de2c0e629c06a..fdc101f3d82628f251a775b2110d73f0540fdc63 100644 (file)
@@ -329,25 +329,20 @@ enum {
   FL_IS_PENDING = 1 << 2,
   FL_NEED_SORTING = 1 << 3,
   FL_NEED_FILTERING = 1 << 4,
+  FL_SORT_INVERT = 1 << 5,
 };
 
-#define SPECIAL_IMG_SIZE 48
-#define SPECIAL_IMG_ROWS 4
-#define SPECIAL_IMG_COLS 4
+#define SPECIAL_IMG_SIZE 256
+#define SPECIAL_IMG_ROWS 1
+#define SPECIAL_IMG_COLS 6
 
 enum {
-  SPECIAL_IMG_FOLDER = 0,
-  SPECIAL_IMG_PARENT = 1,
-  SPECIAL_IMG_REFRESH = 2,
-  SPECIAL_IMG_BLENDFILE = 3,
-  SPECIAL_IMG_SOUNDFILE = 4,
-  SPECIAL_IMG_MOVIEFILE = 5,
-  SPECIAL_IMG_PYTHONFILE = 6,
-  SPECIAL_IMG_TEXTFILE = 7,
-  SPECIAL_IMG_FONTFILE = 8,
-  SPECIAL_IMG_UNKNOWNFILE = 9,
-  SPECIAL_IMG_LOADING = 10,
-  SPECIAL_IMG_BACKUP = 11,
+  SPECIAL_IMG_DOCUMENT = 0,
+  SPECIAL_IMG_FOLDER = 1,
+  SPECIAL_IMG_PARENT = 2,
+  SPECIAL_IMG_DRIVE_FIXED = 3,
+  SPECIAL_IMG_DRIVE_ATTACHED = 4,
+  SPECIAL_IMG_DRIVE_REMOTE = 5,
   SPECIAL_IMG_MAX,
 };
 
@@ -369,6 +364,19 @@ static void filelist_cache_clear(FileListEntryCache *cache, size_t new_size);
 
 /* ********** Sort helpers ********** */
 
+struct FileSortData {
+  bool inverted;
+};
+
+static int compare_apply_inverted(int val, const struct FileSortData *sort_data)
+{
+  return sort_data->inverted ? -val : val;
+}
+
+/**
+ * Handles inverted sorting itself (currently there's nothing to invert), so if this returns non-0,
+ * it should be used as-is and not inverted.
+ */
 static int compare_direntry_generic(const FileListInternEntry *entry1,
                                     const FileListInternEntry *entry2)
 {
@@ -420,10 +428,11 @@ static int compare_direntry_generic(const FileListInternEntry *entry1,
   return 0;
 }
 
-static int compare_name(void *UNUSED(user_data), const void *a1, const void *a2)
+static int compare_name(void *user_data, const void *a1, const void *a2)
 {
   const FileListInternEntry *entry1 = a1;
   const FileListInternEntry *entry2 = a2;
+  const struct FileSortData *sort_data = user_data;
   char *name1, *name2;
   int ret;
 
@@ -434,13 +443,14 @@ static int compare_name(void *UNUSED(user_data), const void *a1, const void *a2)
   name1 = entry1->name;
   name2 = entry2->name;
 
-  return BLI_strcasecmp_natural(name1, name2);
+  return compare_apply_inverted(BLI_strcasecmp_natural(name1, name2), sort_data);
 }
 
-static int compare_date(void *UNUSED(user_data), const void *a1, const void *a2)
+static int compare_date(void *user_data, const void *a1, const void *a2)
 {
   const FileListInternEntry *entry1 = a1;
   const FileListInternEntry *entry2 = a2;
+  const struct FileSortData *sort_data = user_data;
   char *name1, *name2;
   int64_t time1, time2;
   int ret;
@@ -452,22 +462,23 @@ static int compare_date(void *UNUSED(user_data), const void *a1, const void *a2)
   time1 = (int64_t)entry1->st.st_mtime;
   time2 = (int64_t)entry2->st.st_mtime;
   if (time1 < time2) {
-    return 1;
+    return compare_apply_inverted(1, sort_data);
   }
   if (time1 > time2) {
-    return -1;
+    return compare_apply_inverted(-1, sort_data);
   }
 
   name1 = entry1->name;
   name2 = entry2->name;
 
-  return BLI_strcasecmp_natural(name1, name2);
+  return compare_apply_inverted(BLI_strcasecmp_natural(name1, name2), sort_data);
 }
 
-static int compare_size(void *UNUSED(user_data), const void *a1, const void *a2)
+static int compare_size(void *user_data, const void *a1, const void *a2)
 {
   const FileListInternEntry *entry1 = a1;
   const FileListInternEntry *entry2 = a2;
+  const struct FileSortData *sort_data = user_data;
   char *name1, *name2;
   uint64_t size1, size2;
   int ret;
@@ -479,22 +490,23 @@ static int compare_size(void *UNUSED(user_data), const void *a1, const void *a2)
   size1 = entry1->st.st_size;
   size2 = entry2->st.st_size;
   if (size1 < size2) {
-    return 1;
+    return compare_apply_inverted(1, sort_data);
   }
   if (size1 > size2) {
-    return -1;
+    return compare_apply_inverted(-1, sort_data);
   }
 
   name1 = entry1->name;
   name2 = entry2->name;
 
-  return BLI_strcasecmp_natural(name1, name2);
+  return compare_apply_inverted(BLI_strcasecmp_natural(name1, name2), sort_data);
 }
 
-static int compare_extension(void *UNUSED(user_data), const void *a1, const void *a2)
+static int compare_extension(void *user_data, const void *a1, const void *a2)
 {
   const FileListInternEntry *entry1 = a1;
   const FileListInternEntry *entry2 = a2;
+  const struct FileSortData *sort_data = user_data;
   char *name1, *name2;
   int ret;
 
@@ -516,10 +528,10 @@ static int compare_extension(void *UNUSED(user_data), const void *a1, const void
       return -1;
     }
     if (entry1->blentype < entry2->blentype) {
-      return -1;
+      return compare_apply_inverted(-1, sort_data);
     }
     if (entry1->blentype > entry2->blentype) {
-      return 1;
+      return compare_apply_inverted(1, sort_data);
     }
   }
   else {
@@ -539,48 +551,58 @@ static int compare_extension(void *UNUSED(user_data), const void *a1, const void
     }
 
     if ((ret = BLI_strcasecmp(sufix1, sufix2))) {
-      return ret;
+      return compare_apply_inverted(ret, sort_data);
     }
   }
 
   name1 = entry1->name;
   name2 = entry2->name;
 
-  return BLI_strcasecmp_natural(name1, name2);
+  return compare_apply_inverted(BLI_strcasecmp_natural(name1, name2), sort_data);
 }
 
 void filelist_sort(struct FileList *filelist)
 {
   if ((filelist->flags & FL_NEED_SORTING) && (filelist->sort != FILE_SORT_NONE)) {
+    void *sort_cb = NULL;
+
     switch (filelist->sort) {
       case FILE_SORT_ALPHA:
-        BLI_listbase_sort_r(&filelist->filelist_intern.entries, compare_name, NULL);
+        sort_cb = compare_name;
         break;
       case FILE_SORT_TIME:
-        BLI_listbase_sort_r(&filelist->filelist_intern.entries, compare_date, NULL);
+        sort_cb = compare_date;
         break;
       case FILE_SORT_SIZE:
-        BLI_listbase_sort_r(&filelist->filelist_intern.entries, compare_size, NULL);
+        sort_cb = compare_size;
         break;
       case FILE_SORT_EXTENSION:
-        BLI_listbase_sort_r(&filelist->filelist_intern.entries, compare_extension, NULL);
+        sort_cb = compare_extension;
         break;
       case FILE_SORT_NONE: /* Should never reach this point! */
       default:
         BLI_assert(0);
         break;
     }
+    BLI_listbase_sort_r(
+        &filelist->filelist_intern.entries,
+        sort_cb,
+        &(struct FileSortData){.inverted = (filelist->flags & FL_SORT_INVERT) != 0});
 
     filelist_filter_clear(filelist);
     filelist->flags &= ~FL_NEED_SORTING;
   }
 }
 
-void filelist_setsorting(struct FileList *filelist, const short sort)
+void filelist_setsorting(struct FileList *filelist, const short sort, bool invert_sort)
 {
-  if (filelist->sort != sort) {
+  const bool was_invert_sort = filelist->flags & FL_SORT_INVERT;
+
+  if ((filelist->sort != sort) || (was_invert_sort != invert_sort)) {
     filelist->sort = sort;
     filelist->flags |= FL_NEED_SORTING;
+    filelist->flags = invert_sort ? (filelist->flags | FL_SORT_INVERT) :
+                                    (filelist->flags & ~FL_SORT_INVERT);
   }
 }
 
@@ -635,9 +657,9 @@ static bool is_filtered_file(FileListInternEntry *file,
 {
   bool is_filtered = !is_hidden_file(file->relpath, filter);
 
-  if (is_filtered && (filter->flags & FLF_DO_FILTER) && !FILENAME_IS_CURRPAR(file->relpath)) {
+  if (is_filtered && !FILENAME_IS_CURRPAR(file->relpath)) {
     /* We only check for types if some type are enabled in filtering. */
-    if (filter->filter) {
+    if (filter->filter && (filter->flags & FLF_DO_FILTER)) {
       if (file->typeflag & FILE_TYPE_DIR) {
         if (file->typeflag &
             (FILE_TYPE_BLENDERLIB | FILE_TYPE_BLENDER | FILE_TYPE_BLENDER_BACKUP)) {
@@ -657,6 +679,7 @@ static bool is_filtered_file(FileListInternEntry *file,
         }
       }
     }
+    /* If there's a filter string, apply it as filter even if FLF_DO_FILTER is not set. */
     if (is_filtered && (filter->filter_search[0] != '\0')) {
       if (fnmatch(filter->filter_search, file->relpath, FNM_CASEFOLD) != 0) {
         is_filtered = false;
@@ -676,9 +699,9 @@ static bool is_filtered_lib(FileListInternEntry *file, const char *root, FileLis
 
   if (BLO_library_path_explode(path, dir, &group, &name)) {
     is_filtered = !is_hidden_file(file->relpath, filter);
-    if (is_filtered && (filter->flags & FLF_DO_FILTER) && !FILENAME_IS_CURRPAR(file->relpath)) {
+    if (is_filtered && !FILENAME_IS_CURRPAR(file->relpath)) {
       /* We only check for types if some type are enabled in filtering. */
-      if (filter->filter || filter->filter_id) {
+      if ((filter->filter || filter->filter_id) && (filter->flags & FLF_DO_FILTER)) {
         if (file->typeflag & FILE_TYPE_DIR) {
           if (file->typeflag &
               (FILE_TYPE_BLENDERLIB | FILE_TYPE_BLENDER | FILE_TYPE_BLENDER_BACKUP)) {
@@ -704,6 +727,7 @@ static bool is_filtered_lib(FileListInternEntry *file, const char *root, FileLis
           }
         }
       }
+      /* If there's a filter string, apply it as filter even if FLF_DO_FILTER is not set. */
       if (is_filtered && (filter->filter_search[0] != '\0')) {
         if (fnmatch(filter->filter_search, file->relpath, FNM_CASEFOLD) != 0) {
           is_filtered = false;
@@ -904,42 +928,12 @@ static ImBuf *filelist_geticon_image_ex(const unsigned int typeflag, const char
     if (FILENAME_IS_PARENT(relpath)) {
       ibuf = gSpecialFileImages[SPECIAL_IMG_PARENT];
     }
-    else if (FILENAME_IS_CURRENT(relpath)) {
-      ibuf = gSpecialFileImages[SPECIAL_IMG_REFRESH];
-    }
     else {
       ibuf = gSpecialFileImages[SPECIAL_IMG_FOLDER];
     }
   }
-  else if (typeflag & FILE_TYPE_BLENDER) {
-    ibuf = gSpecialFileImages[SPECIAL_IMG_BLENDFILE];
-  }
-  else if (typeflag & FILE_TYPE_BLENDERLIB) {
-    ibuf = gSpecialFileImages[SPECIAL_IMG_UNKNOWNFILE];
-  }
-  else if (typeflag & (FILE_TYPE_MOVIE)) {
-    ibuf = gSpecialFileImages[SPECIAL_IMG_MOVIEFILE];
-  }
-  else if (typeflag & FILE_TYPE_SOUND) {
-    ibuf = gSpecialFileImages[SPECIAL_IMG_SOUNDFILE];
-  }
-  else if (typeflag & FILE_TYPE_PYSCRIPT) {
-    ibuf = gSpecialFileImages[SPECIAL_IMG_PYTHONFILE];
-  }
-  else if (typeflag & FILE_TYPE_FTFONT) {
-    ibuf = gSpecialFileImages[SPECIAL_IMG_FONTFILE];
-  }
-  else if (typeflag & FILE_TYPE_TEXT) {
-    ibuf = gSpecialFileImages[SPECIAL_IMG_TEXTFILE];
-  }
-  else if (typeflag & FILE_TYPE_IMAGE) {
-    ibuf = gSpecialFileImages[SPECIAL_IMG_LOADING];
-  }
-  else if (typeflag & FILE_TYPE_BLENDER_BACKUP) {
-    ibuf = gSpecialFileImages[SPECIAL_IMG_BACKUP];
-  }
   else {
-    ibuf = gSpecialFileImages[SPECIAL_IMG_UNKNOWNFILE];
+    ibuf = gSpecialFileImages[SPECIAL_IMG_DOCUMENT];
   }
 
   return ibuf;
@@ -1001,10 +995,13 @@ static int filelist_geticon_ex(const int typeflag,
     return ICON_FILE_BLANK;
   }
   else if (typeflag & FILE_TYPE_COLLADA) {
-    return ICON_FILE_BLANK;
+    return ICON_FILE_3D;
   }
   else if (typeflag & FILE_TYPE_ALEMBIC) {
-    return ICON_FILE_BLANK;
+    return ICON_FILE_3D;
+  }
+  else if (typeflag & FILE_TYPE_OBJECT_IO) {
+    return ICON_FILE_3D;
   }
   else if (typeflag & FILE_TYPE_TEXT) {
     return ICON_FILE_TEXT;
@@ -1243,7 +1240,8 @@ static void filelist_cache_previews_clear(FileListEntryCache *cache)
     BLI_task_pool_cancel(cache->previews_pool);
 
     while ((preview = BLI_thread_queue_pop_timeout(cache->previews_done, 0))) {
-      // printf("%s: DONE %d - %s - %p\n", __func__, preview->index, preview->path, preview->img);
+      // printf("%s: DONE %d - %s - %p\n", __func__, preview->index, preview->path,
+      // preview->img);
       if (preview->img) {
         IMB_freeImBuf(preview->img);
       }
@@ -2128,6 +2126,9 @@ int ED_path_extension_type(const char *path)
   else if (BLI_path_extension_check(path, ".abc")) {
     return FILE_TYPE_ALEMBIC;
   }
+  else if (BLI_path_extension_check_n(path, ".obj", ".3ds", ".fbx", ".glb", ".gltf", NULL)) {
+    return FILE_TYPE_OBJECT_IO;
+  }
   else if (BLI_path_extension_check_array(path, imb_ext_image)) {
     return FILE_TYPE_IMAGE;
   }
@@ -2177,9 +2178,9 @@ int ED_file_extension_icon(const char *path)
     case FILE_TYPE_BTX:
       return ICON_FILE_BLANK;
     case FILE_TYPE_COLLADA:
-      return ICON_FILE_BLANK;
     case FILE_TYPE_ALEMBIC:
-      return ICON_FILE_BLANK;
+    case FILE_TYPE_OBJECT_IO:
+      return ICON_FILE_3D;
     case FILE_TYPE_TEXT:
       return ICON_FILE_TEXT;
     default:
index caf77246797098751fae633be7bcd4950e15ed24..9af0b7d623f5eb983e400b985a31f6317c370612 100644 (file)
@@ -55,7 +55,7 @@ void folderlist_pushdir(struct ListBase *folderlist, const char *dir);
 const char *folderlist_peeklastdir(struct ListBase *folderdist);
 int folderlist_clear_next(struct SpaceFile *sfile);
 
-void filelist_setsorting(struct FileList *filelist, const short sort);
+void filelist_setsorting(struct FileList *filelist, const short sort, bool invert_sort);
 void filelist_sort(struct FileList *filelist);
 
 void filelist_setfilter_options(struct FileList *filelist,
index db42d007b8e7cba11e0fa5291176ecc09524e17e..3223fe0c6ce92e41bd7abd1899ef044792aeba8b 100644 (file)
@@ -49,6 +49,8 @@
 #include "BLI_utildefines.h"
 #include "BLI_fnmatch.h"
 
+#include "BLT_translation.h"
+
 #include "BKE_appdir.h"
 #include "BKE_context.h"
 #include "BKE_main.h"
@@ -69,6 +71,8 @@
 #include "file_intern.h"
 #include "filelist.h"
 
+#define VERTLIST_MAJORCOLUMN_WIDTH (25 * UI_UNIT_X)
+
 FileSelectParams *ED_fileselect_get_params(struct SpaceFile *sfile)
 {
   if (!sfile->params) {
@@ -99,6 +103,8 @@ short ED_fileselect_set_params(SpaceFile *sfile)
     sfile->params->filter_glob[0] = '\0';
     /* set the default thumbnails size */
     sfile->params->thumbnail_size = 128;
+    /* Show size column by default. */
+    sfile->params->details_flags = FILE_DETAILS_SIZE | FILE_DETAILS_DATETIME;
   }
 
   params = sfile->params;
@@ -161,6 +167,10 @@ short ED_fileselect_set_params(SpaceFile *sfile)
       params->flag &= ~FILE_DIRSEL_ONLY;
     }
 
+    if ((prop = RNA_struct_find_property(op->ptr, "hide_props_region"))) {
+      params->flag |= RNA_property_boolean_get(op->ptr, prop) ? FILE_HIDE_TOOL_PROPS : 0;
+    }
+
     params->filter = 0;
     if ((prop = RNA_struct_find_property(op->ptr, "filter_blender"))) {
       params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_BLENDER : 0;
@@ -261,6 +271,10 @@ short ED_fileselect_set_params(SpaceFile *sfile)
       params->sort = FILE_SORT_ALPHA;
     }
 
+    if ((prop = RNA_struct_find_property(op->ptr, "action_type"))) {
+      params->action_type = RNA_property_enum_get(op->ptr, prop);
+    }
+
     if (params->display == FILE_DEFAULTDISPLAY) {
       if (params->display_previous == FILE_DEFAULTDISPLAY) {
         if (U.uiflag & USER_SHOW_THUMBNAILS) {
@@ -268,11 +282,11 @@ short ED_fileselect_set_params(SpaceFile *sfile)
             params->display = FILE_IMGDISPLAY;
           }
           else {
-            params->display = FILE_SHORTDISPLAY;
+            params->display = FILE_VERTICALDISPLAY;
           }
         }
         else {
-          params->display = FILE_SHORTDISPLAY;
+          params->display = FILE_VERTICALDISPLAY;
         }
       }
       else {
@@ -293,7 +307,7 @@ short ED_fileselect_set_params(SpaceFile *sfile)
     params->type = FILE_UNIX;
     params->flag |= FILE_HIDE_DOT;
     params->flag &= ~FILE_DIRSEL_ONLY;
-    params->display = FILE_SHORTDISPLAY;
+    params->display = FILE_VERTICALDISPLAY;
     params->display_previous = FILE_DEFAULTDISPLAY;
     params->sort = FILE_SORT_ALPHA;
     params->filter = 0;
@@ -344,7 +358,7 @@ void ED_fileselect_reset_params(SpaceFile *sfile)
 void fileselect_file_set(SpaceFile *sfile, const int index)
 {
   const struct FileDirEntry *file = filelist_file(sfile->files, index);
-  if (file && file->relpath && file->relpath[0] && !(file->typeflag & FILE_TYPE_FOLDER)) {
+  if (file && file->relpath && file->relpath[0] && !(file->typeflag & FILE_TYPE_DIR)) {
     BLI_strncpy(sfile->params->file, file->relpath, FILE_MAXFILE);
   }
 }
@@ -372,10 +386,10 @@ int ED_fileselect_layout_numfiles(FileLayout *layout, ARegion *ar)
   }
   else {
     const int y_item = layout->tile_h + (2 * layout->tile_border_y);
-    const int y_view = (int)(BLI_rctf_size_y(&ar->v2d.cur));
+    const int y_view = (int)(BLI_rctf_size_y(&ar->v2d.cur)) - layout->offset_top;
     const int y_over = y_item - (y_view % y_item);
     numfiles = (int)((float)(y_view + y_over) / (float)(y_item));
-    return numfiles * layout->columns;
+    return numfiles * layout->flow_columns;
   }
 }
 
@@ -395,19 +409,19 @@ FileSelection ED_fileselect_layout_offset_rect(FileLayout *layout, const rcti *r
   }
 
   colmin = (rect->xmin) / (layout->tile_w + 2 * layout->tile_border_x);
-  rowmin = (rect->ymin) / (layout->tile_h + 2 * layout->tile_border_y);
+  rowmin = (rect->ymin - layout->offset_top) / (layout->tile_h + 2 * layout->tile_border_y);
   colmax = (rect->xmax) / (layout->tile_w + 2 * layout->tile_border_x);
-  rowmax = (rect->ymax) / (layout->tile_h + 2 * layout->tile_border_y);
+  rowmax = (rect->ymax - layout->offset_top) / (layout->tile_h + 2 * layout->tile_border_y);
 
-  if (is_inside(colmin, rowmin, layout->columns, layout->rows) ||
-      is_inside(colmax, rowmax, layout->columns, layout->rows)) {
-    CLAMP(colmin, 0, layout->columns - 1);
+  if (is_inside(colmin, rowmin, layout->flow_columns, layout->rows) ||
+      is_inside(colmax, rowmax, layout->flow_columns, layout->rows)) {
+    CLAMP(colmin, 0, layout->flow_columns - 1);
     CLAMP(rowmin, 0, layout->rows - 1);
-    CLAMP(colmax, 0, layout->columns - 1);
+    CLAMP(colmax, 0, layout->flow_columns - 1);
     CLAMP(rowmax, 0, layout->rows - 1);
   }
 
-  if ((colmin > layout->columns - 1) || (rowmin > layout->rows - 1)) {
+  if ((colmin > layout->flow_columns - 1) || (rowmin > layout->rows - 1)) {
     sel.first = -1;
   }
   else {
@@ -415,10 +429,10 @@ FileSelection ED_fileselect_layout_offset_rect(FileLayout *layout, const rcti *r
       sel.first = layout->rows * colmin + rowmin;
     }
     else {
-      sel.first = colmin + layout->columns * rowmin;
+      sel.first = colmin + layout->flow_columns * rowmin;
     }
   }
-  if ((colmax > layout->columns - 1) || (rowmax > layout->rows - 1)) {
+  if ((colmax > layout->flow_columns - 1) || (rowmax > layout->rows - 1)) {
     sel.last = -1;
   }
   else {
@@ -426,7 +440,7 @@ FileSelection ED_fileselect_layout_offset_rect(FileLayout *layout, const rcti *r
       sel.last = layout->rows * colmax + rowmax;
     }
     else {
-      sel.last = colmax + layout->columns * rowmax;
+      sel.last = colmax + layout->flow_columns * rowmax;
     }
   }
 
@@ -443,9 +457,9 @@ int ED_fileselect_layout_offset(FileLayout *layout, int x, int y)
   }
 
   offsetx = (x) / (layout->tile_w + 2 * layout->tile_border_x);
-  offsety = (y) / (layout->tile_h + 2 * layout->tile_border_y);
+  offsety = (y - layout->offset_top) / (layout->tile_h + 2 * layout->tile_border_y);
 
-  if (offsetx > layout->columns - 1) {
+  if (offsetx > layout->flow_columns - 1) {
     return -1;
   }
   if (offsety > layout->rows - 1) {
@@ -456,25 +470,121 @@ int ED_fileselect_layout_offset(FileLayout *layout, int x, int y)
     active_file = layout->rows * offsetx + offsety;
   }
   else {
-    active_file = offsetx + layout->columns * offsety;
+    active_file = offsetx + layout->flow_columns * offsety;
   }
   return active_file;
 }
 
+/**
+ * Get the currently visible bounds of the layout in screen space. Matches View2D.mask minus the
+ * top column-header row.
+ */
+void ED_fileselect_layout_maskrect(const FileLayout *layout, const View2D *v2d, rcti *r_rect)
+{
+  *r_rect = v2d->mask;
+  r_rect->ymax -= layout->offset_top;
+}
+
+bool ED_fileselect_layout_is_inside_pt(const FileLayout *layout, const View2D *v2d, int x, int y)
+{
+  rcti maskrect;
+  ED_fileselect_layout_maskrect(layout, v2d, &maskrect);
+  return BLI_rcti_isect_pt(&maskrect, x, y);
+}
+
+bool ED_fileselect_layout_isect_rect(const FileLayout *layout,
+                                     const View2D *v2d,
+                                     const rcti *rect,
+                                     rcti *r_dst)
+{
+  rcti maskrect;
+  ED_fileselect_layout_maskrect(layout, v2d, &maskrect);
+  return BLI_rcti_isect(&maskrect, rect, r_dst);
+}
+
 void ED_fileselect_layout_tilepos(FileLayout *layout, int tile, int *x, int *y)
 {
   if (layout->flag == FILE_LAYOUT_HOR) {
     *x = layout->tile_border_x +
          (tile / layout->rows) * (layout->tile_w + 2 * layout->tile_border_x);
-    *y = layout->tile_border_y +
+    *y = layout->offset_top + layout->tile_border_y +
          (tile % layout->rows) * (layout->tile_h + 2 * layout->tile_border_y);
   }
   else {
     *x = layout->tile_border_x +
-         ((tile) % layout->columns) * (layout->tile_w + 2 * layout->tile_border_x);
-    *y = layout->tile_border_y +
-         ((tile) / layout->columns) * (layout->tile_h + 2 * layout->tile_border_y);
+         ((tile) % layout->flow_columns) * (layout->tile_w + 2 * layout->tile_border_x);
+    *y = layout->offset_top + layout->tile_border_y +
+         ((tile) / layout->flow_columns) * (layout->tile_h + 2 * layout->tile_border_y);
+  }
+}
+
+/**
+ * Check if the region coordinate defined by \a x and \a y are inside the column header.
+ */
+bool file_attribute_column_header_is_inside(const View2D *v2d,
+                                            const FileLayout *layout,
+                                            int x,
+                                            int y)
+{
+  rcti header_rect = v2d->mask;
+  header_rect.ymin = header_rect.ymax - layout->attribute_column_header_h;
+  return BLI_rcti_isect_pt(&header_rect, x, y);
+}
+
+bool file_attribute_column_type_enabled(const FileSelectParams *params,
+                                        FileAttributeColumnType column)
+{
+  switch (column) {
+    case COLUMN_NAME:
+      /* Always enabled */
+      return true;
+    case COLUMN_DATETIME:
+      return (params->details_flags & FILE_DETAILS_DATETIME) != 0;
+    case COLUMN_SIZE:
+      return (params->details_flags & FILE_DETAILS_SIZE) != 0;
+    default:
+      return false;
+  }
+}
+
+/**
+ * Find the column type at region coordinate given by \a x (y doesn't matter for this).
+ */
+FileAttributeColumnType file_attribute_column_type_find_isect(const View2D *v2d,
+                                                              const FileSelectParams *params,
+                                                              FileLayout *layout,
+                                                              int x)
+{
+  float mx, my;
+  int offset_tile;
+
+  UI_view2d_region_to_view(v2d, x, v2d->mask.ymax - layout->offset_top - 1, &mx, &my);
+  offset_tile = ED_fileselect_layout_offset(
+      layout, (int)(v2d->tot.xmin + mx), (int)(v2d->tot.ymax - my));
+  if (offset_tile > -1) {
+    int tile_x, tile_y;
+    int pos_x = 0;
+    int rel_x; /* x relative to the hovered tile */
+
+    ED_fileselect_layout_tilepos(layout, offset_tile, &tile_x, &tile_y);
+    /* Column header drawing doesn't use left tile border, so subtract it. */
+    rel_x = mx - (tile_x - layout->tile_border_x);
+
+    for (FileAttributeColumnType column = 0; column < ATTRIBUTE_COLUMN_MAX; column++) {
+      if (!file_attribute_column_type_enabled(params, column)) {
+        continue;
+      }
+      const int width = layout->attribute_columns[column].width;
+
+      if (IN_RANGE(rel_x, pos_x, pos_x + width)) {
+        return column;
+      }
+
+      pos_x += width;
+    }
   }
+
+  return COLUMN_NONE;
 }
 
 float file_string_width(const char *str)
@@ -512,20 +622,52 @@ float file_font_pointsize(void)
 #endif
 }
 
-static void column_widths(FileSelectParams *params, struct FileLayout *layout)
+static void file_attribute_columns_widths(const FileSelectParams *params, FileLayout *layout)
 {
-  int i;
+  FileAttributeColumn *columns = layout->attribute_columns;
   const bool small_size = SMALL_SIZE_CHECK(params->thumbnail_size);
+  const int pad = small_size ? 0 : ATTRIBUTE_COLUMN_PADDING * 2;
 
-  for (i = 0; i < MAX_FILE_COLUMN; ++i) {
-    layout->column_widths[i] = 0;
+  for (int i = 0; i < ATTRIBUTE_COLUMN_MAX; ++i) {
+    layout->attribute_columns[i].width = 0;
   }
 
-  layout->column_widths[COLUMN_NAME] = ((float)params->thumbnail_size / 8.0f) * UI_UNIT_X;
   /* Biggest possible reasonable values... */
-  layout->column_widths[COLUMN_DATE] = file_string_width(small_size ? "23/08/89" : "23-Dec-89");
-  layout->column_widths[COLUMN_TIME] = file_string_width("23:59");
-  layout->column_widths[COLUMN_SIZE] = file_string_width(small_size ? "98.7 M" : "98.7 MiB");
+  columns[COLUMN_DATETIME].width = file_string_width(small_size ? "23/08/89" :
+                                                                  "23 Dec 6789, 23:59") +
+                                   pad;
+  columns[COLUMN_SIZE].width = file_string_width(small_size ? "98.7 M" : "098.7 MB") + pad;
+  if (params->display == FILE_IMGDISPLAY) {
+    columns[COLUMN_NAME].width = ((float)params->thumbnail_size / 8.0f) * UI_UNIT_X;
+  }
+  /* Name column uses remaining width */
+  else {
+    int remwidth = layout->tile_w;
+    for (FileAttributeColumnType column_type = ATTRIBUTE_COLUMN_MAX - 1; column_type >= 0;
+         column_type--) {
+      if ((column_type == COLUMN_NAME) ||
+          !file_attribute_column_type_enabled(params, column_type)) {
+        continue;
+      }
+      remwidth -= columns[column_type].width;
+    }
+    columns[COLUMN_NAME].width = remwidth;
+  }
+}
+
+static void file_attribute_columns_init(const FileSelectParams *params, FileLayout *layout)
+{
+  file_attribute_columns_widths(params, layout);
+
+  layout->attribute_columns[COLUMN_NAME].name = N_("Name");
+  layout->attribute_columns[COLUMN_NAME].sort_type = FILE_SORT_ALPHA;
+  layout->attribute_columns[COLUMN_NAME].text_align = UI_STYLE_TEXT_LEFT;
+  layout->attribute_columns[COLUMN_DATETIME].name = N_("Date Modified");
+  layout->attribute_columns[COLUMN_DATETIME].sort_type = FILE_SORT_TIME;
+  layout->attribute_columns[COLUMN_DATETIME].text_align = UI_STYLE_TEXT_LEFT;
+  layout->attribute_columns[COLUMN_SIZE].name = N_("Size");
+  layout->attribute_columns[COLUMN_SIZE].sort_type = FILE_SORT_SIZE;
+  layout->attribute_columns[COLUMN_SIZE].text_align = UI_STYLE_TEXT_RIGHT;
 }
 
 void ED_fileselect_init_layout(struct SpaceFile *sfile, ARegion *ar)
@@ -533,7 +675,6 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, ARegion *ar)
   FileSelectParams *params = ED_fileselect_get_params(sfile);
   FileLayout *layout = NULL;
   View2D *v2d = &ar->v2d;
-  int maxlen = 0;
   int numfiles;
   int textheight;
 
@@ -560,57 +701,66 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, ARegion *ar)
     layout->tile_w = layout->prv_w + 2 * layout->prv_border_x;
     layout->tile_h = layout->prv_h + 2 * layout->prv_border_y + textheight;
     layout->width = (int)(BLI_rctf_size_x(&v2d->cur) - 2 * layout->tile_border_x);
-    layout->columns = layout->width / (layout->tile_w + 2 * layout->tile_border_x);
-    if (layout->columns > 0) {
-      layout->rows = numfiles / layout->columns + 1;  // XXX dirty, modulo is zero
+    layout->flow_columns = layout->width / (layout->tile_w + 2 * layout->tile_border_x);
+    layout->attribute_column_header_h = 0;
+    layout->offset_top = 0;
+    if (layout->flow_columns > 0) {
+      layout->rows = numfiles / layout->flow_columns + 1;  // XXX dirty, modulo is zero
     }
     else {
-      layout->columns = 1;
+      layout->flow_columns = 1;
       layout->rows = numfiles + 1;  // XXX dirty, modulo is zero
     }
     layout->height = sfile->layout->rows * (layout->tile_h + 2 * layout->tile_border_y) +
-                     layout->tile_border_y * 2;
+                     layout->tile_border_y * 2 - layout->offset_top;
     layout->flag = FILE_LAYOUT_VER;
   }
-  else {
-    int column_space = 0.6f * UI_UNIT_X;
-    int column_icon_space = 0.2f * UI_UNIT_X;
+  else if (params->display == FILE_VERTICALDISPLAY) {
+    int rowcount;
 
-    layout->prv_w = 0;
-    layout->prv_h = 0;
+    layout->prv_w = ((float)params->thumbnail_size / 20.0f) * UI_UNIT_X;
+    layout->prv_h = ((float)params->thumbnail_size / 20.0f) * UI_UNIT_Y;
+    layout->tile_border_x = 0.4f * UI_UNIT_X;
+    layout->tile_border_y = 0.1f * UI_UNIT_Y;
+    layout->tile_h = textheight * 3 / 2;
+    layout->width = (int)(BLI_rctf_size_x(&v2d->cur) - 2 * layout->tile_border_x);
+    layout->tile_w = layout->width;
+    layout->flow_columns = 1;
+    layout->attribute_column_header_h = layout->tile_h * 1.2f + 2 * layout->tile_border_y;
+    layout->offset_top = layout->attribute_column_header_h;
+    rowcount = (int)(BLI_rctf_size_y(&v2d->cur) - layout->offset_top - 2 * layout->tile_border_y) /
+               (layout->tile_h + 2 * layout->tile_border_y);
+    file_attribute_columns_init(params, layout);
+
+    layout->rows = MAX2(rowcount, numfiles);
+    BLI_assert(layout->rows != 0);
+    layout->height = sfile->layout->rows * (layout->tile_h + 2 * layout->tile_border_y) +
+                     layout->tile_border_y * 2 + layout->offset_top;
+    layout->flag = FILE_LAYOUT_VER;
+  }
+  else if (params->display == FILE_HORIZONTALDISPLAY) {
+    layout->prv_w = ((float)params->thumbnail_size / 20.0f) * UI_UNIT_X;
+    layout->prv_h = ((float)params->thumbnail_size / 20.0f) * UI_UNIT_Y;
     layout->tile_border_x = 0.4f * UI_UNIT_X;
     layout->tile_border_y = 0.1f * UI_UNIT_Y;
-    layout->prv_border_x = 0;
-    layout->prv_border_y = 0;
     layout->tile_h = textheight * 3 / 2;
+    layout->attribute_column_header_h = 0;
+    layout->offset_top = layout->attribute_column_header_h;
     layout->height = (int)(BLI_rctf_size_y(&v2d->cur) - 2 * layout->tile_border_y);
     /* Padding by full scrollbar H is too much, can overlap tile border Y. */
     layout->rows = (layout->height - V2D_SCROLL_HEIGHT + layout->tile_border_y) /
                    (layout->tile_h + 2 * layout->tile_border_y);
+    layout->tile_w = VERTLIST_MAJORCOLUMN_WIDTH;
+    file_attribute_columns_init(params, layout);
 
-    column_widths(params, layout);
-
-    if (params->display == FILE_SHORTDISPLAY) {
-      maxlen = ICON_DEFAULT_WIDTH_SCALE + column_icon_space +
-               (int)layout->column_widths[COLUMN_NAME] + column_space +
-               (int)layout->column_widths[COLUMN_SIZE] + column_space;
-    }
-    else {
-      maxlen = ICON_DEFAULT_WIDTH_SCALE + column_icon_space +
-               (int)layout->column_widths[COLUMN_NAME] + column_space +
-               (int)layout->column_widths[COLUMN_DATE] + column_space +
-               (int)layout->column_widths[COLUMN_TIME] + column_space +
-               (int)layout->column_widths[COLUMN_SIZE] + column_space;
-    }
-    layout->tile_w = maxlen;
     if (layout->rows > 0) {
-      layout->columns = numfiles / layout->rows + 1;  // XXX dirty, modulo is zero
+      layout->flow_columns = numfiles / layout->rows + 1;  // XXX dirty, modulo is zero
     }
     else {
       layout->rows = 1;
-      layout->columns = numfiles + 1;  // XXX dirty, modulo is zero
+      layout->flow_columns = numfiles + 1;  // XXX dirty, modulo is zero
     }
-    layout->width = sfile->layout->columns * (layout->tile_w + 2 * layout->tile_border_x) +
+    layout->width = sfile->layout->flow_columns * (layout->tile_w + 2 * layout->tile_border_x) +
                     layout->tile_border_x * 2;
     layout->flag = FILE_LAYOUT_HOR;
   }
index 1fd878e466208ee954bbcdab6953140c3f0fdd9d..1befdd52d7d3d70528920370ba65d302bd9f84e2 100644 (file)
@@ -72,23 +72,40 @@ static SpaceLink *file_new(const ScrArea *UNUSED(area), const Scene *UNUSED(scen
   /* Ignore user preference "USER_HEADER_BOTTOM" here (always show top for new types). */
   ar->alignment = RGN_ALIGN_TOP;
 
+  /* ui list region */
+  ar = MEM_callocN(sizeof(ARegion), "ui region for file");
+  BLI_addtail(&sfile->regionbase, ar);
+  ar->regiontype = RGN_TYPE_UI;
+  ar->alignment = RGN_ALIGN_TOP;
+  ar->flag |= RGN_FLAG_DYNAMIC_SIZE;
+
   /* Tools region */
   ar = MEM_callocN(sizeof(ARegion), "tools region for file");
   BLI_addtail(&sfile->regionbase, ar);
   ar->regiontype = RGN_TYPE_TOOLS;
   ar->alignment = RGN_ALIGN_LEFT;
+  /* Tools region (lower split region) */
+  ar = MEM_callocN(sizeof(ARegion), "lower tools region for file");
+  BLI_addtail(&sfile->regionbase, ar);
+  ar->regiontype = RGN_TYPE_TOOLS;
+  ar->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
+  ar->flag |= RGN_FLAG_DYNAMIC_SIZE;
+
+  /* Execute region */
+  ar = MEM_callocN(sizeof(ARegion), "execute region for file");
+  BLI_addtail(&sfile->regionbase, ar);
+  ar->regiontype = RGN_TYPE_EXECUTE;
+  ar->alignment = RGN_ALIGN_BOTTOM;
+  ar->flag |= RGN_FLAG_DYNAMIC_SIZE;
 
+  /* Tool props region is added as needed. */
+#if 0
   /* Tool props (aka operator) region */
   ar = MEM_callocN(sizeof(ARegion), "tool props region for file");
   BLI_addtail(&sfile->regionbase, ar);
   ar->regiontype = RGN_TYPE_TOOL_PROPS;
-  ar->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
-
-  /* ui list region */
-  ar = MEM_callocN(sizeof(ARegion), "ui region for file");
-  BLI_addtail(&sfile->regionbase, ar);
-  ar->regiontype = RGN_TYPE_UI;
-  ar->alignment = RGN_ALIGN_TOP;
+  ar->alignment = RGN_ALIGN_RIGHT;
+#endif
 
   /* main region */
   ar = MEM_callocN(sizeof(ARegion), "main region for file");
@@ -204,6 +221,7 @@ static SpaceLink *file_duplicate(SpaceLink *sl)
 static void file_refresh(const bContext *C, ScrArea *sa)
 {
   wmWindowManager *wm = CTX_wm_manager(C);
+  wmWindow *win = CTX_wm_window(C);
   SpaceFile *sfile = CTX_wm_space_file(C);
   FileSelectParams *params = ED_fileselect_get_params(sfile);
   struct FSMenu *fsmenu = ED_fsmenu_get();
@@ -217,15 +235,16 @@ static void file_refresh(const bContext *C, ScrArea *sa)
   }
   filelist_setdir(sfile->files, params->dir);
   filelist_setrecursion(sfile->files, params->recursion_level);
-  filelist_setsorting(sfile->files, params->sort);
-  filelist_setfilter_options(sfile->files,
-                             (params->flag & FILE_FILTER) != 0,
-                             (params->flag & FILE_HIDE_DOT) != 0,
-                             false, /* TODO hide_parent, should be controllable? */
-                             params->filter,
-                             params->filter_id,
-                             params->filter_glob,
-                             params->filter_search);
+  filelist_setsorting(sfile->files, params->sort, params->flag & FILE_SORT_INVERT);
+  filelist_setfilter_options(
+      sfile->files,
+      (params->flag & FILE_FILTER) != 0,
+      (params->flag & FILE_HIDE_DOT) != 0,
+      true, /* Just always hide parent, prefer to not add an extra user option for this. */
+      params->filter,
+      params->filter_id,
+      params->filter_glob,
+      params->filter_search);
 
   /* Update the active indices of bookmarks & co. */
   sfile->systemnr = fsmenu_get_active_indices(fsmenu, FS_CATEGORY_SYSTEM, params->dir);
@@ -254,7 +273,7 @@ static void file_refresh(const bContext *C, ScrArea *sa)
   else {
     filelist_cache_previews_set(sfile->files, false);
     if (sfile->previews_timer) {
-      WM_event_remove_timer_notifier(wm, CTX_wm_window(C), sfile->previews_timer);
+      WM_event_remove_timer_notifier(wm, win, sfile->previews_timer);
       sfile->previews_timer = NULL;
     }
   }
@@ -269,10 +288,20 @@ static void file_refresh(const bContext *C, ScrArea *sa)
 
   /* Might be called with NULL sa, see file_main_region_draw() below. */
   if (sa && BKE_area_find_region_type(sa, RGN_TYPE_TOOLS) == NULL) {
-    /* Create TOOLS/TOOL_PROPS regions. */
+    /* Create TOOLS region. */
     file_tools_region(sa);
 
-    ED_area_initialize(wm, CTX_wm_window(C), sa);
+    ED_area_initialize(wm, win, sa);
+  }
+  if (sa && sfile->op && BKE_area_find_region_type(sa, RGN_TYPE_TOOL_PROPS) == NULL) {
+    /* Create TOOL_PROPS region. */
+    ARegion *region_props = file_tool_props_region(sa);
+
+    if (params->flag & FILE_HIDE_TOOL_PROPS) {
+      region_props->flag |= RGN_FLAG_HIDDEN;
+    }
+
+    ED_area_initialize(wm, win, sa);
   }
 
   ED_area_tag_redraw(sa);
@@ -406,6 +435,11 @@ static void file_main_region_draw(const bContext *C, ARegion *ar)
     v2d->keepofs &= ~V2D_LOCKOFS_Y;
     v2d->keepofs |= V2D_LOCKOFS_X;
   }
+  else if (params->display == FILE_VERTICALDISPLAY) {
+    v2d->scroll = V2D_SCROLL_RIGHT;
+    v2d->keepofs &= ~V2D_LOCKOFS_Y;
+    v2d->keepofs |= V2D_LOCKOFS_X;
+  }
   else {
     v2d->scroll = V2D_SCROLL_BOTTOM;
     v2d->keepofs &= ~V2D_LOCKOFS_X;
@@ -439,7 +473,9 @@ static void file_main_region_draw(const bContext *C, ARegion *ar)
   UI_view2d_view_restore(C);
 
   /* scrollers */
-  scrollers = UI_view2d_scrollers_calc(v2d, NULL);
+  rcti view_rect;
+  ED_fileselect_layout_maskrect(sfile->layout, v2d, &view_rect);
+  scrollers = UI_view2d_scrollers_calc(v2d, &view_rect);
   UI_view2d_scrollers_draw(v2d, scrollers);
   UI_view2d_scrollers_free(scrollers);
 }
@@ -452,6 +488,7 @@ static void file_operatortypes(void)
   WM_operatortype_append(FILE_OT_select_box);
   WM_operatortype_append(FILE_OT_select_bookmark);
   WM_operatortype_append(FILE_OT_highlight);
+  WM_operatortype_append(FILE_OT_sort_column_ui_context);
   WM_operatortype_append(FILE_OT_execute);
   WM_operatortype_append(FILE_OT_cancel);
   WM_operatortype_append(FILE_OT_parent);
@@ -538,7 +575,8 @@ static void file_ui_region_init(wmWindowManager *wm, ARegion *ar)
 {
   wmKeyMap *keymap;
 
-  UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
+  ED_region_panels_init(wm, ar);
+  ar->v2d.keepzoom |= V2D_LOCKZOOM_X | V2D_LOCKZOOM_Y;
 
   /* own keymap */
   keymap = WM_keymap_ensure(wm->defaultconf, "File Browser", SPACE_FILE, 0);
@@ -550,22 +588,18 @@ static void file_ui_region_init(wmWindowManager *wm, ARegion *ar)
 
 static void file_ui_region_draw(const bContext *C, ARegion *ar)
 {
-  float col[3];
-  /* clear */
-  UI_GetThemeColor3fv(TH_BACK, col);
-  GPU_clear_color(col[0], col[1], col[2], 0.0);
-  GPU_clear(GPU_COLOR_BIT);
-
-  /* scrolling here is just annoying, disable it */
-  ar->v2d.cur.ymax = BLI_rctf_size_y(&ar->v2d.cur);
-  ar->v2d.cur.ymin = 0;
-
-  /* set view2d view matrix for scrolling (without scrollers) */
-  UI_view2d_view_ortho(&ar->v2d);
+  ED_region_panels(C, ar);
+}
 
-  file_draw_buttons(C, ar);
+static void file_execution_region_init(wmWindowManager *wm, ARegion *ar)
+{
+  ED_region_panels_init(wm, ar);
+  ar->v2d.keepzoom |= V2D_LOCKZOOM_X | V2D_LOCKZOOM_Y;
+}
 
-  UI_view2d_view_restore(C);
+static void file_execution_region_draw(const bContext *C, ARegion *ar)
+{
+  ED_region_panels(C, ar);
 }
 
 static void file_ui_region_listener(wmWindow *UNUSED(win),
@@ -656,13 +690,21 @@ void ED_spacetype_file(void)
   /* regions: ui */
   art = MEM_callocN(sizeof(ARegionType), "spacetype file region");
   art->regionid = RGN_TYPE_UI;
-  art->prefsizey = 60;
   art->keymapflag = ED_KEYMAP_UI;
   art->listener = file_ui_region_listener;
   art->init = file_ui_region_init;
   art->draw = file_ui_region_draw;
   BLI_addhead(&st->regiontypes, art);
 
+  /* regions: execution */
+  art = MEM_callocN(sizeof(ARegionType), "spacetype file region");
+  art->regionid = RGN_TYPE_EXECUTE;
+  art->keymapflag = ED_KEYMAP_UI;
+  art->listener = file_ui_region_listener;
+  art->init = file_execution_region_init;
+  art->draw = file_execution_region_draw;
+  BLI_addhead(&st->regiontypes, art);
+
   /* regions: channels (directories) */
   art = MEM_callocN(sizeof(ARegionType), "spacetype file region");
   art->regionid = RGN_TYPE_TOOLS;
@@ -677,8 +719,8 @@ void ED_spacetype_file(void)
   /* regions: tool properties */
   art = MEM_callocN(sizeof(ARegionType), "spacetype file operator region");
   art->regionid = RGN_TYPE_TOOL_PROPS;
-  art->prefsizex = 0;
-  art->prefsizey = 360;
+  art->prefsizex = 240;
+  art->prefsizey = 60;
   art->keymapflag = ED_KEYMAP_UI;
   art->listener = file_tools_region_listener;
   art->init = file_tools_region_init;
index b624e21937f5b1225943e1aa7a8f6f4e34ebe9fc..329067de545cf9e01c9ac090623ef72dc4c8dd00 100644 (file)
@@ -1538,7 +1538,7 @@ void GRAPH_OT_sound_bake(wmOperatorType *ot)
                                  FILE_TYPE_FOLDER | FILE_TYPE_SOUND | FILE_TYPE_MOVIE,
                                  FILE_SPECIAL,
                                  FILE_OPENFILE,
-                                 WM_FILESEL_FILEPATH,
+                                 WM_FILESEL_FILEPATH | WM_FILESEL_SHOW_PROPS,
                                  FILE_DEFAULTDISPLAY,
                                  FILE_SORT_ALPHA);
   RNA_def_float(ot->srna,
index 1b4e4dc23ee888ed8adde31794cbb98af16aafe1..2fc42e904c2ed96574f130875fafbe9b85b57c82 100644 (file)
@@ -677,8 +677,11 @@ typedef struct FileSelectParams {
   /** Display mode flag. */
   short display;
   short display_previous;
+  /** Details toggles (file size, creation date, etc.) */
+  char details_flags;
+  /* The type of file action (opening or saving) */
+  char action_type; /* eFileSel_Action */
   /** Filter when (flags & FILE_FILTER) is true. */
-  char _pad2[2];
   int filter;
 
   /** Max number of levels in dirtree to show at once, 0 to disable recursion. */
@@ -736,8 +739,8 @@ typedef struct SpaceFile {
 /* FileSelectParams.display */
 enum eFileDisplayType {
   FILE_DEFAULTDISPLAY = 0,
-  FILE_SHORTDISPLAY = 1,
-  FILE_LONGDISPLAY = 2,
+  FILE_VERTICALDISPLAY = 1,
+  FILE_HORIZONTALDISPLAY = 2,
   FILE_IMGDISPLAY = 3,
 };
 
@@ -750,6 +753,12 @@ enum eFileSortType {
   FILE_SORT_SIZE = 4,
 };
 
+/* FileSelectParams.details_flags */
+enum eFileDetails {
+  FILE_DETAILS_SIZE = (1 << 0),
+  FILE_DETAILS_DATETIME = (1 << 1),
+};
+
 /* these values need to be hardcoded in structs, dna does not recognize defines */
 /* also defined in BKE */
 #define FILE_MAXDIR 768
@@ -787,6 +796,8 @@ typedef enum eFileSel_Params_Flag {
   FILE_FILTER = (1 << 8),
   FILE_PARAMS_FLAG_UNUSED_9 = (1 << 9), /* cleared */
   FILE_GROUP_INSTANCE = (1 << 10),
+  FILE_SORT_INVERT = (1 << 11),
+  FILE_HIDE_TOOL_PROPS = (1 << 12)
 } eFileSel_Params_Flag;
 
 /* sfile->params->rename_flag */
@@ -824,6 +835,8 @@ typedef enum eFileSel_File_Types {
   FILE_TYPE_OPERATOR = (1 << 14),
   FILE_TYPE_APPLICATIONBUNDLE = (1 << 15),
   FILE_TYPE_ALEMBIC = (1 << 16),
+  /** For all kinds of recognized import/export formats. No need for specialized types. */
+  FILE_TYPE_OBJECT_IO = (1 << 17),
 
   /** An FS directory (i.e. S_ISDIR on its path is true). */
   FILE_TYPE_DIR = (1 << 30),
@@ -882,8 +895,7 @@ typedef struct FileDirEntryRevision {
   int64_t time;
   /* Temp caching of UI-generated strings... */
   char size_str[16];
-  char time_str[8];
-  char date_str[16];
+  char datetime_str[16 + 8];
 } FileDirEntryRevision;
 
 /* Container for a variant, only relevant in asset context.
index b0226b09b882eba634f611bfac8274b0a7b9b5dc..ca857fb7be88db98a0c81f24cafc371fa01d7c32 100644 (file)
@@ -420,19 +420,19 @@ const EnumPropertyItem rna_enum_file_sort_items[] = {
     {FILE_SORT_ALPHA,
      "FILE_SORT_ALPHA",
      ICON_SORTALPHA,
-     "Sort alphabetically",
+     "Name",
      "Sort the file list alphabetically"},
     {FILE_SORT_EXTENSION,
      "FILE_SORT_EXTENSION",
      ICON_SORTBYEXT,
-     "Sort by extension",
+     "Extension",
      "Sort the file list by extension/type"},
     {FILE_SORT_TIME,
      "FILE_SORT_TIME",
      ICON_SORTTIME,
-     "Sort by time",
+     "Modified Date",
      "Sort files by modification time"},
-    {FILE_SORT_SIZE, "FILE_SORT_SIZE", ICON_SORTSIZE, "Sort by size", "Sort files by size"},
+    {FILE_SORT_SIZE, "FILE_SORT_SIZE", ICON_SORTSIZE, "Size", "Sort files by size"},
     {0, NULL, 0, NULL, NULL},
 };
 
@@ -2142,6 +2142,18 @@ static void rna_SpaceClipEditor_view_type_update(Main *UNUSED(bmain),
 
 /* File browser. */
 
+int rna_FileSelectParams_filename_editable(struct PointerRNA *ptr, const char **r_info)
+{
+  FileSelectParams *params = ptr->data;
+
+  if (params && (params->flag & FILE_DIRSEL_ONLY)) {
+    *r_info = "Only directories can be chosen for the current operation.";
+    return 0;
+  }
+
+  return params ? PROP_EDITABLE : 0;
+}
+
 static bool rna_FileSelectParams_use_lib_get(PointerRNA *ptr)
 {
   FileSelectParams *params = ptr->data;
@@ -5133,25 +5145,25 @@ static void rna_def_fileselect_params(BlenderRNA *brna)
   PropertyRNA *prop;
 
   static const EnumPropertyItem file_display_items[] = {
-      {FILE_SHORTDISPLAY,
-       "LIST_SHORT",
-       ICON_SHORTDISPLAY,
-       "Short List",
-       "Display files as short list"},
-      {FILE_LONGDISPLAY,
-       "LIST_LONG",
+      {FILE_VERTICALDISPLAY,
+       "LIST_VERTICAL",
        ICON_LONGDISPLAY,
-       "Long List",
-       "Display files as a detailed list"},
+       "Vertical List",
+       "Display files as a vertical list"},
+      {FILE_HORIZONTALDISPLAY,
+       "LIST_HORIZONTAL",
+       ICON_SHORTDISPLAY,
+       "Horizontal List",
+       "Display files as a horizontal list"},
       {FILE_IMGDISPLAY, "THUMBNAIL", ICON_IMGDISPLAY, "Thumbnails", "Display files as thumbnails"},
       {0, NULL, 0, NULL, NULL},
   };
 
   static const EnumPropertyItem display_size_items[] = {
-      {32, "TINY", 0, "Tiny", ""},
-      {64, "SMALL", 0, "Small", ""},
+      {64, "TINY", 0, "Tiny", ""},
+      {96, "SMALL", 0, "Small", ""},
       {128, "NORMAL", 0, "Regular", ""},
-      {256, "LARGE", 0, "Large", ""},
+      {192, "LARGE", 0, "Large", ""},
       {0, NULL, 0, NULL, NULL},
   };
 
@@ -5267,7 +5279,10 @@ static void rna_def_fileselect_params(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Title", "Title for the file browser");
   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 
-  prop = RNA_def_property(srna, "directory", PROP_STRING, PROP_DIRPATH);
+  /* Use BYTESTRING rather than DIRPATH as subtype so UI code doesn't add OT_directory_browse
+   * button when displaying this prop in the file browser (it would just open a file browser). That
+   * should be the only effective difference between the two. */
+  prop = RNA_def_property(srna, "directory", PROP_STRING, PROP_BYTESTRING);
   RNA_def_property_string_sdna(prop, NULL, "dir");
   RNA_def_property_ui_text(prop, "Directory", "Directory displayed in the file browser");
   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
@@ -5275,6 +5290,7 @@ static void rna_def_fileselect_params(BlenderRNA *brna)
   prop = RNA_def_property(srna, "filename", PROP_STRING, PROP_FILENAME);
   RNA_def_property_string_sdna(prop, NULL, "file");
   RNA_def_property_ui_text(prop, "File Name", "Active file in the file browser");
+  RNA_def_property_editable_func(prop, "rna_FileSelectParams_filename_editable");
   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
 
   prop = RNA_def_property(srna, "use_library_browsing", PROP_BOOLEAN, PROP_NONE);
@@ -5295,6 +5311,19 @@ static void rna_def_fileselect_params(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Recursion", "Numbers of dirtree levels to show simultaneously");
   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
 
+  prop = RNA_def_property(srna, "show_details_size", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_sdna(prop, NULL, "details_flags", FILE_DETAILS_SIZE);
+  RNA_def_property_ui_text(prop, "File Size", "Draw a column listing the size of each file");
+  RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+
+  prop = RNA_def_property(srna, "show_details_datetime", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_sdna(prop, NULL, "details_flags", FILE_DETAILS_DATETIME);
+  RNA_def_property_ui_text(
+      prop,
+      "File Modification Date",
+      "Draw a column listing the date and time of modification for each file");
+  RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+
   prop = RNA_def_property(srna, "use_filter", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_sdna(prop, NULL, "flag", FILE_FILTER);
   RNA_def_property_ui_text(prop, "Filter Files", "Enable filtering of files");
@@ -5311,6 +5340,12 @@ static void rna_def_fileselect_params(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Sort", "");
   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
 
+  prop = RNA_def_property(srna, "use_sort_invert", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_sdna(prop, NULL, "flag", FILE_SORT_INVERT);
+  RNA_def_property_ui_text(
+      prop, "Reverse Sorting", "Sort items descending, from highest value to lowest");
+  RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+
   prop = RNA_def_property(srna, "use_filter_image", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_sdna(prop, NULL, "filter", FILE_TYPE_IMAGE);
   RNA_def_property_ui_text(prop, "Filter Images", "Show image files");
index 13be8701c274e22a0f93b0f81fd948ef539cd231..c7b18adf9b186b766b7dd548f1db2e1af4dd7584 100644 (file)
@@ -159,7 +159,7 @@ enum {
   WM_WINDOW_USERPREFS,
   WM_WINDOW_DRIVERS,
   WM_WINDOW_INFO,
-  // WM_WINDOW_FILESEL // UNUSED
+  WM_WINDOW_FILESEL,
 };
 
 struct wmWindow *WM_window_open(struct bContext *C, const struct rcti *rect);
@@ -493,6 +493,8 @@ bool WM_operator_properties_checker_interval_test(const struct CheckerIntervalPa
 #define WM_FILESEL_FILENAME (1 << 2)
 #define WM_FILESEL_FILEPATH (1 << 3)
 #define WM_FILESEL_FILES (1 << 4)
+/* Show the properties sidebar by default. */
+#define WM_FILESEL_SHOW_PROPS (1 << 5)
 
 /* operator as a python command (resultuing string must be freed) */
 char *WM_operator_pystring_ex(struct bContext *C,
index 51191b45439648dd3b7ddaf10005ffecfe5f18da..9fe53cb3af0c255358446bef8310f914ef8fbe72 100644 (file)
@@ -2339,45 +2339,31 @@ static int wm_handler_fileselect_do(bContext *C,
 
   switch (val) {
     case EVT_FILESELECT_FULL_OPEN: {
-      ScrArea *sa;
+      wmWindow *win = CTX_wm_window(C);
+      const int sizex = 1020 * UI_DPI_FAC;
+      const int sizey = 600 * UI_DPI_FAC;
 
-      /* sa can be null when window A is active, but mouse is over window B
-       * in this case, open file select in original window A. Also don't
-       * use global areas. */
-      if (handler->context.area == NULL || ED_area_is_global(handler->context.area)) {
-        bScreen *screen = CTX_wm_screen(C);
-        sa = (ScrArea *)screen->areabase.first;
-      }
-      else {
-        sa = handler->context.area;
-      }
+      if (WM_window_open_temp(
+              C, win->sizex / 2, win->sizey / 2, sizex, sizey, WM_WINDOW_FILESEL) != NULL) {
+        ScrArea *area = CTX_wm_area(C);
+        ARegion *region_header = BKE_area_find_region_type(area, RGN_TYPE_HEADER);
 
-      if (sa->full) {
-        /* ensure the first area becomes the file browser, because the second one is the small
-         * top (info-)area which might be too small (in fullscreens we have max two areas) */
-        if (sa->prev) {
-          sa = sa->prev;
-        }
-        ED_area_newspace(C, sa, SPACE_FILE, true); /* 'sa' is modified in-place */
-        /* we already had a fullscreen here -> mark new space as a stacked fullscreen */
-        sa->flag |= (AREA_FLAG_STACKED_FULLSCREEN | AREA_FLAG_TEMP_TYPE);
-      }
-      else if (sa->spacetype == SPACE_FILE) {
-        sa = ED_screen_state_toggle(C, CTX_wm_window(C), sa, SCREENMAXIMIZED);
-      }
-      else {
-        sa = ED_screen_full_newspace(C, sa, SPACE_FILE); /* sets context */
-      }
+        BLI_assert(area->spacetype == SPACE_FILE);
 
-      /* note, getting the 'sa' back from the context causes a nasty bug where the newly created
-       * 'sa' != CTX_wm_area(C). removed the line below and set 'sa' in the 'if' above */
-      /* sa = CTX_wm_area(C); */
+        region_header->flag |= RGN_FLAG_HIDDEN;
+        /* Header on bottom, AZone triangle to toggle header looks misplaced at the top */
+        region_header->alignment = RGN_ALIGN_BOTTOM;
 
-      /* settings for filebrowser, sfile is not operator owner but sends events */
-      sfile = (SpaceFile *)sa->spacedata.first;
-      sfile->op = handler->op;
+        /* settings for filebrowser, sfile is not operator owner but sends events */
+        sfile = (SpaceFile *)area->spacedata.first;
+        sfile->op = handler->op;
 
-      ED_fileselect_set_params(sfile);
+        ED_fileselect_set_params(sfile);
+      }
+      else {
+        BKE_report(&wm->reports, RPT_ERROR, "Failed to open window!");
+        return OPERATOR_CANCELLED;
+      }
 
       action = WM_HANDLER_BREAK;
       break;
@@ -2390,14 +2376,27 @@ static int wm_handler_fileselect_do(bContext *C,
       BLI_remlink(handlers, handler);
 
       if (val != EVT_FILESELECT_EXTERNAL_CANCEL) {
-        ScrArea *sa = CTX_wm_area(C);
+        for (wmWindow *win = wm->windows.first; win; win = win->next) {
+          if (WM_window_is_temp_screen(win)) {
+            bScreen *screen = WM_window_get_active_screen(win);
+            ScrArea *file_sa = screen->areabase.first;
 
-        if (sa->full) {
-          ED_screen_full_prevspace(C, sa);
-        }
-        /* user may have left fullscreen */
-        else {
-          ED_area_prevspace(C, sa);
+            BLI_assert(file_sa->spacetype == SPACE_FILE);
+
+            if (BLI_listbase_is_single(&file_sa->spacedata)) {
+              wmWindow *ctx_win = CTX_wm_window(C);
+              wm_window_close(C, wm, win);
+              CTX_wm_window_set(C, ctx_win);  // wm_window_close() NULLs.
+            }
+            else if (file_sa->full) {
+              ED_screen_full_prevspace(C, file_sa);
+            }
+            else {
+              ED_area_prevspace(C, file_sa);
+            }
+
+            break;
+          }
         }
       }
 
index ae704142d5a98845ac20b80157ee36e7eb792024..af841f206207ca92d957d511436eaaa02cadbe43 100644 (file)
@@ -1205,6 +1205,8 @@ static ImBuf *blend_file_thumb(const bContext *C,
   /* will be scaled down, but gives some nice oversampling */
   ImBuf *ibuf;
   BlendThumbnail *thumb;
+  wmWindowManager *wm = CTX_wm_manager(C);
+  wmWindow *windrawable_old = wm->windrawable;
   char err_out[256] = "unknown";
 
   /* screen if no camera found */
@@ -1238,6 +1240,9 @@ static ImBuf *blend_file_thumb(const bContext *C,
   /* gets scaled to BLEN_THUMB_SIZE */
   Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
 
+  /* Offscreen drawing requires a drawable window context. */
+  wm_window_make_drawable(wm, CTX_wm_window(C));
+
   if (scene->camera) {
     ibuf = ED_view3d_draw_offscreen_imbuf_simple(depsgraph,
                                                  scene,
@@ -1270,6 +1275,14 @@ static ImBuf *blend_file_thumb(const bContext *C,
                                           err_out);
   }
 
+  /* Reset to old drawable. */
+  if (windrawable_old) {
+    wm_window_make_drawable(wm, windrawable_old);
+  }
+  else {
+    wm_window_clear_drawable(wm);
+  }
+
   if (ibuf) {
     float aspect = (scene->r.xsch * scene->r.xasp) / (scene->r.ysch * scene->r.yasp);
 
@@ -2322,7 +2335,7 @@ static void wm_open_mainfile_ui(bContext *UNUSED(C), wmOperator *op)
 
 void WM_OT_open_mainfile(wmOperatorType *ot)
 {
-  ot->name = "Open Blender File";
+  ot->name = "Open";
   ot->idname = "WM_OT_open_mainfile";
   ot->description = "Open a Blender file";
 
@@ -2504,7 +2517,7 @@ void WM_OT_recover_auto_save(wmOperatorType *ot)
                                  FILE_BLENDER,
                                  FILE_OPENFILE,
                                  WM_FILESEL_FILEPATH,
-                                 FILE_LONGDISPLAY,
+                                 FILE_HORIZONTALDISPLAY,
                                  FILE_SORT_TIME);
 }
 
@@ -2638,7 +2651,7 @@ void WM_OT_save_as_mainfile(wmOperatorType *ot)
 {
   PropertyRNA *prop;
 
-  ot->name = "Save As Blender File";
+  ot->name = "Save As";
   ot->idname = "WM_OT_save_as_mainfile";
   ot->description = "Save the current file in the desired location";
 
index 5a6606984ba945ce99982384c4e5e241eba4e26d..2cd2cf0636a6bd9440309222021c28ea9edc0d3f 100644 (file)
@@ -561,7 +561,7 @@ static void wm_link_append_properties_common(wmOperatorType *ot, bool is_link)
 
 void WM_OT_link(wmOperatorType *ot)
 {
-  ot->name = "Link from Library";
+  ot->name = "Link";
   ot->idname = "WM_OT_link";
   ot->description = "Link from a Library .blend file";
 
@@ -585,7 +585,7 @@ void WM_OT_link(wmOperatorType *ot)
 
 void WM_OT_append(wmOperatorType *ot)
 {
-  ot->name = "Append from Library";
+  ot->name = "Append";
   ot->idname = "WM_OT_append";
   ot->description = "Append from a Library .blend file";
 
index fcb55d3f80188914472ae7e814d2a25cbcc38f6c..663e4adf06bc4111b4665b10495a15fc29c02cea 100644 (file)
@@ -65,19 +65,27 @@ void WM_operator_properties_filesel(wmOperatorType *ot,
        0,
        "Default",
        "Automatically determine display type for files"},
-      {FILE_SHORTDISPLAY,
-       "LIST_SHORT",
-       ICON_SHORTDISPLAY,
+      {FILE_VERTICALDISPLAY,
+       "LIST_VERTICAL",
+       ICON_SHORTDISPLAY, /* Name of deprecated short list */
        "Short List",
        "Display files as short list"},
-      {FILE_LONGDISPLAY,
-       "LIST_LONG",
-       ICON_LONGDISPLAY,
+      {FILE_HORIZONTALDISPLAY,
+       "LIST_HORIZONTAL",
+       ICON_LONGDISPLAY, /* Name of deprecated long list */
        "Long List",
        "Display files as a detailed list"},
       {FILE_IMGDISPLAY, "THUMBNAIL", ICON_IMGDISPLAY, "Thumbnails", "Display files as thumbnails"},
       {0, NULL, 0, NULL, NULL},
   };
+  static const EnumPropertyItem file_action_types[] = {
+      {FILE_OPENFILE,
+       "OPENFILE",
+       0,
+       "Open",
+       "Use the file browser for opening files or a directory"},
+      {FILE_SAVE, "SAVE", 0, "Save", "Use the file browser for saving a file"},
+  };
 
   if (flag & WM_FILESEL_FILEPATH) {
     RNA_def_string_file_path(ot->srna, "filepath", NULL, FILE_MAX, "File Path", "Path to file");
@@ -99,6 +107,15 @@ void WM_operator_properties_filesel(wmOperatorType *ot,
     RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
   }
 
+  if ((flag & WM_FILESEL_SHOW_PROPS) == 0) {
+    prop = RNA_def_boolean(ot->srna,
+                           "hide_props_region",
+                           true,
+                           "Hide Operator Properties",
+                           "Collapse the region displaying the operator settings");
+    RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
+  }
+
   if (action == FILE_SAVE) {
     /* note, this is only used to check if we should highlight the filename area red when the
      * filepath is an existing file. */
@@ -186,6 +203,9 @@ void WM_operator_properties_filesel(wmOperatorType *ot,
   prop = RNA_def_enum(
       ot->srna, "sort_method", rna_enum_file_sort_items, sort, "File sorting mode", "");
   RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
+
+  prop = RNA_def_enum(ot->srna, "action_type", file_action_types, action, "Action Type", "");
+  RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
 }
 
 static void wm_operator_properties_select_action_ex(wmOperatorType *ot,
index 47491813f70f66a1a62a607e50c523bcbab8fe04..00ed203c2081d211a832ac58725fb80624ac21ce 100644 (file)
@@ -807,6 +807,7 @@ wmWindow *WM_window_open_temp(bContext *C, int x, int y, int sizex, int sizey, i
   ScrArea *sa;
   Scene *scene = CTX_data_scene(C);
   ViewLayer *view_layer = CTX_data_view_layer(C);
+  eSpace_Type space_type = SPACE_EMPTY;
   const char *title;
 
   /* convert to native OS window coordinates */
@@ -888,17 +889,24 @@ wmWindow *WM_window_open_temp(bContext *C, int x, int y, int sizex, int sizey, i
   CTX_wm_area_set(C, sa);
 
   if (type == WM_WINDOW_RENDER) {
-    ED_area_newspace(C, sa, SPACE_IMAGE, false);
+    space_type = SPACE_IMAGE;
   }
   else if (type == WM_WINDOW_DRIVERS) {
-    ED_area_newspace(C, sa, SPACE_GRAPH, false);
+    space_type = SPACE_GRAPH;
+  }
+  else if (type == WM_WINDOW_USERPREFS) {
+    space_type = SPACE_USERPREF;
+  }
+  else if (type == WM_WINDOW_FILESEL) {
+    space_type = SPACE_FILE;
   }
   else if (type == WM_WINDOW_INFO) {
     ED_area_newspace(C, sa, SPACE_INFO, false);
   }
   else {
-    ED_area_newspace(C, sa, SPACE_USERPREF, false);
+    BLI_assert(false);
   }
+  ED_area_newspace(C, sa, space_type, false);
 
   ED_screen_change(C, screen);
   ED_screen_refresh(CTX_wm_manager(C), win); /* test scale */