summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Declara <declara91@gmail.com>2012-03-26 15:59:00 +0000
committerDenis Declara <declara91@gmail.com>2012-03-26 15:59:00 +0000
commit8874f80dd60361ed721554497862ce3a6fb5ea8e (patch)
treefe114b3559c430d1a90f073a3458f4bd1c6d2285
parentAdded anchor-selection widget, it doesn't do much at the moment, next step wi... (diff)
parentpowerstroke: spiro join: more robust detection of tangent direction. fixes in... (diff)
downloadinkscape-8874f80dd60361ed721554497862ce3a6fb5ea8e.tar.gz
inkscape-8874f80dd60361ed721554497862ce3a6fb5ea8e.zip
Trunk merge
(bzr r11073.1.4)
-rwxr-xr-xbuild.xml1
-rw-r--r--po/POTFILES.in2
-rw-r--r--po/inkscape.pot3485
-rw-r--r--share/ui/units.txt2
-rw-r--r--share/ui/units.xml2
-rw-r--r--src/2geom/svg-path.h8
-rw-r--r--src/dialogs/CMakeLists.txt2
-rw-r--r--src/dialogs/Makefile_insert2
-rw-r--r--src/dialogs/clonetiler.h30
-rw-r--r--src/extension/internal/pdfinput/pdf-parser.cpp22
-rw-r--r--src/live_effects/CMakeLists.txt8
-rw-r--r--src/live_effects/Makefile_insert5
-rw-r--r--src/live_effects/bezctx.cpp48
-rw-r--r--src/live_effects/bezctx.h10
-rw-r--r--src/live_effects/bezctx_intf.h20
-rw-r--r--src/live_effects/lpe-powerstroke-interpolators.h83
-rw-r--r--src/live_effects/lpe-powerstroke.cpp193
-rw-r--r--src/live_effects/lpe-powerstroke.h2
-rw-r--r--src/live_effects/lpe-spiro.cpp85
-rw-r--r--src/live_effects/spiro-converters.cpp123
-rw-r--r--src/live_effects/spiro-converters.h67
-rw-r--r--src/live_effects/spiro.cpp69
-rw-r--r--src/live_effects/spiro.h54
-rw-r--r--src/ui/CMakeLists.txt2
-rw-r--r--src/ui/context-menu.cpp1372
-rw-r--r--src/ui/dialog/Makefile_insert2
-rw-r--r--src/ui/dialog/clonetiler.cpp (renamed from src/dialogs/clonetiler.cpp)2455
-rw-r--r--src/ui/dialog/clonetiler.h183
-rw-r--r--src/ui/dialog/dialog-manager.cpp3
-rw-r--r--src/ui/dialog/find.cpp887
-rw-r--r--src/ui/dialog/find.h282
-rw-r--r--src/ui/dialog/guides.cpp6
-rw-r--r--src/ui/dialog/transformation.cpp2
-rw-r--r--src/ui/dialog/xml-tree.cpp23
-rw-r--r--src/ui/dialog/xml-tree.h7
-rw-r--r--src/ui/widget/button.cpp16
-rw-r--r--src/ui/widget/button.h14
-rw-r--r--src/ui/widget/entry.cpp1
-rw-r--r--src/ui/widget/entry.h2
-rw-r--r--src/util/units.h2
-rw-r--r--src/verbs.cpp9
-rw-r--r--src/widgets/sp-xmlview-attr-list.cpp4
42 files changed, 5403 insertions, 4192 deletions
diff --git a/build.xml b/build.xml
index 3a45ca93e..c7ce9514c 100755
--- a/build.xml
+++ b/build.xml
@@ -340,6 +340,7 @@
</excludeinc>
<flags>
-Wall -Wformat -Werror=format-security -W -Wpointer-arith -Wcast-align -Wsign-compare -Woverloaded-virtual -Wswitch
+ -Werror=return-type
-O2
-mms-bitfields
-fopenmp
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 8bdc7cce0..b20d61b1f 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -45,7 +45,7 @@ src/connector-context.cpp
src/context-fns.cpp
src/desktop-events.cpp
src/desktop.cpp
-src/dialogs/clonetiler.cpp
+src/ui/dialog/clonetiler.cpp
src/ui/dialog/export.cpp
src/dialogs/find.cpp
src/ui/dialog/spellcheck.cpp
diff --git a/po/inkscape.pot b/po/inkscape.pot
index 71bcd3eb4..61843fcec 100644
--- a/po/inkscape.pot
+++ b/po/inkscape.pot
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2012-03-09 13:09+0100\n"
+"POT-Creation-Date: 2012-03-24 08:41+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -737,7 +737,7 @@ msgstr ""
#. Pencil
#: ../share/filters/filters.svg.h:1
-#: ../src/ui/dialog/inkscape-preferences.cpp:402 ../src/verbs.cpp:2465
+#: ../src/ui/dialog/inkscape-preferences.cpp:401 ../src/verbs.cpp:2464
msgid "Pencil"
msgstr ""
@@ -1436,8 +1436,8 @@ msgstr ""
msgid "Black Light"
msgstr ""
-#: ../share/filters/filters.svg.h:1 ../src/dialogs/clonetiler.cpp:2520
-#: ../src/dialogs/clonetiler.cpp:2659
+#: ../share/filters/filters.svg.h:1 ../src/ui/dialog/clonetiler.cpp:806
+#: ../src/ui/dialog/clonetiler.cpp:945
#: ../src/extension/internal/bitmap/colorize.cpp:52
#: ../src/extension/internal/filter/bumps.h:101
#: ../src/extension/internal/filter/bumps.h:324
@@ -3624,7 +3624,7 @@ msgid "Defines the direction and magnitude of the extrusion"
msgstr ""
#: ../src/sp-flowtext.cpp:365 ../src/sp-text.cpp:423
-#: ../src/text-context.cpp:1615
+#: ../src/text-context.cpp:1631
msgid " [truncated]"
msgstr ""
@@ -3770,674 +3770,611 @@ msgstr ""
msgid "No next zoom."
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:160
-msgid "<small>Nothing selected.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:166
-msgid "<small>More than one object selected.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:173
-#, c-format
-msgid "<small>Object has <b>%d</b> tiled clones.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:178
-msgid "<small>Object has no tiled clones.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:925
-msgid "Select <b>one object</b> whose tiled clones to unclump."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:947
-msgid "Unclump tiled clones"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:976
-msgid "Select <b>one object</b> whose tiled clones to remove."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:999
-msgid "Delete tiled clones"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1046 ../src/selection-chemistry.cpp:2049
-msgid "Select an <b>object</b> to clone."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1052
-msgid ""
-"If you want to clone several objects, <b>group</b> them and <b>clone the "
-"group</b>."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1061
-msgid "<small>Creating tiled clones...</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1466
-msgid "Create tiled clones"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1648
-msgid "<small>Per row:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1661
-msgid "<small>Per column:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1669
-msgid "<small>Randomize:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1816
+#: ../src/ui/dialog/clonetiler.cpp:107
msgid "_Symmetry"
msgstr ""
#. TRANSLATORS: "translation" means "shift" / "displacement" here.
-#: ../src/dialogs/clonetiler.cpp:1828
+#: ../src/ui/dialog/clonetiler.cpp:119
msgid "<b>P1</b>: simple translation"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1829
+#: ../src/ui/dialog/clonetiler.cpp:120
msgid "<b>P2</b>: 180&#176; rotation"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1830
+#: ../src/ui/dialog/clonetiler.cpp:121
msgid "<b>PM</b>: reflection"
msgstr ""
#. TRANSLATORS: "glide reflection" is a reflection and a translation combined.
#. For more info, see http://mathforum.org/sum95/suzanne/symsusan.html
-#: ../src/dialogs/clonetiler.cpp:1833
+#: ../src/ui/dialog/clonetiler.cpp:124
msgid "<b>PG</b>: glide reflection"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1834
+#: ../src/ui/dialog/clonetiler.cpp:125
msgid "<b>CM</b>: reflection + glide reflection"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1835
+#: ../src/ui/dialog/clonetiler.cpp:126
msgid "<b>PMM</b>: reflection + reflection"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1836
+#: ../src/ui/dialog/clonetiler.cpp:127
msgid "<b>PMG</b>: reflection + 180&#176; rotation"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1837
+#: ../src/ui/dialog/clonetiler.cpp:128
msgid "<b>PGG</b>: glide reflection + 180&#176; rotation"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1838
+#: ../src/ui/dialog/clonetiler.cpp:129
msgid "<b>CMM</b>: reflection + reflection + 180&#176; rotation"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1839
+#: ../src/ui/dialog/clonetiler.cpp:130
msgid "<b>P4</b>: 90&#176; rotation"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1840
+#: ../src/ui/dialog/clonetiler.cpp:131
msgid "<b>P4M</b>: 90&#176; rotation + 45&#176; reflection"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1841
+#: ../src/ui/dialog/clonetiler.cpp:132
msgid "<b>P4G</b>: 90&#176; rotation + 90&#176; reflection"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1842
+#: ../src/ui/dialog/clonetiler.cpp:133
msgid "<b>P3</b>: 120&#176; rotation"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1843
+#: ../src/ui/dialog/clonetiler.cpp:134
msgid "<b>P31M</b>: reflection + 120&#176; rotation, dense"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1844
+#: ../src/ui/dialog/clonetiler.cpp:135
msgid "<b>P3M1</b>: reflection + 120&#176; rotation, sparse"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1845
+#: ../src/ui/dialog/clonetiler.cpp:136
msgid "<b>P6</b>: 60&#176; rotation"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1846
+#: ../src/ui/dialog/clonetiler.cpp:137
msgid "<b>P6M</b>: reflection + 60&#176; rotation"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1868
+#: ../src/ui/dialog/clonetiler.cpp:157
msgid "Select one of the 17 symmetry groups for the tiling"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1889
+#: ../src/ui/dialog/clonetiler.cpp:175
msgid "S_hift"
msgstr ""
#. TRANSLATORS: "shift" means: the tiles will be shifted (offset) horizontally by this amount
-#: ../src/dialogs/clonetiler.cpp:1899
+#: ../src/ui/dialog/clonetiler.cpp:185
#, no-c-format
msgid "<b>Shift X:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1907
+#: ../src/ui/dialog/clonetiler.cpp:193
#, no-c-format
msgid "Horizontal shift per row (in % of tile width)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1915
+#: ../src/ui/dialog/clonetiler.cpp:201
#, no-c-format
msgid "Horizontal shift per column (in % of tile width)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1921
+#: ../src/ui/dialog/clonetiler.cpp:207
msgid "Randomize the horizontal shift by this percentage"
msgstr ""
#. TRANSLATORS: "shift" means: the tiles will be shifted (offset) vertically by this amount
-#: ../src/dialogs/clonetiler.cpp:1931
+#: ../src/ui/dialog/clonetiler.cpp:217
#, no-c-format
msgid "<b>Shift Y:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1939
+#: ../src/ui/dialog/clonetiler.cpp:225
#, no-c-format
msgid "Vertical shift per row (in % of tile height)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1947
+#: ../src/ui/dialog/clonetiler.cpp:233
#, no-c-format
msgid "Vertical shift per column (in % of tile height)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1954
+#: ../src/ui/dialog/clonetiler.cpp:240
msgid "Randomize the vertical shift by this percentage"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1962 ../src/dialogs/clonetiler.cpp:2108
+#: ../src/ui/dialog/clonetiler.cpp:248 ../src/ui/dialog/clonetiler.cpp:394
msgid "<b>Exponent:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1969
+#: ../src/ui/dialog/clonetiler.cpp:255
msgid "Whether rows are spaced evenly (1), converge (<1) or diverge (>1)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1976
+#: ../src/ui/dialog/clonetiler.cpp:262
msgid "Whether columns are spaced evenly (1), converge (<1) or diverge (>1)"
msgstr ""
#. TRANSLATORS: "Alternate" is a verb here
-#: ../src/dialogs/clonetiler.cpp:1984 ../src/dialogs/clonetiler.cpp:2148
-#: ../src/dialogs/clonetiler.cpp:2224 ../src/dialogs/clonetiler.cpp:2297
-#: ../src/dialogs/clonetiler.cpp:2343 ../src/dialogs/clonetiler.cpp:2465
+#: ../src/ui/dialog/clonetiler.cpp:270 ../src/ui/dialog/clonetiler.cpp:434
+#: ../src/ui/dialog/clonetiler.cpp:510 ../src/ui/dialog/clonetiler.cpp:583
+#: ../src/ui/dialog/clonetiler.cpp:629 ../src/ui/dialog/clonetiler.cpp:751
msgid "<small>Alternate:</small>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1990
+#: ../src/ui/dialog/clonetiler.cpp:276
msgid "Alternate the sign of shifts for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:1995
+#: ../src/ui/dialog/clonetiler.cpp:281
msgid "Alternate the sign of shifts for each column"
msgstr ""
#. TRANSLATORS: "Cumulate" is a verb here
-#: ../src/dialogs/clonetiler.cpp:2002 ../src/dialogs/clonetiler.cpp:2166
-#: ../src/dialogs/clonetiler.cpp:2242
+#: ../src/ui/dialog/clonetiler.cpp:288 ../src/ui/dialog/clonetiler.cpp:452
+#: ../src/ui/dialog/clonetiler.cpp:528
msgid "<small>Cumulate:</small>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2008
+#: ../src/ui/dialog/clonetiler.cpp:294
msgid "Cumulate the shifts for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2013
+#: ../src/ui/dialog/clonetiler.cpp:299
msgid "Cumulate the shifts for each column"
msgstr ""
#. TRANSLATORS: "Cumulate" is a verb here
-#: ../src/dialogs/clonetiler.cpp:2020
+#: ../src/ui/dialog/clonetiler.cpp:306
msgid "<small>Exclude tile:</small>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2026
+#: ../src/ui/dialog/clonetiler.cpp:312
msgid "Exclude tile height in shift"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2031
+#: ../src/ui/dialog/clonetiler.cpp:317
msgid "Exclude tile width in shift"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2040
+#: ../src/ui/dialog/clonetiler.cpp:326
msgid "Sc_ale"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2048
+#: ../src/ui/dialog/clonetiler.cpp:334
msgid "<b>Scale X:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2056
+#: ../src/ui/dialog/clonetiler.cpp:342
#, no-c-format
msgid "Horizontal scale per row (in % of tile width)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2064
+#: ../src/ui/dialog/clonetiler.cpp:350
#, no-c-format
msgid "Horizontal scale per column (in % of tile width)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2070
+#: ../src/ui/dialog/clonetiler.cpp:356
msgid "Randomize the horizontal scale by this percentage"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2078
+#: ../src/ui/dialog/clonetiler.cpp:364
msgid "<b>Scale Y:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2086
+#: ../src/ui/dialog/clonetiler.cpp:372
#, no-c-format
msgid "Vertical scale per row (in % of tile height)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2094
+#: ../src/ui/dialog/clonetiler.cpp:380
#, no-c-format
msgid "Vertical scale per column (in % of tile height)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2100
+#: ../src/ui/dialog/clonetiler.cpp:386
msgid "Randomize the vertical scale by this percentage"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2114
+#: ../src/ui/dialog/clonetiler.cpp:400
msgid "Whether row scaling is uniform (1), converge (<1) or diverge (>1)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2120
+#: ../src/ui/dialog/clonetiler.cpp:406
msgid "Whether column scaling is uniform (1), converge (<1) or diverge (>1)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2128
+#: ../src/ui/dialog/clonetiler.cpp:414
msgid "<b>Base:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2134 ../src/dialogs/clonetiler.cpp:2140
+#: ../src/ui/dialog/clonetiler.cpp:420 ../src/ui/dialog/clonetiler.cpp:426
msgid ""
"Base for a logarithmic spiral: not used (0), converge (<1), or diverge (>1)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2154
+#: ../src/ui/dialog/clonetiler.cpp:440
msgid "Alternate the sign of scales for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2159
+#: ../src/ui/dialog/clonetiler.cpp:445
msgid "Alternate the sign of scales for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2172
+#: ../src/ui/dialog/clonetiler.cpp:458
msgid "Cumulate the scales for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2177
+#: ../src/ui/dialog/clonetiler.cpp:463
msgid "Cumulate the scales for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2186
+#: ../src/ui/dialog/clonetiler.cpp:472
msgid "_Rotation"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2194
+#: ../src/ui/dialog/clonetiler.cpp:480
msgid "<b>Angle:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2202
+#: ../src/ui/dialog/clonetiler.cpp:488
#, no-c-format
msgid "Rotate tiles by this angle for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2210
+#: ../src/ui/dialog/clonetiler.cpp:496
#, no-c-format
msgid "Rotate tiles by this angle for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2216
+#: ../src/ui/dialog/clonetiler.cpp:502
msgid "Randomize the rotation angle by this percentage"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2230
+#: ../src/ui/dialog/clonetiler.cpp:516
msgid "Alternate the rotation direction for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2235
+#: ../src/ui/dialog/clonetiler.cpp:521
msgid "Alternate the rotation direction for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2248
+#: ../src/ui/dialog/clonetiler.cpp:534
msgid "Cumulate the rotation for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2253
+#: ../src/ui/dialog/clonetiler.cpp:539
msgid "Cumulate the rotation for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2262
+#: ../src/ui/dialog/clonetiler.cpp:548
msgid "_Blur & opacity"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2271
+#: ../src/ui/dialog/clonetiler.cpp:557
msgid "<b>Blur:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2277
+#: ../src/ui/dialog/clonetiler.cpp:563
msgid "Blur tiles by this percentage for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2283
+#: ../src/ui/dialog/clonetiler.cpp:569
msgid "Blur tiles by this percentage for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2289
+#: ../src/ui/dialog/clonetiler.cpp:575
msgid "Randomize the tile blur by this percentage"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2303
+#: ../src/ui/dialog/clonetiler.cpp:589
msgid "Alternate the sign of blur change for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2308
+#: ../src/ui/dialog/clonetiler.cpp:594
msgid "Alternate the sign of blur change for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2317
+#: ../src/ui/dialog/clonetiler.cpp:603
msgid "<b>Opacity:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2323
+#: ../src/ui/dialog/clonetiler.cpp:609
msgid "Decrease tile opacity by this percentage for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2329
+#: ../src/ui/dialog/clonetiler.cpp:615
msgid "Decrease tile opacity by this percentage for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2335
+#: ../src/ui/dialog/clonetiler.cpp:621
msgid "Randomize the tile opacity by this percentage"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2349
+#: ../src/ui/dialog/clonetiler.cpp:635
msgid "Alternate the sign of opacity change for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2354
+#: ../src/ui/dialog/clonetiler.cpp:640
msgid "Alternate the sign of opacity change for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2362
+#: ../src/ui/dialog/clonetiler.cpp:648
msgid "Co_lor"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2367
+#: ../src/ui/dialog/clonetiler.cpp:653
msgid "Initial color: "
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2371
+#: ../src/ui/dialog/clonetiler.cpp:657
msgid "Initial color of tiled clones"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2371
+#: ../src/ui/dialog/clonetiler.cpp:657
msgid ""
"Initial color for clones (works only if the original has unset fill or "
"stroke)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2386
+#: ../src/ui/dialog/clonetiler.cpp:672
msgid "<b>H:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2392
+#: ../src/ui/dialog/clonetiler.cpp:678
msgid "Change the tile hue by this percentage for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2398
+#: ../src/ui/dialog/clonetiler.cpp:684
msgid "Change the tile hue by this percentage for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2404
+#: ../src/ui/dialog/clonetiler.cpp:690
msgid "Randomize the tile hue by this percentage"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2413
+#: ../src/ui/dialog/clonetiler.cpp:699
msgid "<b>S:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2419
+#: ../src/ui/dialog/clonetiler.cpp:705
msgid "Change the color saturation by this percentage for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2425
+#: ../src/ui/dialog/clonetiler.cpp:711
msgid "Change the color saturation by this percentage for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2431
+#: ../src/ui/dialog/clonetiler.cpp:717
msgid "Randomize the color saturation by this percentage"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2439
+#: ../src/ui/dialog/clonetiler.cpp:725
msgid "<b>L:</b>"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2445
+#: ../src/ui/dialog/clonetiler.cpp:731
msgid "Change the color lightness by this percentage for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2451
+#: ../src/ui/dialog/clonetiler.cpp:737
msgid "Change the color lightness by this percentage for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2457
+#: ../src/ui/dialog/clonetiler.cpp:743
msgid "Randomize the color lightness by this percentage"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2471
+#: ../src/ui/dialog/clonetiler.cpp:757
msgid "Alternate the sign of color changes for each row"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2476
+#: ../src/ui/dialog/clonetiler.cpp:762
msgid "Alternate the sign of color changes for each column"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2484
+#: ../src/ui/dialog/clonetiler.cpp:770
msgid "_Trace"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2491
+#: ../src/ui/dialog/clonetiler.cpp:777
msgid "Trace the drawing under the tiles"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2495
+#: ../src/ui/dialog/clonetiler.cpp:781
msgid ""
"For each clone, pick a value from the drawing in that clone's location and "
"apply it to the clone"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2509
+#: ../src/ui/dialog/clonetiler.cpp:795
msgid "1. Pick from the drawing:"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2521
+#: ../src/ui/dialog/clonetiler.cpp:807
msgid "Pick the visible color and opacity"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2528 ../src/dialogs/clonetiler.cpp:2669
+#: ../src/ui/dialog/clonetiler.cpp:814 ../src/ui/dialog/clonetiler.cpp:955
#: ../src/extension/internal/bitmap/opacity.cpp:38
#: ../src/extension/internal/filter/transparency.h:279
#: ../src/widgets/toolbox.cpp:4722 ../share/extensions/interp_att_g.inx.h:14
msgid "Opacity"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2529
+#: ../src/ui/dialog/clonetiler.cpp:815
msgid "Pick the total accumulated opacity"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2536
+#: ../src/ui/dialog/clonetiler.cpp:822
msgid "R"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2537
+#: ../src/ui/dialog/clonetiler.cpp:823
msgid "Pick the Red component of the color"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2544
+#: ../src/ui/dialog/clonetiler.cpp:830
msgid "G"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2545
+#: ../src/ui/dialog/clonetiler.cpp:831
msgid "Pick the Green component of the color"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2552
+#: ../src/ui/dialog/clonetiler.cpp:838
msgid "B"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2553
+#: ../src/ui/dialog/clonetiler.cpp:839
msgid "Pick the Blue component of the color"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2560
+#: ../src/ui/dialog/clonetiler.cpp:846
msgctxt "Clonetiler color hue"
msgid "H"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2561
+#: ../src/ui/dialog/clonetiler.cpp:847
msgid "Pick the hue of the color"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2568
+#: ../src/ui/dialog/clonetiler.cpp:854
msgctxt "Clonetiler color saturation"
msgid "S"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2569
+#: ../src/ui/dialog/clonetiler.cpp:855
msgid "Pick the saturation of the color"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2576
+#: ../src/ui/dialog/clonetiler.cpp:862
msgctxt "Clonetiler color lightness"
msgid "L"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2577
+#: ../src/ui/dialog/clonetiler.cpp:863
msgid "Pick the lightness of the color"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2587
+#: ../src/ui/dialog/clonetiler.cpp:873
msgid "2. Tweak the picked value:"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2597
+#: ../src/ui/dialog/clonetiler.cpp:883
msgid "Gamma-correct:"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2601
+#: ../src/ui/dialog/clonetiler.cpp:887
msgid "Shift the mid-range of the picked value upwards (>0) or downwards (<0)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2608
+#: ../src/ui/dialog/clonetiler.cpp:894
msgid "Randomize:"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2612
+#: ../src/ui/dialog/clonetiler.cpp:898
msgid "Randomize the picked value by this percentage"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2619
+#: ../src/ui/dialog/clonetiler.cpp:905
msgid "Invert:"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2623
+#: ../src/ui/dialog/clonetiler.cpp:909
msgid "Invert the picked value"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2629
+#: ../src/ui/dialog/clonetiler.cpp:915
msgid "3. Apply the value to the clones':"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2639
+#: ../src/ui/dialog/clonetiler.cpp:925
msgid "Presence"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2642
+#: ../src/ui/dialog/clonetiler.cpp:928
msgid ""
"Each clone is created with the probability determined by the picked value in "
"that point"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2649
+#: ../src/ui/dialog/clonetiler.cpp:935
msgid "Size"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2652
+#: ../src/ui/dialog/clonetiler.cpp:938
msgid "Each clone's size is determined by the picked value in that point"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2662
+#: ../src/ui/dialog/clonetiler.cpp:948
msgid ""
"Each clone is painted by the picked color (the original must have unset fill "
"or stroke)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2672
+#: ../src/ui/dialog/clonetiler.cpp:958
msgid "Each clone's opacity is determined by the picked value in that point"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2700
+#: ../src/ui/dialog/clonetiler.cpp:986
msgid "How many rows in the tiling"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2722
+#: ../src/ui/dialog/clonetiler.cpp:1008
msgid "How many columns in the tiling"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2753
+#: ../src/ui/dialog/clonetiler.cpp:1039
msgid "Width of the rectangle to be filled"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2779
+#: ../src/ui/dialog/clonetiler.cpp:1065
msgid "Height of the rectangle to be filled"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2796
+#: ../src/ui/dialog/clonetiler.cpp:1082
msgid "Rows, columns: "
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2797
+#: ../src/ui/dialog/clonetiler.cpp:1083
msgid "Create the specified number of rows and columns"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2806
+#: ../src/ui/dialog/clonetiler.cpp:1092
msgid "Width, height: "
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2807
+#: ../src/ui/dialog/clonetiler.cpp:1093
msgid "Fill the specified width and height with the tiling"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2823
+#: ../src/ui/dialog/clonetiler.cpp:1109
msgid "Use saved size and position of the tile"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2826
+#: ../src/ui/dialog/clonetiler.cpp:1112
msgid ""
"Pretend that the size and position of the tile are the same as the last time "
"you tiled it (if any), instead of using the current size"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2850
+#: ../src/ui/dialog/clonetiler.cpp:1136
msgid " <b>_Create</b> "
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2852
+#: ../src/ui/dialog/clonetiler.cpp:1138
msgid "Create and tile the clones of the selection"
msgstr ""
@@ -4446,39 +4383,102 @@ msgstr ""
#. diagrams on the left in the following screenshot:
#. http://www.inkscape.org/screenshots/gallery/inkscape-0.42-CVS-tiles-unclump.png
#. So unclumping is the process of spreading a number of objects out more evenly.
-#: ../src/dialogs/clonetiler.cpp:2867
+#: ../src/ui/dialog/clonetiler.cpp:1153
msgid " _Unclump "
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2868
+#: ../src/ui/dialog/clonetiler.cpp:1154
msgid "Spread out clones to reduce clumping; can be applied repeatedly"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2874
+#: ../src/ui/dialog/clonetiler.cpp:1160
msgid " Re_move "
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2875
+#: ../src/ui/dialog/clonetiler.cpp:1161
msgid "Remove existing tiled clones of the selected object (siblings only)"
msgstr ""
-#: ../src/dialogs/clonetiler.cpp:2891
+#: ../src/ui/dialog/clonetiler.cpp:1177
msgid " R_eset "
msgstr ""
#. TRANSLATORS: "change" is a noun here
-#: ../src/dialogs/clonetiler.cpp:2893
+#: ../src/ui/dialog/clonetiler.cpp:1179
msgid ""
"Reset all shifts, scales, rotates, opacity and color changes in the dialog "
"to zero"
msgstr ""
+#: ../src/ui/dialog/clonetiler.cpp:1252
+msgid "<small>Nothing selected.</small>"
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:1258
+msgid "<small>More than one object selected.</small>"
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:1265
+#, c-format
+msgid "<small>Object has <b>%d</b> tiled clones.</small>"
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:1270
+msgid "<small>Object has no tiled clones.</small>"
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:1990
+msgid "Select <b>one object</b> whose tiled clones to unclump."
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:2012
+msgid "Unclump tiled clones"
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:2041
+msgid "Select <b>one object</b> whose tiled clones to remove."
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:2064
+msgid "Delete tiled clones"
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:2111 ../src/selection-chemistry.cpp:2057
+msgid "Select an <b>object</b> to clone."
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:2117
+msgid ""
+"If you want to clone several objects, <b>group</b> them and <b>clone the "
+"group</b>."
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:2126
+msgid "<small>Creating tiled clones...</small>"
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:2531
+msgid "Create tiled clones"
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:2713
+msgid "<small>Per row:</small>"
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:2726
+msgid "<small>Per column:</small>"
+msgstr ""
+
+#: ../src/ui/dialog/clonetiler.cpp:2734
+msgid "<small>Randomize:</small>"
+msgstr ""
+
#: ../src/ui/dialog/export.cpp:107 ../src/widgets/toolbox.cpp:1775
#: ../src/widgets/toolbox.cpp:1783 ../share/extensions/gears.inx.h:8
msgid "Units:"
msgstr ""
-#: ../src/ui/dialog/export.cpp:109 ../src/ui/widget/preferences-widget.cpp:702
+#: ../src/ui/dialog/export.cpp:109 ../src/ui/widget/preferences-widget.cpp:706
msgid "_Browse..."
msgstr ""
@@ -4556,8 +4556,8 @@ msgid "_Height:"
msgstr ""
#: ../src/ui/dialog/export.cpp:235
-#: ../src/ui/dialog/inkscape-preferences.cpp:1306
-#: ../src/ui/dialog/inkscape-preferences.cpp:1309
+#: ../src/ui/dialog/inkscape-preferences.cpp:1315
+#: ../src/ui/dialog/inkscape-preferences.cpp:1318
msgid "dpi"
msgstr ""
@@ -4613,22 +4613,22 @@ msgid "Select a filename for exporting"
msgstr ""
#. TRANSLATORS: "%s" is replaced with "exact" or "partial" when this string is displayed
-#: ../src/dialogs/find.cpp:379 ../src/ui/dialog/find.cpp:447
+#: ../src/dialogs/find.cpp:379 ../src/ui/dialog/find.cpp:824
#, c-format
msgid "<b>%d</b> object found (out of <b>%d</b>), %s match."
msgid_plural "<b>%d</b> objects found (out of <b>%d</b>), %s match."
msgstr[0] ""
msgstr[1] ""
-#: ../src/dialogs/find.cpp:382 ../src/ui/dialog/find.cpp:450
+#: ../src/dialogs/find.cpp:382 ../src/ui/dialog/find.cpp:827
msgid "exact"
msgstr ""
-#: ../src/dialogs/find.cpp:382 ../src/ui/dialog/find.cpp:450
+#: ../src/dialogs/find.cpp:382 ../src/ui/dialog/find.cpp:827
msgid "partial"
msgstr ""
-#: ../src/dialogs/find.cpp:389 ../src/ui/dialog/find.cpp:457
+#: ../src/dialogs/find.cpp:389 ../src/ui/dialog/find.cpp:845
msgid "No objects found"
msgstr ""
@@ -4636,194 +4636,192 @@ msgstr ""
msgid "T_ype: "
msgstr ""
-#: ../src/dialogs/find.cpp:552 ../src/ui/dialog/find.cpp:71
+#: ../src/dialogs/find.cpp:552
msgid "Search in all object types"
msgstr ""
-#: ../src/dialogs/find.cpp:552 ../src/ui/dialog/find.cpp:71
+#: ../src/dialogs/find.cpp:552 ../src/ui/dialog/find.cpp:93
msgid "All types"
msgstr ""
-#: ../src/dialogs/find.cpp:563 ../src/ui/dialog/find.cpp:72
+#: ../src/dialogs/find.cpp:563
msgid "Search all shapes"
msgstr ""
-#: ../src/dialogs/find.cpp:563 ../src/ui/dialog/find.cpp:72
+#: ../src/dialogs/find.cpp:563
msgid "All shapes"
msgstr ""
-#: ../src/dialogs/find.cpp:580 ../src/ui/dialog/find.cpp:73
+#: ../src/dialogs/find.cpp:580 ../src/ui/dialog/find.cpp:94
msgid "Search rectangles"
msgstr ""
-#: ../src/dialogs/find.cpp:580 ../src/ui/dialog/find.cpp:73
+#: ../src/dialogs/find.cpp:580 ../src/ui/dialog/find.cpp:94
msgid "Rectangles"
msgstr ""
-#: ../src/dialogs/find.cpp:585 ../src/ui/dialog/find.cpp:74
+#: ../src/dialogs/find.cpp:585 ../src/ui/dialog/find.cpp:95
msgid "Search ellipses, arcs, circles"
msgstr ""
-#: ../src/dialogs/find.cpp:585 ../src/ui/dialog/find.cpp:74
+#: ../src/dialogs/find.cpp:585 ../src/ui/dialog/find.cpp:95
msgid "Ellipses"
msgstr ""
-#: ../src/dialogs/find.cpp:590 ../src/ui/dialog/find.cpp:75
+#: ../src/dialogs/find.cpp:590 ../src/ui/dialog/find.cpp:96
msgid "Search stars and polygons"
msgstr ""
-#: ../src/dialogs/find.cpp:590 ../src/ui/dialog/find.cpp:75
+#: ../src/dialogs/find.cpp:590 ../src/ui/dialog/find.cpp:96
msgid "Stars"
msgstr ""
-#: ../src/dialogs/find.cpp:595 ../src/ui/dialog/find.cpp:76
+#: ../src/dialogs/find.cpp:595 ../src/ui/dialog/find.cpp:97
msgid "Search spirals"
msgstr ""
-#: ../src/dialogs/find.cpp:595 ../src/ui/dialog/find.cpp:76
+#: ../src/dialogs/find.cpp:595 ../src/ui/dialog/find.cpp:97
msgid "Spirals"
msgstr ""
#. TRANSLATORS: polyline is a set of connected straight line segments
#. http://www.w3.org/TR/SVG11/shapes.html#PolylineElement
-#: ../src/dialogs/find.cpp:608 ../src/ui/dialog/find.cpp:77
+#: ../src/dialogs/find.cpp:608 ../src/ui/dialog/find.cpp:98
msgid "Search paths, lines, polylines"
msgstr ""
-#: ../src/dialogs/find.cpp:608 ../src/ui/dialog/find.cpp:77
+#: ../src/dialogs/find.cpp:608 ../src/ui/dialog/find.cpp:98
#: ../src/widgets/toolbox.cpp:2439
msgid "Paths"
msgstr ""
-#: ../src/dialogs/find.cpp:613 ../src/ui/dialog/find.cpp:78
+#: ../src/dialogs/find.cpp:613 ../src/ui/dialog/find.cpp:99
msgid "Search text objects"
msgstr ""
-#: ../src/dialogs/find.cpp:613 ../src/ui/dialog/find.cpp:78
+#: ../src/dialogs/find.cpp:613 ../src/ui/dialog/find.cpp:99
msgid "Texts"
msgstr ""
-#: ../src/dialogs/find.cpp:618 ../src/ui/dialog/find.cpp:79
+#: ../src/dialogs/find.cpp:618 ../src/ui/dialog/find.cpp:100
msgid "Search groups"
msgstr ""
-#: ../src/dialogs/find.cpp:618 ../src/ui/dialog/find.cpp:79
+#: ../src/dialogs/find.cpp:618 ../src/ui/dialog/find.cpp:100
msgid "Groups"
msgstr ""
-#: ../src/dialogs/find.cpp:623 ../src/ui/dialog/find.cpp:82
+#: ../src/dialogs/find.cpp:623 ../src/ui/dialog/find.cpp:103
msgid "Search clones"
msgstr ""
#. TRANSLATORS: "Clones" is a noun indicating type of object to find
-#: ../src/dialogs/find.cpp:625 ../src/ui/dialog/find.cpp:82
+#: ../src/dialogs/find.cpp:625 ../src/ui/dialog/find.cpp:103
msgctxt "Find dialog"
msgid "Clones"
msgstr ""
-#: ../src/dialogs/find.cpp:630 ../src/ui/dialog/find.cpp:83
+#: ../src/dialogs/find.cpp:630 ../src/ui/dialog/find.cpp:105
msgid "Search images"
msgstr ""
-#: ../src/dialogs/find.cpp:630 ../src/ui/dialog/find.cpp:83
+#: ../src/dialogs/find.cpp:630 ../src/ui/dialog/find.cpp:105
#: ../share/extensions/embedimage.inx.h:3
#: ../share/extensions/extractimage.inx.h:4
msgid "Images"
msgstr ""
-#: ../src/dialogs/find.cpp:635 ../src/ui/dialog/find.cpp:84
+#: ../src/dialogs/find.cpp:635 ../src/ui/dialog/find.cpp:106
msgid "Search offset objects"
msgstr ""
-#: ../src/dialogs/find.cpp:635 ../src/ui/dialog/find.cpp:84
+#: ../src/dialogs/find.cpp:635 ../src/ui/dialog/find.cpp:106
msgid "Offsets"
msgstr ""
-#: ../src/dialogs/find.cpp:700 ../src/ui/dialog/find.cpp:62
+#: ../src/dialogs/find.cpp:700
msgid "_Text:"
msgstr ""
-#: ../src/dialogs/find.cpp:700 ../src/ui/dialog/find.cpp:62
+#: ../src/dialogs/find.cpp:700
msgid "Find objects by their text content (exact or partial match)"
msgstr ""
-#: ../src/dialogs/find.cpp:701 ../src/ui/dialog/find.cpp:63
-#: ../src/ui/dialog/object-properties.cpp:42
+#: ../src/dialogs/find.cpp:701 ../src/ui/dialog/object-properties.cpp:42
#: ../src/ui/dialog/object-properties.cpp:249
#: ../src/ui/dialog/object-properties.cpp:306
#: ../src/ui/dialog/object-properties.cpp:313
msgid "_ID:"
msgstr ""
-#: ../src/dialogs/find.cpp:701 ../src/ui/dialog/find.cpp:63
+#: ../src/dialogs/find.cpp:701
msgid "Find objects by the value of the id attribute (exact or partial match)"
msgstr ""
-#: ../src/dialogs/find.cpp:702 ../src/ui/dialog/find.cpp:64
+#: ../src/dialogs/find.cpp:702
msgid "_Style:"
msgstr ""
-#: ../src/dialogs/find.cpp:702 ../src/ui/dialog/find.cpp:64
+#: ../src/dialogs/find.cpp:702
msgid ""
"Find objects by the value of the style attribute (exact or partial match)"
msgstr ""
-#: ../src/dialogs/find.cpp:703 ../src/ui/dialog/find.cpp:65
+#: ../src/dialogs/find.cpp:703
msgid "_Attribute:"
msgstr ""
-#: ../src/dialogs/find.cpp:703 ../src/ui/dialog/find.cpp:65
+#: ../src/dialogs/find.cpp:703
msgid "Find objects by the name of an attribute (exact or partial match)"
msgstr ""
-#: ../src/dialogs/find.cpp:717 ../src/ui/dialog/find.cpp:66
+#: ../src/dialogs/find.cpp:717
msgid "Search in s_election"
msgstr ""
-#: ../src/dialogs/find.cpp:721 ../src/ui/dialog/find.cpp:66
+#: ../src/dialogs/find.cpp:721 ../src/ui/dialog/find.cpp:72
msgid "Limit search to the current selection"
msgstr ""
-#: ../src/dialogs/find.cpp:726 ../src/ui/dialog/find.cpp:67
+#: ../src/dialogs/find.cpp:726
msgid "Search in current _layer"
msgstr ""
-#: ../src/dialogs/find.cpp:730 ../src/ui/dialog/find.cpp:67
+#: ../src/dialogs/find.cpp:730 ../src/ui/dialog/find.cpp:71
msgid "Limit search to the current layer"
msgstr ""
-#: ../src/dialogs/find.cpp:735 ../src/ui/dialog/find.cpp:68
+#: ../src/dialogs/find.cpp:735 ../src/ui/dialog/find.cpp:81
msgid "Include _hidden"
msgstr ""
-#: ../src/dialogs/find.cpp:739 ../src/ui/dialog/find.cpp:68
+#: ../src/dialogs/find.cpp:739 ../src/ui/dialog/find.cpp:81
msgid "Include hidden objects in search"
msgstr ""
-#: ../src/dialogs/find.cpp:744 ../src/ui/dialog/find.cpp:69
+#: ../src/dialogs/find.cpp:744
msgid "Include l_ocked"
msgstr ""
-#: ../src/dialogs/find.cpp:748 ../src/ui/dialog/find.cpp:69
+#: ../src/dialogs/find.cpp:748 ../src/ui/dialog/find.cpp:82
msgid "Include locked objects in search"
msgstr ""
#. TRANSLATORS: "Clear" is a verb here
#: ../src/dialogs/find.cpp:759 ../src/ui/dialog/debug.cpp:76
-#: ../src/ui/dialog/find.cpp:86 ../src/ui/dialog/messages.cpp:47
-#: ../src/ui/dialog/scriptdialog.cpp:179
+#: ../src/ui/dialog/messages.cpp:47 ../src/ui/dialog/scriptdialog.cpp:179
msgid "_Clear"
msgstr ""
-#: ../src/dialogs/find.cpp:759 ../src/ui/dialog/find.cpp:86
+#: ../src/dialogs/find.cpp:759
msgid "Clear values"
msgstr ""
-#: ../src/dialogs/find.cpp:760 ../src/ui/dialog/find.cpp:87
+#: ../src/dialogs/find.cpp:760 ../src/ui/dialog/find.cpp:110
msgid "_Find"
msgstr ""
-#: ../src/dialogs/find.cpp:760 ../src/ui/dialog/find.cpp:87
+#: ../src/dialogs/find.cpp:760
msgid "Select objects matching all of the fields you filled in"
msgstr ""
@@ -4902,7 +4900,8 @@ msgstr ""
msgid "Fix spelling"
msgstr ""
-#: ../src/ui/dialog/text-edit.cpp:66 ../src/ui/dialog/svg-fonts-dialog.cpp:909
+#: ../src/ui/dialog/text-edit.cpp:66 ../src/ui/dialog/find.cpp:90
+#: ../src/ui/dialog/svg-fonts-dialog.cpp:909
msgid "_Font"
msgstr ""
@@ -4958,112 +4957,112 @@ msgstr ""
msgid "Spacing between lines (percent of font size)"
msgstr ""
-#: ../src/ui/dialog/text-edit.cpp:566 ../src/text-context.cpp:1508
+#: ../src/ui/dialog/text-edit.cpp:565 ../src/text-context.cpp:1519
msgid "Set text style"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:68 ../src/ui/dialog/xml-tree.cpp:117
+#: ../src/ui/dialog/xml-tree.cpp:71 ../src/ui/dialog/xml-tree.cpp:120
msgid "New element node"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:69 ../src/ui/dialog/xml-tree.cpp:123
+#: ../src/ui/dialog/xml-tree.cpp:72 ../src/ui/dialog/xml-tree.cpp:126
msgid "New text node"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:70 ../src/ui/dialog/xml-tree.cpp:137
+#: ../src/ui/dialog/xml-tree.cpp:73 ../src/ui/dialog/xml-tree.cpp:140
msgid "nodeAsInXMLdialogTooltip|Delete node"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:71 ../src/ui/dialog/xml-tree.cpp:129
-#: ../src/ui/dialog/xml-tree.cpp:999
+#: ../src/ui/dialog/xml-tree.cpp:74 ../src/ui/dialog/xml-tree.cpp:132
+#: ../src/ui/dialog/xml-tree.cpp:947
msgid "Duplicate node"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:77 ../src/ui/dialog/xml-tree.cpp:181
-#: ../src/ui/dialog/xml-tree.cpp:1033
+#: ../src/ui/dialog/xml-tree.cpp:80 ../src/ui/dialog/xml-tree.cpp:184
+#: ../src/ui/dialog/xml-tree.cpp:981
msgid "Delete attribute"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:81
+#: ../src/ui/dialog/xml-tree.cpp:84
msgid "Set"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:112
+#: ../src/ui/dialog/xml-tree.cpp:115
msgid "Drag to reorder nodes"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:143 ../src/ui/dialog/xml-tree.cpp:144
-#: ../src/ui/dialog/xml-tree.cpp:1158
+#: ../src/ui/dialog/xml-tree.cpp:146 ../src/ui/dialog/xml-tree.cpp:147
+#: ../src/ui/dialog/xml-tree.cpp:1102
msgid "Unindent node"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:148 ../src/ui/dialog/xml-tree.cpp:149
-#: ../src/ui/dialog/xml-tree.cpp:1136
+#: ../src/ui/dialog/xml-tree.cpp:151 ../src/ui/dialog/xml-tree.cpp:152
+#: ../src/ui/dialog/xml-tree.cpp:1080
msgid "Indent node"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:153 ../src/ui/dialog/xml-tree.cpp:154
-#: ../src/ui/dialog/xml-tree.cpp:1087
+#: ../src/ui/dialog/xml-tree.cpp:156 ../src/ui/dialog/xml-tree.cpp:157
+#: ../src/ui/dialog/xml-tree.cpp:1031
msgid "Raise node"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:158 ../src/ui/dialog/xml-tree.cpp:159
-#: ../src/ui/dialog/xml-tree.cpp:1105
+#: ../src/ui/dialog/xml-tree.cpp:161 ../src/ui/dialog/xml-tree.cpp:162
+#: ../src/ui/dialog/xml-tree.cpp:1049
msgid "Lower node"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:197
+#: ../src/ui/dialog/xml-tree.cpp:201
msgid "Attribute name"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:212
+#: ../src/ui/dialog/xml-tree.cpp:216
msgid "Attribute value"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:302
+#: ../src/ui/dialog/xml-tree.cpp:306
msgid "<b>Click</b> to select nodes, <b>drag</b> to rearrange."
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:313
+#: ../src/ui/dialog/xml-tree.cpp:317
msgid "<b>Click</b> attribute to edit."
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:317
+#: ../src/ui/dialog/xml-tree.cpp:321
#, c-format
msgid ""
"Attribute <b>%s</b> selected. Press <b>Ctrl+Enter</b> when done editing to "
"commit changes."
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:574
+#: ../src/ui/dialog/xml-tree.cpp:578
msgid "Drag XML subtree"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:906
+#: ../src/ui/dialog/xml-tree.cpp:854
msgid "New element node..."
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:928
+#: ../src/ui/dialog/xml-tree.cpp:876
msgid "Cancel"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:934
+#: ../src/ui/dialog/xml-tree.cpp:882
msgid "Create"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:965
+#: ../src/ui/dialog/xml-tree.cpp:913
msgid "Create new element node"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:981
+#: ../src/ui/dialog/xml-tree.cpp:929
msgid "Create new text node"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:1014
+#: ../src/ui/dialog/xml-tree.cpp:962
msgid "nodeAsInXMLinHistoryDialog|Delete node"
msgstr ""
-#: ../src/ui/dialog/xml-tree.cpp:1057
+#: ../src/ui/dialog/xml-tree.cpp:1005
msgid "Change attribute"
msgstr ""
@@ -5076,8 +5075,8 @@ msgid "_Origin X:"
msgstr ""
#: ../src/display/canvas-axonomgrid.cpp:331 ../src/display/canvas-grid.cpp:702
-#: ../src/ui/dialog/inkscape-preferences.cpp:658
-#: ../src/ui/dialog/inkscape-preferences.cpp:683
+#: ../src/ui/dialog/inkscape-preferences.cpp:667
+#: ../src/ui/dialog/inkscape-preferences.cpp:692
msgid "X coordinate of grid origin"
msgstr ""
@@ -5086,8 +5085,8 @@ msgid "O_rigin Y:"
msgstr ""
#: ../src/display/canvas-axonomgrid.cpp:333 ../src/display/canvas-grid.cpp:704
-#: ../src/ui/dialog/inkscape-preferences.cpp:659
-#: ../src/ui/dialog/inkscape-preferences.cpp:684
+#: ../src/ui/dialog/inkscape-preferences.cpp:668
+#: ../src/ui/dialog/inkscape-preferences.cpp:693
msgid "Y coordinate of grid origin"
msgstr ""
@@ -5096,29 +5095,29 @@ msgid "Spacing _Y:"
msgstr ""
#: ../src/display/canvas-axonomgrid.cpp:335
-#: ../src/ui/dialog/inkscape-preferences.cpp:687
+#: ../src/ui/dialog/inkscape-preferences.cpp:696
msgid "Base length of z-axis"
msgstr ""
#: ../src/display/canvas-axonomgrid.cpp:337
-#: ../src/ui/dialog/inkscape-preferences.cpp:690
+#: ../src/ui/dialog/inkscape-preferences.cpp:699
#: ../src/widgets/toolbox.cpp:3817
msgid "Angle X:"
msgstr ""
#: ../src/display/canvas-axonomgrid.cpp:337
-#: ../src/ui/dialog/inkscape-preferences.cpp:690
+#: ../src/ui/dialog/inkscape-preferences.cpp:699
msgid "Angle of x-axis"
msgstr ""
#: ../src/display/canvas-axonomgrid.cpp:339
-#: ../src/ui/dialog/inkscape-preferences.cpp:691
+#: ../src/ui/dialog/inkscape-preferences.cpp:700
#: ../src/widgets/toolbox.cpp:3896
msgid "Angle Z:"
msgstr ""
#: ../src/display/canvas-axonomgrid.cpp:339
-#: ../src/ui/dialog/inkscape-preferences.cpp:691
+#: ../src/ui/dialog/inkscape-preferences.cpp:700
msgid "Angle of z-axis"
msgstr ""
@@ -5201,12 +5200,12 @@ msgid "Spacing _X:"
msgstr ""
#: ../src/display/canvas-grid.cpp:706
-#: ../src/ui/dialog/inkscape-preferences.cpp:664
+#: ../src/ui/dialog/inkscape-preferences.cpp:673
msgid "Distance between vertical grid lines"
msgstr ""
#: ../src/display/canvas-grid.cpp:708
-#: ../src/ui/dialog/inkscape-preferences.cpp:665
+#: ../src/ui/dialog/inkscape-preferences.cpp:674
msgid "Distance between horizontal grid lines"
msgstr ""
@@ -5536,11 +5535,11 @@ msgid "[Unchanged]"
msgstr ""
#. Edit
-#: ../src/event-log.cpp:264 ../src/event-log.cpp:267 ../src/verbs.cpp:2219
+#: ../src/event-log.cpp:264 ../src/event-log.cpp:267 ../src/verbs.cpp:2218
msgid "_Undo"
msgstr ""
-#: ../src/event-log.cpp:274 ../src/event-log.cpp:278 ../src/verbs.cpp:2221
+#: ../src/event-log.cpp:274 ../src/event-log.cpp:278 ../src/verbs.cpp:2220
msgid "_Redo"
msgstr ""
@@ -5712,7 +5711,7 @@ msgstr ""
#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:43
#: ../src/extension/internal/filter/color.h:1044
#: ../src/extension/internal/filter/paint.h:357
-#: ../src/widgets/gradient-vector.cpp:826
+#: ../src/widgets/gradient-vector.cpp:848
#: ../share/extensions/printing_marks.inx.h:10
msgid "Offset:"
msgstr ""
@@ -6132,6 +6131,7 @@ msgstr ""
#: ../src/extension/internal/bitmap/opacity.cpp:40
#: ../src/extension/internal/filter/blurs.h:333
#: ../src/ui/dialog/filter-effects-dialog.cpp:2286
+#: ../src/ui/widget/object-composite-settings.cpp:65
#: ../src/widgets/toolbox.cpp:5925
msgid "Opacity:"
msgstr ""
@@ -6241,7 +6241,7 @@ msgstr ""
#: ../src/extension/internal/bitmap/threshold.cpp:40
#: ../src/extension/internal/bitmap/unsharpmask.cpp:46
-#: ../src/ui/dialog/inkscape-preferences.cpp:1098
+#: ../src/ui/dialog/inkscape-preferences.cpp:1107
#: ../src/widgets/toolbox.cpp:8665
msgid "Threshold:"
msgstr ""
@@ -6729,7 +6729,7 @@ msgstr ""
#: ../src/extension/internal/filter/paint.h:712
#: ../src/extension/internal/filter/textures.h:77
#: ../src/extension/internal/filter/transparency.h:61
-#: ../src/filter-enums.cpp:51 ../src/ui/dialog/inkscape-preferences.cpp:586
+#: ../src/filter-enums.cpp:51 ../src/ui/dialog/inkscape-preferences.cpp:588
msgid "Normal"
msgstr ""
@@ -6818,7 +6818,7 @@ msgstr ""
#: ../src/extension/internal/filter/bumps.h:100
#: ../src/extension/internal/filter/bumps.h:334
-#: ../share/extensions/measure.inx.h:10
+#: ../share/extensions/measure.inx.h:27
msgid "Precision:"
msgstr ""
@@ -7664,7 +7664,7 @@ msgstr ""
#: ../src/extension/internal/filter/overlays.h:59
#: ../src/extension/internal/filter/paint.h:700
-#: ../src/extension/internal/filter/shadows.h:59
+#: ../src/extension/internal/filter/shadows.h:59 ../src/ui/dialog/find.cpp:83
#: ../src/ui/dialog/tracedialog.cpp:626
#: ../share/extensions/color_custom.inx.h:14
#: ../share/extensions/color_randomize.inx.h:6
@@ -7854,7 +7854,7 @@ msgstr ""
#: ../src/extension/internal/filter/paint.h:594
#: ../src/extension/internal/filter/paint.h:871
-#: ../src/ui/widget/filter-effect-chooser.cpp:25
+#: ../src/ui/widget/filter-effect-chooser.cpp:26
msgid "Blend mode:"
msgstr ""
@@ -8108,29 +8108,37 @@ msgstr ""
msgid "Repaint anything visible monochrome"
msgstr ""
-#: ../src/extension/internal/gdkpixbuf-input.cpp:159
+#: ../src/extension/internal/gdkpixbuf-input.cpp:163
#, c-format
-msgid "%s Bitmap Input"
+msgid "%s bitmap image import"
msgstr ""
-#: ../src/extension/internal/gdkpixbuf-input.cpp:165
+#: ../src/extension/internal/gdkpixbuf-input.cpp:169
msgid "Link or embed image:"
msgstr ""
-#: ../src/extension/internal/gdkpixbuf-input.cpp:166
+#: ../src/extension/internal/gdkpixbuf-input.cpp:170
msgid "Embed"
msgstr ""
-#: ../src/extension/internal/gdkpixbuf-input.cpp:167
+#: ../src/extension/internal/gdkpixbuf-input.cpp:171
msgid "Link"
msgstr ""
-#: ../src/extension/internal/gdkpixbuf-input.cpp:169
+#: ../src/extension/internal/gdkpixbuf-input.cpp:173
msgid ""
"Embed results in stand-alone, larger SVG files. Link references a file "
"outside this SVG document and all files must be moved together."
msgstr ""
+#: ../src/extension/internal/gdkpixbuf-input.cpp:174
+msgid "Hide the dialog next time and always apply the same action."
+msgstr ""
+
+#: ../src/extension/internal/gdkpixbuf-input.cpp:174
+msgid "Don't ask again"
+msgstr ""
+
#: ../src/extension/internal/gimpgrad.cpp:272
msgid "GIMP Gradients"
msgstr ""
@@ -8195,7 +8203,7 @@ msgstr ""
#: ../src/extension/internal/grid.cpp:212
#: ../src/ui/dialog/document-properties.cpp:147
-#: ../src/ui/dialog/inkscape-preferences.cpp:699
+#: ../src/ui/dialog/inkscape-preferences.cpp:708
#: ../src/widgets/toolbox.cpp:2529
msgid "Grids"
msgstr ""
@@ -8547,7 +8555,7 @@ msgid "Document saved."
msgstr ""
#. We are saving for the first time; create a unique default filename
-#: ../src/file.cpp:792 ../src/file.cpp:1233
+#: ../src/file.cpp:792 ../src/file.cpp:1259
#, c-format
msgid "drawing%s"
msgstr ""
@@ -8578,7 +8586,7 @@ msgstr ""
msgid "Saving document..."
msgstr ""
-#: ../src/file.cpp:1093 ../src/ui/dialog/ocaldialogs.cpp:1120
+#: ../src/file.cpp:1093 ../src/ui/dialog/ocaldialogs.cpp:1117
msgid "Import"
msgstr ""
@@ -8586,11 +8594,11 @@ msgstr ""
msgid "Select file to import"
msgstr ""
-#: ../src/file.cpp:1255
+#: ../src/file.cpp:1281
msgid "Select file to export to"
msgstr ""
-#: ../src/file.cpp:1508
+#: ../src/file.cpp:1534
msgid "Import Clip Art"
msgstr ""
@@ -8675,7 +8683,7 @@ msgid "Luminance to Alpha"
msgstr ""
#. File
-#: ../src/filter-enums.cpp:70 ../src/interface.cpp:839 ../src/verbs.cpp:2186
+#: ../src/filter-enums.cpp:70 ../src/interface.cpp:839 ../src/verbs.cpp:2185
#: ../share/extensions/jessyInk_mouseHandler.inx.h:1
#: ../share/extensions/jessyInk_transitions.inx.h:2
msgid "Default"
@@ -8685,7 +8693,7 @@ msgstr ""
msgid "Arithmetic"
msgstr ""
-#: ../src/filter-enums.cpp:92 ../src/selection-chemistry.cpp:437
+#: ../src/filter-enums.cpp:92 ../src/selection-chemistry.cpp:445
#: ../src/widgets/gradient-selector.cpp:140
msgid "Duplicate"
msgstr ""
@@ -8697,15 +8705,15 @@ msgstr ""
#: ../src/filter-enums.cpp:94 ../src/live_effects/lpe-ruler.cpp:34
#: ../src/ui/dialog/filter-effects-dialog.cpp:487
#: ../src/ui/dialog/filter-effects-dialog.cpp:489
-#: ../src/ui/dialog/inkscape-preferences.cpp:319
-#: ../src/ui/dialog/inkscape-preferences.cpp:585
-#: ../src/ui/dialog/inkscape-preferences.cpp:1147
-#: ../src/ui/dialog/inkscape-preferences.cpp:1293
-#: ../src/ui/dialog/inkscape-preferences.cpp:1352
+#: ../src/ui/dialog/inkscape-preferences.cpp:318
+#: ../src/ui/dialog/inkscape-preferences.cpp:587
+#: ../src/ui/dialog/inkscape-preferences.cpp:1156
+#: ../src/ui/dialog/inkscape-preferences.cpp:1302
+#: ../src/ui/dialog/inkscape-preferences.cpp:1360
#: ../src/ui/dialog/input.cpp:610 ../src/ui/dialog/input.cpp:612
#: ../src/ui/dialog/input.cpp:614 ../src/ui/dialog/input.cpp:1281
-#: ../src/ui/dialog/input.cpp:1284 ../src/verbs.cpp:2183
-#: ../src/widgets/stroke-style.cpp:364 ../src/widgets/toolbox.cpp:4288
+#: ../src/ui/dialog/input.cpp:1284 ../src/verbs.cpp:2182
+#: ../src/widgets/toolbox.cpp:4288
#: ../share/extensions/gcodetools_area.inx.h:32
#: ../share/extensions/gcodetools_dxf_points.inx.h:15
#: ../share/extensions/gcodetools_engraving.inx.h:19
@@ -8758,7 +8766,7 @@ msgstr ""
msgid "Hue"
msgstr ""
-#: ../src/flood-context.cpp:251 ../src/ui/dialog/inkscape-preferences.cpp:843
+#: ../src/flood-context.cpp:251 ../src/ui/dialog/inkscape-preferences.cpp:852
#: ../src/widgets/sp-color-icc-selector.cpp:233
#: ../src/widgets/sp-color-icc-selector.cpp:234
#: ../src/widgets/sp-color-scales.cpp:433
@@ -8919,7 +8927,7 @@ msgstr[0] ""
msgstr[1] ""
#: ../src/gradient-context.cpp:391 ../src/gradient-context.cpp:484
-#: ../src/ui/dialog/swatches.cpp:187 ../src/widgets/gradient-vector.cpp:743
+#: ../src/ui/dialog/swatches.cpp:187 ../src/widgets/gradient-vector.cpp:751
msgid "Add gradient stop"
msgstr ""
@@ -8966,7 +8974,7 @@ msgstr ""
msgid "Move gradient handle"
msgstr ""
-#: ../src/gradient-drag.cpp:994 ../src/widgets/gradient-vector.cpp:774
+#: ../src/gradient-drag.cpp:994 ../src/widgets/gradient-vector.cpp:784
msgid "Delete gradient stop"
msgstr ""
@@ -9081,7 +9089,7 @@ msgstr ""
msgid "Percent"
msgstr ""
-#: ../src/helper/units.cpp:42 ../src/ui/dialog/inkscape-preferences.cpp:1157
+#: ../src/helper/units.cpp:42 ../src/ui/dialog/inkscape-preferences.cpp:1166
msgid "%"
msgstr ""
@@ -9711,8 +9719,8 @@ msgstr ""
msgid "Dockitem which 'owns' this tablabel"
msgstr ""
-#: ../src/libgdl/gdl-dock.c:176 ../src/ui/dialog/inkscape-preferences.cpp:580
-#: ../src/ui/dialog/inkscape-preferences.cpp:607
+#: ../src/libgdl/gdl-dock.c:176 ../src/ui/dialog/inkscape-preferences.cpp:579
+#: ../src/ui/dialog/inkscape-preferences.cpp:609
msgid "Floating"
msgstr ""
@@ -11044,11 +11052,11 @@ msgid "_New"
msgstr ""
#. " <verb verb-id=\"FileExportToOCAL\" />\n"
-#: ../src/menus-skeleton.h:45 ../src/verbs.cpp:2435 ../src/verbs.cpp:2441
+#: ../src/menus-skeleton.h:45 ../src/verbs.cpp:2434 ../src/verbs.cpp:2440
msgid "_Edit"
msgstr ""
-#: ../src/menus-skeleton.h:55 ../src/verbs.cpp:2231
+#: ../src/menus-skeleton.h:55 ../src/verbs.cpp:2230
msgid "Paste Si_ze"
msgstr ""
@@ -11567,7 +11575,7 @@ msgstr ""
msgid "Unique URI to a related document"
msgstr ""
-#: ../src/rdf.cpp:263 ../src/ui/dialog/inkscape-preferences.cpp:1371
+#: ../src/rdf.cpp:263 ../src/ui/dialog/inkscape-preferences.cpp:1379
msgid "Language:"
msgstr ""
@@ -11729,7 +11737,7 @@ msgstr ""
msgid "<b>Nothing</b> was deleted."
msgstr ""
-#: ../src/selection-chemistry.cpp:333 ../src/text-context.cpp:1020
+#: ../src/selection-chemistry.cpp:333 ../src/text-context.cpp:1031
#: ../src/ui/dialog/swatches.cpp:209 ../src/ui/dialog/swatches.cpp:272
#: ../src/widgets/toolbox.cpp:1479 ../src/widgets/toolbox.cpp:6360
msgid "Delete"
@@ -11739,349 +11747,349 @@ msgstr ""
msgid "Select <b>object(s)</b> to duplicate."
msgstr ""
-#: ../src/selection-chemistry.cpp:462
+#: ../src/selection-chemistry.cpp:470
msgid "Delete all"
msgstr ""
-#: ../src/selection-chemistry.cpp:648
+#: ../src/selection-chemistry.cpp:656
msgid "Select <b>some objects</b> to group."
msgstr ""
-#: ../src/selection-chemistry.cpp:663 ../src/selection-describer.cpp:52
+#: ../src/selection-chemistry.cpp:671 ../src/selection-describer.cpp:52
msgid "Group"
msgstr ""
-#: ../src/selection-chemistry.cpp:677
+#: ../src/selection-chemistry.cpp:685
msgid "Select a <b>group</b> to ungroup."
msgstr ""
-#: ../src/selection-chemistry.cpp:718
+#: ../src/selection-chemistry.cpp:726
msgid "<b>No groups</b> to ungroup in the selection."
msgstr ""
-#: ../src/selection-chemistry.cpp:724 ../src/sp-item-group.cpp:501
+#: ../src/selection-chemistry.cpp:732 ../src/sp-item-group.cpp:501
msgid "Ungroup"
msgstr ""
-#: ../src/selection-chemistry.cpp:810
+#: ../src/selection-chemistry.cpp:818
msgid "Select <b>object(s)</b> to raise."
msgstr ""
-#: ../src/selection-chemistry.cpp:816 ../src/selection-chemistry.cpp:876
-#: ../src/selection-chemistry.cpp:910 ../src/selection-chemistry.cpp:974
+#: ../src/selection-chemistry.cpp:824 ../src/selection-chemistry.cpp:884
+#: ../src/selection-chemistry.cpp:918 ../src/selection-chemistry.cpp:982
msgid ""
"You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."
msgstr ""
#. TRANSLATORS: "Raise" means "to raise an object" in the undo history
-#: ../src/selection-chemistry.cpp:856
+#: ../src/selection-chemistry.cpp:864
msgctxt "Undo action"
msgid "Raise"
msgstr ""
-#: ../src/selection-chemistry.cpp:868
+#: ../src/selection-chemistry.cpp:876
msgid "Select <b>object(s)</b> to raise to top."
msgstr ""
-#: ../src/selection-chemistry.cpp:891
+#: ../src/selection-chemistry.cpp:899
msgid "Raise to top"
msgstr ""
-#: ../src/selection-chemistry.cpp:904
+#: ../src/selection-chemistry.cpp:912
msgid "Select <b>object(s)</b> to lower."
msgstr ""
-#: ../src/selection-chemistry.cpp:954
+#: ../src/selection-chemistry.cpp:962
msgid "Lower"
msgstr ""
-#: ../src/selection-chemistry.cpp:966
+#: ../src/selection-chemistry.cpp:974
msgid "Select <b>object(s)</b> to lower to bottom."
msgstr ""
-#: ../src/selection-chemistry.cpp:1001
+#: ../src/selection-chemistry.cpp:1009
msgid "Lower to bottom"
msgstr ""
-#: ../src/selection-chemistry.cpp:1008
+#: ../src/selection-chemistry.cpp:1016
msgid "Nothing to undo."
msgstr ""
-#: ../src/selection-chemistry.cpp:1016
+#: ../src/selection-chemistry.cpp:1024
msgid "Nothing to redo."
msgstr ""
-#: ../src/selection-chemistry.cpp:1077
+#: ../src/selection-chemistry.cpp:1085
msgid "Paste"
msgstr ""
-#: ../src/selection-chemistry.cpp:1085
+#: ../src/selection-chemistry.cpp:1093
msgid "Paste style"
msgstr ""
-#: ../src/selection-chemistry.cpp:1095
+#: ../src/selection-chemistry.cpp:1103
msgid "Paste live path effect"
msgstr ""
-#: ../src/selection-chemistry.cpp:1116
+#: ../src/selection-chemistry.cpp:1124
msgid "Select <b>object(s)</b> to remove live path effects from."
msgstr ""
-#: ../src/selection-chemistry.cpp:1128
+#: ../src/selection-chemistry.cpp:1136
msgid "Remove live path effect"
msgstr ""
-#: ../src/selection-chemistry.cpp:1139
+#: ../src/selection-chemistry.cpp:1147
msgid "Select <b>object(s)</b> to remove filters from."
msgstr ""
-#: ../src/selection-chemistry.cpp:1149
+#: ../src/selection-chemistry.cpp:1157
#: ../src/ui/dialog/filter-effects-dialog.cpp:1380
msgid "Remove filter"
msgstr ""
-#: ../src/selection-chemistry.cpp:1158
+#: ../src/selection-chemistry.cpp:1166
msgid "Paste size"
msgstr ""
-#: ../src/selection-chemistry.cpp:1167
+#: ../src/selection-chemistry.cpp:1175
msgid "Paste size separately"
msgstr ""
-#: ../src/selection-chemistry.cpp:1177
+#: ../src/selection-chemistry.cpp:1185
msgid "Select <b>object(s)</b> to move to the layer above."
msgstr ""
-#: ../src/selection-chemistry.cpp:1203
+#: ../src/selection-chemistry.cpp:1211
msgid "Raise to next layer"
msgstr ""
-#: ../src/selection-chemistry.cpp:1210
+#: ../src/selection-chemistry.cpp:1218
msgid "No more layers above."
msgstr ""
-#: ../src/selection-chemistry.cpp:1222
+#: ../src/selection-chemistry.cpp:1230
msgid "Select <b>object(s)</b> to move to the layer below."
msgstr ""
-#: ../src/selection-chemistry.cpp:1248
+#: ../src/selection-chemistry.cpp:1256
msgid "Lower to previous layer"
msgstr ""
-#: ../src/selection-chemistry.cpp:1255
+#: ../src/selection-chemistry.cpp:1263
msgid "No more layers below."
msgstr ""
-#: ../src/selection-chemistry.cpp:1478
+#: ../src/selection-chemistry.cpp:1486
msgid "Remove transform"
msgstr ""
-#: ../src/selection-chemistry.cpp:1581
+#: ../src/selection-chemistry.cpp:1589
msgid "Rotate 90&#176; CCW"
msgstr ""
-#: ../src/selection-chemistry.cpp:1581
+#: ../src/selection-chemistry.cpp:1589
msgid "Rotate 90&#176; CW"
msgstr ""
-#: ../src/selection-chemistry.cpp:1602 ../src/seltrans.cpp:476
+#: ../src/selection-chemistry.cpp:1610 ../src/seltrans.cpp:476
#: ../src/ui/dialog/transformation.cpp:743
msgid "Rotate"
msgstr ""
-#: ../src/selection-chemistry.cpp:1649
+#: ../src/selection-chemistry.cpp:1657
msgid "Rotate by pixels"
msgstr ""
-#: ../src/selection-chemistry.cpp:1679 ../src/seltrans.cpp:473
+#: ../src/selection-chemistry.cpp:1687 ../src/seltrans.cpp:473
#: ../src/ui/dialog/transformation.cpp:722
#: ../share/extensions/interp_att_g.inx.h:19
msgid "Scale"
msgstr ""
-#: ../src/selection-chemistry.cpp:1704
+#: ../src/selection-chemistry.cpp:1712
msgid "Scale by whole factor"
msgstr ""
-#: ../src/selection-chemistry.cpp:1719
+#: ../src/selection-chemistry.cpp:1727
msgid "Move vertically"
msgstr ""
-#: ../src/selection-chemistry.cpp:1722
+#: ../src/selection-chemistry.cpp:1730
msgid "Move horizontally"
msgstr ""
-#: ../src/selection-chemistry.cpp:1725 ../src/selection-chemistry.cpp:1751
+#: ../src/selection-chemistry.cpp:1733 ../src/selection-chemistry.cpp:1759
#: ../src/seltrans.cpp:470 ../src/ui/dialog/transformation.cpp:661
msgid "Move"
msgstr ""
-#: ../src/selection-chemistry.cpp:1745
+#: ../src/selection-chemistry.cpp:1753
msgid "Move vertically by pixels"
msgstr ""
-#: ../src/selection-chemistry.cpp:1748
+#: ../src/selection-chemistry.cpp:1756
msgid "Move horizontally by pixels"
msgstr ""
-#: ../src/selection-chemistry.cpp:1880
+#: ../src/selection-chemistry.cpp:1888
msgid "The selection has no applied path effect."
msgstr ""
-#: ../src/selection-chemistry.cpp:2083
+#: ../src/selection-chemistry.cpp:2091
msgctxt "Action"
msgid "Clone"
msgstr ""
-#: ../src/selection-chemistry.cpp:2099
+#: ../src/selection-chemistry.cpp:2107
msgid "Select <b>clones</b> to relink."
msgstr ""
-#: ../src/selection-chemistry.cpp:2106
+#: ../src/selection-chemistry.cpp:2114
msgid "Copy an <b>object</b> to clipboard to relink clones to."
msgstr ""
-#: ../src/selection-chemistry.cpp:2130
+#: ../src/selection-chemistry.cpp:2138
msgid "<b>No clones to relink</b> in the selection."
msgstr ""
-#: ../src/selection-chemistry.cpp:2133
+#: ../src/selection-chemistry.cpp:2141
msgid "Relink clone"
msgstr ""
-#: ../src/selection-chemistry.cpp:2147
+#: ../src/selection-chemistry.cpp:2155
msgid "Select <b>clones</b> to unlink."
msgstr ""
-#: ../src/selection-chemistry.cpp:2201
+#: ../src/selection-chemistry.cpp:2209
msgid "<b>No clones to unlink</b> in the selection."
msgstr ""
-#: ../src/selection-chemistry.cpp:2205
+#: ../src/selection-chemistry.cpp:2213
msgid "Unlink clone"
msgstr ""
-#: ../src/selection-chemistry.cpp:2218
+#: ../src/selection-chemistry.cpp:2226
msgid ""
"Select a <b>clone</b> to go to its original. Select a <b>linked offset</b> "
"to go to its source. Select a <b>text on path</b> to go to the path. Select "
"a <b>flowed text</b> to go to its frame."
msgstr ""
-#: ../src/selection-chemistry.cpp:2251
+#: ../src/selection-chemistry.cpp:2259
msgid ""
"<b>Cannot find</b> the object to select (orphaned clone, offset, textpath, "
"flowed text?)"
msgstr ""
-#: ../src/selection-chemistry.cpp:2257
+#: ../src/selection-chemistry.cpp:2265
msgid ""
"The object you're trying to select is <b>not visible</b> (it is in &lt;"
"defs&gt;)"
msgstr ""
-#: ../src/selection-chemistry.cpp:2302
+#: ../src/selection-chemistry.cpp:2310
msgid "Select <b>one</b> path to clone."
msgstr ""
-#: ../src/selection-chemistry.cpp:2306
+#: ../src/selection-chemistry.cpp:2314
msgid "Select one <b>path</b> to clone."
msgstr ""
-#: ../src/selection-chemistry.cpp:2340
+#: ../src/selection-chemistry.cpp:2348
msgid "Clone original path"
msgstr ""
-#: ../src/selection-chemistry.cpp:2361
+#: ../src/selection-chemistry.cpp:2369
msgid "Select <b>object(s)</b> to convert to marker."
msgstr ""
-#: ../src/selection-chemistry.cpp:2429
+#: ../src/selection-chemistry.cpp:2437
msgid "Objects to marker"
msgstr ""
-#: ../src/selection-chemistry.cpp:2457
+#: ../src/selection-chemistry.cpp:2465
msgid "Select <b>object(s)</b> to convert to guides."
msgstr ""
-#: ../src/selection-chemistry.cpp:2469
+#: ../src/selection-chemistry.cpp:2477
msgid "Objects to guides"
msgstr ""
-#: ../src/selection-chemistry.cpp:2486
+#: ../src/selection-chemistry.cpp:2494
msgid "Select <b>object(s)</b> to convert to pattern."
msgstr ""
-#: ../src/selection-chemistry.cpp:2574
+#: ../src/selection-chemistry.cpp:2582
msgid "Objects to pattern"
msgstr ""
-#: ../src/selection-chemistry.cpp:2590
+#: ../src/selection-chemistry.cpp:2598
msgid "Select an <b>object with pattern fill</b> to extract objects from."
msgstr ""
-#: ../src/selection-chemistry.cpp:2643
+#: ../src/selection-chemistry.cpp:2651
msgid "<b>No pattern fills</b> in the selection."
msgstr ""
-#: ../src/selection-chemistry.cpp:2646
+#: ../src/selection-chemistry.cpp:2654
msgid "Pattern to objects"
msgstr ""
-#: ../src/selection-chemistry.cpp:2728
+#: ../src/selection-chemistry.cpp:2736
msgid "Select <b>object(s)</b> to make a bitmap copy."
msgstr ""
-#: ../src/selection-chemistry.cpp:2732
+#: ../src/selection-chemistry.cpp:2740
msgid "Rendering bitmap..."
msgstr ""
-#: ../src/selection-chemistry.cpp:2906
+#: ../src/selection-chemistry.cpp:2914
msgid "Create bitmap"
msgstr ""
-#: ../src/selection-chemistry.cpp:2938
+#: ../src/selection-chemistry.cpp:2946
msgid "Select <b>object(s)</b> to create clippath or mask from."
msgstr ""
-#: ../src/selection-chemistry.cpp:2941
+#: ../src/selection-chemistry.cpp:2949
msgid "Select mask object and <b>object(s)</b> to apply clippath or mask to."
msgstr ""
-#: ../src/selection-chemistry.cpp:3122
+#: ../src/selection-chemistry.cpp:3130
msgid "Set clipping path"
msgstr ""
-#: ../src/selection-chemistry.cpp:3124
+#: ../src/selection-chemistry.cpp:3132
msgid "Set mask"
msgstr ""
-#: ../src/selection-chemistry.cpp:3139
+#: ../src/selection-chemistry.cpp:3147
msgid "Select <b>object(s)</b> to remove clippath or mask from."
msgstr ""
-#: ../src/selection-chemistry.cpp:3250
+#: ../src/selection-chemistry.cpp:3258
msgid "Release clipping path"
msgstr ""
-#: ../src/selection-chemistry.cpp:3252
+#: ../src/selection-chemistry.cpp:3260
msgid "Release mask"
msgstr ""
-#: ../src/selection-chemistry.cpp:3271
+#: ../src/selection-chemistry.cpp:3279
msgid "Select <b>object(s)</b> to fit canvas to."
msgstr ""
#. Fit Page
-#: ../src/selection-chemistry.cpp:3291 ../src/verbs.cpp:2696
+#: ../src/selection-chemistry.cpp:3299 ../src/verbs.cpp:2695
msgid "Fit Page to Selection"
msgstr ""
-#: ../src/selection-chemistry.cpp:3320 ../src/verbs.cpp:2698
+#: ../src/selection-chemistry.cpp:3328 ../src/verbs.cpp:2697
msgid "Fit Page to Drawing"
msgstr ""
-#: ../src/selection-chemistry.cpp:3341 ../src/verbs.cpp:2700
+#: ../src/selection-chemistry.cpp:3349 ../src/verbs.cpp:2699
msgid "Fit Page to Selection or Drawing"
msgstr ""
@@ -12097,7 +12105,7 @@ msgstr ""
#. Ellipse
#: ../src/selection-describer.cpp:48 ../src/selection-describer.cpp:73
-#: ../src/ui/dialog/inkscape-preferences.cpp:390 ../src/verbs.cpp:2459
+#: ../src/ui/dialog/inkscape-preferences.cpp:389 ../src/verbs.cpp:2458
#: ../src/widgets/toolbox.cpp:4291
msgid "Ellipse"
msgstr ""
@@ -12124,19 +12132,19 @@ msgstr ""
#. Rectangle
#: ../src/selection-describer.cpp:64
-#: ../src/ui/dialog/inkscape-preferences.cpp:380 ../src/verbs.cpp:2455
+#: ../src/ui/dialog/inkscape-preferences.cpp:379 ../src/verbs.cpp:2454
msgid "Rectangle"
msgstr ""
#. 3D box
#: ../src/selection-describer.cpp:66
-#: ../src/ui/dialog/inkscape-preferences.cpp:385 ../src/verbs.cpp:2457
+#: ../src/ui/dialog/inkscape-preferences.cpp:384 ../src/verbs.cpp:2456
msgid "3D Box"
msgstr ""
#. Text
#: ../src/selection-describer.cpp:68
-#: ../src/ui/dialog/inkscape-preferences.cpp:426 ../src/verbs.cpp:2471
+#: ../src/ui/dialog/inkscape-preferences.cpp:425 ../src/verbs.cpp:2470
#: ../share/extensions/lorem_ipsum.inx.h:7
#: ../share/extensions/replace_font.inx.h:10 ../share/extensions/split.inx.h:6
#: ../share/extensions/text_braille.inx.h:2
@@ -12164,14 +12172,14 @@ msgstr ""
#. Spiral
#: ../src/selection-describer.cpp:77
-#: ../src/ui/dialog/inkscape-preferences.cpp:398 ../src/verbs.cpp:2463
+#: ../src/ui/dialog/inkscape-preferences.cpp:397 ../src/verbs.cpp:2462
#: ../share/extensions/gcodetools_area.inx.h:45
msgid "Spiral"
msgstr ""
#. Star
#: ../src/selection-describer.cpp:79
-#: ../src/ui/dialog/inkscape-preferences.cpp:394 ../src/verbs.cpp:2461
+#: ../src/ui/dialog/inkscape-preferences.cpp:393 ../src/verbs.cpp:2460
#: ../src/widgets/toolbox.cpp:3128
msgid "Star"
msgstr ""
@@ -12398,7 +12406,7 @@ msgstr ""
msgid "Create Guides Around the Page"
msgstr ""
-#: ../src/sp-guide.cpp:327 ../src/verbs.cpp:2291
+#: ../src/sp-guide.cpp:327 ../src/verbs.cpp:2290
msgid "Delete All Guides"
msgstr ""
@@ -12809,7 +12817,7 @@ msgstr ""
msgid "The flowed text(s) must be <b>visible</b> in order to be put on a path."
msgstr ""
-#: ../src/text-chemistry.cpp:195 ../src/verbs.cpp:2311
+#: ../src/text-chemistry.cpp:195 ../src/verbs.cpp:2310
msgid "Put text on path"
msgstr ""
@@ -12821,7 +12829,7 @@ msgstr ""
msgid "<b>No texts-on-paths</b> in the selection."
msgstr ""
-#: ../src/text-chemistry.cpp:231 ../src/verbs.cpp:2313
+#: ../src/text-chemistry.cpp:231 ../src/verbs.cpp:2312
msgid "Remove text from path"
msgstr ""
@@ -12893,7 +12901,7 @@ msgstr ""
msgid "Unicode (<b>Enter</b> to finish): %s: %s"
msgstr ""
-#: ../src/text-context.cpp:576 ../src/text-context.cpp:874
+#: ../src/text-context.cpp:576 ../src/text-context.cpp:885
msgid "Unicode (<b>Enter</b> to finish): "
msgstr ""
@@ -12902,111 +12910,111 @@ msgstr ""
msgid "<b>Flowed text frame</b>: %s &#215; %s"
msgstr ""
-#: ../src/text-context.cpp:708
+#: ../src/text-context.cpp:719
msgid "Type text; <b>Enter</b> to start new line."
msgstr ""
-#: ../src/text-context.cpp:719
+#: ../src/text-context.cpp:730
msgid "Flowed text is created."
msgstr ""
-#: ../src/text-context.cpp:721
+#: ../src/text-context.cpp:732
msgid "Create flowed text"
msgstr ""
-#: ../src/text-context.cpp:723
+#: ../src/text-context.cpp:734
msgid ""
"The frame is <b>too small</b> for the current font size. Flowed text not "
"created."
msgstr ""
-#: ../src/text-context.cpp:859
+#: ../src/text-context.cpp:870
msgid "No-break space"
msgstr ""
-#: ../src/text-context.cpp:861
+#: ../src/text-context.cpp:872
msgid "Insert no-break space"
msgstr ""
-#: ../src/text-context.cpp:898
+#: ../src/text-context.cpp:909
msgid "Make bold"
msgstr ""
-#: ../src/text-context.cpp:916
+#: ../src/text-context.cpp:927
msgid "Make italic"
msgstr ""
-#: ../src/text-context.cpp:955
+#: ../src/text-context.cpp:966
msgid "New line"
msgstr ""
-#: ../src/text-context.cpp:989
+#: ../src/text-context.cpp:1000
msgid "Backspace"
msgstr ""
-#: ../src/text-context.cpp:1037
+#: ../src/text-context.cpp:1048
msgid "Kern to the left"
msgstr ""
-#: ../src/text-context.cpp:1062
+#: ../src/text-context.cpp:1073
msgid "Kern to the right"
msgstr ""
-#: ../src/text-context.cpp:1087
+#: ../src/text-context.cpp:1098
msgid "Kern up"
msgstr ""
-#: ../src/text-context.cpp:1112
+#: ../src/text-context.cpp:1123
msgid "Kern down"
msgstr ""
-#: ../src/text-context.cpp:1188
+#: ../src/text-context.cpp:1199
msgid "Rotate counterclockwise"
msgstr ""
-#: ../src/text-context.cpp:1209
+#: ../src/text-context.cpp:1220
msgid "Rotate clockwise"
msgstr ""
-#: ../src/text-context.cpp:1226
+#: ../src/text-context.cpp:1237
msgid "Contract line spacing"
msgstr ""
-#: ../src/text-context.cpp:1233
+#: ../src/text-context.cpp:1244
msgid "Contract letter spacing"
msgstr ""
-#: ../src/text-context.cpp:1251
+#: ../src/text-context.cpp:1262
msgid "Expand line spacing"
msgstr ""
-#: ../src/text-context.cpp:1258
+#: ../src/text-context.cpp:1269
msgid "Expand letter spacing"
msgstr ""
-#: ../src/text-context.cpp:1386
+#: ../src/text-context.cpp:1397
msgid "Paste text"
msgstr ""
-#: ../src/text-context.cpp:1632
+#: ../src/text-context.cpp:1648
#, c-format
msgid ""
"Type or edit flowed text (%d characters%s); <b>Enter</b> to start new "
"paragraph."
msgstr ""
-#: ../src/text-context.cpp:1634
+#: ../src/text-context.cpp:1650
#, c-format
msgid "Type or edit text (%d characters%s); <b>Enter</b> to start new line."
msgstr ""
-#: ../src/text-context.cpp:1642 ../src/tools-switch.cpp:199
+#: ../src/text-context.cpp:1658 ../src/tools-switch.cpp:199
msgid ""
"<b>Click</b> to select or create text, <b>drag</b> to create flowed text; "
"then type."
msgstr ""
-#: ../src/text-context.cpp:1747
+#: ../src/text-context.cpp:1760
msgid "Type text"
msgstr ""
@@ -13280,126 +13288,137 @@ msgid "Blur tweak"
msgstr ""
#. check whether something is selected
-#: ../src/ui/clipboard.cpp:260
+#: ../src/ui/clipboard.cpp:261
msgid "Nothing was copied."
msgstr ""
-#: ../src/ui/clipboard.cpp:332 ../src/ui/clipboard.cpp:541
-#: ../src/ui/clipboard.cpp:564
+#: ../src/ui/clipboard.cpp:333 ../src/ui/clipboard.cpp:542
+#: ../src/ui/clipboard.cpp:565
msgid "Nothing on the clipboard."
msgstr ""
-#: ../src/ui/clipboard.cpp:390
+#: ../src/ui/clipboard.cpp:391
msgid "Select <b>object(s)</b> to paste style to."
msgstr ""
-#: ../src/ui/clipboard.cpp:401 ../src/ui/clipboard.cpp:418
+#: ../src/ui/clipboard.cpp:402 ../src/ui/clipboard.cpp:419
msgid "No style on the clipboard."
msgstr ""
-#: ../src/ui/clipboard.cpp:443
+#: ../src/ui/clipboard.cpp:444
msgid "Select <b>object(s)</b> to paste size to."
msgstr ""
-#: ../src/ui/clipboard.cpp:450
+#: ../src/ui/clipboard.cpp:451
msgid "No size on the clipboard."
msgstr ""
-#: ../src/ui/clipboard.cpp:503
+#: ../src/ui/clipboard.cpp:504
msgid "Select <b>object(s)</b> to paste live path effect to."
msgstr ""
#. no_effect:
-#: ../src/ui/clipboard.cpp:528
+#: ../src/ui/clipboard.cpp:529
msgid "No effect on the clipboard."
msgstr ""
-#: ../src/ui/clipboard.cpp:547 ../src/ui/clipboard.cpp:575
+#: ../src/ui/clipboard.cpp:548 ../src/ui/clipboard.cpp:576
msgid "Clipboard does not contain a path."
msgstr ""
#. Item dialog
-#: ../src/ui/context-menu.cpp:107 ../src/verbs.cpp:2637
+#: ../src/ui/context-menu.cpp:108 ../src/verbs.cpp:2636
msgid "_Object Properties..."
msgstr ""
#. Select item
-#: ../src/ui/context-menu.cpp:117
+#: ../src/ui/context-menu.cpp:118
msgid "_Select This"
msgstr ""
#. Create link
-#: ../src/ui/context-menu.cpp:127
+#: ../src/ui/context-menu.cpp:128
msgid "_Create Link"
msgstr ""
#. Set mask
-#: ../src/ui/context-menu.cpp:134
+#: ../src/ui/context-menu.cpp:135
msgid "Set Mask"
msgstr ""
#. Release mask
-#: ../src/ui/context-menu.cpp:145
+#: ../src/ui/context-menu.cpp:146
msgid "Release Mask"
msgstr ""
#. Set Clip
-#: ../src/ui/context-menu.cpp:156
+#: ../src/ui/context-menu.cpp:157
msgid "Set _Clip"
msgstr ""
#. Release Clip
-#: ../src/ui/context-menu.cpp:167
+#: ../src/ui/context-menu.cpp:168
msgid "Release C_lip"
msgstr ""
-#: ../src/ui/context-menu.cpp:284
+#: ../src/ui/context-menu.cpp:285
msgid "Create link"
msgstr ""
#. "Ungroup"
-#: ../src/ui/context-menu.cpp:300 ../src/verbs.cpp:2307
+#: ../src/ui/context-menu.cpp:301 ../src/verbs.cpp:2306
msgid "_Ungroup"
msgstr ""
#. Link dialog
-#: ../src/ui/context-menu.cpp:338
+#: ../src/ui/context-menu.cpp:339
msgid "Link _Properties..."
msgstr ""
#. Select item
-#: ../src/ui/context-menu.cpp:344
+#: ../src/ui/context-menu.cpp:345
msgid "_Follow Link"
msgstr ""
#. Reset transformations
-#: ../src/ui/context-menu.cpp:349
+#: ../src/ui/context-menu.cpp:350
msgid "_Remove Link"
msgstr ""
-#. Link dialog
-#: ../src/ui/context-menu.cpp:395
+#. Image properties
+#: ../src/ui/context-menu.cpp:400
msgid "Image _Properties..."
msgstr ""
-#: ../src/ui/context-menu.cpp:401
+#. Edit externally
+#: ../src/ui/context-menu.cpp:407
msgid "Edit Externally..."
msgstr ""
+#: ../src/ui/context-menu.cpp:418
+msgctxt "Context menu"
+msgid "Embed Image"
+msgstr ""
+
+#: ../src/ui/context-menu.cpp:430
+msgctxt "Context menu"
+msgid "Extract Image..."
+msgstr ""
+
#. Item dialog
#. Fill and Stroke dialog
-#: ../src/ui/context-menu.cpp:526 ../src/ui/context-menu.cpp:576
-#: ../src/verbs.cpp:2602
+#: ../src/ui/context-menu.cpp:614 ../src/ui/context-menu.cpp:664
+#: ../src/verbs.cpp:2601
msgid "_Fill and Stroke..."
msgstr ""
#. Edit Text dialog
-#: ../src/ui/context-menu.cpp:583 ../src/verbs.cpp:2617
+#: ../src/ui/context-menu.cpp:671 ../src/verbs.cpp:2616
msgid "_Text and Font..."
msgstr ""
#. Spellcheck dialog
-#: ../src/ui/context-menu.cpp:590 ../src/verbs.cpp:2625
+#: ../src/ui/context-menu.cpp:678 ../src/verbs.cpp:2624
msgid "Check Spellin_g..."
msgstr ""
@@ -13974,7 +13993,7 @@ msgstr ""
msgid "Guides"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:148 ../src/verbs.cpp:2542
+#: ../src/ui/dialog/document-properties.cpp:148 ../src/verbs.cpp:2541
msgid "Snap"
msgstr ""
@@ -14022,7 +14041,7 @@ msgstr ""
#. Inkscape::GC::release(defsRepr);
#. inform the document, so we can undo
#. Color Management
-#: ../src/ui/dialog/document-properties.cpp:421 ../src/verbs.cpp:2712
+#: ../src/ui/dialog/document-properties.cpp:421 ../src/verbs.cpp:2711
msgid "Link Color Profile"
msgstr ""
@@ -14159,7 +14178,8 @@ msgstr ""
#: ../share/extensions/jessyInk_view.inx.h:3
#: ../share/extensions/layout_nup.inx.h:15
#: ../share/extensions/lindenmayer.inx.h:23
-#: ../share/extensions/lorem_ipsum.inx.h:1 ../share/extensions/measure.inx.h:2
+#: ../share/extensions/lorem_ipsum.inx.h:1
+#: ../share/extensions/measure.inx.h:19
#: ../share/extensions/pathalongpath.inx.h:5
#: ../share/extensions/pathscatter.inx.h:6
#: ../share/extensions/radiusrand.inx.h:1 ../share/extensions/split.inx.h:1
@@ -14916,6 +14936,178 @@ msgstr ""
msgid "Set filter primitive attribute"
msgstr ""
+#: ../src/ui/dialog/find.cpp:67
+msgid "F_ind:"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:67
+msgid "Find objects by their content (exact or partial match)"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:68
+msgid "Re_place:"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:68
+msgid "Replace found objects with this value "
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:70
+msgid "_All"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:70
+msgid "Search in all layers"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:71
+msgid "Current _layer"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:72
+msgid "S_election"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:73
+msgid "Te_xt"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:73
+msgid "Search in text objects"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:74
+msgid "_Properties"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:74
+msgid "Search in object properties, styles, attributes and IDs"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:75
+msgid "Search in"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:76
+msgid "Scope"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:79
+msgid "Case sensiti_ve"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:79
+msgid "Match upper/lower case"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:80
+msgid "E_xact match"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:80
+msgid "Match whole objects only"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:82
+msgid "Include loc_ked"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:84
+msgid "General"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:86
+msgid "_ID"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:86
+msgid "Search id name"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:87
+msgid "Attribute _Name"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:87
+msgid "Search attribute name"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:88
+msgid "Attribute _Value"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:88
+msgid "Search attribute value"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:89
+msgid "_Style"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:89
+msgid "Search style"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:90
+msgid "Search fonts"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:91
+msgid "Properties"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:93
+msgid "Search all object types"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:107
+msgid "Object Types"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:110
+msgid "Select all objects matching the selected fields "
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:111
+msgid "_Replace All"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:111
+msgid "Replace all the matching objects"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:782
+msgid "Nothing to replace"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:828
+msgid "objects"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:828
+msgid "replaced"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:828
+msgid "found"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:836
+msgid "Text Replace"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:840
+msgid "Not found"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:866
+msgid "Select an object"
+msgstr ""
+
+#: ../src/ui/dialog/find.cpp:884
+msgid "Select a property"
+msgstr ""
+
#: ../src/ui/dialog/glyphs.cpp:53 ../src/ui/dialog/glyphs.cpp:145
msgid "all"
msgstr ""
@@ -15710,333 +15902,333 @@ msgstr ""
msgid "Selection only or whole document"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:170
+#: ../src/ui/dialog/inkscape-preferences.cpp:169
msgid "Show selection cue"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:171
+#: ../src/ui/dialog/inkscape-preferences.cpp:170
msgid ""
"Whether selected objects display a selection cue (the same as in selector)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:177
+#: ../src/ui/dialog/inkscape-preferences.cpp:176
msgid "Enable gradient editing"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:178
+#: ../src/ui/dialog/inkscape-preferences.cpp:177
msgid "Whether selected objects display gradient editing controls"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:183
+#: ../src/ui/dialog/inkscape-preferences.cpp:182
msgid "Conversion to guides uses edges instead of bounding box"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:184
+#: ../src/ui/dialog/inkscape-preferences.cpp:183
msgid ""
"Converting an object to guides places these along the object's true edges "
"(imitating the object's shape), not along the bounding box"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:191
+#: ../src/ui/dialog/inkscape-preferences.cpp:190
msgid "Ctrl+click dot size:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:191
+#: ../src/ui/dialog/inkscape-preferences.cpp:190
msgid "times current stroke width"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:192
+#: ../src/ui/dialog/inkscape-preferences.cpp:191
msgid "Size of dots created with Ctrl+click (relative to current stroke width)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:207
+#: ../src/ui/dialog/inkscape-preferences.cpp:206
msgid "<b>No objects selected</b> to take the style from."
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:216
+#: ../src/ui/dialog/inkscape-preferences.cpp:215
msgid ""
"<b>More than one object selected.</b> Cannot take style from multiple "
"objects."
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:249
+#: ../src/ui/dialog/inkscape-preferences.cpp:248
msgid "Style of new objects"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:251
+#: ../src/ui/dialog/inkscape-preferences.cpp:250
msgid "Last used style"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:253
+#: ../src/ui/dialog/inkscape-preferences.cpp:252
msgid "Apply the style you last set on an object"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:258
+#: ../src/ui/dialog/inkscape-preferences.cpp:257
msgid "This tool's own style:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:262
+#: ../src/ui/dialog/inkscape-preferences.cpp:261
msgid ""
"Each tool may store its own style to apply to the newly created objects. Use "
"the button below to set it."
msgstr ""
#. style swatch
-#: ../src/ui/dialog/inkscape-preferences.cpp:266
+#: ../src/ui/dialog/inkscape-preferences.cpp:265
msgid "Take from selection"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:271
+#: ../src/ui/dialog/inkscape-preferences.cpp:270
msgid "This tool's style of new objects"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:278
+#: ../src/ui/dialog/inkscape-preferences.cpp:277
msgid "Remember the style of the (first) selected object as this tool's style"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:283
+#: ../src/ui/dialog/inkscape-preferences.cpp:282
msgid "Tools"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:286
+#: ../src/ui/dialog/inkscape-preferences.cpp:285
msgid "Bounding box to use"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:287
+#: ../src/ui/dialog/inkscape-preferences.cpp:286
msgid "Visual bounding box"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:289
+#: ../src/ui/dialog/inkscape-preferences.cpp:288
msgid "This bounding box includes stroke width, markers, filter margins, etc."
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:290
+#: ../src/ui/dialog/inkscape-preferences.cpp:289
msgid "Geometric bounding box"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:292
+#: ../src/ui/dialog/inkscape-preferences.cpp:291
msgid "This bounding box includes only the bare path"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:294
+#: ../src/ui/dialog/inkscape-preferences.cpp:293
msgid "Conversion to guides"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:295
+#: ../src/ui/dialog/inkscape-preferences.cpp:294
msgid "Keep objects after conversion to guides"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:297
+#: ../src/ui/dialog/inkscape-preferences.cpp:296
msgid ""
"When converting an object to guides, don't delete the object after the "
"conversion"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:298
+#: ../src/ui/dialog/inkscape-preferences.cpp:297
msgid "Treat groups as a single object"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:300
+#: ../src/ui/dialog/inkscape-preferences.cpp:299
msgid ""
"Treat groups as a single object during conversion to guides rather than "
"converting each child separately"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:302
+#: ../src/ui/dialog/inkscape-preferences.cpp:301
msgid "Average all sketches"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:303
+#: ../src/ui/dialog/inkscape-preferences.cpp:302
msgid "Width is in absolute units"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:304
+#: ../src/ui/dialog/inkscape-preferences.cpp:303
msgid "Select new path"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:305
+#: ../src/ui/dialog/inkscape-preferences.cpp:304
msgid "Don't attach connectors to text objects"
msgstr ""
#. Selector
-#: ../src/ui/dialog/inkscape-preferences.cpp:308
+#: ../src/ui/dialog/inkscape-preferences.cpp:307
msgid "Selector"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:311
+#: ../src/ui/dialog/inkscape-preferences.cpp:310
msgid "When transforming, show"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:312
+#: ../src/ui/dialog/inkscape-preferences.cpp:311
msgid "Objects"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:314
+#: ../src/ui/dialog/inkscape-preferences.cpp:313
msgid "Show the actual objects when moving or transforming"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:315
+#: ../src/ui/dialog/inkscape-preferences.cpp:314
msgid "Box outline"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:317
+#: ../src/ui/dialog/inkscape-preferences.cpp:316
msgid "Show only a box outline of the objects when moving or transforming"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:318
+#: ../src/ui/dialog/inkscape-preferences.cpp:317
msgid "Per-object selection cue"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:321
+#: ../src/ui/dialog/inkscape-preferences.cpp:320
msgid "No per-object selection indication"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:322
+#: ../src/ui/dialog/inkscape-preferences.cpp:321
msgid "Mark"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:324
+#: ../src/ui/dialog/inkscape-preferences.cpp:323
msgid "Each selected object has a diamond mark in the top left corner"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:325
+#: ../src/ui/dialog/inkscape-preferences.cpp:324
msgid "Box"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:327
+#: ../src/ui/dialog/inkscape-preferences.cpp:326
msgid "Each selected object displays its bounding box"
msgstr ""
#. Node
-#: ../src/ui/dialog/inkscape-preferences.cpp:330
+#: ../src/ui/dialog/inkscape-preferences.cpp:329
msgid "Node"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:333
+#: ../src/ui/dialog/inkscape-preferences.cpp:332
msgid "Path outline"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:334
+#: ../src/ui/dialog/inkscape-preferences.cpp:333
msgid "Path outline color"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:335
+#: ../src/ui/dialog/inkscape-preferences.cpp:334
msgid "Selects the color used for showing the path outline"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:336
+#: ../src/ui/dialog/inkscape-preferences.cpp:335
msgid "Always show outline"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:337
+#: ../src/ui/dialog/inkscape-preferences.cpp:336
msgid "Show outlines for all paths, not only invisible paths"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:338
+#: ../src/ui/dialog/inkscape-preferences.cpp:337
msgid "Update outline when dragging nodes"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:339
+#: ../src/ui/dialog/inkscape-preferences.cpp:338
msgid ""
"Update the outline when dragging or transforming nodes; if this is off, the "
"outline will only update when completing a drag"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:340
+#: ../src/ui/dialog/inkscape-preferences.cpp:339
msgid "Update paths when dragging nodes"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:341
+#: ../src/ui/dialog/inkscape-preferences.cpp:340
msgid ""
"Update paths when dragging or transforming nodes; if this is off, paths will "
"only be updated when completing a drag"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:342
+#: ../src/ui/dialog/inkscape-preferences.cpp:341
msgid "Show path direction on outlines"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:343
+#: ../src/ui/dialog/inkscape-preferences.cpp:342
msgid ""
"Visualize the direction of selected paths by drawing small arrows in the "
"middle of each outline segment"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:344
+#: ../src/ui/dialog/inkscape-preferences.cpp:343
msgid "Show temporary path outline"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:345
+#: ../src/ui/dialog/inkscape-preferences.cpp:344
msgid "When hovering over a path, briefly flash its outline"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:346
+#: ../src/ui/dialog/inkscape-preferences.cpp:345
msgid "Show temporary outline for selected paths"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:347
+#: ../src/ui/dialog/inkscape-preferences.cpp:346
msgid "Show temporary outline even when a path is selected for editing"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:349
+#: ../src/ui/dialog/inkscape-preferences.cpp:348
msgid "Flash time:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:349
+#: ../src/ui/dialog/inkscape-preferences.cpp:348
msgid ""
"Specifies how long the path outline will be visible after a mouse-over (in "
"milliseconds); specify 0 to have the outline shown until mouse leaves the "
"path"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:350
+#: ../src/ui/dialog/inkscape-preferences.cpp:349
msgid "Editing preferences"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:351
+#: ../src/ui/dialog/inkscape-preferences.cpp:350
msgid "Show transform handles for single nodes"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:352
+#: ../src/ui/dialog/inkscape-preferences.cpp:351
msgid "Show transform handles even when only a single node is selected"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:353
+#: ../src/ui/dialog/inkscape-preferences.cpp:352
msgid "Deleting nodes preserves shape"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:354
+#: ../src/ui/dialog/inkscape-preferences.cpp:353
msgid ""
"Move handles next to deleted nodes to resemble original shape; hold Ctrl to "
"get the other behavior"
msgstr ""
#. Tweak
-#: ../src/ui/dialog/inkscape-preferences.cpp:357 ../src/verbs.cpp:2451
+#: ../src/ui/dialog/inkscape-preferences.cpp:356 ../src/verbs.cpp:2450
msgid "Tweak"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:358
+#: ../src/ui/dialog/inkscape-preferences.cpp:357
msgid "Object paint style"
msgstr ""
#. Zoom
-#: ../src/ui/dialog/inkscape-preferences.cpp:363 ../src/verbs.cpp:2475
+#: ../src/ui/dialog/inkscape-preferences.cpp:362 ../src/verbs.cpp:2474
#: ../src/widgets/desktop-widget.cpp:505
msgid "Zoom"
msgstr ""
#. Measure
-#: ../src/ui/dialog/inkscape-preferences.cpp:368 ../src/verbs.cpp:2477
-#: ../share/extensions/measure.inx.h:6
+#: ../src/ui/dialog/inkscape-preferences.cpp:367 ../src/verbs.cpp:2476
+#: ../share/extensions/measure.inx.h:23
msgid "Measure"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:370
+#: ../src/ui/dialog/inkscape-preferences.cpp:369
msgid "Ignore first and last points"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:371
+#: ../src/ui/dialog/inkscape-preferences.cpp:370
msgid ""
"The start and end of the measurement tool's control line will not be "
"considered for calculating lengths. Only lengths between actual curve "
@@ -16044,77 +16236,77 @@ msgid ""
msgstr ""
#. Shapes
-#: ../src/ui/dialog/inkscape-preferences.cpp:374
+#: ../src/ui/dialog/inkscape-preferences.cpp:373
msgid "Shapes"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:406
+#: ../src/ui/dialog/inkscape-preferences.cpp:405
msgid "Sketch mode"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:408
+#: ../src/ui/dialog/inkscape-preferences.cpp:407
msgid ""
"If on, the sketch result will be the normal average of all sketches made, "
"instead of averaging the old result with the new sketch"
msgstr ""
#. Pen
-#: ../src/ui/dialog/inkscape-preferences.cpp:411
-#: ../src/ui/dialog/input.cpp:1195 ../src/verbs.cpp:2467
+#: ../src/ui/dialog/inkscape-preferences.cpp:410
+#: ../src/ui/dialog/input.cpp:1195 ../src/verbs.cpp:2466
msgid "Pen"
msgstr ""
#. Calligraphy
-#: ../src/ui/dialog/inkscape-preferences.cpp:417 ../src/verbs.cpp:2469
+#: ../src/ui/dialog/inkscape-preferences.cpp:416 ../src/verbs.cpp:2468
msgid "Calligraphy"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:421
+#: ../src/ui/dialog/inkscape-preferences.cpp:420
msgid ""
"If on, pen width is in absolute units (px) independent of zoom; otherwise "
"pen width depends on zoom so that it looks the same at any zoom"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:423
+#: ../src/ui/dialog/inkscape-preferences.cpp:422
msgid ""
"If on, each newly created object will be selected (deselecting previous "
"selection)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:431
+#: ../src/ui/dialog/inkscape-preferences.cpp:430
msgid "Show font samples in the drop-down list"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:432
+#: ../src/ui/dialog/inkscape-preferences.cpp:431
msgid ""
"Show font samples alongside font names in the drop-down list in Text bar"
msgstr ""
#. Spray
-#: ../src/ui/dialog/inkscape-preferences.cpp:437 ../src/verbs.cpp:2453
+#: ../src/ui/dialog/inkscape-preferences.cpp:436 ../src/verbs.cpp:2452
msgid "Spray"
msgstr ""
#. Eraser
-#: ../src/ui/dialog/inkscape-preferences.cpp:442 ../src/verbs.cpp:2487
+#: ../src/ui/dialog/inkscape-preferences.cpp:441 ../src/verbs.cpp:2486
msgid "Eraser"
msgstr ""
#. Paint Bucket
-#: ../src/ui/dialog/inkscape-preferences.cpp:446 ../src/verbs.cpp:2483
+#: ../src/ui/dialog/inkscape-preferences.cpp:445 ../src/verbs.cpp:2482
msgid "Paint Bucket"
msgstr ""
#. Gradient
-#: ../src/ui/dialog/inkscape-preferences.cpp:451 ../src/verbs.cpp:2473
+#: ../src/ui/dialog/inkscape-preferences.cpp:450 ../src/verbs.cpp:2472
msgid "Gradient"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:453
+#: ../src/ui/dialog/inkscape-preferences.cpp:452
msgid "Prevent sharing of gradient definitions"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:455
+#: ../src/ui/dialog/inkscape-preferences.cpp:454
msgid ""
"When on, shared gradient definitions are automatically forked on change; "
"uncheck to allow sharing of gradient definitions so that editing one object "
@@ -16122,749 +16314,773 @@ msgid ""
msgstr ""
#. Dropper
-#: ../src/ui/dialog/inkscape-preferences.cpp:458 ../src/verbs.cpp:2479
+#: ../src/ui/dialog/inkscape-preferences.cpp:457 ../src/verbs.cpp:2478
msgid "Dropper"
msgstr ""
#. Connector
-#: ../src/ui/dialog/inkscape-preferences.cpp:463 ../src/verbs.cpp:2481
+#: ../src/ui/dialog/inkscape-preferences.cpp:462 ../src/verbs.cpp:2480
msgid "Connector"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:466
+#: ../src/ui/dialog/inkscape-preferences.cpp:465
msgid "If on, connector attachment points will not be shown for text objects"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:476
+#: ../src/ui/dialog/inkscape-preferences.cpp:475
msgid "Interface"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:479
+#: ../src/ui/dialog/inkscape-preferences.cpp:478
msgid "System default"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:479
+#: ../src/ui/dialog/inkscape-preferences.cpp:478
msgid "Albanian (sq)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:479
+#: ../src/ui/dialog/inkscape-preferences.cpp:478
msgid "Amharic (am)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:479
+#: ../src/ui/dialog/inkscape-preferences.cpp:478
msgid "Arabic (ar)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:479
+#: ../src/ui/dialog/inkscape-preferences.cpp:478
msgid "Armenian (hy)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:479
+#: ../src/ui/dialog/inkscape-preferences.cpp:478
msgid "Azerbaijani (az)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:479
+#: ../src/ui/dialog/inkscape-preferences.cpp:478
msgid "Basque (eu)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:479
+#: ../src/ui/dialog/inkscape-preferences.cpp:478
msgid "Belarusian (be)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:480
+#: ../src/ui/dialog/inkscape-preferences.cpp:479
msgid "Bulgarian (bg)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:480
+#: ../src/ui/dialog/inkscape-preferences.cpp:479
msgid "Bengali (bn)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:480
+#: ../src/ui/dialog/inkscape-preferences.cpp:479
msgid "Breton (br)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:480
+#: ../src/ui/dialog/inkscape-preferences.cpp:479
msgid "Catalan (ca)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:480
+#: ../src/ui/dialog/inkscape-preferences.cpp:479
msgid "Valencian Catalan (ca@valencia)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:480
+#: ../src/ui/dialog/inkscape-preferences.cpp:479
msgid "Chinese/China (zh_CN)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:481
+#: ../src/ui/dialog/inkscape-preferences.cpp:480
msgid "Chinese/Taiwan (zh_TW)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:481
+#: ../src/ui/dialog/inkscape-preferences.cpp:480
msgid "Croatian (hr)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:481
+#: ../src/ui/dialog/inkscape-preferences.cpp:480
msgid "Czech (cs)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:482
+#: ../src/ui/dialog/inkscape-preferences.cpp:481
msgid "Danish (da)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:482
+#: ../src/ui/dialog/inkscape-preferences.cpp:481
msgid "Dutch (nl)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:482
+#: ../src/ui/dialog/inkscape-preferences.cpp:481
msgid "Dzongkha (dz)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:482
+#: ../src/ui/dialog/inkscape-preferences.cpp:481
msgid "German (de)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:482
+#: ../src/ui/dialog/inkscape-preferences.cpp:481
msgid "Greek (el)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:482
+#: ../src/ui/dialog/inkscape-preferences.cpp:481
msgid "English (en)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:482
+#: ../src/ui/dialog/inkscape-preferences.cpp:481
msgid "English/Australia (en_AU)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:483
+#: ../src/ui/dialog/inkscape-preferences.cpp:482
msgid "English/Canada (en_CA)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:483
+#: ../src/ui/dialog/inkscape-preferences.cpp:482
msgid "English/Great Britain (en_GB)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:483
+#: ../src/ui/dialog/inkscape-preferences.cpp:482
msgid "Pig Latin (en_US@piglatin)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:484
+#: ../src/ui/dialog/inkscape-preferences.cpp:483
msgid "Esperanto (eo)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:484
+#: ../src/ui/dialog/inkscape-preferences.cpp:483
msgid "Estonian (et)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:484
+#: ../src/ui/dialog/inkscape-preferences.cpp:483
msgid "Farsi (fa)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:484
+#: ../src/ui/dialog/inkscape-preferences.cpp:483
msgid "Finnish (fi)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:485
+#: ../src/ui/dialog/inkscape-preferences.cpp:484
msgid "French (fr)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:485
+#: ../src/ui/dialog/inkscape-preferences.cpp:484
msgid "Irish (ga)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:485
+#: ../src/ui/dialog/inkscape-preferences.cpp:484
msgid "Galician (gl)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:485
+#: ../src/ui/dialog/inkscape-preferences.cpp:484
msgid "Hebrew (he)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:485
+#: ../src/ui/dialog/inkscape-preferences.cpp:484
msgid "Hungarian (hu)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:486
+#: ../src/ui/dialog/inkscape-preferences.cpp:485
msgid "Indonesian (id)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:486
+#: ../src/ui/dialog/inkscape-preferences.cpp:485
msgid "Italian (it)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:486
+#: ../src/ui/dialog/inkscape-preferences.cpp:485
msgid "Japanese (ja)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:486
+#: ../src/ui/dialog/inkscape-preferences.cpp:485
msgid "Khmer (km)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:486
+#: ../src/ui/dialog/inkscape-preferences.cpp:485
msgid "Kinyarwanda (rw)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:486
+#: ../src/ui/dialog/inkscape-preferences.cpp:485
msgid "Korean (ko)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:486
+#: ../src/ui/dialog/inkscape-preferences.cpp:485
msgid "Lithuanian (lt)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:486
+#: ../src/ui/dialog/inkscape-preferences.cpp:485
+msgid "Latvian (lv)"
+msgstr ""
+
+#: ../src/ui/dialog/inkscape-preferences.cpp:485
msgid "Macedonian (mk)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:487
+#: ../src/ui/dialog/inkscape-preferences.cpp:486
msgid "Mongolian (mn)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:487
+#: ../src/ui/dialog/inkscape-preferences.cpp:486
msgid "Nepali (ne)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:487
+#: ../src/ui/dialog/inkscape-preferences.cpp:486
msgid "Norwegian Bokmål (nb)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:487
+#: ../src/ui/dialog/inkscape-preferences.cpp:486
msgid "Norwegian Nynorsk (nn)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:487
+#: ../src/ui/dialog/inkscape-preferences.cpp:486
msgid "Panjabi (pa)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:488
+#: ../src/ui/dialog/inkscape-preferences.cpp:487
msgid "Polish (pl)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:488
+#: ../src/ui/dialog/inkscape-preferences.cpp:487
msgid "Portuguese (pt)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:488
+#: ../src/ui/dialog/inkscape-preferences.cpp:487
msgid "Portuguese/Brazil (pt_BR)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:488
+#: ../src/ui/dialog/inkscape-preferences.cpp:487
msgid "Romanian (ro)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:488
+#: ../src/ui/dialog/inkscape-preferences.cpp:487
msgid "Russian (ru)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:489
+#: ../src/ui/dialog/inkscape-preferences.cpp:488
msgid "Serbian (sr)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:489
+#: ../src/ui/dialog/inkscape-preferences.cpp:488
msgid "Serbian in Latin script (sr@latin)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:489
+#: ../src/ui/dialog/inkscape-preferences.cpp:488
msgid "Slovak (sk)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:489
+#: ../src/ui/dialog/inkscape-preferences.cpp:488
msgid "Slovenian (sl)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:489
+#: ../src/ui/dialog/inkscape-preferences.cpp:488
msgid "Spanish (es)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:489
+#: ../src/ui/dialog/inkscape-preferences.cpp:488
msgid "Spanish/Mexico (es_MX)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:490
+#: ../src/ui/dialog/inkscape-preferences.cpp:489
msgid "Swedish (sv)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:490
+#: ../src/ui/dialog/inkscape-preferences.cpp:489
msgid "Telugu (te_IN)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:490
+#: ../src/ui/dialog/inkscape-preferences.cpp:489
msgid "Thai (th)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:490
+#: ../src/ui/dialog/inkscape-preferences.cpp:489
msgid "Turkish (tr)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:490
+#: ../src/ui/dialog/inkscape-preferences.cpp:489
msgid "Ukrainian (uk)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:490
+#: ../src/ui/dialog/inkscape-preferences.cpp:489
msgid "Vietnamese (vi)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:522
+#: ../src/ui/dialog/inkscape-preferences.cpp:521
msgid "Language (requires restart):"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:523
+#: ../src/ui/dialog/inkscape-preferences.cpp:522
msgid "Set the language for menus and number formats"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:525
+#: ../src/ui/dialog/inkscape-preferences.cpp:524
msgid "Large"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:525
+#: ../src/ui/dialog/inkscape-preferences.cpp:524
msgid "Small"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:525
+#: ../src/ui/dialog/inkscape-preferences.cpp:524
msgid "Smaller"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:529
+#: ../src/ui/dialog/inkscape-preferences.cpp:528
msgid "Toolbox icon size:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:530
+#: ../src/ui/dialog/inkscape-preferences.cpp:529
msgid "Set the size for the tool icons (requires restart)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:533
+#: ../src/ui/dialog/inkscape-preferences.cpp:532
msgid "Control bar icon size:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:534
+#: ../src/ui/dialog/inkscape-preferences.cpp:533
msgid ""
"Set the size for the icons in tools' control bars to use (requires restart)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:537
+#: ../src/ui/dialog/inkscape-preferences.cpp:536
msgid "Secondary toolbar icon size:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:538
+#: ../src/ui/dialog/inkscape-preferences.cpp:537
msgid ""
"Set the size for the icons in secondary toolbars to use (requires restart)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:541
+#: ../src/ui/dialog/inkscape-preferences.cpp:540
msgid "Work-around color sliders not drawing"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:543
+#: ../src/ui/dialog/inkscape-preferences.cpp:542
msgid ""
"When on, will attempt to work around bugs in certain GTK themes drawing "
"color sliders"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:549
+#: ../src/ui/dialog/inkscape-preferences.cpp:548
msgid "Clear list"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:554
+#: ../src/ui/dialog/inkscape-preferences.cpp:553
msgid "Maximum documents in Open Recent:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:555
+#: ../src/ui/dialog/inkscape-preferences.cpp:554
msgid ""
"Set the maximum length of the Open Recent list in the File menu, or clear "
"the list"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:558
+#: ../src/ui/dialog/inkscape-preferences.cpp:557
msgid "Zoom correction factor (in %):"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:559
+#: ../src/ui/dialog/inkscape-preferences.cpp:558
msgid ""
"Adjust the slider until the length of the ruler on your screen matches its "
"real length. This information is used when zooming to 1:1, 1:2, etc., to "
"display objects in their true sizes"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:562
+#: ../src/ui/dialog/inkscape-preferences.cpp:561
msgid "Enable dynamic relayout for incomplete sections"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:564
+#: ../src/ui/dialog/inkscape-preferences.cpp:563
msgid ""
"When on, will allow dynamic layout of components that are not completely "
"finished being refactored"
msgstr ""
#. show infobox
-#: ../src/ui/dialog/inkscape-preferences.cpp:567
+#: ../src/ui/dialog/inkscape-preferences.cpp:566
msgid "Show filter primitives infobox"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:569
+#: ../src/ui/dialog/inkscape-preferences.cpp:568
msgid ""
"Show icons and descriptions for the filter primitives available at the "
"filter effects dialog"
msgstr ""
#. Windows
-#: ../src/ui/dialog/inkscape-preferences.cpp:572
+#: ../src/ui/dialog/inkscape-preferences.cpp:571
msgid "Save and restore window geometry for each document"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:573
+#: ../src/ui/dialog/inkscape-preferences.cpp:572
msgid "Remember and use last window's geometry"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:574
+#: ../src/ui/dialog/inkscape-preferences.cpp:573
msgid "Don't save window geometry"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:576
+#: ../src/ui/dialog/inkscape-preferences.cpp:575
msgid "Save and restore dialogs status"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:577
-#: ../src/ui/dialog/inkscape-preferences.cpp:599
+#: ../src/ui/dialog/inkscape-preferences.cpp:576
+#: ../src/ui/dialog/inkscape-preferences.cpp:601
msgid "Don't save dialogs status"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:579
-#: ../src/ui/dialog/inkscape-preferences.cpp:605
+#: ../src/ui/dialog/inkscape-preferences.cpp:578
+#: ../src/ui/dialog/inkscape-preferences.cpp:607
msgid "Dockable"
msgstr ""
+#: ../src/ui/dialog/inkscape-preferences.cpp:581
+msgid "Native open/save dialogs"
+msgstr ""
+
#: ../src/ui/dialog/inkscape-preferences.cpp:582
+msgid "GTK open/save dialogs"
+msgstr ""
+
+#: ../src/ui/dialog/inkscape-preferences.cpp:584
msgid "Dialogs are hidden in taskbar"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:583
+#: ../src/ui/dialog/inkscape-preferences.cpp:585
msgid "Zoom when window is resized"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:584
+#: ../src/ui/dialog/inkscape-preferences.cpp:586
msgid "Show close button on dialogs"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:587
+#: ../src/ui/dialog/inkscape-preferences.cpp:589
msgid "Aggressive"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:589
+#: ../src/ui/dialog/inkscape-preferences.cpp:591
msgid "Saving window geometry (size and position)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:591
+#: ../src/ui/dialog/inkscape-preferences.cpp:593
msgid "Let the window manager determine placement of all windows"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:593
+#: ../src/ui/dialog/inkscape-preferences.cpp:595
msgid ""
"Remember and use the last window's geometry (saves geometry to user "
"preferences)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:595
+#: ../src/ui/dialog/inkscape-preferences.cpp:597
msgid ""
"Save and restore window geometry for each document (saves geometry in the "
"document)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:597
+#: ../src/ui/dialog/inkscape-preferences.cpp:599
msgid "Saving dialogs status"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:601
+#: ../src/ui/dialog/inkscape-preferences.cpp:603
msgid ""
"Save and restore dialogs status (the last open windows dialogs are saved "
"when it closes)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:603
+#: ../src/ui/dialog/inkscape-preferences.cpp:605
msgid "Dialog behavior (requires restart)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:610
-msgid "Dialogs on top:"
+#: ../src/ui/dialog/inkscape-preferences.cpp:611
+msgid "Desktop integration"
msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:613
-msgid "Dialogs are treated as regular windows"
+msgid "Use Windows like open and save dialogs"
msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:615
+msgid "Use GTK open and save dialogs "
+msgstr ""
+
+#: ../src/ui/dialog/inkscape-preferences.cpp:619
+msgid "Dialogs on top:"
+msgstr ""
+
+#: ../src/ui/dialog/inkscape-preferences.cpp:622
+msgid "Dialogs are treated as regular windows"
+msgstr ""
+
+#: ../src/ui/dialog/inkscape-preferences.cpp:624
msgid "Dialogs stay on top of document windows"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:617
+#: ../src/ui/dialog/inkscape-preferences.cpp:626
msgid "Same as Normal but may work better with some window managers"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:621
+#: ../src/ui/dialog/inkscape-preferences.cpp:630
msgid "Dialog Transparency"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:623
+#: ../src/ui/dialog/inkscape-preferences.cpp:632
msgid "Opacity when focused:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:625
+#: ../src/ui/dialog/inkscape-preferences.cpp:634
msgid "Opacity when unfocused:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:627
+#: ../src/ui/dialog/inkscape-preferences.cpp:636
msgid "Time of opacity change animation:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:630
+#: ../src/ui/dialog/inkscape-preferences.cpp:639
msgid "Miscellaneous"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:633
+#: ../src/ui/dialog/inkscape-preferences.cpp:642
msgid "Whether dialog windows are to be hidden in the window manager taskbar"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:636
+#: ../src/ui/dialog/inkscape-preferences.cpp:645
msgid ""
"Zoom drawing when document window is resized, to keep the same area visible "
"(this is the default which can be changed in any window using the button "
"above the right scrollbar)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:638
+#: ../src/ui/dialog/inkscape-preferences.cpp:647
msgid "Whether dialog windows have a close button (requires restart)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:639
+#: ../src/ui/dialog/inkscape-preferences.cpp:648
msgid "Windows"
msgstr ""
#. Grids
-#: ../src/ui/dialog/inkscape-preferences.cpp:642
+#: ../src/ui/dialog/inkscape-preferences.cpp:651
msgid "Major grid line emphasizing"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:644
+#: ../src/ui/dialog/inkscape-preferences.cpp:653
msgid "Don't emphasize gridlines when zoomed out"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:645
+#: ../src/ui/dialog/inkscape-preferences.cpp:654
msgid ""
"If set and zoomed out, the gridlines will be shown in normal color instead "
"of major grid line color"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:647
+#: ../src/ui/dialog/inkscape-preferences.cpp:656
msgid "Default grid settings"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:653
-#: ../src/ui/dialog/inkscape-preferences.cpp:678
+#: ../src/ui/dialog/inkscape-preferences.cpp:662
+#: ../src/ui/dialog/inkscape-preferences.cpp:687
msgid "Grid units:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:658
-#: ../src/ui/dialog/inkscape-preferences.cpp:683
+#: ../src/ui/dialog/inkscape-preferences.cpp:667
+#: ../src/ui/dialog/inkscape-preferences.cpp:692
msgid "Origin X:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:659
-#: ../src/ui/dialog/inkscape-preferences.cpp:684
+#: ../src/ui/dialog/inkscape-preferences.cpp:668
+#: ../src/ui/dialog/inkscape-preferences.cpp:693
msgid "Origin Y:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:664
+#: ../src/ui/dialog/inkscape-preferences.cpp:673
msgid "Spacing X:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:665
-#: ../src/ui/dialog/inkscape-preferences.cpp:687
+#: ../src/ui/dialog/inkscape-preferences.cpp:674
+#: ../src/ui/dialog/inkscape-preferences.cpp:696
msgid "Spacing Y:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:667
-#: ../src/ui/dialog/inkscape-preferences.cpp:668
-#: ../src/ui/dialog/inkscape-preferences.cpp:692
-#: ../src/ui/dialog/inkscape-preferences.cpp:693
+#: ../src/ui/dialog/inkscape-preferences.cpp:676
+#: ../src/ui/dialog/inkscape-preferences.cpp:677
+#: ../src/ui/dialog/inkscape-preferences.cpp:701
+#: ../src/ui/dialog/inkscape-preferences.cpp:702
msgid "Grid line color:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:668
-#: ../src/ui/dialog/inkscape-preferences.cpp:693
+#: ../src/ui/dialog/inkscape-preferences.cpp:677
+#: ../src/ui/dialog/inkscape-preferences.cpp:702
msgid "Color used for normal grid lines"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:669
-#: ../src/ui/dialog/inkscape-preferences.cpp:670
-#: ../src/ui/dialog/inkscape-preferences.cpp:694
-#: ../src/ui/dialog/inkscape-preferences.cpp:695
+#: ../src/ui/dialog/inkscape-preferences.cpp:678
+#: ../src/ui/dialog/inkscape-preferences.cpp:679
+#: ../src/ui/dialog/inkscape-preferences.cpp:703
+#: ../src/ui/dialog/inkscape-preferences.cpp:704
msgid "Major grid line color:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:670
-#: ../src/ui/dialog/inkscape-preferences.cpp:695
+#: ../src/ui/dialog/inkscape-preferences.cpp:679
+#: ../src/ui/dialog/inkscape-preferences.cpp:704
msgid "Color used for major (highlighted) grid lines"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:672
-#: ../src/ui/dialog/inkscape-preferences.cpp:697
+#: ../src/ui/dialog/inkscape-preferences.cpp:681
+#: ../src/ui/dialog/inkscape-preferences.cpp:706
msgid "Major grid line every:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:673
+#: ../src/ui/dialog/inkscape-preferences.cpp:682
msgid "Show dots instead of lines"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:674
+#: ../src/ui/dialog/inkscape-preferences.cpp:683
msgid "If set, display dots at gridpoints instead of gridlines"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:746
-msgid "Input-output"
+#: ../src/ui/dialog/inkscape-preferences.cpp:755
+msgid "Input/Output"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:749
+#: ../src/ui/dialog/inkscape-preferences.cpp:758
msgid "Use current directory for \"Save As ...\""
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:751
+#: ../src/ui/dialog/inkscape-preferences.cpp:760
msgid ""
"When this option is on, the \"Save as...\" and \"Save a Copy\" dialogs will "
"always open in the directory where the currently open document is; when it's "
"off, each will open in the directory where you last saved a file using it"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:753
+#: ../src/ui/dialog/inkscape-preferences.cpp:762
msgid "Add label comments to printing output"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:755
+#: ../src/ui/dialog/inkscape-preferences.cpp:764
msgid ""
"When on, a comment will be added to the raw print output, marking the "
"rendered output for an object with its label"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:759
+#: ../src/ui/dialog/inkscape-preferences.cpp:768
msgid "Grab sensitivity:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:759
-#: ../src/ui/dialog/inkscape-preferences.cpp:762
-#: ../src/ui/dialog/inkscape-preferences.cpp:1084
-#: ../src/ui/dialog/inkscape-preferences.cpp:1088
-#: ../src/ui/dialog/inkscape-preferences.cpp:1098
+#: ../src/ui/dialog/inkscape-preferences.cpp:768
+#: ../src/ui/dialog/inkscape-preferences.cpp:771
+#: ../src/ui/dialog/inkscape-preferences.cpp:1093
+#: ../src/ui/dialog/inkscape-preferences.cpp:1097
+#: ../src/ui/dialog/inkscape-preferences.cpp:1107
msgid "pixels"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:760
+#: ../src/ui/dialog/inkscape-preferences.cpp:769
msgid ""
"How close on the screen you need to be to an object to be able to grab it "
"with mouse (in screen pixels)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:762
+#: ../src/ui/dialog/inkscape-preferences.cpp:771
msgid "Click/drag threshold:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:763
+#: ../src/ui/dialog/inkscape-preferences.cpp:772
msgid ""
"Maximum mouse drag (in screen pixels) which is considered a click, not a drag"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:765
+#: ../src/ui/dialog/inkscape-preferences.cpp:774
msgid "Use pressure-sensitive tablet (requires restart)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:767
+#: ../src/ui/dialog/inkscape-preferences.cpp:776
msgid ""
"Use the capabilities of a tablet or other pressure-sensitive device. Disable "
"this only if you have problems with the tablet (you can still use it as a "
"mouse)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:769
+#: ../src/ui/dialog/inkscape-preferences.cpp:778
msgid "Switch tool based on tablet device (requires restart)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:771
+#: ../src/ui/dialog/inkscape-preferences.cpp:780
msgid ""
"Change tool as different devices are used on the tablet (pen, eraser, mouse)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:772
+#: ../src/ui/dialog/inkscape-preferences.cpp:781
msgid "Input devices"
msgstr ""
#. SVG output options
-#: ../src/ui/dialog/inkscape-preferences.cpp:775
+#: ../src/ui/dialog/inkscape-preferences.cpp:784
msgid "Use named colors"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:776
+#: ../src/ui/dialog/inkscape-preferences.cpp:785
msgid ""
"If set, write the CSS name of the color when available (e.g. 'red' or "
"'magenta') instead of the numeric value"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:778
+#: ../src/ui/dialog/inkscape-preferences.cpp:787
msgid "XML formatting"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:780
+#: ../src/ui/dialog/inkscape-preferences.cpp:789
msgid "Inline attributes"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:781
+#: ../src/ui/dialog/inkscape-preferences.cpp:790
msgid "Put attributes on the same line as the element tag"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:784
+#: ../src/ui/dialog/inkscape-preferences.cpp:793
msgid "Indent, spaces:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:784
+#: ../src/ui/dialog/inkscape-preferences.cpp:793
msgid ""
"The number of spaces to use for indenting nested elements; set to 0 for no "
"indentation"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:786
+#: ../src/ui/dialog/inkscape-preferences.cpp:795
msgid "Path data"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:788
+#: ../src/ui/dialog/inkscape-preferences.cpp:797
msgid "Allow relative coordinates"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:789
+#: ../src/ui/dialog/inkscape-preferences.cpp:798
msgid "If set, relative coordinates may be used in path data"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:791
+#: ../src/ui/dialog/inkscape-preferences.cpp:800
msgid "Force repeat commands"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:792
+#: ../src/ui/dialog/inkscape-preferences.cpp:801
msgid ""
"Force repeating of the same path command (for example, 'L 1,2 L 3,4' instead "
"of 'L 1,2 3,4')"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:794
+#: ../src/ui/dialog/inkscape-preferences.cpp:803
msgid "Numbers"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:797
+#: ../src/ui/dialog/inkscape-preferences.cpp:806
msgid "Numeric precision:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:797
+#: ../src/ui/dialog/inkscape-preferences.cpp:806
msgid "Significant figures of the values written to the SVG file"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:800
+#: ../src/ui/dialog/inkscape-preferences.cpp:809
msgid "Minimum exponent:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:800
+#: ../src/ui/dialog/inkscape-preferences.cpp:809
msgid ""
"The smallest number written to SVG is 10 to the power of this exponent; "
"anything smaller is written as zero"
@@ -16872,56 +17088,56 @@ msgstr ""
#. Code to add controls for attribute checking options
#. Add incorrect style properties options
-#: ../src/ui/dialog/inkscape-preferences.cpp:805
+#: ../src/ui/dialog/inkscape-preferences.cpp:814
msgid "Improper Attributes Actions"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:807
-#: ../src/ui/dialog/inkscape-preferences.cpp:815
-#: ../src/ui/dialog/inkscape-preferences.cpp:823
+#: ../src/ui/dialog/inkscape-preferences.cpp:816
+#: ../src/ui/dialog/inkscape-preferences.cpp:824
+#: ../src/ui/dialog/inkscape-preferences.cpp:832
msgid "Print warnings"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:808
+#: ../src/ui/dialog/inkscape-preferences.cpp:817
msgid ""
"Print warning if invalid or non-useful attributes found. Database files "
"located in inkscape_data_dir/attributes."
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:809
+#: ../src/ui/dialog/inkscape-preferences.cpp:818
msgid "Remove attributes"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:810
+#: ../src/ui/dialog/inkscape-preferences.cpp:819
msgid "Delete invalid or non-useful attributes from element tag."
msgstr ""
#. Add incorrect style properties options
-#: ../src/ui/dialog/inkscape-preferences.cpp:813
+#: ../src/ui/dialog/inkscape-preferences.cpp:822
msgid "Inappropriate Style Properties Actions"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:816
+#: ../src/ui/dialog/inkscape-preferences.cpp:825
msgid ""
"Print warning if inappropriate style properties found (i.e. 'font-family' "
"set on a <rect>). Database files located in inkscape_data_dir/attributes."
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:817
-#: ../src/ui/dialog/inkscape-preferences.cpp:825
+#: ../src/ui/dialog/inkscape-preferences.cpp:826
+#: ../src/ui/dialog/inkscape-preferences.cpp:834
msgid "Remove style properties"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:818
+#: ../src/ui/dialog/inkscape-preferences.cpp:827
msgid "Delete inappropriate style properties."
msgstr ""
#. Add default or inherited style properties options
-#: ../src/ui/dialog/inkscape-preferences.cpp:821
+#: ../src/ui/dialog/inkscape-preferences.cpp:830
msgid "Non-useful Style Properties Actions"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:824
+#: ../src/ui/dialog/inkscape-preferences.cpp:833
msgid ""
"Print warning if redundant style properties found (i.e. if a property has "
"the default value and a different value is not inherited or if value is the "
@@ -16929,164 +17145,164 @@ msgid ""
"attributes."
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:826
+#: ../src/ui/dialog/inkscape-preferences.cpp:835
msgid "Delete redundant style properties."
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:828
+#: ../src/ui/dialog/inkscape-preferences.cpp:837
msgid "Check Attributes and Style Properties on:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:830
+#: ../src/ui/dialog/inkscape-preferences.cpp:839
msgid "Reading"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:831
+#: ../src/ui/dialog/inkscape-preferences.cpp:840
msgid ""
"Check attributes and style properties on reading in SVG files (including "
"those internal to Inkscape which will slow down startup)."
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:832
+#: ../src/ui/dialog/inkscape-preferences.cpp:841
msgid "Editing"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:833
+#: ../src/ui/dialog/inkscape-preferences.cpp:842
msgid ""
"Check attributes and style properties while editing SVG files (may slow down "
"Inkscape, mostly useful for debugging)."
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:834
+#: ../src/ui/dialog/inkscape-preferences.cpp:843
msgid "Writing"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:835
+#: ../src/ui/dialog/inkscape-preferences.cpp:844
msgid "Check attributes and style properties on writing out SVG files."
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:837
+#: ../src/ui/dialog/inkscape-preferences.cpp:846
msgid "SVG output"
msgstr ""
#. TRANSLATORS: see http://www.newsandtech.com/issues/2004/03-04/pt/03-04_rendering.htm
-#: ../src/ui/dialog/inkscape-preferences.cpp:843
+#: ../src/ui/dialog/inkscape-preferences.cpp:852
msgid "Perceptual"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:843
+#: ../src/ui/dialog/inkscape-preferences.cpp:852
msgid "Relative Colorimetric"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:843
+#: ../src/ui/dialog/inkscape-preferences.cpp:852
msgid "Absolute Colorimetric"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:847
+#: ../src/ui/dialog/inkscape-preferences.cpp:856
msgid "(Note: Color management has been disabled in this build)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:851
+#: ../src/ui/dialog/inkscape-preferences.cpp:860
msgid "Display adjustment"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:861
+#: ../src/ui/dialog/inkscape-preferences.cpp:870
#, c-format
msgid ""
"The ICC profile to use to calibrate display output.\n"
"Searched directories:%s"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:862
+#: ../src/ui/dialog/inkscape-preferences.cpp:871
msgid "Display profile:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:867
+#: ../src/ui/dialog/inkscape-preferences.cpp:876
msgid "Retrieve profile from display"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:870
+#: ../src/ui/dialog/inkscape-preferences.cpp:879
msgid "Retrieve profiles from those attached to displays via XICC"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:872
+#: ../src/ui/dialog/inkscape-preferences.cpp:881
msgid "Retrieve profiles from those attached to displays"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:877
+#: ../src/ui/dialog/inkscape-preferences.cpp:886
msgid "Display rendering intent:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:878
+#: ../src/ui/dialog/inkscape-preferences.cpp:887
msgid "The rendering intent to use to calibrate display output"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:880
+#: ../src/ui/dialog/inkscape-preferences.cpp:889
msgid "Proofing"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:882
+#: ../src/ui/dialog/inkscape-preferences.cpp:891
msgid "Simulate output on screen"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:884
+#: ../src/ui/dialog/inkscape-preferences.cpp:893
msgid "Simulates output of target device"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:886
+#: ../src/ui/dialog/inkscape-preferences.cpp:895
msgid "Mark out of gamut colors"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:888
+#: ../src/ui/dialog/inkscape-preferences.cpp:897
msgid "Highlights colors that are out of gamut for the target device"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:893
+#: ../src/ui/dialog/inkscape-preferences.cpp:902
msgid "Out of gamut warning color:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:894
+#: ../src/ui/dialog/inkscape-preferences.cpp:903
msgid "Selects the color used for out of gamut warning"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:896
+#: ../src/ui/dialog/inkscape-preferences.cpp:905
msgid "Device profile:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:897
+#: ../src/ui/dialog/inkscape-preferences.cpp:906
msgid "The ICC profile to use to simulate device output"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:900
+#: ../src/ui/dialog/inkscape-preferences.cpp:909
msgid "Device rendering intent:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:901
+#: ../src/ui/dialog/inkscape-preferences.cpp:910
msgid "The rendering intent to use to calibrate device output"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:903
+#: ../src/ui/dialog/inkscape-preferences.cpp:912
msgid "Black point compensation"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:905
+#: ../src/ui/dialog/inkscape-preferences.cpp:914
msgid "Enables black point compensation"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:907
+#: ../src/ui/dialog/inkscape-preferences.cpp:916
msgid "Preserve black"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:912
+#: ../src/ui/dialog/inkscape-preferences.cpp:921
msgid "(LittleCMS 1.15 or later required)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:914
+#: ../src/ui/dialog/inkscape-preferences.cpp:923
msgid "Preserve K channel in CMYK -> CMYK transforms"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:928
-#: ../src/ui/dialog/inkscape-preferences.cpp:930
+#: ../src/ui/dialog/inkscape-preferences.cpp:937
+#: ../src/ui/dialog/inkscape-preferences.cpp:939
#: ../src/widgets/sp-color-icc-selector.cpp:308
#: ../src/widgets/sp-color-icc-selector.cpp:311
#: ../src/widgets/sp-color-icc-selector.cpp:598
@@ -17094,43 +17310,43 @@ msgstr ""
msgid "<none>"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:984
+#: ../src/ui/dialog/inkscape-preferences.cpp:993
msgid "Color management"
msgstr ""
#. Autosave options
-#: ../src/ui/dialog/inkscape-preferences.cpp:987
+#: ../src/ui/dialog/inkscape-preferences.cpp:996
msgid "Enable autosave (requires restart)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:988
+#: ../src/ui/dialog/inkscape-preferences.cpp:997
msgid ""
"Automatically save the current document(s) at a given interval, thus "
"minimizing loss in case of a crash"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:990
+#: ../src/ui/dialog/inkscape-preferences.cpp:999
msgid "Interval (in minutes):"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:990
+#: ../src/ui/dialog/inkscape-preferences.cpp:999
msgid "Interval (in minutes) at which document will be autosaved"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:992
+#: ../src/ui/dialog/inkscape-preferences.cpp:1001
msgctxt "Filesystem"
msgid "Path:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:992
+#: ../src/ui/dialog/inkscape-preferences.cpp:1001
msgid "The directory where autosaves will be written"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:994
+#: ../src/ui/dialog/inkscape-preferences.cpp:1003
msgid "Maximum number of autosaves:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:994
+#: ../src/ui/dialog/inkscape-preferences.cpp:1003
msgid ""
"Maximum number of autosaved files; use this to limit the storage space used"
msgstr ""
@@ -17147,49 +17363,49 @@ msgstr ""
#. _autosave_autosave_interval.signal_changed().connect( sigc::ptr_fun(inkscape_autosave_init), TRUE );
#.
#. -----------
-#: ../src/ui/dialog/inkscape-preferences.cpp:1009
+#: ../src/ui/dialog/inkscape-preferences.cpp:1018
msgid "Autosave"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1013
+#: ../src/ui/dialog/inkscape-preferences.cpp:1022
msgid "Open Clip Art Library Server Name:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1014
+#: ../src/ui/dialog/inkscape-preferences.cpp:1023
msgid ""
"The server name of the Open Clip Art Library webdav server; it's used by the "
"Import and Export to OCAL function"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1016
+#: ../src/ui/dialog/inkscape-preferences.cpp:1025
msgid "Open Clip Art Library Username:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1017
+#: ../src/ui/dialog/inkscape-preferences.cpp:1026
msgid "The username used to log into Open Clip Art Library"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1019
+#: ../src/ui/dialog/inkscape-preferences.cpp:1028
msgid "Open Clip Art Library Password:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1020
+#: ../src/ui/dialog/inkscape-preferences.cpp:1029
msgid "The password used to log into Open Clip Art Library"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1021
+#: ../src/ui/dialog/inkscape-preferences.cpp:1030
msgid "Open Clip Art"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1026
+#: ../src/ui/dialog/inkscape-preferences.cpp:1035
msgid "Behavior"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1030
+#: ../src/ui/dialog/inkscape-preferences.cpp:1039
msgid "Simplification threshold:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1031
+#: ../src/ui/dialog/inkscape-preferences.cpp:1040
msgid ""
"How strong is the Node tool's Simplify command by default. If you invoke "
"this command several times in quick succession, it will act more and more "
@@ -17197,402 +17413,402 @@ msgid ""
msgstr ""
#. Selecting options
-#: ../src/ui/dialog/inkscape-preferences.cpp:1034
+#: ../src/ui/dialog/inkscape-preferences.cpp:1043
msgid "Select in all layers"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1035
+#: ../src/ui/dialog/inkscape-preferences.cpp:1044
msgid "Select only within current layer"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1036
+#: ../src/ui/dialog/inkscape-preferences.cpp:1045
msgid "Select in current layer and sublayers"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1037
+#: ../src/ui/dialog/inkscape-preferences.cpp:1046
msgid "Ignore hidden objects and layers"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1038
+#: ../src/ui/dialog/inkscape-preferences.cpp:1047
msgid "Ignore locked objects and layers"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1039
+#: ../src/ui/dialog/inkscape-preferences.cpp:1048
msgid "Deselect upon layer change"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1041
+#: ../src/ui/dialog/inkscape-preferences.cpp:1050
msgid "Ctrl+A, Tab, Shift+Tab"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1043
+#: ../src/ui/dialog/inkscape-preferences.cpp:1052
msgid "Make keyboard selection commands work on objects in all layers"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1045
+#: ../src/ui/dialog/inkscape-preferences.cpp:1054
msgid "Make keyboard selection commands work on objects in current layer only"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1047
+#: ../src/ui/dialog/inkscape-preferences.cpp:1056
msgid ""
"Make keyboard selection commands work on objects in current layer and all "
"its sublayers"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1049
+#: ../src/ui/dialog/inkscape-preferences.cpp:1058
msgid ""
"Uncheck this to be able to select objects that are hidden (either by "
"themselves or by being in a hidden layer)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
+#: ../src/ui/dialog/inkscape-preferences.cpp:1060
msgid ""
"Uncheck this to be able to select objects that are locked (either by "
"themselves or by being in a locked layer)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
+#: ../src/ui/dialog/inkscape-preferences.cpp:1063
msgid ""
"Uncheck this to be able to keep the current objects selected when the "
"current layer changes"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1056
+#: ../src/ui/dialog/inkscape-preferences.cpp:1065
msgid "Selecting"
msgstr ""
#. Transforms options
-#: ../src/ui/dialog/inkscape-preferences.cpp:1059
+#: ../src/ui/dialog/inkscape-preferences.cpp:1068
#: ../src/widgets/select-toolbar.cpp:561
msgid "Scale stroke width"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1060
+#: ../src/ui/dialog/inkscape-preferences.cpp:1069
msgid "Scale rounded corners in rectangles"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
+#: ../src/ui/dialog/inkscape-preferences.cpp:1070
msgid "Transform gradients"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1062
+#: ../src/ui/dialog/inkscape-preferences.cpp:1071
msgid "Transform patterns"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1063
+#: ../src/ui/dialog/inkscape-preferences.cpp:1072
msgid "Optimized"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1064
+#: ../src/ui/dialog/inkscape-preferences.cpp:1073
msgid "Preserved"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1067
+#: ../src/ui/dialog/inkscape-preferences.cpp:1076
#: ../src/widgets/select-toolbar.cpp:562
msgid "When scaling objects, scale the stroke width by the same proportion"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1069
+#: ../src/ui/dialog/inkscape-preferences.cpp:1078
#: ../src/widgets/select-toolbar.cpp:573
msgid "When scaling rectangles, scale the radii of rounded corners"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1071
+#: ../src/ui/dialog/inkscape-preferences.cpp:1080
#: ../src/widgets/select-toolbar.cpp:584
msgid "Move gradients (in fill or stroke) along with the objects"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1073
+#: ../src/ui/dialog/inkscape-preferences.cpp:1082
#: ../src/widgets/select-toolbar.cpp:595
msgid "Move patterns (in fill or stroke) along with the objects"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1074
+#: ../src/ui/dialog/inkscape-preferences.cpp:1083
msgid "Store transformation"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1076
+#: ../src/ui/dialog/inkscape-preferences.cpp:1085
msgid ""
"If possible, apply transformation to objects without adding a transform= "
"attribute"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1078
+#: ../src/ui/dialog/inkscape-preferences.cpp:1087
msgid "Always store transformation as a transform= attribute on objects"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1080
+#: ../src/ui/dialog/inkscape-preferences.cpp:1089
msgid "Transforms"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1084
+#: ../src/ui/dialog/inkscape-preferences.cpp:1093
msgid "Mouse wheel scrolls by:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1085
+#: ../src/ui/dialog/inkscape-preferences.cpp:1094
msgid ""
"One mouse wheel notch scrolls by this distance in screen pixels "
"(horizontally with Shift)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1086
+#: ../src/ui/dialog/inkscape-preferences.cpp:1095
msgid "Ctrl+arrows"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1088
+#: ../src/ui/dialog/inkscape-preferences.cpp:1097
msgid "Scroll by:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1089
+#: ../src/ui/dialog/inkscape-preferences.cpp:1098
msgid "Pressing Ctrl+arrow key scrolls by this distance (in screen pixels)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1091
+#: ../src/ui/dialog/inkscape-preferences.cpp:1100
msgid "Acceleration:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1092
+#: ../src/ui/dialog/inkscape-preferences.cpp:1101
msgid ""
"Pressing and holding Ctrl+arrow will gradually speed up scrolling (0 for no "
"acceleration)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1093
+#: ../src/ui/dialog/inkscape-preferences.cpp:1102
msgid "Autoscrolling"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1095
+#: ../src/ui/dialog/inkscape-preferences.cpp:1104
msgid "Speed:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1096
+#: ../src/ui/dialog/inkscape-preferences.cpp:1105
msgid ""
"How fast the canvas autoscrolls when you drag beyond canvas edge (0 to turn "
"autoscroll off)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1099
+#: ../src/ui/dialog/inkscape-preferences.cpp:1108
msgid ""
"How far (in screen pixels) you need to be from the canvas edge to trigger "
"autoscroll; positive is outside the canvas, negative is within the canvas"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1100
+#: ../src/ui/dialog/inkscape-preferences.cpp:1109
msgid "Left mouse button pans when Space is pressed"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1102
+#: ../src/ui/dialog/inkscape-preferences.cpp:1111
msgid ""
"When on, pressing and holding Space and dragging with left mouse button pans "
"canvas (as in Adobe Illustrator); when off, Space temporarily switches to "
"Selector tool (default)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1103
+#: ../src/ui/dialog/inkscape-preferences.cpp:1112
msgid "Mouse wheel zooms by default"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1105
+#: ../src/ui/dialog/inkscape-preferences.cpp:1114
msgid ""
"When on, mouse wheel zooms without Ctrl and scrolls canvas with Ctrl; when "
"off, it zooms with Ctrl and scrolls without Ctrl"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1106
+#: ../src/ui/dialog/inkscape-preferences.cpp:1115
msgid "Scrolling"
msgstr ""
#. Snapping options
-#: ../src/ui/dialog/inkscape-preferences.cpp:1109
+#: ../src/ui/dialog/inkscape-preferences.cpp:1118
msgid "Enable snap indicator"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1111
+#: ../src/ui/dialog/inkscape-preferences.cpp:1120
msgid "After snapping, a symbol is drawn at the point that has snapped"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1114
+#: ../src/ui/dialog/inkscape-preferences.cpp:1123
msgid "Delay (in ms):"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1115
+#: ../src/ui/dialog/inkscape-preferences.cpp:1124
msgid ""
"Postpone snapping as long as the mouse is moving, and then wait an "
"additional fraction of a second. This additional delay is specified here. "
"When set to zero or to a very small number, snapping will be immediate."
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1117
+#: ../src/ui/dialog/inkscape-preferences.cpp:1126
msgid "Only snap the node closest to the pointer"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1119
+#: ../src/ui/dialog/inkscape-preferences.cpp:1128
msgid ""
"Only try to snap the node that is initially closest to the mouse pointer"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1122
+#: ../src/ui/dialog/inkscape-preferences.cpp:1131
msgid "Weight factor:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1123
+#: ../src/ui/dialog/inkscape-preferences.cpp:1132
msgid ""
"When multiple snap solutions are found, then Inkscape can either prefer the "
"closest transformation (when set to 0), or prefer the node that was "
"initially the closest to the pointer (when set to 1)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1125
+#: ../src/ui/dialog/inkscape-preferences.cpp:1134
msgid "Snap the mouse pointer when dragging a constrained knot"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1127
+#: ../src/ui/dialog/inkscape-preferences.cpp:1136
msgid ""
"When dragging a knot along a constraint line, then snap the position of the "
"mouse pointer instead of snapping the projection of the knot onto the "
"constraint line"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1129
+#: ../src/ui/dialog/inkscape-preferences.cpp:1138
msgid "Snapping"
msgstr ""
#. nudgedistance is limited to 1000 in select-context.cpp: use the same limit here
-#: ../src/ui/dialog/inkscape-preferences.cpp:1134
+#: ../src/ui/dialog/inkscape-preferences.cpp:1143
msgid "Arrow keys move by:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1135
+#: ../src/ui/dialog/inkscape-preferences.cpp:1144
msgid ""
"Pressing an arrow key moves selected object(s) or node(s) by this distance"
msgstr ""
#. defaultscale is limited to 1000 in select-context.cpp: use the same limit here
-#: ../src/ui/dialog/inkscape-preferences.cpp:1138
+#: ../src/ui/dialog/inkscape-preferences.cpp:1147
msgid "> and < scale by:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1139
+#: ../src/ui/dialog/inkscape-preferences.cpp:1148
msgid "Pressing > or < scales selection up or down by this increment"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1141
+#: ../src/ui/dialog/inkscape-preferences.cpp:1150
msgid "Inset/Outset by:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1142
+#: ../src/ui/dialog/inkscape-preferences.cpp:1151
msgid "Inset and Outset commands displace the path by this distance"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1143
+#: ../src/ui/dialog/inkscape-preferences.cpp:1152
msgid "Compass-like display of angles"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1145
+#: ../src/ui/dialog/inkscape-preferences.cpp:1154
msgid ""
"When on, angles are displayed with 0 at north, 0 to 360 range, positive "
"clockwise; otherwise with 0 at east, -180 to 180 range, positive "
"counterclockwise"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
+#: ../src/ui/dialog/inkscape-preferences.cpp:1160
msgid "Rotation snaps every:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
+#: ../src/ui/dialog/inkscape-preferences.cpp:1160
msgid "degrees"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1152
+#: ../src/ui/dialog/inkscape-preferences.cpp:1161
msgid ""
"Rotating with Ctrl pressed snaps every that much degrees; also, pressing "
"[ or ] rotates by this amount"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1153
+#: ../src/ui/dialog/inkscape-preferences.cpp:1162
msgid "Relative snapping of guideline angles"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1155
+#: ../src/ui/dialog/inkscape-preferences.cpp:1164
msgid ""
"When on, the snap angles when rotating a guideline will be relative to the "
"original angle"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1157
+#: ../src/ui/dialog/inkscape-preferences.cpp:1166
msgid "Zoom in/out by:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1158
+#: ../src/ui/dialog/inkscape-preferences.cpp:1167
msgid ""
"Zoom tool click, +/- keys, and middle click zoom in and out by this "
"multiplier"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1159
+#: ../src/ui/dialog/inkscape-preferences.cpp:1168
msgid "Steps"
msgstr ""
#. Clones options
-#: ../src/ui/dialog/inkscape-preferences.cpp:1162
+#: ../src/ui/dialog/inkscape-preferences.cpp:1171
msgid "Move in parallel"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1164
+#: ../src/ui/dialog/inkscape-preferences.cpp:1173
msgid "Stay unmoved"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1166
+#: ../src/ui/dialog/inkscape-preferences.cpp:1175
msgid "Move according to transform"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1168
+#: ../src/ui/dialog/inkscape-preferences.cpp:1177
msgid "Are unlinked"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1170
+#: ../src/ui/dialog/inkscape-preferences.cpp:1179
msgid "Are deleted"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1173
+#: ../src/ui/dialog/inkscape-preferences.cpp:1182
msgid "Moving original: clones and linked offsets"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1175
+#: ../src/ui/dialog/inkscape-preferences.cpp:1184
msgid "Clones are translated by the same vector as their original"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1177
+#: ../src/ui/dialog/inkscape-preferences.cpp:1186
msgid "Clones preserve their positions when their original is moved"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1179
+#: ../src/ui/dialog/inkscape-preferences.cpp:1188
msgid ""
"Each clone moves according to the value of its transform= attribute; for "
"example, a rotated clone will move in a different direction than its original"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1180
+#: ../src/ui/dialog/inkscape-preferences.cpp:1189
msgid "Deleting original: clones"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1182
+#: ../src/ui/dialog/inkscape-preferences.cpp:1191
msgid "Orphaned clones are converted to regular objects"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1184
+#: ../src/ui/dialog/inkscape-preferences.cpp:1193
msgid "Orphaned clones are deleted along with their original"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1186
+#: ../src/ui/dialog/inkscape-preferences.cpp:1195
msgid "Duplicating original+clones/linked offset"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1188
+#: ../src/ui/dialog/inkscape-preferences.cpp:1197
msgid "Relink duplicated clones"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1190
+#: ../src/ui/dialog/inkscape-preferences.cpp:1199
msgid ""
"When duplicating a selection containing both a clone and its original "
"(possibly in groups), relink the duplicated clone to the duplicated original "
@@ -17600,97 +17816,97 @@ msgid ""
msgstr ""
#. TRANSLATORS: Heading for the Inkscape Preferences "Clones" Page
-#: ../src/ui/dialog/inkscape-preferences.cpp:1193
+#: ../src/ui/dialog/inkscape-preferences.cpp:1202
msgid "Clones"
msgstr ""
#. Clip paths and masks options
-#: ../src/ui/dialog/inkscape-preferences.cpp:1196
+#: ../src/ui/dialog/inkscape-preferences.cpp:1205
msgid "When applying, use the topmost selected object as clippath/mask"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1198
+#: ../src/ui/dialog/inkscape-preferences.cpp:1207
msgid ""
"Uncheck this to use the bottom selected object as the clipping path or mask"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1199
+#: ../src/ui/dialog/inkscape-preferences.cpp:1208
msgid "Remove clippath/mask object after applying"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1201
+#: ../src/ui/dialog/inkscape-preferences.cpp:1210
msgid ""
"After applying, remove the object used as the clipping path or mask from the "
"drawing"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1203
+#: ../src/ui/dialog/inkscape-preferences.cpp:1212
msgid "Before applying"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1205
+#: ../src/ui/dialog/inkscape-preferences.cpp:1214
msgid "Do not group clipped/masked objects"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1206
+#: ../src/ui/dialog/inkscape-preferences.cpp:1215
msgid "Enclose every clipped/masked object in its own group"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1207
+#: ../src/ui/dialog/inkscape-preferences.cpp:1216
msgid "Put all clipped/masked objects into one group"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1210
+#: ../src/ui/dialog/inkscape-preferences.cpp:1219
msgid "Apply clippath/mask to every object"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1213
+#: ../src/ui/dialog/inkscape-preferences.cpp:1222
msgid "Apply clippath/mask to groups containing single object"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1216
+#: ../src/ui/dialog/inkscape-preferences.cpp:1225
msgid "Apply clippath/mask to group containing all objects"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1218
+#: ../src/ui/dialog/inkscape-preferences.cpp:1227
msgid "After releasing"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1220
+#: ../src/ui/dialog/inkscape-preferences.cpp:1229
msgid "Ungroup automatically created groups"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1222
+#: ../src/ui/dialog/inkscape-preferences.cpp:1231
msgid "Ungroup groups created when setting clip/mask"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1224
+#: ../src/ui/dialog/inkscape-preferences.cpp:1233
msgid "Clippaths and masks"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1232
+#: ../src/ui/dialog/inkscape-preferences.cpp:1241
msgid "Number of Threads:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1232
-#: ../src/ui/dialog/inkscape-preferences.cpp:1410
+#: ../src/ui/dialog/inkscape-preferences.cpp:1241
+#: ../src/ui/dialog/inkscape-preferences.cpp:1418
msgid "(requires restart)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1233
+#: ../src/ui/dialog/inkscape-preferences.cpp:1242
msgid "Configure number of processors/threads to use when rendering filters"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1237
+#: ../src/ui/dialog/inkscape-preferences.cpp:1246
msgid "Rendering cache size:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1237
+#: ../src/ui/dialog/inkscape-preferences.cpp:1246
msgctxt "mebibyte (2^20 bytes) abbreviation"
msgid "MiB"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1237
+#: ../src/ui/dialog/inkscape-preferences.cpp:1246
msgid ""
"Set the amount of memory per document which can be used to store rendered "
"parts of the drawing for later reuse; set to zero to disable caching"
@@ -17698,281 +17914,281 @@ msgstr ""
#. blur quality
#. filter quality
-#: ../src/ui/dialog/inkscape-preferences.cpp:1240
-#: ../src/ui/dialog/inkscape-preferences.cpp:1264
+#: ../src/ui/dialog/inkscape-preferences.cpp:1249
+#: ../src/ui/dialog/inkscape-preferences.cpp:1273
msgid "Best quality (slowest)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1242
-#: ../src/ui/dialog/inkscape-preferences.cpp:1266
+#: ../src/ui/dialog/inkscape-preferences.cpp:1251
+#: ../src/ui/dialog/inkscape-preferences.cpp:1275
msgid "Better quality (slower)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1244
-#: ../src/ui/dialog/inkscape-preferences.cpp:1268
+#: ../src/ui/dialog/inkscape-preferences.cpp:1253
+#: ../src/ui/dialog/inkscape-preferences.cpp:1277
msgid "Average quality"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1246
-#: ../src/ui/dialog/inkscape-preferences.cpp:1270
+#: ../src/ui/dialog/inkscape-preferences.cpp:1255
+#: ../src/ui/dialog/inkscape-preferences.cpp:1279
msgid "Lower quality (faster)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1248
-#: ../src/ui/dialog/inkscape-preferences.cpp:1272
+#: ../src/ui/dialog/inkscape-preferences.cpp:1257
+#: ../src/ui/dialog/inkscape-preferences.cpp:1281
msgid "Lowest quality (fastest)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1251
+#: ../src/ui/dialog/inkscape-preferences.cpp:1260
msgid "Gaussian blur quality for display"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1253
-#: ../src/ui/dialog/inkscape-preferences.cpp:1277
+#: ../src/ui/dialog/inkscape-preferences.cpp:1262
+#: ../src/ui/dialog/inkscape-preferences.cpp:1286
msgid ""
"Best quality, but display may be very slow at high zooms (bitmap export "
"always uses best quality)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1255
-#: ../src/ui/dialog/inkscape-preferences.cpp:1279
+#: ../src/ui/dialog/inkscape-preferences.cpp:1264
+#: ../src/ui/dialog/inkscape-preferences.cpp:1288
msgid "Better quality, but slower display"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1257
-#: ../src/ui/dialog/inkscape-preferences.cpp:1281
+#: ../src/ui/dialog/inkscape-preferences.cpp:1266
+#: ../src/ui/dialog/inkscape-preferences.cpp:1290
msgid "Average quality, acceptable display speed"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1259
-#: ../src/ui/dialog/inkscape-preferences.cpp:1283
+#: ../src/ui/dialog/inkscape-preferences.cpp:1268
+#: ../src/ui/dialog/inkscape-preferences.cpp:1292
msgid "Lower quality (some artifacts), but display is faster"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1261
-#: ../src/ui/dialog/inkscape-preferences.cpp:1285
+#: ../src/ui/dialog/inkscape-preferences.cpp:1270
+#: ../src/ui/dialog/inkscape-preferences.cpp:1294
msgid "Lowest quality (considerable artifacts), but display is fastest"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1275
+#: ../src/ui/dialog/inkscape-preferences.cpp:1284
msgid "Filter effects quality for display"
msgstr ""
#. build custom preferences tab
-#: ../src/ui/dialog/inkscape-preferences.cpp:1287
+#: ../src/ui/dialog/inkscape-preferences.cpp:1296
#: ../src/ui/dialog/print.cpp:224
msgid "Rendering"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1293
+#: ../src/ui/dialog/inkscape-preferences.cpp:1302
msgid "2x2"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1293
+#: ../src/ui/dialog/inkscape-preferences.cpp:1302
msgid "4x4"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1293
+#: ../src/ui/dialog/inkscape-preferences.cpp:1302
msgid "8x8"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1293
+#: ../src/ui/dialog/inkscape-preferences.cpp:1302
msgid "16x16"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1297
+#: ../src/ui/dialog/inkscape-preferences.cpp:1306
msgid "Oversample bitmaps:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1300
+#: ../src/ui/dialog/inkscape-preferences.cpp:1309
msgid "Automatically reload bitmaps"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1302
+#: ../src/ui/dialog/inkscape-preferences.cpp:1311
msgid "Automatically reload linked images when file is changed on disk"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1304
+#: ../src/ui/dialog/inkscape-preferences.cpp:1313
msgid "Bitmap editor:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1306
+#: ../src/ui/dialog/inkscape-preferences.cpp:1315
msgid "Default export resolution:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1307
+#: ../src/ui/dialog/inkscape-preferences.cpp:1316
msgid "Default bitmap resolution (in dots per inch) in the Export dialog"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1309
+#: ../src/ui/dialog/inkscape-preferences.cpp:1318
msgid "Resolution for Create Bitmap Copy:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1310
+#: ../src/ui/dialog/inkscape-preferences.cpp:1319
msgid "Resolution used by the Create Bitmap Copy command"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1312
+#: ../src/ui/dialog/inkscape-preferences.cpp:1321
msgid "Always embed"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1312
+#: ../src/ui/dialog/inkscape-preferences.cpp:1321
msgid "Always link"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1312
+#: ../src/ui/dialog/inkscape-preferences.cpp:1321
msgid "Ask"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1315
+#: ../src/ui/dialog/inkscape-preferences.cpp:1324
msgid "Bitmap import:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1319
+#: ../src/ui/dialog/inkscape-preferences.cpp:1327
msgid "Bitmaps"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1372
+#: ../src/ui/dialog/inkscape-preferences.cpp:1380
msgid "Set the main spell check language"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1375
+#: ../src/ui/dialog/inkscape-preferences.cpp:1383
msgid "Second language:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1376
+#: ../src/ui/dialog/inkscape-preferences.cpp:1384
msgid ""
"Set the second spell check language; checking will only stop on words "
"unknown in ALL chosen languages"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1379
+#: ../src/ui/dialog/inkscape-preferences.cpp:1387
msgid "Third language:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1380
+#: ../src/ui/dialog/inkscape-preferences.cpp:1388
msgid ""
"Set the third spell check language; checking will only stop on words unknown "
"in ALL chosen languages"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1382
+#: ../src/ui/dialog/inkscape-preferences.cpp:1390
msgid "Ignore words with digits"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1384
+#: ../src/ui/dialog/inkscape-preferences.cpp:1392
msgid "Ignore words containing digits, such as \"R2D2\""
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1386
+#: ../src/ui/dialog/inkscape-preferences.cpp:1394
msgid "Ignore words in ALL CAPITALS"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1388
+#: ../src/ui/dialog/inkscape-preferences.cpp:1396
msgid "Ignore words in all capitals, such as \"IUPAC\""
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1390
+#: ../src/ui/dialog/inkscape-preferences.cpp:1398
msgid "Spellcheck"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1410
+#: ../src/ui/dialog/inkscape-preferences.cpp:1418
msgid "Latency skew:"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1411
+#: ../src/ui/dialog/inkscape-preferences.cpp:1419
msgid ""
"Factor by which the event clock is skewed from the actual time (0.9766 on "
"some systems)"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1413
+#: ../src/ui/dialog/inkscape-preferences.cpp:1421
msgid "Pre-render named icons"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1415
+#: ../src/ui/dialog/inkscape-preferences.cpp:1423
msgid ""
"When on, named icons will be rendered before displaying the ui. This is for "
"working around bugs in GTK+ named icon notification"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1423
+#: ../src/ui/dialog/inkscape-preferences.cpp:1431
msgid "System info"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1427
+#: ../src/ui/dialog/inkscape-preferences.cpp:1435
msgid "User config: "
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1427
+#: ../src/ui/dialog/inkscape-preferences.cpp:1435
msgid "Location of users configuration"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1431
+#: ../src/ui/dialog/inkscape-preferences.cpp:1439
msgid "User preferences: "
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1431
+#: ../src/ui/dialog/inkscape-preferences.cpp:1439
msgid "Location of the users preferences file"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1435
+#: ../src/ui/dialog/inkscape-preferences.cpp:1443
msgid "User extensions: "
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1435
+#: ../src/ui/dialog/inkscape-preferences.cpp:1443
msgid "Location of the users extensions"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1439
+#: ../src/ui/dialog/inkscape-preferences.cpp:1447
msgid "User cache: "
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1439
+#: ../src/ui/dialog/inkscape-preferences.cpp:1447
msgid "Location of users cache"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1447
+#: ../src/ui/dialog/inkscape-preferences.cpp:1455
msgid "Temporary files: "
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1447
+#: ../src/ui/dialog/inkscape-preferences.cpp:1455
msgid "Location of the temporary files used for autosave"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1451
+#: ../src/ui/dialog/inkscape-preferences.cpp:1459
msgid "Inkscape data: "
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1451
+#: ../src/ui/dialog/inkscape-preferences.cpp:1459
msgid "Location of Inkscape data"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1455
+#: ../src/ui/dialog/inkscape-preferences.cpp:1463
msgid "Inkscape extensions: "
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1455
+#: ../src/ui/dialog/inkscape-preferences.cpp:1463
msgid "Location of the Inkscape extensions"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1464
+#: ../src/ui/dialog/inkscape-preferences.cpp:1472
msgid "System data: "
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1464
+#: ../src/ui/dialog/inkscape-preferences.cpp:1472
msgid "Locations of system data"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1488
+#: ../src/ui/dialog/inkscape-preferences.cpp:1496
msgid "Icon theme: "
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1488
+#: ../src/ui/dialog/inkscape-preferences.cpp:1496
msgid "Location of icon themes"
msgstr ""
-#: ../src/ui/dialog/inkscape-preferences.cpp:1490
+#: ../src/ui/dialog/inkscape-preferences.cpp:1498
#: ../src/widgets/sp-color-gtkselector.cpp:50
msgid "System"
msgstr ""
@@ -18030,7 +18246,7 @@ msgstr ""
msgid "_Use pressure-sensitive tablet (requires restart)"
msgstr ""
-#: ../src/ui/dialog/input.cpp:888 ../src/verbs.cpp:2192
+#: ../src/ui/dialog/input.cpp:888 ../src/verbs.cpp:2191
msgid "_Save"
msgstr ""
@@ -18073,7 +18289,7 @@ msgid "Rename layer"
msgstr ""
#. TRANSLATORS: This means "The layer has been renamed"
-#: ../src/ui/dialog/layer-properties.cpp:199
+#: ../src/ui/dialog/layer-properties.cpp:199 ../src/ui/dialog/layers.cpp:533
msgid "Renamed layer"
msgstr ""
@@ -18105,32 +18321,32 @@ msgstr ""
msgid "Unlock layer"
msgstr ""
-#: ../src/ui/dialog/layers.cpp:648
+#: ../src/ui/dialog/layers.cpp:650
msgctxt "Layers"
msgid "New"
msgstr ""
-#: ../src/ui/dialog/layers.cpp:654
+#: ../src/ui/dialog/layers.cpp:656
msgctxt "Layers"
msgid "Top"
msgstr ""
-#: ../src/ui/dialog/layers.cpp:660
+#: ../src/ui/dialog/layers.cpp:662
msgctxt "Layers"
msgid "Up"
msgstr ""
-#: ../src/ui/dialog/layers.cpp:666
+#: ../src/ui/dialog/layers.cpp:668
msgctxt "Layers"
msgid "Dn"
msgstr ""
-#: ../src/ui/dialog/layers.cpp:672
+#: ../src/ui/dialog/layers.cpp:674
msgctxt "Layers"
msgid "Bot"
msgstr ""
-#: ../src/ui/dialog/layers.cpp:682
+#: ../src/ui/dialog/layers.cpp:684
msgid "X"
msgstr ""
@@ -18292,8 +18508,8 @@ msgstr ""
msgid "L_ock"
msgstr ""
-#: ../src/ui/dialog/object-properties.cpp:50 ../src/verbs.cpp:2433
-#: ../src/verbs.cpp:2439
+#: ../src/ui/dialog/object-properties.cpp:50 ../src/verbs.cpp:2432
+#: ../src/verbs.cpp:2438
msgid "_Set"
msgstr ""
@@ -18372,57 +18588,57 @@ msgstr ""
msgid "Clipart found"
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:675
+#: ../src/ui/dialog/ocaldialogs.cpp:673
msgid "Downloading image..."
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:824
+#: ../src/ui/dialog/ocaldialogs.cpp:821
msgid "Could not download image"
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:834
+#: ../src/ui/dialog/ocaldialogs.cpp:831
msgid "Clipart downloaded successfully"
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:848
+#: ../src/ui/dialog/ocaldialogs.cpp:845
msgid "Could not download thumbnail file"
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:925
+#: ../src/ui/dialog/ocaldialogs.cpp:922
msgid "No description"
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:993
+#: ../src/ui/dialog/ocaldialogs.cpp:990
msgid "Searching clipart..."
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:1029
+#: ../src/ui/dialog/ocaldialogs.cpp:1026
msgid "Could not connect to the Open Clip Art Library"
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:1048
+#: ../src/ui/dialog/ocaldialogs.cpp:1045
msgid "Could not parse search results"
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:1084
+#: ../src/ui/dialog/ocaldialogs.cpp:1081
msgid "No clipart named"
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:1084
+#: ../src/ui/dialog/ocaldialogs.cpp:1081
msgid "was found."
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:1085
+#: ../src/ui/dialog/ocaldialogs.cpp:1082
msgid ""
"Please make sure all keywords are spelled correctly, or try again with "
"different keywords."
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:1113
+#: ../src/ui/dialog/ocaldialogs.cpp:1110
msgid "Search"
msgstr ""
-#: ../src/ui/dialog/ocaldialogs.cpp:1119
+#: ../src/ui/dialog/ocaldialogs.cpp:1116
msgid "Close"
msgstr ""
@@ -18548,7 +18764,7 @@ msgid "From selection..."
msgstr ""
#: ../src/ui/dialog/svg-fonts-dialog.cpp:701
-#: ../src/ui/widget/preferences-widget.cpp:654
+#: ../src/ui/widget/preferences-widget.cpp:658
msgid "Reset"
msgstr ""
@@ -18646,7 +18862,7 @@ msgid "Set stroke"
msgstr ""
#: ../src/ui/dialog/swatches.cpp:281 ../src/widgets/gradient-selector.cpp:146
-#: ../src/widgets/gradient-toolbar.cpp:483
+#: ../src/widgets/gradient-toolbar.cpp:486
msgid "Edit..."
msgstr ""
@@ -19577,7 +19793,6 @@ msgid "<b>Rotation center</b>: drag to change the origin of transforms"
msgstr ""
#: ../src/ui/widget/filter-effect-chooser.cpp:27
-#: ../src/ui/widget/filter-effect-chooser.cpp:29
msgid "_Blur:"
msgstr ""
@@ -19605,15 +19820,11 @@ msgstr ""
msgid "MetadataLicence|Other"
msgstr ""
-#: ../src/ui/widget/object-composite-settings.cpp:66
-msgid "_Opacity (%):"
-msgstr ""
-
-#: ../src/ui/widget/object-composite-settings.cpp:176
+#: ../src/ui/widget/object-composite-settings.cpp:187
msgid "Change blur"
msgstr ""
-#: ../src/ui/widget/object-composite-settings.cpp:216
+#: ../src/ui/widget/object-composite-settings.cpp:227
#: ../src/ui/widget/selected-style.cpp:863
#: ../src/ui/widget/selected-style.cpp:1157
msgid "Change opacity"
@@ -19772,7 +19983,7 @@ msgctxt "Swatches"
msgid "Wrap"
msgstr ""
-#: ../src/ui/widget/preferences-widget.cpp:788
+#: ../src/ui/widget/preferences-widget.cpp:792
msgid "Select a bitmap editor"
msgstr ""
@@ -19832,6 +20043,7 @@ msgstr ""
#: ../src/ui/widget/selected-style.cpp:165
#: ../src/ui/widget/selected-style.cpp:1032
#: ../src/ui/widget/selected-style.cpp:1033
+#: ../src/widgets/gradient-toolbar.cpp:215
msgid "Nothing selected"
msgstr ""
@@ -19852,7 +20064,6 @@ msgstr ""
#: ../src/ui/widget/selected-style.cpp:175
#: ../src/ui/widget/style-swatch.cpp:284
-#: ../src/widgets/paint-selector.cpp:1019
msgid "Pattern fill"
msgstr ""
@@ -20312,1593 +20523,1593 @@ msgstr ""
#. TRANSLATORS: If you have translated the tutorial-basic.en.svgz file to your language,
#. then translate this string as "tutorial-basic.LANG.svgz" (where LANG is your language
#. code); otherwise leave as "tutorial-basic.svg".
-#: ../src/verbs.cpp:1940
+#: ../src/verbs.cpp:1939
msgid "tutorial-basic.svg"
msgstr ""
#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1944
+#: ../src/verbs.cpp:1943
msgid "tutorial-shapes.svg"
msgstr ""
#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1948
+#: ../src/verbs.cpp:1947
msgid "tutorial-advanced.svg"
msgstr ""
#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1952
+#: ../src/verbs.cpp:1951
msgid "tutorial-tracing.svg"
msgstr ""
#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1956
+#: ../src/verbs.cpp:1955
msgid "tutorial-calligraphy.svg"
msgstr ""
#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1960
+#: ../src/verbs.cpp:1959
msgid "tutorial-interpolate.svg"
msgstr ""
#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1964
+#: ../src/verbs.cpp:1963
msgid "tutorial-elements.svg"
msgstr ""
#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1968
+#: ../src/verbs.cpp:1967
msgid "tutorial-tips.svg"
msgstr ""
-#: ../src/verbs.cpp:2156 ../src/verbs.cpp:2704
+#: ../src/verbs.cpp:2155 ../src/verbs.cpp:2703
msgid "Unlock all objects in the current layer"
msgstr ""
-#: ../src/verbs.cpp:2160 ../src/verbs.cpp:2706
+#: ../src/verbs.cpp:2159 ../src/verbs.cpp:2705
msgid "Unlock all objects in all layers"
msgstr ""
-#: ../src/verbs.cpp:2164 ../src/verbs.cpp:2708
+#: ../src/verbs.cpp:2163 ../src/verbs.cpp:2707
msgid "Unhide all objects in the current layer"
msgstr ""
-#: ../src/verbs.cpp:2168 ../src/verbs.cpp:2710
+#: ../src/verbs.cpp:2167 ../src/verbs.cpp:2709
msgid "Unhide all objects in all layers"
msgstr ""
-#: ../src/verbs.cpp:2183
+#: ../src/verbs.cpp:2182
msgid "Does nothing"
msgstr ""
-#: ../src/verbs.cpp:2186
+#: ../src/verbs.cpp:2185
msgid "Create new document from the default template"
msgstr ""
-#: ../src/verbs.cpp:2188
+#: ../src/verbs.cpp:2187
msgid "_Open..."
msgstr ""
-#: ../src/verbs.cpp:2189
+#: ../src/verbs.cpp:2188
msgid "Open an existing document"
msgstr ""
-#: ../src/verbs.cpp:2190
+#: ../src/verbs.cpp:2189
msgid "Re_vert"
msgstr ""
-#: ../src/verbs.cpp:2191
+#: ../src/verbs.cpp:2190
msgid "Revert to the last saved version of document (changes will be lost)"
msgstr ""
-#: ../src/verbs.cpp:2192
+#: ../src/verbs.cpp:2191
msgid "Save document"
msgstr ""
-#: ../src/verbs.cpp:2194
+#: ../src/verbs.cpp:2193
msgid "Save _As..."
msgstr ""
-#: ../src/verbs.cpp:2195
+#: ../src/verbs.cpp:2194
msgid "Save document under a new name"
msgstr ""
-#: ../src/verbs.cpp:2196
+#: ../src/verbs.cpp:2195
msgid "Save a Cop_y..."
msgstr ""
-#: ../src/verbs.cpp:2197
+#: ../src/verbs.cpp:2196
msgid "Save a copy of the document under a new name"
msgstr ""
-#: ../src/verbs.cpp:2198
+#: ../src/verbs.cpp:2197
msgid "_Print..."
msgstr ""
-#: ../src/verbs.cpp:2198
+#: ../src/verbs.cpp:2197
msgid "Print document"
msgstr ""
#. TRANSLATORS: "Vacuum Defs" means "Clean up defs" (so as to remove unused definitions)
-#: ../src/verbs.cpp:2201
+#: ../src/verbs.cpp:2200
msgid "Vac_uum Defs"
msgstr ""
-#: ../src/verbs.cpp:2201
+#: ../src/verbs.cpp:2200
msgid ""
"Remove unused definitions (such as gradients or clipping paths) from the &lt;"
"defs&gt; of the document"
msgstr ""
-#: ../src/verbs.cpp:2203
+#: ../src/verbs.cpp:2202
msgid "_Import..."
msgstr ""
-#: ../src/verbs.cpp:2204
+#: ../src/verbs.cpp:2203
msgid "Import a bitmap or SVG image into this document"
msgstr ""
-#: ../src/verbs.cpp:2205 ../src/verbs.cpp:2657
+#: ../src/verbs.cpp:2204 ../src/verbs.cpp:2656
msgid "_Export Bitmap..."
msgstr ""
-#: ../src/verbs.cpp:2206 ../src/verbs.cpp:2658
+#: ../src/verbs.cpp:2205 ../src/verbs.cpp:2657
msgid "Export this document or a selection as a bitmap image"
msgstr ""
-#: ../src/verbs.cpp:2207
+#: ../src/verbs.cpp:2206
msgid "Import Clip Art..."
msgstr ""
-#: ../src/verbs.cpp:2208
+#: ../src/verbs.cpp:2207
msgid "Import clipart from Open Clip Art Library"
msgstr ""
#. new FileVerb(SP_VERB_FILE_EXPORT_TO_OCAL, "FileExportToOCAL", N_("Export To Open Clip Art Library"), N_("Export this document to Open Clip Art Library"), INKSCAPE_ICON_DOCUMENT_EXPORT_OCAL),
-#: ../src/verbs.cpp:2210
+#: ../src/verbs.cpp:2209
msgid "N_ext Window"
msgstr ""
-#: ../src/verbs.cpp:2211
+#: ../src/verbs.cpp:2210
msgid "Switch to the next document window"
msgstr ""
-#: ../src/verbs.cpp:2212
+#: ../src/verbs.cpp:2211
msgid "P_revious Window"
msgstr ""
-#: ../src/verbs.cpp:2213
+#: ../src/verbs.cpp:2212
msgid "Switch to the previous document window"
msgstr ""
-#: ../src/verbs.cpp:2214
+#: ../src/verbs.cpp:2213
msgid "_Close"
msgstr ""
-#: ../src/verbs.cpp:2215
+#: ../src/verbs.cpp:2214
msgid "Close this document window"
msgstr ""
-#: ../src/verbs.cpp:2216
+#: ../src/verbs.cpp:2215
msgid "_Quit"
msgstr ""
-#: ../src/verbs.cpp:2216
+#: ../src/verbs.cpp:2215
msgid "Quit Inkscape"
msgstr ""
-#: ../src/verbs.cpp:2219
+#: ../src/verbs.cpp:2218
msgid "Undo last action"
msgstr ""
-#: ../src/verbs.cpp:2222
+#: ../src/verbs.cpp:2221
msgid "Do again the last undone action"
msgstr ""
-#: ../src/verbs.cpp:2223
+#: ../src/verbs.cpp:2222
msgid "Cu_t"
msgstr ""
-#: ../src/verbs.cpp:2224
+#: ../src/verbs.cpp:2223
msgid "Cut selection to clipboard"
msgstr ""
-#: ../src/verbs.cpp:2225
+#: ../src/verbs.cpp:2224
msgid "_Copy"
msgstr ""
-#: ../src/verbs.cpp:2226
+#: ../src/verbs.cpp:2225
msgid "Copy selection to clipboard"
msgstr ""
-#: ../src/verbs.cpp:2227
+#: ../src/verbs.cpp:2226
msgid "_Paste"
msgstr ""
-#: ../src/verbs.cpp:2228
+#: ../src/verbs.cpp:2227
msgid "Paste objects from clipboard to mouse point, or paste text"
msgstr ""
-#: ../src/verbs.cpp:2229
+#: ../src/verbs.cpp:2228
msgid "Paste _Style"
msgstr ""
-#: ../src/verbs.cpp:2230
+#: ../src/verbs.cpp:2229
msgid "Apply the style of the copied object to selection"
msgstr ""
-#: ../src/verbs.cpp:2232
+#: ../src/verbs.cpp:2231
msgid "Scale selection to match the size of the copied object"
msgstr ""
-#: ../src/verbs.cpp:2233
+#: ../src/verbs.cpp:2232
msgid "Paste _Width"
msgstr ""
-#: ../src/verbs.cpp:2234
+#: ../src/verbs.cpp:2233
msgid "Scale selection horizontally to match the width of the copied object"
msgstr ""
-#: ../src/verbs.cpp:2235
+#: ../src/verbs.cpp:2234
msgid "Paste _Height"
msgstr ""
-#: ../src/verbs.cpp:2236
+#: ../src/verbs.cpp:2235
msgid "Scale selection vertically to match the height of the copied object"
msgstr ""
-#: ../src/verbs.cpp:2237
+#: ../src/verbs.cpp:2236
msgid "Paste Size Separately"
msgstr ""
-#: ../src/verbs.cpp:2238
+#: ../src/verbs.cpp:2237
msgid "Scale each selected object to match the size of the copied object"
msgstr ""
-#: ../src/verbs.cpp:2239
+#: ../src/verbs.cpp:2238
msgid "Paste Width Separately"
msgstr ""
-#: ../src/verbs.cpp:2240
+#: ../src/verbs.cpp:2239
msgid ""
"Scale each selected object horizontally to match the width of the copied "
"object"
msgstr ""
-#: ../src/verbs.cpp:2241
+#: ../src/verbs.cpp:2240
msgid "Paste Height Separately"
msgstr ""
-#: ../src/verbs.cpp:2242
+#: ../src/verbs.cpp:2241
msgid ""
"Scale each selected object vertically to match the height of the copied "
"object"
msgstr ""
-#: ../src/verbs.cpp:2243
+#: ../src/verbs.cpp:2242
msgid "Paste _In Place"
msgstr ""
-#: ../src/verbs.cpp:2244
+#: ../src/verbs.cpp:2243
msgid "Paste objects from clipboard to the original location"
msgstr ""
-#: ../src/verbs.cpp:2245
+#: ../src/verbs.cpp:2244
msgid "Paste Path _Effect"
msgstr ""
-#: ../src/verbs.cpp:2246
+#: ../src/verbs.cpp:2245
msgid "Apply the path effect of the copied object to selection"
msgstr ""
-#: ../src/verbs.cpp:2247
+#: ../src/verbs.cpp:2246
msgid "Remove Path _Effect"
msgstr ""
-#: ../src/verbs.cpp:2248
+#: ../src/verbs.cpp:2247
msgid "Remove any path effects from selected objects"
msgstr ""
-#: ../src/verbs.cpp:2249
+#: ../src/verbs.cpp:2248
msgid "_Remove Filters"
msgstr ""
-#: ../src/verbs.cpp:2250
+#: ../src/verbs.cpp:2249
msgid "Remove any filters from selected objects"
msgstr ""
-#: ../src/verbs.cpp:2251
+#: ../src/verbs.cpp:2250
msgid "_Delete"
msgstr ""
-#: ../src/verbs.cpp:2252
+#: ../src/verbs.cpp:2251
msgid "Delete selection"
msgstr ""
-#: ../src/verbs.cpp:2253
+#: ../src/verbs.cpp:2252
msgid "Duplic_ate"
msgstr ""
-#: ../src/verbs.cpp:2254
+#: ../src/verbs.cpp:2253
msgid "Duplicate selected objects"
msgstr ""
-#: ../src/verbs.cpp:2255
+#: ../src/verbs.cpp:2254
msgid "Create Clo_ne"
msgstr ""
-#: ../src/verbs.cpp:2256
+#: ../src/verbs.cpp:2255
msgid "Create a clone (a copy linked to the original) of selected object"
msgstr ""
-#: ../src/verbs.cpp:2257
+#: ../src/verbs.cpp:2256
msgid "Unlin_k Clone"
msgstr ""
-#: ../src/verbs.cpp:2258
+#: ../src/verbs.cpp:2257
msgid ""
"Cut the selected clones' links to the originals, turning them into "
"standalone objects"
msgstr ""
-#: ../src/verbs.cpp:2259
+#: ../src/verbs.cpp:2258
msgid "Relink to Copied"
msgstr ""
-#: ../src/verbs.cpp:2260
+#: ../src/verbs.cpp:2259
msgid "Relink the selected clones to the object currently on the clipboard"
msgstr ""
-#: ../src/verbs.cpp:2261
+#: ../src/verbs.cpp:2260
msgid "Select _Original"
msgstr ""
-#: ../src/verbs.cpp:2262
+#: ../src/verbs.cpp:2261
msgid "Select the object to which the selected clone is linked"
msgstr ""
-#: ../src/verbs.cpp:2263
+#: ../src/verbs.cpp:2262
msgid "Clone original path (LPE)"
msgstr ""
-#: ../src/verbs.cpp:2264
+#: ../src/verbs.cpp:2263
msgid ""
"Creates a new path, applies the Clone original LPE, and refers it to the "
"selected path"
msgstr ""
-#: ../src/verbs.cpp:2265
+#: ../src/verbs.cpp:2264
msgid "Objects to _Marker"
msgstr ""
-#: ../src/verbs.cpp:2266
+#: ../src/verbs.cpp:2265
msgid "Convert selection to a line marker"
msgstr ""
-#: ../src/verbs.cpp:2267
+#: ../src/verbs.cpp:2266
msgid "Objects to Gu_ides"
msgstr ""
-#: ../src/verbs.cpp:2268
+#: ../src/verbs.cpp:2267
msgid ""
"Convert selected objects to a collection of guidelines aligned with their "
"edges"
msgstr ""
-#: ../src/verbs.cpp:2269
+#: ../src/verbs.cpp:2268
msgid "Objects to Patter_n"
msgstr ""
-#: ../src/verbs.cpp:2270
+#: ../src/verbs.cpp:2269
msgid "Convert selection to a rectangle with tiled pattern fill"
msgstr ""
-#: ../src/verbs.cpp:2271
+#: ../src/verbs.cpp:2270
msgid "Pattern to _Objects"
msgstr ""
-#: ../src/verbs.cpp:2272
+#: ../src/verbs.cpp:2271
msgid "Extract objects from a tiled pattern fill"
msgstr ""
-#: ../src/verbs.cpp:2273
+#: ../src/verbs.cpp:2272
msgid "Clea_r All"
msgstr ""
-#: ../src/verbs.cpp:2274
+#: ../src/verbs.cpp:2273
msgid "Delete all objects from document"
msgstr ""
-#: ../src/verbs.cpp:2275
+#: ../src/verbs.cpp:2274
msgid "Select Al_l"
msgstr ""
-#: ../src/verbs.cpp:2276
+#: ../src/verbs.cpp:2275
msgid "Select all objects or all nodes"
msgstr ""
-#: ../src/verbs.cpp:2277
+#: ../src/verbs.cpp:2276
msgid "Select All in All La_yers"
msgstr ""
-#: ../src/verbs.cpp:2278
+#: ../src/verbs.cpp:2277
msgid "Select all objects in all visible and unlocked layers"
msgstr ""
-#: ../src/verbs.cpp:2279
+#: ../src/verbs.cpp:2278
msgid "In_vert Selection"
msgstr ""
-#: ../src/verbs.cpp:2280
+#: ../src/verbs.cpp:2279
msgid "Invert selection (unselect what is selected and select everything else)"
msgstr ""
-#: ../src/verbs.cpp:2281
+#: ../src/verbs.cpp:2280
msgid "Invert in All Layers"
msgstr ""
-#: ../src/verbs.cpp:2282
+#: ../src/verbs.cpp:2281
msgid "Invert selection in all visible and unlocked layers"
msgstr ""
-#: ../src/verbs.cpp:2283
+#: ../src/verbs.cpp:2282
msgid "Select Next"
msgstr ""
-#: ../src/verbs.cpp:2284
+#: ../src/verbs.cpp:2283
msgid "Select next object or node"
msgstr ""
-#: ../src/verbs.cpp:2285
+#: ../src/verbs.cpp:2284
msgid "Select Previous"
msgstr ""
-#: ../src/verbs.cpp:2286
+#: ../src/verbs.cpp:2285
msgid "Select previous object or node"
msgstr ""
-#: ../src/verbs.cpp:2287
+#: ../src/verbs.cpp:2286
msgid "D_eselect"
msgstr ""
-#: ../src/verbs.cpp:2288
+#: ../src/verbs.cpp:2287
msgid "Deselect any selected objects or nodes"
msgstr ""
-#: ../src/verbs.cpp:2289
+#: ../src/verbs.cpp:2288
msgid "Create _Guides Around the Page"
msgstr ""
-#: ../src/verbs.cpp:2290 ../src/verbs.cpp:2292
+#: ../src/verbs.cpp:2289 ../src/verbs.cpp:2291
msgid "Create four guides aligned with the page borders"
msgstr ""
-#: ../src/verbs.cpp:2293
+#: ../src/verbs.cpp:2292
msgid "Next path effect parameter"
msgstr ""
-#: ../src/verbs.cpp:2294
+#: ../src/verbs.cpp:2293
msgid "Show next editable path effect parameter"
msgstr ""
#. Selection
-#: ../src/verbs.cpp:2297
+#: ../src/verbs.cpp:2296
msgid "Raise to _Top"
msgstr ""
-#: ../src/verbs.cpp:2298
+#: ../src/verbs.cpp:2297
msgid "Raise selection to top"
msgstr ""
-#: ../src/verbs.cpp:2299
+#: ../src/verbs.cpp:2298
msgid "Lower to _Bottom"
msgstr ""
-#: ../src/verbs.cpp:2300
+#: ../src/verbs.cpp:2299
msgid "Lower selection to bottom"
msgstr ""
-#: ../src/verbs.cpp:2301
+#: ../src/verbs.cpp:2300
msgid "_Raise"
msgstr ""
-#: ../src/verbs.cpp:2302
+#: ../src/verbs.cpp:2301
msgid "Raise selection one step"
msgstr ""
-#: ../src/verbs.cpp:2303
+#: ../src/verbs.cpp:2302
msgid "_Lower"
msgstr ""
-#: ../src/verbs.cpp:2304
+#: ../src/verbs.cpp:2303
msgid "Lower selection one step"
msgstr ""
-#: ../src/verbs.cpp:2305
+#: ../src/verbs.cpp:2304
msgid "_Group"
msgstr ""
-#: ../src/verbs.cpp:2306
+#: ../src/verbs.cpp:2305
msgid "Group selected objects"
msgstr ""
-#: ../src/verbs.cpp:2308
+#: ../src/verbs.cpp:2307
msgid "Ungroup selected groups"
msgstr ""
-#: ../src/verbs.cpp:2310
+#: ../src/verbs.cpp:2309
msgid "_Put on Path"
msgstr ""
-#: ../src/verbs.cpp:2312
+#: ../src/verbs.cpp:2311
msgid "_Remove from Path"
msgstr ""
-#: ../src/verbs.cpp:2314
+#: ../src/verbs.cpp:2313
msgid "Remove Manual _Kerns"
msgstr ""
#. TRANSLATORS: "glyph": An image used in the visual representation of characters;
#. roughly speaking, how a character looks. A font is a set of glyphs.
-#: ../src/verbs.cpp:2317
+#: ../src/verbs.cpp:2316
msgid "Remove all manual kerns and glyph rotations from a text object"
msgstr ""
-#: ../src/verbs.cpp:2319
+#: ../src/verbs.cpp:2318
msgid "_Union"
msgstr ""
-#: ../src/verbs.cpp:2320
+#: ../src/verbs.cpp:2319
msgid "Create union of selected paths"
msgstr ""
-#: ../src/verbs.cpp:2321
+#: ../src/verbs.cpp:2320
msgid "_Intersection"
msgstr ""
-#: ../src/verbs.cpp:2322
+#: ../src/verbs.cpp:2321
msgid "Create intersection of selected paths"
msgstr ""
-#: ../src/verbs.cpp:2323
+#: ../src/verbs.cpp:2322
msgid "_Difference"
msgstr ""
-#: ../src/verbs.cpp:2324
+#: ../src/verbs.cpp:2323
msgid "Create difference of selected paths (bottom minus top)"
msgstr ""
-#: ../src/verbs.cpp:2325
+#: ../src/verbs.cpp:2324
msgid "E_xclusion"
msgstr ""
-#: ../src/verbs.cpp:2326
+#: ../src/verbs.cpp:2325
msgid ""
"Create exclusive OR of selected paths (those parts that belong to only one "
"path)"
msgstr ""
-#: ../src/verbs.cpp:2327
+#: ../src/verbs.cpp:2326
msgid "Di_vision"
msgstr ""
-#: ../src/verbs.cpp:2328
+#: ../src/verbs.cpp:2327
msgid "Cut the bottom path into pieces"
msgstr ""
#. TRANSLATORS: "to cut a path" is not the same as "to break a path apart" - see the
#. Advanced tutorial for more info
-#: ../src/verbs.cpp:2331
+#: ../src/verbs.cpp:2330
msgid "Cut _Path"
msgstr ""
-#: ../src/verbs.cpp:2332
+#: ../src/verbs.cpp:2331
msgid "Cut the bottom path's stroke into pieces, removing fill"
msgstr ""
#. TRANSLATORS: "outset": expand a shape by offsetting the object's path,
#. i.e. by displacing it perpendicular to the path in each point.
#. See also the Advanced Tutorial for explanation.
-#: ../src/verbs.cpp:2336
+#: ../src/verbs.cpp:2335
msgid "Outs_et"
msgstr ""
-#: ../src/verbs.cpp:2337
+#: ../src/verbs.cpp:2336
msgid "Outset selected paths"
msgstr ""
-#: ../src/verbs.cpp:2339
+#: ../src/verbs.cpp:2338
msgid "O_utset Path by 1 px"
msgstr ""
-#: ../src/verbs.cpp:2340
+#: ../src/verbs.cpp:2339
msgid "Outset selected paths by 1 px"
msgstr ""
-#: ../src/verbs.cpp:2342
+#: ../src/verbs.cpp:2341
msgid "O_utset Path by 10 px"
msgstr ""
-#: ../src/verbs.cpp:2343
+#: ../src/verbs.cpp:2342
msgid "Outset selected paths by 10 px"
msgstr ""
#. TRANSLATORS: "inset": contract a shape by offsetting the object's path,
#. i.e. by displacing it perpendicular to the path in each point.
#. See also the Advanced Tutorial for explanation.
-#: ../src/verbs.cpp:2347
+#: ../src/verbs.cpp:2346
msgid "I_nset"
msgstr ""
-#: ../src/verbs.cpp:2348
+#: ../src/verbs.cpp:2347
msgid "Inset selected paths"
msgstr ""
-#: ../src/verbs.cpp:2350
+#: ../src/verbs.cpp:2349
msgid "I_nset Path by 1 px"
msgstr ""
-#: ../src/verbs.cpp:2351
+#: ../src/verbs.cpp:2350
msgid "Inset selected paths by 1 px"
msgstr ""
-#: ../src/verbs.cpp:2353
+#: ../src/verbs.cpp:2352
msgid "I_nset Path by 10 px"
msgstr ""
-#: ../src/verbs.cpp:2354
+#: ../src/verbs.cpp:2353
msgid "Inset selected paths by 10 px"
msgstr ""
-#: ../src/verbs.cpp:2356
+#: ../src/verbs.cpp:2355
msgid "D_ynamic Offset"
msgstr ""
-#: ../src/verbs.cpp:2356
+#: ../src/verbs.cpp:2355
msgid "Create a dynamic offset object"
msgstr ""
-#: ../src/verbs.cpp:2358
+#: ../src/verbs.cpp:2357
msgid "_Linked Offset"
msgstr ""
-#: ../src/verbs.cpp:2359
+#: ../src/verbs.cpp:2358
msgid "Create a dynamic offset object linked to the original path"
msgstr ""
-#: ../src/verbs.cpp:2361
+#: ../src/verbs.cpp:2360
msgid "_Stroke to Path"
msgstr ""
-#: ../src/verbs.cpp:2362
+#: ../src/verbs.cpp:2361
msgid "Convert selected object's stroke to paths"
msgstr ""
-#: ../src/verbs.cpp:2363
+#: ../src/verbs.cpp:2362
msgid "Si_mplify"
msgstr ""
-#: ../src/verbs.cpp:2364
+#: ../src/verbs.cpp:2363
msgid "Simplify selected paths (remove extra nodes)"
msgstr ""
-#: ../src/verbs.cpp:2365
+#: ../src/verbs.cpp:2364
msgid "_Reverse"
msgstr ""
-#: ../src/verbs.cpp:2366
+#: ../src/verbs.cpp:2365
msgid "Reverse the direction of selected paths (useful for flipping markers)"
msgstr ""
#. TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize)
-#: ../src/verbs.cpp:2368
+#: ../src/verbs.cpp:2367
msgid "_Trace Bitmap..."
msgstr ""
-#: ../src/verbs.cpp:2369
+#: ../src/verbs.cpp:2368
msgid "Create one or more paths from a bitmap by tracing it"
msgstr ""
-#: ../src/verbs.cpp:2370
+#: ../src/verbs.cpp:2369
msgid "_Make a Bitmap Copy"
msgstr ""
-#: ../src/verbs.cpp:2371
+#: ../src/verbs.cpp:2370
msgid "Export selection to a bitmap and insert it into document"
msgstr ""
-#: ../src/verbs.cpp:2372
+#: ../src/verbs.cpp:2371
msgid "_Combine"
msgstr ""
-#: ../src/verbs.cpp:2373
+#: ../src/verbs.cpp:2372
msgid "Combine several paths into one"
msgstr ""
#. TRANSLATORS: "to cut a path" is not the same as "to break a path apart" - see the
#. Advanced tutorial for more info
-#: ../src/verbs.cpp:2376
+#: ../src/verbs.cpp:2375
msgid "Break _Apart"
msgstr ""
-#: ../src/verbs.cpp:2377
+#: ../src/verbs.cpp:2376
msgid "Break selected paths into subpaths"
msgstr ""
-#: ../src/verbs.cpp:2378
+#: ../src/verbs.cpp:2377
msgid "Ro_ws and Columns..."
msgstr ""
-#: ../src/verbs.cpp:2379
+#: ../src/verbs.cpp:2378
msgid "Arrange selected objects in a table"
msgstr ""
#. Layer
-#: ../src/verbs.cpp:2381
+#: ../src/verbs.cpp:2380
msgid "_Add Layer..."
msgstr ""
-#: ../src/verbs.cpp:2382
+#: ../src/verbs.cpp:2381
msgid "Create a new layer"
msgstr ""
-#: ../src/verbs.cpp:2383
+#: ../src/verbs.cpp:2382
msgid "Re_name Layer..."
msgstr ""
-#: ../src/verbs.cpp:2384
+#: ../src/verbs.cpp:2383
msgid "Rename the current layer"
msgstr ""
-#: ../src/verbs.cpp:2385
+#: ../src/verbs.cpp:2384
msgid "Switch to Layer Abov_e"
msgstr ""
-#: ../src/verbs.cpp:2386
+#: ../src/verbs.cpp:2385
msgid "Switch to the layer above the current"
msgstr ""
-#: ../src/verbs.cpp:2387
+#: ../src/verbs.cpp:2386
msgid "Switch to Layer Belo_w"
msgstr ""
-#: ../src/verbs.cpp:2388
+#: ../src/verbs.cpp:2387
msgid "Switch to the layer below the current"
msgstr ""
-#: ../src/verbs.cpp:2389
+#: ../src/verbs.cpp:2388
msgid "Move Selection to Layer Abo_ve"
msgstr ""
-#: ../src/verbs.cpp:2390
+#: ../src/verbs.cpp:2389
msgid "Move selection to the layer above the current"
msgstr ""
-#: ../src/verbs.cpp:2391
+#: ../src/verbs.cpp:2390
msgid "Move Selection to Layer Bel_ow"
msgstr ""
-#: ../src/verbs.cpp:2392
+#: ../src/verbs.cpp:2391
msgid "Move selection to the layer below the current"
msgstr ""
-#: ../src/verbs.cpp:2393
+#: ../src/verbs.cpp:2392
msgid "Layer to _Top"
msgstr ""
-#: ../src/verbs.cpp:2394
+#: ../src/verbs.cpp:2393
msgid "Raise the current layer to the top"
msgstr ""
-#: ../src/verbs.cpp:2395
+#: ../src/verbs.cpp:2394
msgid "Layer to _Bottom"
msgstr ""
-#: ../src/verbs.cpp:2396
+#: ../src/verbs.cpp:2395
msgid "Lower the current layer to the bottom"
msgstr ""
-#: ../src/verbs.cpp:2397
+#: ../src/verbs.cpp:2396
msgid "_Raise Layer"
msgstr ""
-#: ../src/verbs.cpp:2398
+#: ../src/verbs.cpp:2397
msgid "Raise the current layer"
msgstr ""
-#: ../src/verbs.cpp:2399
+#: ../src/verbs.cpp:2398
msgid "_Lower Layer"
msgstr ""
-#: ../src/verbs.cpp:2400
+#: ../src/verbs.cpp:2399
msgid "Lower the current layer"
msgstr ""
-#: ../src/verbs.cpp:2401
+#: ../src/verbs.cpp:2400
msgid "D_uplicate Current Layer"
msgstr ""
-#: ../src/verbs.cpp:2402
+#: ../src/verbs.cpp:2401
msgid "Duplicate an existing layer"
msgstr ""
-#: ../src/verbs.cpp:2403
+#: ../src/verbs.cpp:2402
msgid "_Delete Current Layer"
msgstr ""
-#: ../src/verbs.cpp:2404
+#: ../src/verbs.cpp:2403
msgid "Delete the current layer"
msgstr ""
-#: ../src/verbs.cpp:2405
+#: ../src/verbs.cpp:2404
msgid "_Show/hide other layers"
msgstr ""
-#: ../src/verbs.cpp:2406
+#: ../src/verbs.cpp:2405
msgid "Solo the current layer"
msgstr ""
#. Object
-#: ../src/verbs.cpp:2409
+#: ../src/verbs.cpp:2408
msgid "Rotate _90&#176; CW"
msgstr ""
#. This is shared between tooltips and statusbar, so they
#. must use UTF-8, not HTML entities for special characters.
-#: ../src/verbs.cpp:2412
+#: ../src/verbs.cpp:2411
msgid "Rotate selection 90° clockwise"
msgstr ""
-#: ../src/verbs.cpp:2413
+#: ../src/verbs.cpp:2412
msgid "Rotate 9_0&#176; CCW"
msgstr ""
#. This is shared between tooltips and statusbar, so they
#. must use UTF-8, not HTML entities for special characters.
-#: ../src/verbs.cpp:2416
+#: ../src/verbs.cpp:2415
msgid "Rotate selection 90° counter-clockwise"
msgstr ""
-#: ../src/verbs.cpp:2417
+#: ../src/verbs.cpp:2416
msgid "Remove _Transformations"
msgstr ""
-#: ../src/verbs.cpp:2418
+#: ../src/verbs.cpp:2417
msgid "Remove transformations from object"
msgstr ""
-#: ../src/verbs.cpp:2419
+#: ../src/verbs.cpp:2418
msgid "_Object to Path"
msgstr ""
-#: ../src/verbs.cpp:2420
+#: ../src/verbs.cpp:2419
msgid "Convert selected object to path"
msgstr ""
-#: ../src/verbs.cpp:2421
+#: ../src/verbs.cpp:2420
msgid "_Flow into Frame"
msgstr ""
-#: ../src/verbs.cpp:2422
+#: ../src/verbs.cpp:2421
msgid ""
"Put text into a frame (path or shape), creating a flowed text linked to the "
"frame object"
msgstr ""
-#: ../src/verbs.cpp:2423
+#: ../src/verbs.cpp:2422
msgid "_Unflow"
msgstr ""
-#: ../src/verbs.cpp:2424
+#: ../src/verbs.cpp:2423
msgid "Remove text from frame (creates a single-line text object)"
msgstr ""
-#: ../src/verbs.cpp:2425
+#: ../src/verbs.cpp:2424
msgid "_Convert to Text"
msgstr ""
-#: ../src/verbs.cpp:2426
+#: ../src/verbs.cpp:2425
msgid "Convert flowed text to regular text object (preserves appearance)"
msgstr ""
-#: ../src/verbs.cpp:2428
+#: ../src/verbs.cpp:2427
msgid "Flip _Horizontal"
msgstr ""
-#: ../src/verbs.cpp:2428
+#: ../src/verbs.cpp:2427
msgid "Flip selected objects horizontally"
msgstr ""
-#: ../src/verbs.cpp:2431
+#: ../src/verbs.cpp:2430
msgid "Flip _Vertical"
msgstr ""
-#: ../src/verbs.cpp:2431
+#: ../src/verbs.cpp:2430
msgid "Flip selected objects vertically"
msgstr ""
-#: ../src/verbs.cpp:2434
+#: ../src/verbs.cpp:2433
msgid "Apply mask to selection (using the topmost object as mask)"
msgstr ""
-#: ../src/verbs.cpp:2436
+#: ../src/verbs.cpp:2435
msgid "Edit mask"
msgstr ""
-#: ../src/verbs.cpp:2437 ../src/verbs.cpp:2443
+#: ../src/verbs.cpp:2436 ../src/verbs.cpp:2442
msgid "_Release"
msgstr ""
-#: ../src/verbs.cpp:2438
+#: ../src/verbs.cpp:2437
msgid "Remove mask from selection"
msgstr ""
-#: ../src/verbs.cpp:2440
+#: ../src/verbs.cpp:2439
msgid ""
"Apply clipping path to selection (using the topmost object as clipping path)"
msgstr ""
-#: ../src/verbs.cpp:2442
+#: ../src/verbs.cpp:2441
msgid "Edit clipping path"
msgstr ""
-#: ../src/verbs.cpp:2444
+#: ../src/verbs.cpp:2443
msgid "Remove clipping path from selection"
msgstr ""
#. Tools
-#: ../src/verbs.cpp:2447
+#: ../src/verbs.cpp:2446
msgid "Select"
msgstr ""
-#: ../src/verbs.cpp:2448
+#: ../src/verbs.cpp:2447
msgid "Select and transform objects"
msgstr ""
-#: ../src/verbs.cpp:2449
+#: ../src/verbs.cpp:2448
msgid "Node Edit"
msgstr ""
-#: ../src/verbs.cpp:2450
+#: ../src/verbs.cpp:2449
msgid "Edit paths by nodes"
msgstr ""
-#: ../src/verbs.cpp:2452
+#: ../src/verbs.cpp:2451
msgid "Tweak objects by sculpting or painting"
msgstr ""
-#: ../src/verbs.cpp:2454
+#: ../src/verbs.cpp:2453
msgid "Spray objects by sculpting or painting"
msgstr ""
-#: ../src/verbs.cpp:2456
+#: ../src/verbs.cpp:2455
msgid "Create rectangles and squares"
msgstr ""
-#: ../src/verbs.cpp:2458
+#: ../src/verbs.cpp:2457
msgid "Create 3D boxes"
msgstr ""
-#: ../src/verbs.cpp:2460
+#: ../src/verbs.cpp:2459
msgid "Create circles, ellipses, and arcs"
msgstr ""
-#: ../src/verbs.cpp:2462
+#: ../src/verbs.cpp:2461
msgid "Create stars and polygons"
msgstr ""
-#: ../src/verbs.cpp:2464
+#: ../src/verbs.cpp:2463
msgid "Create spirals"
msgstr ""
-#: ../src/verbs.cpp:2466
+#: ../src/verbs.cpp:2465
msgid "Draw freehand lines"
msgstr ""
-#: ../src/verbs.cpp:2468
+#: ../src/verbs.cpp:2467
msgid "Draw Bezier curves and straight lines"
msgstr ""
-#: ../src/verbs.cpp:2470
+#: ../src/verbs.cpp:2469
msgid "Draw calligraphic or brush strokes"
msgstr ""
-#: ../src/verbs.cpp:2472
+#: ../src/verbs.cpp:2471
msgid "Create and edit text objects"
msgstr ""
-#: ../src/verbs.cpp:2474
+#: ../src/verbs.cpp:2473
msgid "Create and edit gradients"
msgstr ""
-#: ../src/verbs.cpp:2476
+#: ../src/verbs.cpp:2475
msgid "Zoom in or out"
msgstr ""
-#: ../src/verbs.cpp:2478
+#: ../src/verbs.cpp:2477
msgid "Measurement tool"
msgstr ""
-#: ../src/verbs.cpp:2480
+#: ../src/verbs.cpp:2479
msgid "Pick colors from image"
msgstr ""
-#: ../src/verbs.cpp:2482
+#: ../src/verbs.cpp:2481
msgid "Create diagram connectors"
msgstr ""
-#: ../src/verbs.cpp:2484
+#: ../src/verbs.cpp:2483
msgid "Fill bounded areas"
msgstr ""
-#: ../src/verbs.cpp:2485
+#: ../src/verbs.cpp:2484
msgid "LPE Edit"
msgstr ""
-#: ../src/verbs.cpp:2486
+#: ../src/verbs.cpp:2485
msgid "Edit Path Effect parameters"
msgstr ""
-#: ../src/verbs.cpp:2488
+#: ../src/verbs.cpp:2487
msgid "Erase existing paths"
msgstr ""
-#: ../src/verbs.cpp:2489
+#: ../src/verbs.cpp:2488
msgid "LPE Tool"
msgstr ""
-#: ../src/verbs.cpp:2490
+#: ../src/verbs.cpp:2489
msgid "Do geometric constructions"
msgstr ""
#. Tool prefs
-#: ../src/verbs.cpp:2492
+#: ../src/verbs.cpp:2491
msgid "Selector Preferences"
msgstr ""
-#: ../src/verbs.cpp:2493
+#: ../src/verbs.cpp:2492
msgid "Open Preferences for the Selector tool"
msgstr ""
-#: ../src/verbs.cpp:2494
+#: ../src/verbs.cpp:2493
msgid "Node Tool Preferences"
msgstr ""
-#: ../src/verbs.cpp:2495
+#: ../src/verbs.cpp:2494
msgid "Open Preferences for the Node tool"
msgstr ""
-#: ../src/verbs.cpp:2496
+#: ../src/verbs.cpp:2495
msgid "Tweak Tool Preferences"
msgstr ""
-#: ../src/verbs.cpp:2497
+#: ../src/verbs.cpp:2496
msgid "Open Preferences for the Tweak tool"
msgstr ""
-#: ../src/verbs.cpp:2498
+#: ../src/verbs.cpp:2497
msgid "Spray Tool Preferences"
msgstr ""
-#: ../src/verbs.cpp:2499
+#: ../src/verbs.cpp:2498
msgid "Open Preferences for the Spray tool"
msgstr ""
-#: ../src/verbs.cpp:2500
+#: ../src/verbs.cpp:2499
msgid "Rectangle Preferences"
msgstr ""
-#: ../src/verbs.cpp:2501
+#: ../src/verbs.cpp:2500
msgid "Open Preferences for the Rectangle tool"
msgstr ""
-#: ../src/verbs.cpp:2502
+#: ../src/verbs.cpp:2501
msgid "3D Box Preferences"
msgstr ""
-#: ../src/verbs.cpp:2503
+#: ../src/verbs.cpp:2502
msgid "Open Preferences for the 3D Box tool"
msgstr ""
-#: ../src/verbs.cpp:2504
+#: ../src/verbs.cpp:2503
msgid "Ellipse Preferences"
msgstr ""
-#: ../src/verbs.cpp:2505
+#: ../src/verbs.cpp:2504
msgid "Open Preferences for the Ellipse tool"
msgstr ""
-#: ../src/verbs.cpp:2506
+#: ../src/verbs.cpp:2505
msgid "Star Preferences"
msgstr ""
-#: ../src/verbs.cpp:2507
+#: ../src/verbs.cpp:2506
msgid "Open Preferences for the Star tool"
msgstr ""
-#: ../src/verbs.cpp:2508
+#: ../src/verbs.cpp:2507
msgid "Spiral Preferences"
msgstr ""
-#: ../src/verbs.cpp:2509
+#: ../src/verbs.cpp:2508
msgid "Open Preferences for the Spiral tool"
msgstr ""
-#: ../src/verbs.cpp:2510
+#: ../src/verbs.cpp:2509
msgid "Pencil Preferences"
msgstr ""
-#: ../src/verbs.cpp:2511
+#: ../src/verbs.cpp:2510
msgid "Open Preferences for the Pencil tool"
msgstr ""
-#: ../src/verbs.cpp:2512
+#: ../src/verbs.cpp:2511
msgid "Pen Preferences"
msgstr ""
-#: ../src/verbs.cpp:2513
+#: ../src/verbs.cpp:2512
msgid "Open Preferences for the Pen tool"
msgstr ""
-#: ../src/verbs.cpp:2514
+#: ../src/verbs.cpp:2513
msgid "Calligraphic Preferences"
msgstr ""
-#: ../src/verbs.cpp:2515
+#: ../src/verbs.cpp:2514
msgid "Open Preferences for the Calligraphy tool"
msgstr ""
-#: ../src/verbs.cpp:2516
+#: ../src/verbs.cpp:2515
msgid "Text Preferences"
msgstr ""
-#: ../src/verbs.cpp:2517
+#: ../src/verbs.cpp:2516
msgid "Open Preferences for the Text tool"
msgstr ""
-#: ../src/verbs.cpp:2518
+#: ../src/verbs.cpp:2517
msgid "Gradient Preferences"
msgstr ""
-#: ../src/verbs.cpp:2519
+#: ../src/verbs.cpp:2518
msgid "Open Preferences for the Gradient tool"
msgstr ""
-#: ../src/verbs.cpp:2520
+#: ../src/verbs.cpp:2519
msgid "Zoom Preferences"
msgstr ""
-#: ../src/verbs.cpp:2521
+#: ../src/verbs.cpp:2520
msgid "Open Preferences for the Zoom tool"
msgstr ""
-#: ../src/verbs.cpp:2522
+#: ../src/verbs.cpp:2521
msgid "Measure Preferences"
msgstr ""
-#: ../src/verbs.cpp:2523
+#: ../src/verbs.cpp:2522
msgid "Open Preferences for the Measure tool"
msgstr ""
-#: ../src/verbs.cpp:2524
+#: ../src/verbs.cpp:2523
msgid "Dropper Preferences"
msgstr ""
-#: ../src/verbs.cpp:2525
+#: ../src/verbs.cpp:2524
msgid "Open Preferences for the Dropper tool"
msgstr ""
-#: ../src/verbs.cpp:2526
+#: ../src/verbs.cpp:2525
msgid "Connector Preferences"
msgstr ""
-#: ../src/verbs.cpp:2527
+#: ../src/verbs.cpp:2526
msgid "Open Preferences for the Connector tool"
msgstr ""
-#: ../src/verbs.cpp:2528
+#: ../src/verbs.cpp:2527
msgid "Paint Bucket Preferences"
msgstr ""
-#: ../src/verbs.cpp:2529
+#: ../src/verbs.cpp:2528
msgid "Open Preferences for the Paint Bucket tool"
msgstr ""
-#: ../src/verbs.cpp:2530
+#: ../src/verbs.cpp:2529
msgid "Eraser Preferences"
msgstr ""
-#: ../src/verbs.cpp:2531
+#: ../src/verbs.cpp:2530
msgid "Open Preferences for the Eraser tool"
msgstr ""
-#: ../src/verbs.cpp:2532
+#: ../src/verbs.cpp:2531
msgid "LPE Tool Preferences"
msgstr ""
-#: ../src/verbs.cpp:2533
+#: ../src/verbs.cpp:2532
msgid "Open Preferences for the LPETool tool"
msgstr ""
#. Zoom/View
-#: ../src/verbs.cpp:2536
+#: ../src/verbs.cpp:2535
msgid "Zoom In"
msgstr ""
-#: ../src/verbs.cpp:2536
+#: ../src/verbs.cpp:2535
msgid "Zoom in"
msgstr ""
-#: ../src/verbs.cpp:2537
+#: ../src/verbs.cpp:2536
msgid "Zoom Out"
msgstr ""
-#: ../src/verbs.cpp:2537
+#: ../src/verbs.cpp:2536
msgid "Zoom out"
msgstr ""
-#: ../src/verbs.cpp:2538
+#: ../src/verbs.cpp:2537
msgid "_Rulers"
msgstr ""
-#: ../src/verbs.cpp:2538
+#: ../src/verbs.cpp:2537
msgid "Show or hide the canvas rulers"
msgstr ""
-#: ../src/verbs.cpp:2539
+#: ../src/verbs.cpp:2538
msgid "Scroll_bars"
msgstr ""
-#: ../src/verbs.cpp:2539
+#: ../src/verbs.cpp:2538
msgid "Show or hide the canvas scrollbars"
msgstr ""
-#: ../src/verbs.cpp:2540
+#: ../src/verbs.cpp:2539
msgid "_Grid"
msgstr ""
-#: ../src/verbs.cpp:2540
+#: ../src/verbs.cpp:2539
msgid "Show or hide the grid"
msgstr ""
-#: ../src/verbs.cpp:2541
+#: ../src/verbs.cpp:2540
msgid "G_uides"
msgstr ""
-#: ../src/verbs.cpp:2541
+#: ../src/verbs.cpp:2540
msgid "Show or hide guides (drag from a ruler to create a guide)"
msgstr ""
-#: ../src/verbs.cpp:2542
+#: ../src/verbs.cpp:2541
msgid "Enable snapping"
msgstr ""
-#: ../src/verbs.cpp:2543
+#: ../src/verbs.cpp:2542
msgid "Nex_t Zoom"
msgstr ""
-#: ../src/verbs.cpp:2543
+#: ../src/verbs.cpp:2542
msgid "Next zoom (from the history of zooms)"
msgstr ""
-#: ../src/verbs.cpp:2545
+#: ../src/verbs.cpp:2544
msgid "Pre_vious Zoom"
msgstr ""
-#: ../src/verbs.cpp:2545
+#: ../src/verbs.cpp:2544
msgid "Previous zoom (from the history of zooms)"
msgstr ""
-#: ../src/verbs.cpp:2547
+#: ../src/verbs.cpp:2546
msgid "Zoom 1:_1"
msgstr ""
-#: ../src/verbs.cpp:2547
+#: ../src/verbs.cpp:2546
msgid "Zoom to 1:1"
msgstr ""
-#: ../src/verbs.cpp:2549
+#: ../src/verbs.cpp:2548
msgid "Zoom 1:_2"
msgstr ""
-#: ../src/verbs.cpp:2549
+#: ../src/verbs.cpp:2548
msgid "Zoom to 1:2"
msgstr ""
-#: ../src/verbs.cpp:2551
+#: ../src/verbs.cpp:2550
msgid "_Zoom 2:1"
msgstr ""
-#: ../src/verbs.cpp:2551
+#: ../src/verbs.cpp:2550
msgid "Zoom to 2:1"
msgstr ""
-#: ../src/verbs.cpp:2554
+#: ../src/verbs.cpp:2553
msgid "_Fullscreen"
msgstr ""
-#: ../src/verbs.cpp:2554
+#: ../src/verbs.cpp:2553
msgid "Stretch this document window to full screen"
msgstr ""
-#: ../src/verbs.cpp:2557
+#: ../src/verbs.cpp:2556
msgid "Toggle _Focus Mode"
msgstr ""
-#: ../src/verbs.cpp:2557
+#: ../src/verbs.cpp:2556
msgid "Remove excess toolbars to focus on drawing"
msgstr ""
-#: ../src/verbs.cpp:2559
+#: ../src/verbs.cpp:2558
msgid "Duplic_ate Window"
msgstr ""
-#: ../src/verbs.cpp:2559
+#: ../src/verbs.cpp:2558
msgid "Open a new window with the same document"
msgstr ""
-#: ../src/verbs.cpp:2561
+#: ../src/verbs.cpp:2560
msgid "_New View Preview"
msgstr ""
-#: ../src/verbs.cpp:2562
+#: ../src/verbs.cpp:2561
msgid "New View Preview"
msgstr ""
#. "view_new_preview"
-#: ../src/verbs.cpp:2564 ../src/verbs.cpp:2572
+#: ../src/verbs.cpp:2563 ../src/verbs.cpp:2571
msgid "_Normal"
msgstr ""
-#: ../src/verbs.cpp:2565
+#: ../src/verbs.cpp:2564
msgid "Switch to normal display mode"
msgstr ""
-#: ../src/verbs.cpp:2566
+#: ../src/verbs.cpp:2565
msgid "No _Filters"
msgstr ""
-#: ../src/verbs.cpp:2567
+#: ../src/verbs.cpp:2566
msgid "Switch to normal display without filters"
msgstr ""
-#: ../src/verbs.cpp:2568
+#: ../src/verbs.cpp:2567
msgid "_Outline"
msgstr ""
-#: ../src/verbs.cpp:2569
+#: ../src/verbs.cpp:2568
msgid "Switch to outline (wireframe) display mode"
msgstr ""
#. new ZoomVerb(SP_VERB_VIEW_COLOR_MODE_PRINT_COLORS_PREVIEW, "ViewColorModePrintColorsPreview", N_("_Print Colors Preview"),
#. N_("Switch to print colors preview mode"), NULL),
-#: ../src/verbs.cpp:2570 ../src/verbs.cpp:2578
+#: ../src/verbs.cpp:2569 ../src/verbs.cpp:2577
msgid "_Toggle"
msgstr ""
-#: ../src/verbs.cpp:2571
+#: ../src/verbs.cpp:2570
msgid "Toggle between normal and outline display modes"
msgstr ""
-#: ../src/verbs.cpp:2573
+#: ../src/verbs.cpp:2572
msgid "Switch to normal color display mode"
msgstr ""
-#: ../src/verbs.cpp:2574
+#: ../src/verbs.cpp:2573
msgid "_Grayscale"
msgstr ""
-#: ../src/verbs.cpp:2575
+#: ../src/verbs.cpp:2574
msgid "Switch to grayscale display mode"
msgstr ""
-#: ../src/verbs.cpp:2579
+#: ../src/verbs.cpp:2578
msgid "Toggle between normal and grayscale color display modes"
msgstr ""
-#: ../src/verbs.cpp:2581
+#: ../src/verbs.cpp:2580
msgid "Color-managed view"
msgstr ""
-#: ../src/verbs.cpp:2582
+#: ../src/verbs.cpp:2581
msgid "Toggle color-managed display for this document window"
msgstr ""
-#: ../src/verbs.cpp:2584
+#: ../src/verbs.cpp:2583
msgid "Ico_n Preview..."
msgstr ""
-#: ../src/verbs.cpp:2585
+#: ../src/verbs.cpp:2584
msgid "Open a window to preview objects at different icon resolutions"
msgstr ""
-#: ../src/verbs.cpp:2586
+#: ../src/verbs.cpp:2585
msgid "_Page"
msgstr ""
-#: ../src/verbs.cpp:2587
+#: ../src/verbs.cpp:2586
msgid "Zoom to fit page in window"
msgstr ""
-#: ../src/verbs.cpp:2588
+#: ../src/verbs.cpp:2587
msgid "Page _Width"
msgstr ""
-#: ../src/verbs.cpp:2589
+#: ../src/verbs.cpp:2588
msgid "Zoom to fit page width in window"
msgstr ""
-#: ../src/verbs.cpp:2590
+#: ../src/verbs.cpp:2589
msgid "_Drawing"
msgstr ""
-#: ../src/verbs.cpp:2591
+#: ../src/verbs.cpp:2590
msgid "Zoom to fit drawing in window"
msgstr ""
-#: ../src/verbs.cpp:2592
+#: ../src/verbs.cpp:2591
msgid "_Selection"
msgstr ""
-#: ../src/verbs.cpp:2593
+#: ../src/verbs.cpp:2592
msgid "Zoom to fit selection in window"
msgstr ""
#. Dialogs
-#: ../src/verbs.cpp:2596
+#: ../src/verbs.cpp:2595
msgid "In_kscape Preferences..."
msgstr ""
-#: ../src/verbs.cpp:2597
+#: ../src/verbs.cpp:2596
msgid "Edit global Inkscape preferences"
msgstr ""
-#: ../src/verbs.cpp:2598
+#: ../src/verbs.cpp:2597
msgid "_Document Properties..."
msgstr ""
-#: ../src/verbs.cpp:2599
+#: ../src/verbs.cpp:2598
msgid "Edit properties of this document (to be saved with the document)"
msgstr ""
-#: ../src/verbs.cpp:2600
+#: ../src/verbs.cpp:2599
msgid "Document _Metadata..."
msgstr ""
-#: ../src/verbs.cpp:2601
+#: ../src/verbs.cpp:2600
msgid "Edit document metadata (to be saved with the document)"
msgstr ""
-#: ../src/verbs.cpp:2603
+#: ../src/verbs.cpp:2602
msgid ""
"Edit objects' colors, gradients, arrowheads, and other fill and stroke "
"properties..."
msgstr ""
-#: ../src/verbs.cpp:2604
+#: ../src/verbs.cpp:2603
msgid "Gl_yphs..."
msgstr ""
-#: ../src/verbs.cpp:2605
+#: ../src/verbs.cpp:2604
msgid "Select characters from a glyphs palette"
msgstr ""
#. TRANSLATORS: "Swatches" means: color samples
-#: ../src/verbs.cpp:2607
+#: ../src/verbs.cpp:2606
msgid "S_watches..."
msgstr ""
-#: ../src/verbs.cpp:2608
+#: ../src/verbs.cpp:2607
msgid "Select colors from a swatches palette"
msgstr ""
-#: ../src/verbs.cpp:2609
+#: ../src/verbs.cpp:2608
msgid "Transfor_m..."
msgstr ""
-#: ../src/verbs.cpp:2610
+#: ../src/verbs.cpp:2609
msgid "Precisely control objects' transformations"
msgstr ""
-#: ../src/verbs.cpp:2611
+#: ../src/verbs.cpp:2610
msgid "_Align and Distribute..."
msgstr ""
-#: ../src/verbs.cpp:2612
+#: ../src/verbs.cpp:2611
msgid "Align and distribute objects"
msgstr ""
-#: ../src/verbs.cpp:2613
+#: ../src/verbs.cpp:2612
msgid "_Spray options..."
msgstr ""
-#: ../src/verbs.cpp:2614
+#: ../src/verbs.cpp:2613
msgid "Some options for the spray"
msgstr ""
-#: ../src/verbs.cpp:2615
+#: ../src/verbs.cpp:2614
msgid "Undo _History..."
msgstr ""
-#: ../src/verbs.cpp:2616
+#: ../src/verbs.cpp:2615
msgid "Undo History"
msgstr ""
-#: ../src/verbs.cpp:2618
+#: ../src/verbs.cpp:2617
msgid "View and select font family, font size and other text properties"
msgstr ""
-#: ../src/verbs.cpp:2619
+#: ../src/verbs.cpp:2618
msgid "_XML Editor..."
msgstr ""
-#: ../src/verbs.cpp:2620
+#: ../src/verbs.cpp:2619
msgid "View and edit the XML tree of the document"
msgstr ""
-#: ../src/verbs.cpp:2621
+#: ../src/verbs.cpp:2620
msgid "_Find..."
msgstr ""
-#: ../src/verbs.cpp:2622
+#: ../src/verbs.cpp:2621
msgid "Find objects in document"
msgstr ""
-#: ../src/verbs.cpp:2623
+#: ../src/verbs.cpp:2622
msgid "Find and _Replace Text..."
msgstr ""
-#: ../src/verbs.cpp:2624
+#: ../src/verbs.cpp:2623
msgid "Find and replace text in document"
msgstr ""
-#: ../src/verbs.cpp:2626
+#: ../src/verbs.cpp:2625
msgid "Check spelling of text in document"
msgstr ""
-#: ../src/verbs.cpp:2627
+#: ../src/verbs.cpp:2626
msgid "_Messages..."
msgstr ""
-#: ../src/verbs.cpp:2628
+#: ../src/verbs.cpp:2627
msgid "View debug messages"
msgstr ""
-#: ../src/verbs.cpp:2629
+#: ../src/verbs.cpp:2628
msgid "S_cripts..."
msgstr ""
-#: ../src/verbs.cpp:2630
+#: ../src/verbs.cpp:2629
msgid "Run scripts"
msgstr ""
-#: ../src/verbs.cpp:2631
+#: ../src/verbs.cpp:2630
msgid "Show/Hide D_ialogs"
msgstr ""
-#: ../src/verbs.cpp:2632
+#: ../src/verbs.cpp:2631
msgid "Show or hide all open dialogs"
msgstr ""
-#: ../src/verbs.cpp:2633
+#: ../src/verbs.cpp:2632
msgid "Create Tiled Clones..."
msgstr ""
-#: ../src/verbs.cpp:2634
+#: ../src/verbs.cpp:2633
msgid ""
"Create multiple clones of selected object, arranging them into a pattern or "
"scattering"
msgstr ""
-#: ../src/verbs.cpp:2635
+#: ../src/verbs.cpp:2634
msgid "_Object attributes..."
msgstr ""
-#: ../src/verbs.cpp:2636
+#: ../src/verbs.cpp:2635
msgid "Edit the object attributes..."
msgstr ""
-#: ../src/verbs.cpp:2638
+#: ../src/verbs.cpp:2637
msgid "Edit the ID, locked and visible status, and other object properties"
msgstr ""
@@ -21906,218 +22117,218 @@ msgstr ""
#. new DialogVerb(SP_VERB_XMPP_CLIENT, "DialogXmppClient",
#. N_("_Instant Messaging..."), N_("Jabber Instant Messaging Client"), NULL),
#. #endif
-#: ../src/verbs.cpp:2643
+#: ../src/verbs.cpp:2642
msgid "_Input Devices..."
msgstr ""
-#: ../src/verbs.cpp:2644
+#: ../src/verbs.cpp:2643
msgid "Configure extended input devices, such as a graphics tablet"
msgstr ""
-#: ../src/verbs.cpp:2645
+#: ../src/verbs.cpp:2644
msgid "_Extensions..."
msgstr ""
-#: ../src/verbs.cpp:2646
+#: ../src/verbs.cpp:2645
msgid "Query information about extensions"
msgstr ""
-#: ../src/verbs.cpp:2647
+#: ../src/verbs.cpp:2646
msgid "Layer_s..."
msgstr ""
-#: ../src/verbs.cpp:2648
+#: ../src/verbs.cpp:2647
msgid "View Layers"
msgstr ""
-#: ../src/verbs.cpp:2649
+#: ../src/verbs.cpp:2648
msgid "Path E_ffects ..."
msgstr ""
-#: ../src/verbs.cpp:2650
+#: ../src/verbs.cpp:2649
msgid "Manage, edit, and apply path effects"
msgstr ""
-#: ../src/verbs.cpp:2651
+#: ../src/verbs.cpp:2650
msgid "Filter _Editor..."
msgstr ""
-#: ../src/verbs.cpp:2652
+#: ../src/verbs.cpp:2651
msgid "Manage, edit, and apply SVG filters"
msgstr ""
-#: ../src/verbs.cpp:2653
+#: ../src/verbs.cpp:2652
msgid "SVG Font Editor..."
msgstr ""
-#: ../src/verbs.cpp:2654
+#: ../src/verbs.cpp:2653
msgid "Edit SVG fonts"
msgstr ""
-#: ../src/verbs.cpp:2655
+#: ../src/verbs.cpp:2654
msgid "Print Colors..."
msgstr ""
-#: ../src/verbs.cpp:2656
+#: ../src/verbs.cpp:2655
msgid ""
"Select which color separations to render in Print Colors Preview rendermode"
msgstr ""
#. Help
-#: ../src/verbs.cpp:2661
+#: ../src/verbs.cpp:2660
msgid "About E_xtensions"
msgstr ""
-#: ../src/verbs.cpp:2662
+#: ../src/verbs.cpp:2661
msgid "Information on Inkscape extensions"
msgstr ""
-#: ../src/verbs.cpp:2663
+#: ../src/verbs.cpp:2662
msgid "About _Memory"
msgstr ""
-#: ../src/verbs.cpp:2664
+#: ../src/verbs.cpp:2663
msgid "Memory usage information"
msgstr ""
-#: ../src/verbs.cpp:2665
+#: ../src/verbs.cpp:2664
msgid "_About Inkscape"
msgstr ""
-#: ../src/verbs.cpp:2666
+#: ../src/verbs.cpp:2665
msgid "Inkscape version, authors, license"
msgstr ""
#. new HelpVerb(SP_VERB_SHOW_LICENSE, "ShowLicense", N_("_License"),
#. N_("Distribution terms"), /*"show_license"*/"inkscape_options"),
#. Tutorials
-#: ../src/verbs.cpp:2671
+#: ../src/verbs.cpp:2670
msgid "Inkscape: _Basic"
msgstr ""
-#: ../src/verbs.cpp:2672
+#: ../src/verbs.cpp:2671
msgid "Getting started with Inkscape"
msgstr ""
#. "tutorial_basic"
-#: ../src/verbs.cpp:2673
+#: ../src/verbs.cpp:2672
msgid "Inkscape: _Shapes"
msgstr ""
-#: ../src/verbs.cpp:2674
+#: ../src/verbs.cpp:2673
msgid "Using shape tools to create and edit shapes"
msgstr ""
-#: ../src/verbs.cpp:2675
+#: ../src/verbs.cpp:2674
msgid "Inkscape: _Advanced"
msgstr ""
-#: ../src/verbs.cpp:2676
+#: ../src/verbs.cpp:2675
msgid "Advanced Inkscape topics"
msgstr ""
#. "tutorial_advanced"
#. TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize)
-#: ../src/verbs.cpp:2678
+#: ../src/verbs.cpp:2677
msgid "Inkscape: T_racing"
msgstr ""
-#: ../src/verbs.cpp:2679
+#: ../src/verbs.cpp:2678
msgid "Using bitmap tracing"
msgstr ""
#. "tutorial_tracing"
-#: ../src/verbs.cpp:2680
+#: ../src/verbs.cpp:2679
msgid "Inkscape: _Calligraphy"
msgstr ""
-#: ../src/verbs.cpp:2681
+#: ../src/verbs.cpp:2680
msgid "Using the Calligraphy pen tool"
msgstr ""
-#: ../src/verbs.cpp:2682
+#: ../src/verbs.cpp:2681
msgid "Inkscape: _Interpolate"
msgstr ""
-#: ../src/verbs.cpp:2683
+#: ../src/verbs.cpp:2682
msgid "Using the interpolate extension"
msgstr ""
#. "tutorial_interpolate"
-#: ../src/verbs.cpp:2684
+#: ../src/verbs.cpp:2683
msgid "_Elements of Design"
msgstr ""
-#: ../src/verbs.cpp:2685
+#: ../src/verbs.cpp:2684
msgid "Principles of design in the tutorial form"
msgstr ""
#. "tutorial_design"
-#: ../src/verbs.cpp:2686
+#: ../src/verbs.cpp:2685
msgid "_Tips and Tricks"
msgstr ""
-#: ../src/verbs.cpp:2687
+#: ../src/verbs.cpp:2686
msgid "Miscellaneous tips and tricks"
msgstr ""
#. "tutorial_tips"
#. Effect -- renamed Extension
-#: ../src/verbs.cpp:2690
+#: ../src/verbs.cpp:2689
msgid "Previous Exte_nsion"
msgstr ""
-#: ../src/verbs.cpp:2691
+#: ../src/verbs.cpp:2690
msgid "Repeat the last extension with the same settings"
msgstr ""
-#: ../src/verbs.cpp:2692
+#: ../src/verbs.cpp:2691
msgid "_Previous Extension Settings..."
msgstr ""
-#: ../src/verbs.cpp:2693
+#: ../src/verbs.cpp:2692
msgid "Repeat the last extension with new settings"
msgstr ""
-#: ../src/verbs.cpp:2697
+#: ../src/verbs.cpp:2696
msgid "Fit the page to the current selection"
msgstr ""
-#: ../src/verbs.cpp:2699
+#: ../src/verbs.cpp:2698
msgid "Fit the page to the drawing"
msgstr ""
-#: ../src/verbs.cpp:2701
+#: ../src/verbs.cpp:2700
msgid ""
"Fit the page to the current selection or the drawing if there is no selection"
msgstr ""
#. LockAndHide
-#: ../src/verbs.cpp:2703
+#: ../src/verbs.cpp:2702
msgid "Unlock All"
msgstr ""
-#: ../src/verbs.cpp:2705
+#: ../src/verbs.cpp:2704
msgid "Unlock All in All Layers"
msgstr ""
-#: ../src/verbs.cpp:2707
+#: ../src/verbs.cpp:2706
msgid "Unhide All"
msgstr ""
-#: ../src/verbs.cpp:2709
+#: ../src/verbs.cpp:2708
msgid "Unhide All in All Layers"
msgstr ""
-#: ../src/verbs.cpp:2713
+#: ../src/verbs.cpp:2712
msgid "Link an ICC color profile"
msgstr ""
-#: ../src/verbs.cpp:2714
+#: ../src/verbs.cpp:2713
msgid "Remove Color Profile"
msgstr ""
-#: ../src/verbs.cpp:2715
+#: ../src/verbs.cpp:2714
msgid "Remove a linked ICC color profile"
msgstr ""
@@ -22125,7 +22336,7 @@ msgstr ""
msgid "Dash pattern"
msgstr ""
-#: ../src/widgets/dash-selector.cpp:73
+#: ../src/widgets/dash-selector.cpp:67
msgid "Pattern offset"
msgstr ""
@@ -22255,21 +22466,21 @@ msgid "Set pattern on stroke"
msgstr ""
#. Family frame
-#: ../src/widgets/font-selector.cpp:143
+#: ../src/widgets/font-selector.cpp:144
msgid "Font family"
msgstr ""
#. Style frame
-#: ../src/widgets/font-selector.cpp:174
+#: ../src/widgets/font-selector.cpp:175
msgctxt "Font selector"
msgid "Style"
msgstr ""
-#: ../src/widgets/font-selector.cpp:208 ../src/widgets/toolbox.cpp:7752
+#: ../src/widgets/font-selector.cpp:209 ../src/widgets/toolbox.cpp:7752
msgid "Font size (px)"
msgstr ""
-#: ../src/widgets/font-selector.cpp:213 ../share/extensions/dots.inx.h:2
+#: ../src/widgets/font-selector.cpp:214 ../share/extensions/dots.inx.h:2
msgid "Font size:"
msgstr ""
@@ -22296,31 +22507,27 @@ msgstr ""
msgid "Repeat:"
msgstr ""
-#: ../src/widgets/gradient-toolbar.cpp:156
+#: ../src/widgets/gradient-toolbar.cpp:165
msgid "Assign gradient to object"
msgstr ""
-#: ../src/widgets/gradient-toolbar.cpp:190
-msgid "<small>No gradients</small>"
+#: ../src/widgets/gradient-toolbar.cpp:209
+msgid "No gradients"
msgstr ""
-#: ../src/widgets/gradient-toolbar.cpp:200
-msgid "<small>Nothing selected</small>"
+#: ../src/widgets/gradient-toolbar.cpp:223
+msgid "No gradient"
msgstr ""
-#: ../src/widgets/gradient-toolbar.cpp:211
-msgid "<small>No gradients in selection</small>"
+#: ../src/widgets/gradient-toolbar.cpp:231
+msgid "Multiple gradients"
msgstr ""
-#: ../src/widgets/gradient-toolbar.cpp:221
-msgid "<small>Multiple gradients</small>"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:484
+#: ../src/widgets/gradient-toolbar.cpp:487
msgid "Edit the stops of the gradient"
msgstr ""
-#: ../src/widgets/gradient-toolbar.cpp:542 ../src/widgets/toolbox.cpp:3021
+#: ../src/widgets/gradient-toolbar.cpp:545 ../src/widgets/toolbox.cpp:3021
#: ../src/widgets/toolbox.cpp:3103 ../src/widgets/toolbox.cpp:3429
#: ../src/widgets/toolbox.cpp:3467 ../src/widgets/toolbox.cpp:4094
#: ../src/widgets/toolbox.cpp:4118 ../src/widgets/toolbox.cpp:5754
@@ -22328,101 +22535,100 @@ msgstr ""
msgid "<b>New:</b>"
msgstr ""
-#: ../src/widgets/gradient-toolbar.cpp:555
+#: ../src/widgets/gradient-toolbar.cpp:558
msgid "Create linear gradient"
msgstr ""
-#: ../src/widgets/gradient-toolbar.cpp:568
+#: ../src/widgets/gradient-toolbar.cpp:571
msgid "Create radial (elliptic or circular) gradient"
msgstr ""
#. TODO replace aux_toolbox_space(tbl, AUX_SPACING);
-#: ../src/widgets/gradient-toolbar.cpp:584
+#: ../src/widgets/gradient-toolbar.cpp:587
msgid "on"
msgstr ""
-#: ../src/widgets/gradient-toolbar.cpp:597
+#: ../src/widgets/gradient-toolbar.cpp:600
msgid "Create gradient in the fill"
msgstr ""
-#: ../src/widgets/gradient-toolbar.cpp:610
+#: ../src/widgets/gradient-toolbar.cpp:613
msgid "Create gradient in the stroke"
msgstr ""
#. FIXME: implement averaging of all parameters for multiple selected
#. gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>"));
-#: ../src/widgets/gradient-toolbar.cpp:625 ../src/widgets/toolbox.cpp:3023
+#: ../src/widgets/gradient-toolbar.cpp:628 ../src/widgets/toolbox.cpp:3023
#: ../src/widgets/toolbox.cpp:3437 ../src/widgets/toolbox.cpp:3455
#: ../src/widgets/toolbox.cpp:4096 ../src/widgets/toolbox.cpp:4107
#: ../src/widgets/toolbox.cpp:5757 ../src/widgets/toolbox.cpp:5768
msgid "<b>Change:</b>"
msgstr ""
-#: ../src/widgets/gradient-vector.cpp:278
-#: ../src/widgets/paint-selector.cpp:906 ../src/widgets/stroke-style.cpp:419
+#: ../src/widgets/gradient-vector.cpp:296
+#: ../src/widgets/paint-selector.cpp:916
msgid "No document selected"
msgstr ""
-#: ../src/widgets/gradient-vector.cpp:284
+#: ../src/widgets/gradient-vector.cpp:301
msgid "No gradients in document"
msgstr ""
-#: ../src/widgets/gradient-vector.cpp:290
+#: ../src/widgets/gradient-vector.cpp:306
msgid "No gradient selected"
msgstr ""
-#: ../src/widgets/gradient-vector.cpp:554
+#: ../src/widgets/gradient-vector.cpp:566
msgid "No stops in gradient"
msgstr ""
-#: ../src/widgets/gradient-vector.cpp:668
+#: ../src/widgets/gradient-vector.cpp:677
msgid "Change gradient stop offset"
msgstr ""
#. TRANSLATORS: "Stop" means: a "phase" of a gradient
-#: ../src/widgets/gradient-vector.cpp:807
+#: ../src/widgets/gradient-vector.cpp:830
msgid "Add stop"
msgstr ""
-#: ../src/widgets/gradient-vector.cpp:810
+#: ../src/widgets/gradient-vector.cpp:833
msgid "Add another control stop to gradient"
msgstr ""
-#: ../src/widgets/gradient-vector.cpp:812
+#: ../src/widgets/gradient-vector.cpp:835
msgid "Delete stop"
msgstr ""
-#: ../src/widgets/gradient-vector.cpp:815
+#: ../src/widgets/gradient-vector.cpp:838
msgid "Delete current control stop from gradient"
msgstr ""
#. TRANSLATORS: "Stop" means: a "phase" of a gradient
-#: ../src/widgets/gradient-vector.cpp:871
+#: ../src/widgets/gradient-vector.cpp:897
msgid "Stop Color"
msgstr ""
-#: ../src/widgets/gradient-vector.cpp:901
+#: ../src/widgets/gradient-vector.cpp:927
msgid "Gradient editor"
msgstr ""
-#: ../src/widgets/gradient-vector.cpp:1189
+#: ../src/widgets/gradient-vector.cpp:1220
msgid "Change gradient stop color"
msgstr ""
-#: ../src/widgets/paint-selector.cpp:226 ../src/widgets/paint-selector.cpp:609
+#: ../src/widgets/paint-selector.cpp:226
msgid "No paint"
msgstr ""
-#: ../src/widgets/paint-selector.cpp:228 ../src/widgets/paint-selector.cpp:673
+#: ../src/widgets/paint-selector.cpp:228
msgid "Flat color"
msgstr ""
-#. sp_gradient_selector_set_mode(SP_GRADIENT_SELECTOR(gsel), SP_GRADIENT_SELECTOR_MODE_LINEAR);
-#: ../src/widgets/paint-selector.cpp:230 ../src/widgets/paint-selector.cpp:736
+#: ../src/widgets/paint-selector.cpp:230
msgid "Linear gradient"
msgstr ""
-#: ../src/widgets/paint-selector.cpp:232 ../src/widgets/paint-selector.cpp:739
+#: ../src/widgets/paint-selector.cpp:232
msgid "Radial gradient"
msgstr ""
@@ -22447,27 +22653,48 @@ msgid ""
"Fill is solid unless a subpath is counterdirectional (fill-rule: nonzero)"
msgstr ""
-#: ../src/widgets/paint-selector.cpp:576
-msgid "No objects"
+#: ../src/widgets/paint-selector.cpp:583
+msgid "<b>No objects</b>"
+msgstr ""
+
+#: ../src/widgets/paint-selector.cpp:594
+msgid "<b>Multiple styles</b>"
+msgstr ""
+
+#: ../src/widgets/paint-selector.cpp:605
+msgid "<b>Paint is undefined</b>"
+msgstr ""
+
+#: ../src/widgets/paint-selector.cpp:616
+msgid "<b>No paint</b>"
msgstr ""
-#: ../src/widgets/paint-selector.cpp:587
-msgid "Multiple styles"
+#: ../src/widgets/paint-selector.cpp:682
+msgid "<b>Flat color</b>"
+msgstr ""
+
+#. sp_gradient_selector_set_mode(SP_GRADIENT_SELECTOR(gsel), SP_GRADIENT_SELECTOR_MODE_LINEAR);
+#: ../src/widgets/paint-selector.cpp:746
+msgid "<b>Linear gradient</b>"
msgstr ""
-#: ../src/widgets/paint-selector.cpp:598
-msgid "Paint is undefined"
+#: ../src/widgets/paint-selector.cpp:749
+msgid "<b>Radial gradient</b>"
msgstr ""
-#: ../src/widgets/paint-selector.cpp:1006
+#: ../src/widgets/paint-selector.cpp:1016
msgid ""
"Use the <b>Node tool</b> to adjust position, scale, and rotation of the "
"pattern on canvas. Use <b>Object &gt; Pattern &gt; Objects to Pattern</b> to "
"create a new pattern from selection."
msgstr ""
-#: ../src/widgets/paint-selector.cpp:1094
-msgid "Swatch fill"
+#: ../src/widgets/paint-selector.cpp:1029
+msgid "<b>Pattern fill</b>"
+msgstr ""
+
+#: ../src/widgets/paint-selector.cpp:1104
+msgid "<b>Swatch fill</b>"
msgstr ""
#: ../src/widgets/select-toolbar.cpp:262
@@ -22749,11 +22976,11 @@ msgstr ""
msgid "Wheel"
msgstr ""
-#: ../src/widgets/sp-xmlview-attr-list.cpp:46
+#: ../src/widgets/sp-xmlview-attr-list.cpp:52
msgid "Attribute"
msgstr ""
-#: ../src/widgets/sp-xmlview-attr-list.cpp:47
+#: ../src/widgets/sp-xmlview-attr-list.cpp:60
msgid "Value"
msgstr ""
@@ -22761,15 +22988,15 @@ msgstr ""
msgid "Type text in a text node"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:505
+#: ../src/widgets/stroke-style.cpp:193
msgid "Set markers"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:687
+#: ../src/widgets/stroke-style.cpp:333
msgid "Stroke width"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:689
+#: ../src/widgets/stroke-style.cpp:335
msgctxt "Stroke width"
msgid "_Width:"
msgstr ""
@@ -22777,96 +23004,96 @@ msgstr ""
#. Join type
#. TRANSLATORS: The line join style specifies the shape to be used at the
#. corners of paths. It can be "miter", "round" or "bevel".
-#: ../src/widgets/stroke-style.cpp:712
+#: ../src/widgets/stroke-style.cpp:358
msgid "Join:"
msgstr ""
#. TRANSLATORS: Miter join: joining lines with a sharp (pointed) corner.
#. For an example, draw a triangle with a large stroke width and modify the
#. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:724
+#: ../src/widgets/stroke-style.cpp:370
msgid "Miter join"
msgstr ""
#. TRANSLATORS: Round join: joining lines with a rounded corner.
#. For an example, draw a triangle with a large stroke width and modify the
#. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:734
+#: ../src/widgets/stroke-style.cpp:380
msgid "Round join"
msgstr ""
#. TRANSLATORS: Bevel join: joining lines with a blunted (flattened) corner.
#. For an example, draw a triangle with a large stroke width and modify the
#. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:744
+#: ../src/widgets/stroke-style.cpp:390
msgid "Bevel join"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:764
+#: ../src/widgets/stroke-style.cpp:410
msgid "Maximum length of the miter (in units of stroke width)"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:766
+#: ../src/widgets/stroke-style.cpp:412
msgid "Miter _limit:"
msgstr ""
#. Cap type
#. TRANSLATORS: cap type specifies the shape for the ends of lines
#. spw_label(t, _("_Cap:"), 0, i);
-#: ../src/widgets/stroke-style.cpp:778
+#: ../src/widgets/stroke-style.cpp:424
msgid "Cap:"
msgstr ""
#. TRANSLATORS: Butt cap: the line shape does not extend beyond the end point
#. of the line; the ends of the line are square
-#: ../src/widgets/stroke-style.cpp:790
+#: ../src/widgets/stroke-style.cpp:436
msgid "Butt cap"
msgstr ""
#. TRANSLATORS: Round cap: the line shape extends beyond the end point of the
#. line; the ends of the line are rounded
-#: ../src/widgets/stroke-style.cpp:798
+#: ../src/widgets/stroke-style.cpp:444
msgid "Round cap"
msgstr ""
#. TRANSLATORS: Square cap: the line shape extends beyond the end point of the
#. line; the ends of the line are square
-#: ../src/widgets/stroke-style.cpp:806
+#: ../src/widgets/stroke-style.cpp:452
msgid "Square cap"
msgstr ""
#. Dash
-#: ../src/widgets/stroke-style.cpp:812
+#: ../src/widgets/stroke-style.cpp:458
msgid "Dashes:"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:835
+#: ../src/widgets/stroke-style.cpp:476
msgid "_Start Markers:"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:836
+#: ../src/widgets/stroke-style.cpp:477
msgid "Start Markers are drawn on the first node of a path or shape"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:847
+#: ../src/widgets/stroke-style.cpp:487
msgid "_Mid Markers:"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:848
+#: ../src/widgets/stroke-style.cpp:488
msgid ""
"Mid Markers are drawn on every node of a path or shape except the first and "
"last nodes"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:859
+#: ../src/widgets/stroke-style.cpp:498
msgid "_End Markers:"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:860
+#: ../src/widgets/stroke-style.cpp:499
msgid "End Markers are drawn on the last node of a path or shape"
msgstr ""
-#: ../src/widgets/stroke-style.cpp:1213 ../src/widgets/stroke-style.cpp:1309
+#: ../src/widgets/stroke-style.cpp:851 ../src/widgets/stroke-style.cpp:948
msgid "Set stroke style"
msgstr ""
@@ -25194,7 +25421,7 @@ msgid "Visual"
msgstr ""
#: ../share/extensions/dimension.inx.h:5 ../share/extensions/dots.inx.h:13
-#: ../share/extensions/handles.inx.h:2 ../share/extensions/measure.inx.h:19
+#: ../share/extensions/handles.inx.h:2 ../share/extensions/measure.inx.h:38
msgid "Visualize Path"
msgstr ""
@@ -27707,40 +27934,114 @@ msgid "solid"
msgstr ""
#: ../share/extensions/measure.inx.h:1
-msgid "Font size (px):"
+msgid "Angle 0"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:2
+msgid "Angle 120"
msgstr ""
#: ../share/extensions/measure.inx.h:3
+msgid "Angle 135"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:4
+msgid "Angle 150"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:5
+msgid "Angle 180"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:6
+msgid "Angle 210"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:7
+msgid "Angle 225"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:8
+msgid "Angle 240"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:9
+msgid "Angle 270"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:10
+msgid "Angle 30"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:11
+msgid "Angle 300"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:12
+msgid "Angle 315"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:13
+msgid "Angle 330"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:14
+msgid "Angle 45"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:15
+msgid "Angle 60"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:16
+msgid "Angle 90"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:17
+msgid "Display Format: "
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:18
+msgid "Font size (px):"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:20
msgid "Length"
msgstr ""
#. <param name="unit" type="string" _gui-text="Unit {km|m|cm|mm|in|px|pt}">mm</param>
-#: ../share/extensions/measure.inx.h:5
+#: ../share/extensions/measure.inx.h:22
msgid "Length Unit:"
msgstr ""
-#: ../share/extensions/measure.inx.h:7
+#: ../share/extensions/measure.inx.h:24
msgid "Measure Path"
msgstr ""
-#: ../share/extensions/measure.inx.h:8
+#: ../share/extensions/measure.inx.h:25
msgid "Measurement Type: "
msgstr ""
-#: ../share/extensions/measure.inx.h:9
+#: ../share/extensions/measure.inx.h:26
msgid "Offset (px):"
msgstr ""
-#: ../share/extensions/measure.inx.h:11
+#: ../share/extensions/measure.inx.h:28
msgid "Scale Factor (Drawing:Real Length) = 1:"
msgstr ""
-#: ../share/extensions/measure.inx.h:13
+#: ../share/extensions/measure.inx.h:29
+msgid "Text On Path"
+msgstr ""
+
+#: ../share/extensions/measure.inx.h:31
#, no-c-format
msgid ""
-"This effect measures the length, or area, of the selected path and adds it "
-"as a text-on-path object with the selected unit.\n"
+"This effect measures the length, or area, of the selected paths and adds it "
+"as a text object with the selected units.\n"
" \n"
+" * Display format can be either Text-On-Path, or stand-alone text at a "
+"specified angle.\n"
" * The number of significant digits can be controlled by the Precision "
"field.\n"
" * The Offset field controls the distance from the text to the path.\n"
@@ -27752,7 +28053,7 @@ msgid ""
"0.03%."
msgstr ""
-#: ../share/extensions/measure.inx.h:20
+#: ../share/extensions/measure.inx.h:39
msgctxt "measure extension"
msgid "Area"
msgstr ""
diff --git a/share/ui/units.txt b/share/ui/units.txt
index a82cec529..55fd68577 100644
--- a/share/ui/units.txt
+++ b/share/ui/units.txt
@@ -13,7 +13,7 @@
centimeter centimeters cm LINEAR 35.43307 N Centimeters (10 mm/cm)
meter meters m LINEAR 3543.307 N Meters (100 cm/m)
foot feet ft LINEAR 1080 N Feet (12 in/ft)
- degree degrees deg RADIAL 1.00 Y Degrees
+ degree degrees ° RADIAL 1.00 Y Degrees
radian radians rad RADIAL 57.296 N Radians (57.296 deg/rad)
font-height font-heights em FONT_HEIGHT 1.00 Y Font height
x-height x-heights ex FONT_HEIGHT 0.50 N Height of letter 'x'
diff --git a/share/ui/units.xml b/share/ui/units.xml
index e4a07fe06..69d78565d 100644
--- a/share/ui/units.xml
+++ b/share/ui/units.xml
@@ -66,7 +66,7 @@
<unit type="RADIAL" pri="y">
<name>degree</name>
<plural>degrees</plural>
- <abbr>deg</abbr>
+ <abbr>°</abbr>
<factor>1.00</factor>
<description>Degrees</description>
</unit>
diff --git a/src/2geom/svg-path.h b/src/2geom/svg-path.h
index 89192fb72..591eb3aa2 100644
--- a/src/2geom/svg-path.h
+++ b/src/2geom/svg-path.h
@@ -120,6 +120,14 @@ public:
large_arc, sweep, p);
}
+ void append(Path const &other, Path::Stitching stitching = Path::NO_STITCHING)
+ {
+ if (!_in_path) {
+ moveTo(other.initialPoint());
+ }
+ _path.append(other, stitching);
+ }
+
void closePath() {
_path.close();
finish();
diff --git a/src/dialogs/CMakeLists.txt b/src/dialogs/CMakeLists.txt
index 7af6f2ede..1cd230a08 100644
--- a/src/dialogs/CMakeLists.txt
+++ b/src/dialogs/CMakeLists.txt
@@ -1,12 +1,10 @@
set(dialogs_SRC
- clonetiler.cpp
dialog-events.cpp
find.cpp
# -------
# Headers
- clonetiler.h
dialog-events.h
find.h
)
diff --git a/src/dialogs/Makefile_insert b/src/dialogs/Makefile_insert
index ac0792a73..62641ecb9 100644
--- a/src/dialogs/Makefile_insert
+++ b/src/dialogs/Makefile_insert
@@ -1,8 +1,6 @@
## Makefile.am fragment sourced by src/Makefile.am.
ink_common_sources += \
- dialogs/clonetiler.cpp \
- dialogs/clonetiler.h \
dialogs/dialog-events.cpp \
dialogs/dialog-events.h \
dialogs/find.cpp \
diff --git a/src/dialogs/clonetiler.h b/src/dialogs/clonetiler.h
deleted file mode 100644
index 899181346..000000000
--- a/src/dialogs/clonetiler.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/** @file
- * @brief Clone tiling dialog
- */
-/* Authors:
- * bulia byak <buliabyak@users.sf.net>
- *
- * Copyright (C) 2004 Authors
- * Released under the GNU GPL, read the file 'COPYING' for more information
- */
-#ifndef __SP_CLONE_TILER_H__
-#define __SP_CLONE_TILER_H__
-
-#include <glib.h>
-
-#include <gtk/gtk.h>
-
-void clonetiler_dialog ( void );
-
-#endif
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp
index 3b19f925e..5347a85ac 100644
--- a/src/extension/internal/pdfinput/pdf-parser.cpp
+++ b/src/extension/internal/pdfinput/pdf-parser.cpp
@@ -1672,17 +1672,23 @@ void PdfParser::opShFill(Object args[], int /*numArgs*/)
if (matrix != NULL) {
xTemp = matrix[0]*xMin + matrix[2]*yMin + matrix[4];
yTemp = matrix[1]*xMin + matrix[3]*yMin + matrix[5];
- xMin = xTemp;
- yMin = yTemp;
+ state->moveTo(xTemp, yTemp);
+ xTemp = matrix[0]*xMax + matrix[2]*yMin + matrix[4];
+ yTemp = matrix[1]*xMax + matrix[3]*yMin + matrix[5];
+ state->lineTo(xTemp, yTemp);
xTemp = matrix[0]*xMax + matrix[2]*yMax + matrix[4];
yTemp = matrix[1]*xMax + matrix[3]*yMax + matrix[5];
- xMax = xTemp;
- yMax = yTemp;
+ state->lineTo(xTemp, yTemp);
+ xTemp = matrix[0]*xMin + matrix[2]*yMax + matrix[4];
+ yTemp = matrix[1]*xMin + matrix[3]*yMax + matrix[5];
+ state->lineTo(xTemp, yTemp);
+ }
+ else {
+ state->moveTo(xMin, yMin);
+ state->lineTo(xMax, yMin);
+ state->lineTo(xMax, yMax);
+ state->lineTo(xMin, yMax);
}
- state->moveTo(xMin, yMin);
- state->lineTo(xMax, yMin);
- state->lineTo(xMax, yMax);
- state->lineTo(xMin, yMax);
state->closePath();
state->clip();
if (savedState)
diff --git a/src/live_effects/CMakeLists.txt b/src/live_effects/CMakeLists.txt
index e066e7f43..a5f50a69d 100644
--- a/src/live_effects/CMakeLists.txt
+++ b/src/live_effects/CMakeLists.txt
@@ -1,6 +1,5 @@
set(live_effects_SRC
- bezctx.cpp
effect.cpp
lpe-angle_bisector.cpp
lpe-bendpath.cpp
@@ -41,6 +40,7 @@ set(live_effects_SRC
lpeobject-reference.cpp
lpeobject.cpp
spiro.cpp
+ spiro-converters.cpp
parameter/array.cpp
parameter/bool.cpp
@@ -58,8 +58,6 @@ set(live_effects_SRC
# -------
# Headers
- bezctx.h
- bezctx_intf.h
effect-enum.h
effect.h
lpe-angle_bisector.h
@@ -101,6 +99,8 @@ set(live_effects_SRC
lpegroupbbox.h
lpeobject-reference.h
lpeobject.h
+ spiro.h
+ spiro-converters.h
parameter/array.h
parameter/bool.h
@@ -115,7 +115,7 @@ set(live_effects_SRC
parameter/text.h
parameter/unit.h
parameter/vector.h
- spiro.h
+
)
# add_inkscape_lib(live_effects_LIB "${live_effects_SRC}")
diff --git a/src/live_effects/Makefile_insert b/src/live_effects/Makefile_insert
index 74356f563..9c3c171f2 100644
--- a/src/live_effects/Makefile_insert
+++ b/src/live_effects/Makefile_insert
@@ -50,9 +50,8 @@ ink_common_sources += \
live_effects/lpe-perp_bisector.h \
live_effects/spiro.h \
live_effects/spiro.cpp \
- live_effects/bezctx.h \
- live_effects/bezctx_intf.h \
- live_effects/bezctx.cpp \
+ live_effects/spiro-converters.h \
+ live_effects/spiro-converters.cpp \
live_effects/lpe-circle_with_radius.cpp \
live_effects/lpe-circle_with_radius.h \
live_effects/lpe-perspective_path.cpp \
diff --git a/src/live_effects/bezctx.cpp b/src/live_effects/bezctx.cpp
deleted file mode 100644
index 722f5dbaf..000000000
--- a/src/live_effects/bezctx.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-ppedit - A pattern plate editor for Spiro splines.
-Copyright (C) 2007 Raph Levien
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.
-
-*/
-#include "bezctx.h"
-
-void bezctx_moveto(bezctx *bc, double x, double y, int is_open)
-{
- bc->moveto(bc, x, y, is_open);
-}
-
-void bezctx_lineto(bezctx *bc, double x, double y)
-{
- bc->lineto(bc, x, y);
-}
-
-void bezctx_quadto(bezctx *bc, double x1, double y1, double x2, double y2)
-{
- bc->quadto(bc, x1, y1, x2, y2);
-}
-
-void bezctx_curveto(bezctx *bc, double x1, double y1, double x2, double y2,
- double x3, double y3)
-{
- bc->curveto(bc, x1, y1, x2, y2, x3, y3);
-}
-
-void bezctx_mark_knot(bezctx *bc, int knot_idx)
-{
- if (bc->mark_knot)
- bc->mark_knot(bc, knot_idx);
-}
diff --git a/src/live_effects/bezctx.h b/src/live_effects/bezctx.h
deleted file mode 100644
index 057312e5a..000000000
--- a/src/live_effects/bezctx.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "bezctx_intf.h"
-
-struct _bezctx {
- void (*moveto)(bezctx *bc, double x, double y, int is_open);
- void (*lineto)(bezctx *bc, double x, double y);
- void (*quadto)(bezctx *bc, double x1, double y1, double x2, double y2);
- void (*curveto)(bezctx *bc, double x1, double y1, double x2, double y2,
- double x3, double y3);
- void (*mark_knot)(bezctx *bc, int knot_idx);
-};
diff --git a/src/live_effects/bezctx_intf.h b/src/live_effects/bezctx_intf.h
deleted file mode 100644
index a47b8ef5a..000000000
--- a/src/live_effects/bezctx_intf.h
+++ /dev/null
@@ -1,20 +0,0 @@
-typedef struct _bezctx bezctx;
-
-bezctx *
-new_bezctx(void);
-
-void
-bezctx_moveto(bezctx *bc, double x, double y, int is_open);
-
-void
-bezctx_lineto(bezctx *bc, double x, double y);
-
-void
-bezctx_quadto(bezctx *bc, double x1, double y1, double x2, double y2);
-
-void
-bezctx_curveto(bezctx *bc, double x1, double y1, double x2, double y2,
- double x3, double y3);
-
-void
-bezctx_mark_knot(bezctx *bc, int knot_idx);
diff --git a/src/live_effects/lpe-powerstroke-interpolators.h b/src/live_effects/lpe-powerstroke-interpolators.h
index 7f9cb3ddb..6f5b75af8 100644
--- a/src/live_effects/lpe-powerstroke-interpolators.h
+++ b/src/live_effects/lpe-powerstroke-interpolators.h
@@ -16,8 +16,6 @@
#include <2geom/bezier-utils.h>
#include <2geom/sbasis-to-bezier.h>
-#include "live_effects/bezctx.h"
-#include "live_effects/bezctx_intf.h"
#include "live_effects/spiro.h"
@@ -136,7 +134,6 @@ private:
};
-#define SPIRO_SHOW_INFINITE_COORDINATE_CALLS
class SpiroInterpolator : public Interpolator {
public:
SpiroInterpolator() {};
@@ -148,8 +145,7 @@ public:
Coord scale_y = 100.;
guint len = points.size();
- bezctx *bc = new_bezctx_ink(&fit);
- spiro_cp *controlpoints = g_new (spiro_cp, len);
+ Spiro::spiro_cp *controlpoints = g_new (Spiro::spiro_cp, len);
for (unsigned int i = 0; i < len; ++i) {
controlpoints[i].x = points[i][X];
controlpoints[i].y = points[i][Y] / scale_y;
@@ -160,88 +156,13 @@ public:
controlpoints[len-2].ty = 'v';
controlpoints[len-1].ty = '}';
- spiro_seg *s = run_spiro(controlpoints, len);
- spiro_to_bpath(s, len, bc);
- free(s);
- free(bc);
+ Spiro::spiro_run(controlpoints, len, fit);
fit *= Scale(1,scale_y);
return fit;
};
private:
- typedef struct {
- bezctx base;
- Path *path;
- int is_open;
- } bezctx_ink;
-
- static void bezctx_ink_moveto(bezctx *bc, double x, double y, int /*is_open*/)
- {
- bezctx_ink *bi = (bezctx_ink *) bc;
- if ( IS_FINITE(x) && IS_FINITE(y) ) {
- bi->path->start(Point(x, y));
- }
- #ifdef SPIRO_SHOW_INFINITE_COORDINATE_CALLS
- else {
- g_message("spiro moveto not finite");
- }
- #endif
- }
-
- static void bezctx_ink_lineto(bezctx *bc, double x, double y)
- {
- bezctx_ink *bi = (bezctx_ink *) bc;
- if ( IS_FINITE(x) && IS_FINITE(y) ) {
- bi->path->appendNew<LineSegment>( Point(x, y) );
- }
- #ifdef SPIRO_SHOW_INFINITE_COORDINATE_CALLS
- else {
- g_message("spiro lineto not finite");
- }
- #endif
- }
-
- static void bezctx_ink_quadto(bezctx *bc, double xm, double ym, double x3, double y3)
- {
- bezctx_ink *bi = (bezctx_ink *) bc;
-
- if ( IS_FINITE(xm) && IS_FINITE(ym) && IS_FINITE(x3) && IS_FINITE(y3) ) {
- bi->path->appendNew<QuadraticBezier>(Point(xm, ym), Point(x3, y3));
- }
- #ifdef SPIRO_SHOW_INFINITE_COORDINATE_CALLS
- else {
- g_message("spiro quadto not finite");
- }
- #endif
- }
-
- static void bezctx_ink_curveto(bezctx *bc, double x1, double y1, double x2, double y2,
- double x3, double y3)
- {
- bezctx_ink *bi = (bezctx_ink *) bc;
- if ( IS_FINITE(x1) && IS_FINITE(y1) && IS_FINITE(x2) && IS_FINITE(y2) ) {
- bi->path->appendNew<CubicBezier>(Point(x1, y1), Point(x2, y2), Point(x3, y3));
- }
- #ifdef SPIRO_SHOW_INFINITE_COORDINATE_CALLS
- else {
- g_message("spiro curveto not finite");
- }
- #endif
- }
-
- bezctx *
- new_bezctx_ink(Geom::Path *path) const {
- bezctx_ink *result = g_new(bezctx_ink, 1);
- result->base.moveto = bezctx_ink_moveto;
- result->base.lineto = bezctx_ink_lineto;
- result->base.quadto = bezctx_ink_quadto;
- result->base.curveto = bezctx_ink_curveto;
- result->base.mark_knot = NULL;
- result->path = path;
- return &result->base;
- }
-
SpiroInterpolator(const SpiroInterpolator&);
SpiroInterpolator& operator=(const SpiroInterpolator&);
};
diff --git a/src/live_effects/lpe-powerstroke.cpp b/src/live_effects/lpe-powerstroke.cpp
index 257dba8ea..d3843dc92 100644
--- a/src/live_effects/lpe-powerstroke.cpp
+++ b/src/live_effects/lpe-powerstroke.cpp
@@ -5,7 +5,7 @@
/* Authors:
* Johan Engelen <j.b.c.engelen@alumnus.utwente.nl>
*
- * Copyright (C) 2010-2011 Authors
+ * Copyright (C) 2010-2012 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -26,9 +26,12 @@
#include <2geom/svg-path.h>
#include <2geom/path-intersection.h>
#include <2geom/crossing.h>
+#include <2geom/ellipse.h>
-namespace Geom {
+#include "spiro.h"
+namespace Geom {
+// should all be moved to 2geom at some point
Point unitTangentAt( D2<SBasis> const & a, Coord t, unsigned n = 3) {
std::vector<Point> derivs = a.valueAndDerivatives(t, n);
@@ -55,8 +58,48 @@ boost::optional<Point> intersection_point( Point const & origin_a, Point const &
return boost::none;
}
+Geom::CubicBezier sbasis_to_cubicbezier(Geom::D2<Geom::SBasis> const & sbasis_in)
+{
+ std::vector<Geom::Point> temp;
+ sbasis_to_bezier(temp, sbasis_in, 4);
+ return Geom::CubicBezier( temp );
+}
+
+/**
+ * document this!
+ * very quick: this finds the ellipse with minimum eccentricity
+ passing through point P and Q, with tangent PO at P and QO at Q
+ http://mathforum.org/kb/message.jspa?messageID=7471596&tstart=0
+ */
+static Ellipse find_ellipse(Point P, Point Q, Point O)
+{
+ Point p = P - O;
+ Point q = Q - O;
+ Coord K = 4 * dot(p,q) / (L2sq(p) + L2sq(q));
+
+ double cross = p[Y]*q[X] - p[X]*q[Y];
+ double a = -q[Y]/cross;
+ double b = q[X]/cross;
+ double c = (O[X]*q[Y] - O[Y]*q[X])/cross;
+
+ double d = p[Y]/cross;
+ double e = -p[X]/cross;
+ double f = (-O[X]*p[Y] + O[Y]*p[X])/cross;
+
+ // Ax^2 + Bxy + Cy^2 + Dx + Ey + F = 0
+ double A = (a*d*K+d*d+a*a);
+ double B = (a*e*K+b*d*K+2*d*e+2*a*b);
+ double C = (b*e*K+e*e+b*b);
+ double D = (a*f*K+c*d*K+2*d*f-2*d+2*a*c-2*a);
+ double E = (b*f*K+c*e*K+2*e*f-2*e+2*b*c-2*b);
+ double F = c*f*K+f*f-2*f+c*c-2*c+1;
+
+ return Ellipse(A, B, C, D, E, F);
}
+
+} // namespace Geom
+
namespace Inkscape {
namespace LivePathEffect {
@@ -84,19 +127,21 @@ static const Util::EnumData<unsigned> LineCapTypeData[] = {
};
static const Util::EnumDataConverter<unsigned> LineCapTypeConverter(LineCapTypeData, sizeof(LineCapTypeData)/sizeof(*LineCapTypeData));
-enum LineCuspType {
- LINECUSP_BEVEL,
- LINECUSP_ROUND,
- LINECUSP_EXTRP_MITER,
- LINECUSP_MITER
+enum LineJoinType {
+ LINEJOIN_BEVEL,
+ LINEJOIN_ROUND,
+ LINEJOIN_EXTRP_MITER,
+ LINEJOIN_MITER,
+ LINEJOIN_SPIRO
};
-static const Util::EnumData<unsigned> LineCuspTypeData[] = {
- {LINECUSP_BEVEL, N_("Beveled"), "bevel"},
- {LINECUSP_ROUND, N_("Rounded"), "round"},
- {LINECUSP_EXTRP_MITER, N_("Extrapolated"), "extrapolated"},
- {LINECUSP_MITER, N_("Miter"), "miter"},
+static const Util::EnumData<unsigned> LineJoinTypeData[] = {
+ {LINEJOIN_BEVEL, N_("Beveled"), "bevel"},
+ {LINEJOIN_ROUND, N_("Rounded"), "round"},
+ {LINEJOIN_EXTRP_MITER, N_("Extrapolated"), "extrapolated"},
+ {LINEJOIN_MITER, N_("Miter"), "miter"},
+ {LINEJOIN_SPIRO, N_("Spiro"), "spiro"},
};
-static const Util::EnumDataConverter<unsigned> LineCuspTypeConverter(LineCuspTypeData, sizeof(LineCuspTypeData)/sizeof(*LineCuspTypeData));
+static const Util::EnumDataConverter<unsigned> LineJoinTypeConverter(LineJoinTypeData, sizeof(LineJoinTypeData)/sizeof(*LineJoinTypeData));
LPEPowerStroke::LPEPowerStroke(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
@@ -105,7 +150,7 @@ LPEPowerStroke::LPEPowerStroke(LivePathEffectObject *lpeobject) :
interpolator_type(_("Interpolator type"), _("Determines which kind of interpolator will be used to interpolate between stroke width along the path."), "interpolator_type", InterpolatorTypeConverter, &wr, this, Geom::Interpolate::INTERP_CUBICBEZIER_JOHAN),
interpolator_beta(_("Smoothness"), _("Sets the smoothness for the CubicBezierJohan interpolator. 0 = linear interpolation, 1 = smooth"), "interpolator_beta", &wr, this, 0.2),
start_linecap_type(_("Start cap"), _("Determines the shape of the path's start."), "start_linecap_type", LineCapTypeConverter, &wr, this, LINECAP_ROUND),
- cusp_linecap_type(_("Join"), _("Specifies the shape of the path's corners."), "cusp_linecap_type", LineCuspTypeConverter, &wr, this, LINECUSP_ROUND),
+ linejoin_type(_("Join"), _("Specifies the shape of the path's corners."), "linejoin_type", LineJoinTypeConverter, &wr, this, LINEJOIN_ROUND),
miter_limit(_("Miter limit"), _("Maximum length of the miter (in units of stroke width)"), "miter_limit", &wr, this, 4.),
end_linecap_type(_("End cap"), _("Determines the shape of the path's end."), "end_linecap_type", LineCapTypeConverter, &wr, this, LINECAP_ROUND)
{
@@ -121,7 +166,7 @@ LPEPowerStroke::LPEPowerStroke(LivePathEffectObject *lpeobject) :
registerParameter( dynamic_cast<Parameter *>(&interpolator_type) );
registerParameter( dynamic_cast<Parameter *>(&interpolator_beta) );
registerParameter( dynamic_cast<Parameter *>(&start_linecap_type) );
- registerParameter( dynamic_cast<Parameter *>(&cusp_linecap_type) );
+ registerParameter( dynamic_cast<Parameter *>(&linejoin_type) );
registerParameter( dynamic_cast<Parameter *>(&miter_limit) );
registerParameter( dynamic_cast<Parameter *>(&end_linecap_type) );
}
@@ -163,9 +208,9 @@ static bool compare_offsets (Geom::Point first, Geom::Point second)
// find discontinuities in input path
struct discontinuity_data {
- Geom::Point der0; // unit derivative of 'left' side of cusp
- Geom::Point der1; // unit derivative of 'right' side of cusp
- double width; // intended stroke width at cusp
+ Geom::Point der0; // unit derivative of 'left' side of join
+ Geom::Point der1; // unit derivative of 'right' side of join
+ double width; // intended stroke width at join
};
std::vector<discontinuity_data> find_discontinuities( Geom::Piecewise<Geom::D2<Geom::SBasis> > const & der,
Geom::Piecewise<Geom::SBasis> const & x,
@@ -176,8 +221,16 @@ std::vector<discontinuity_data> find_discontinuities( Geom::Piecewise<Geom::D2<G
for(unsigned i = 1; i < der.size(); i++) {
if ( ! are_near(der[i-1].at1(), der[i].at0(), eps) ) {
discontinuity_data data;
+
data.der0 = der[i-1].at1();
data.der1 = der[i].at0();
+ if ( Geom::are_near(data.der0.length(), 0) ) {
+ data.der0 = unitTangentAt(der[i-1], 1, 2);
+ }
+ if ( Geom::are_near(data.der1.length(), 0) ) {
+ data.der1 = unitTangentAt(der[i], 0, 2);
+ }
+
double t = der.cuts[i];
std::vector< double > rts = roots (x - t); /// @todo this has multiple solutions for general strokewidth paths (generated by spiro interpolator...), ignore for now
if (!rts.empty()) {
@@ -194,12 +247,12 @@ std::vector<discontinuity_data> find_discontinuities( Geom::Piecewise<Geom::D2<G
Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis> > const & B,
std::vector<discontinuity_data> const & cusps,
- LineCuspType cusp_linecap,
+ LineJoinType jointype,
double miter_limit,
bool forward_direction,
double tol=Geom::EPSILON)
{
-/* per definition, each discontinuity should be fixed with a cusp-ending, as defined by cusp_linecap_type
+/* per definition, each discontinuity should be fixed with a join-ending, as defined by linejoin_type
*/
Geom::PathBuilder pb;
if (B.size() == 0) {
@@ -223,14 +276,41 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
{ // discontinuity found, so fix it :-)
discontinuity_data cusp = cusps[cusp_i];
- switch (cusp_linecap) {
- case LINECUSP_ROUND: // properly bugged ^_^
- pb.arcTo( abs(cusp.width), abs(cusp.width),
- angle_between(cusp.der0, cusp.der1), false, cusp.width < 0,
- B[i].at0() );
+ bool on_outside = ( sign*cusp.width*angle_between(cusp.der0, cusp.der1) < 0. );
+
+ switch (jointype) {
+ case LINEJOIN_ROUND: {
+ if (on_outside) {
+ // we are on the outside: round corner
+ /* for constant width paths, the rounding is a circular arc (rx == ry),
+ for non-constant width paths, the rounding can be done with an ellipse but is hard and ambiguous.
+ The elliptical arc should go through the discontinuity's start and end points (of course!)
+ and also should match the discontinuity tangents at those start and end points.
+ To resolve the ambiguity, the elliptical arc with minimal eccentricity should be chosen.
+ A 2Geom method was created to do exactly this :)
+ */
+
+ Geom::Point tang1 = unitTangentAt(B[prev_i],1);
+ Geom::Point tang2 = unitTangentAt(B[i],0);
+ boost::optional<Geom::Point> O = intersection_point( B[prev_i].at1(), tang1,
+ B[i].at0(), tang2 );
+ if (!O) {
+ // no center found, i.e. 180 degrees round
+ pb.lineTo(B[i].at0()); // default to bevel for too shallow cusp angles
+ break;
+ }
+
+ Geom::Ellipse ellipse = find_ellipse(B[prev_i].at1(), B[i].at0(), *O);
+ pb.arcTo( ellipse.ray(Geom::X), ellipse.ray(Geom::Y), ellipse.rot_angle(),
+ false, cusp.width < 0, B[i].at0() );
+ } else {
+ // we are on the inside, do a simple bevel to connect the paths
+ pb.lineTo(B[i].at0()); // default to bevel for too shallow cusp angles
+ }
break;
-/* case LINECUSP_NONE: {
- if ( sign*cusp.width*angle_between(cusp.der0, cusp.der1) < 0.) {
+ }
+/* case LINEJOIN_NONE: {
+ if ( on_outside ) {
// we are on the outside
Geom::Point der1 = unitTangentAt(B[prev_i],1);
Geom::Point point_on_path = B[prev_i].at1() - rot90(der1) * cusp.width;
@@ -241,24 +321,18 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
pb.lineTo(B[i].at0()); // default to bevel for too shallow cusp angles
}
} */
- case LINECUSP_EXTRP_MITER: {
- // first figure out whether we are on the outside or inside of the corner in the path
- if ( sign*cusp.width*angle_between(cusp.der0, cusp.der1) < 0.) {
+ case LINEJOIN_EXTRP_MITER: {
+ if (on_outside) {
// we are on the outside, do something complicated to make it look good ;)
Geom::Point der1 = unitTangentAt(B[prev_i],1);
Geom::Point der2 = unitTangentAt(B[i],0);
Geom::D2<Geom::SBasis> newcurve1 = B[prev_i] * Geom::reflection(rot90(der1), B[prev_i].at1());
- newcurve1 = reverse(newcurve1);
- std::vector<Geom::Point> temp;
- sbasis_to_bezier(temp, newcurve1, 4);
- Geom::CubicBezier bzr1( temp );
+ Geom::CubicBezier bzr1 = sbasis_to_cubicbezier( reverse(newcurve1) );
Geom::D2<Geom::SBasis> newcurve2 = B[i] * Geom::reflection(rot90(der2), B[i].at0());
- newcurve2 = reverse(newcurve2);
- sbasis_to_bezier(temp, newcurve2, 4);
- Geom::CubicBezier bzr2( temp );
+ Geom::CubicBezier bzr2 = sbasis_to_cubicbezier( reverse(newcurve2) );
Geom::Crossings cross = crossings(bzr1, bzr2);
if (cross.empty()) {
@@ -285,9 +359,8 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
}
break;
}
- case LINECUSP_MITER: {
- // first figure out whether we are on the outside or inside of the corner in the path
- if ( sign*cusp.width*angle_between(cusp.der0, cusp.der1) < 0.) {
+ case LINEJOIN_MITER: {
+ if (on_outside) {
// we are on the outside, do something complicated to make it look good ;)
Geom::Point der1 = unitTangentAt(B[prev_i],1);
@@ -310,7 +383,39 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
}
break;
}
- case LINECUSP_BEVEL:
+ case LINEJOIN_SPIRO: {
+ if (on_outside) {
+ Geom::Point tang1 = unitTangentAt(B[prev_i],1);
+ Geom::Point tang2 = unitTangentAt(B[i],0);
+
+ Geom::Point direction = B[i].at0() - B[prev_i].at1();
+ double tang1_sign = dot(direction,tang1);
+ double tang2_sign = dot(direction,tang2);
+
+ Spiro::spiro_cp *controlpoints = g_new (Spiro::spiro_cp, 4);
+ controlpoints[0].x = (B[prev_i].at1() - tang1_sign*tang1)[Geom::X];
+ controlpoints[0].y = (B[prev_i].at1() - tang1_sign*tang1)[Geom::Y];
+ controlpoints[0].ty = '{';
+ controlpoints[1].x = B[prev_i].at1()[Geom::X];
+ controlpoints[1].y = B[prev_i].at1()[Geom::Y];
+ controlpoints[1].ty = ']';
+ controlpoints[2].x = B[i].at0()[Geom::X];
+ controlpoints[2].y = B[i].at0()[Geom::Y];
+ controlpoints[2].ty = '[';
+ controlpoints[3].x = (B[i].at0() + tang2_sign*tang2)[Geom::X];
+ controlpoints[3].y = (B[i].at0() + tang2_sign*tang2)[Geom::Y];
+ controlpoints[3].ty = '}';
+
+ Geom::Path spiro;
+ Spiro::spiro_run(controlpoints, 4, spiro);
+ pb.append(spiro.portion(1,spiro.size_open()-1), Geom::Path::STITCH_DISCONTINUOUS);
+ } else {
+ // we are on the inside, do a simple bevel to connect the paths
+ pb.lineTo(B[i].at0()); // default to bevel for too shallow cusp angles
+ }
+ break;
+ }
+ case LINEJOIN_BEVEL:
default:
pb.lineTo(B[i].at0());
break;
@@ -388,13 +493,13 @@ LPEPowerStroke::doEffect_path (std::vector<Geom::Path> const & path_in)
}
std::vector<discontinuity_data> cusps = find_discontinuities(der, x, y);
- LineCuspType cusp_linecap = static_cast<LineCuspType>(cusp_linecap_type.get_value());
+ LineJoinType jointype = static_cast<LineJoinType>(linejoin_type.get_value());
Piecewise<D2<SBasis> > pwd2_out = compose(pwd2_in,x) + y*compose(n,x);
Piecewise<D2<SBasis> > mirrorpath = reverse(compose(pwd2_in,x) - y*compose(n,x));
- Geom::Path fixed_path = path_from_piecewise_fix_cusps( pwd2_out, cusps, cusp_linecap, miter_limit, true, LPE_CONVERSION_TOLERANCE);
- Geom::Path fixed_mirrorpath = path_from_piecewise_fix_cusps( mirrorpath, cusps, cusp_linecap, miter_limit, false, LPE_CONVERSION_TOLERANCE);
+ Geom::Path fixed_path = path_from_piecewise_fix_cusps( pwd2_out, cusps, jointype, miter_limit, true, LPE_CONVERSION_TOLERANCE);
+ Geom::Path fixed_mirrorpath = path_from_piecewise_fix_cusps( mirrorpath, cusps, jointype, miter_limit, false, LPE_CONVERSION_TOLERANCE);
if (path_in[0].closed()) {
fixed_path.close(true);
diff --git a/src/live_effects/lpe-powerstroke.h b/src/live_effects/lpe-powerstroke.h
index a5bb8c836..e6c915234 100644
--- a/src/live_effects/lpe-powerstroke.h
+++ b/src/live_effects/lpe-powerstroke.h
@@ -39,7 +39,7 @@ private:
EnumParam<unsigned> interpolator_type;
ScalarParam interpolator_beta;
EnumParam<unsigned> start_linecap_type;
- EnumParam<unsigned> cusp_linecap_type;
+ EnumParam<unsigned> linejoin_type;
ScalarParam miter_limit;
EnumParam<unsigned> end_linecap_type;
diff --git a/src/live_effects/lpe-spiro.cpp b/src/live_effects/lpe-spiro.cpp
index 22974fe13..8b4274ab2 100644
--- a/src/live_effects/lpe-spiro.cpp
+++ b/src/live_effects/lpe-spiro.cpp
@@ -15,8 +15,6 @@
#include "helper/geom-nodetype.h"
#include "helper/geom-curves.h"
-#include "live_effects/bezctx.h"
-#include "live_effects/bezctx_intf.h"
#include "live_effects/spiro.h"
// For handling un-continuous paths:
@@ -24,82 +22,6 @@
#include "inkscape.h"
#include "desktop.h"
-#define SPIRO_SHOW_INFINITE_COORDINATE_CALLS
-
-typedef struct {
- bezctx base;
- SPCurve *curve;
- int is_open;
-} bezctx_ink;
-
-void bezctx_ink_moveto(bezctx *bc, double x, double y, int /*is_open*/)
-{
- bezctx_ink *bi = (bezctx_ink *) bc;
- if ( IS_FINITE(x) && IS_FINITE(y) ) {
- bi->curve->moveto(x, y);
- }
-#ifdef SPIRO_SHOW_INFINITE_COORDINATE_CALLS
- else {
- g_message("lpe moveto not finite");
- }
-#endif
-}
-
-void bezctx_ink_lineto(bezctx *bc, double x, double y)
-{
- bezctx_ink *bi = (bezctx_ink *) bc;
- if ( IS_FINITE(x) && IS_FINITE(y) ) {
- bi->curve->lineto(x, y);
- }
-#ifdef SPIRO_SHOW_INFINITE_COORDINATE_CALLS
- else {
- g_message("lpe lineto not finite");
- }
-#endif
-}
-
-void bezctx_ink_quadto(bezctx *bc, double xm, double ym, double x3, double y3)
-{
- bezctx_ink *bi = (bezctx_ink *) bc;
-
- if ( IS_FINITE(xm) && IS_FINITE(ym) && IS_FINITE(x3) && IS_FINITE(y3) ) {
- bi->curve->quadto(xm, ym, x3, y3);
- }
-#ifdef SPIRO_SHOW_INFINITE_COORDINATE_CALLS
- else {
- g_message("lpe quadto not finite");
- }
-#endif
-}
-
-void bezctx_ink_curveto(bezctx *bc, double x1, double y1, double x2, double y2,
- double x3, double y3)
-{
- bezctx_ink *bi = (bezctx_ink *) bc;
- if ( IS_FINITE(x1) && IS_FINITE(y1) && IS_FINITE(x2) && IS_FINITE(y2) ) {
- bi->curve->curveto(x1, y1, x2, y2, x3, y3);
- }
-#ifdef SPIRO_SHOW_INFINITE_COORDINATE_CALLS
- else {
- g_message("lpe curveto not finite");
- }
-#endif
-}
-
-bezctx *
-new_bezctx_ink(SPCurve *curve) {
- bezctx_ink *result = g_new(bezctx_ink, 1);
- result->base.moveto = bezctx_ink_moveto;
- result->base.lineto = bezctx_ink_lineto;
- result->base.quadto = bezctx_ink_quadto;
- result->base.curveto = bezctx_ink_curveto;
- result->base.mark_knot = NULL;
- result->curve = curve;
- return &result->base;
-}
-
-
-
namespace Inkscape {
namespace LivePathEffect {
@@ -124,8 +46,7 @@ LPESpiro::doEffect(SPCurve * curve)
guint len = curve->get_segment_count() + 2;
curve->reset();
- bezctx *bc = new_bezctx_ink(curve);
- spiro_cp *path = g_new (spiro_cp, len);
+ Spiro::spiro_cp *path = g_new (Spiro::spiro_cp, len);
int ip = 0;
for(Geom::PathVector::const_iterator path_it = original_pathv.begin(); path_it != original_pathv.end(); ++path_it) {
@@ -218,9 +139,7 @@ LPESpiro::doEffect(SPCurve * curve)
// run subpath through spiro
int sp_len = ip;
- spiro_seg *s = run_spiro(path, sp_len);
- spiro_to_bpath(s, sp_len, bc);
- free(s);
+ Spiro::spiro_run(path, sp_len, *curve);
ip = 0;
}
diff --git a/src/live_effects/spiro-converters.cpp b/src/live_effects/spiro-converters.cpp
new file mode 100644
index 000000000..3c7bdf99e
--- /dev/null
+++ b/src/live_effects/spiro-converters.cpp
@@ -0,0 +1,123 @@
+/* Authors:
+ * Johan Engelen
+ *
+ * Copyright (C) 2010-2012 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "spiro-converters.h"
+#include <2geom/path.h>
+#include "display/curve.h"
+#include <glib.h>
+
+#define SPIRO_SHOW_INFINITE_COORDINATE_CALLS
+#ifdef SPIRO_SHOW_INFINITE_COORDINATE_CALLS
+# define SPIRO_G_MESSAGE(x) g_message(x)
+#else
+# define SPIRO_G_MESSAGE(x)
+#endif
+
+namespace Spiro {
+
+void
+ConverterSPCurve::moveto(double x, double y, bool is_open)
+{
+ if ( IS_FINITE(x) && IS_FINITE(y) ) {
+ _curve.moveto(x, y);
+ if (!is_open) {
+ _curve.closepath();
+ }
+ } else {
+ SPIRO_G_MESSAGE("Spiro: moveto not finite");
+ }
+}
+
+void
+ConverterSPCurve::lineto(double x, double y)
+{
+ if ( IS_FINITE(x) && IS_FINITE(y) ) {
+ _curve.lineto(x, y);
+ } else {
+ SPIRO_G_MESSAGE("Spiro: lineto not finite");
+ }
+}
+
+void
+ConverterSPCurve::quadto(double xm, double ym, double x3, double y3)
+{
+ if ( IS_FINITE(xm) && IS_FINITE(ym) && IS_FINITE(x3) && IS_FINITE(y3) ) {
+ _curve.quadto(xm, ym, x3, y3);
+ } else {
+ SPIRO_G_MESSAGE("Spiro: quadto not finite");
+ }
+}
+
+void
+ConverterSPCurve::curveto(double x1, double y1, double x2, double y2, double x3, double y3)
+{
+ if ( IS_FINITE(x1) && IS_FINITE(y1) && IS_FINITE(x2) && IS_FINITE(y2) ) {
+ _curve.curveto(x1, y1, x2, y2, x3, y3);
+ } else {
+ SPIRO_G_MESSAGE("Spiro: curveto not finite");
+ }
+}
+
+
+
+
+void
+ConverterPath::moveto(double x, double y, bool is_open)
+{
+ if ( IS_FINITE(x) && IS_FINITE(y) ) {
+ _path.start(Geom::Point(x, y));
+ _path.close(!is_open);
+ } else {
+ SPIRO_G_MESSAGE("spiro moveto not finite");
+ }
+}
+
+void
+ConverterPath::lineto(double x, double y)
+{
+ if ( IS_FINITE(x) && IS_FINITE(y) ) {
+ _path.appendNew<Geom::LineSegment>( Geom::Point(x, y) );
+ } else {
+ SPIRO_G_MESSAGE("spiro lineto not finite");
+ }
+}
+
+void
+ConverterPath::quadto(double xm, double ym, double x3, double y3)
+{
+ if ( IS_FINITE(xm) && IS_FINITE(ym) && IS_FINITE(x3) && IS_FINITE(y3) ) {
+ _path.appendNew<Geom::QuadraticBezier>(Geom::Point(xm, ym), Geom::Point(x3, y3));
+ } else {
+ SPIRO_G_MESSAGE("spiro quadto not finite");
+ }
+}
+
+void
+ConverterPath::curveto(double x1, double y1, double x2, double y2, double x3, double y3)
+{
+ if ( IS_FINITE(x1) && IS_FINITE(y1) && IS_FINITE(x2) && IS_FINITE(y2) ) {
+ _path.appendNew<Geom::CubicBezier>(Geom::Point(x1, y1), Geom::Point(x2, y2), Geom::Point(x3, y3));
+ } else {
+ SPIRO_G_MESSAGE("spiro curveto not finite");
+ }
+}
+
+} // namespace Spiro
+
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/spiro-converters.h b/src/live_effects/spiro-converters.h
new file mode 100644
index 000000000..83f6ebbc3
--- /dev/null
+++ b/src/live_effects/spiro-converters.h
@@ -0,0 +1,67 @@
+#ifndef INKSCAPE_SPIRO_CONVERTERS_H
+#define INKSCAPE_SPIRO_CONVERTERS_H
+
+#include <2geom/forward.h>
+class SPCurve;
+
+namespace Spiro {
+
+class ConverterBase {
+public:
+ ConverterBase() {};
+ virtual ~ConverterBase() {};
+
+ virtual void moveto(double x, double y, bool is_open) = 0;
+ virtual void lineto(double x, double y) = 0;
+ virtual void quadto(double x1, double y1, double x2, double y2) = 0;
+ virtual void curveto(double x1, double y1, double x2, double y2, double x3, double y3) = 0;
+};
+
+
+/**
+ * Converts Spiro to Inkscape's SPCurve
+ */
+class ConverterSPCurve : public ConverterBase {
+public:
+ ConverterSPCurve(SPCurve &curve)
+ : _curve(curve)
+ {} ;
+
+ virtual void moveto(double x, double y, bool is_open);
+ virtual void lineto(double x, double y);
+ virtual void quadto(double x1, double y1, double x2, double y2);
+ virtual void curveto(double x1, double y1, double x2, double y2, double x3, double y3);
+
+private:
+ SPCurve &_curve;
+
+ ConverterSPCurve(const ConverterSPCurve&);
+ ConverterSPCurve& operator=(const ConverterSPCurve&);
+};
+
+
+/**
+ * Converts Spiro to 2Geom's Path
+ */
+class ConverterPath : public ConverterBase {
+public:
+ ConverterPath(Geom::Path &path)
+ : _path(path)
+ {} ;
+
+ virtual void moveto(double x, double y, bool is_open);
+ virtual void lineto(double x, double y);
+ virtual void quadto(double x1, double y1, double x2, double y2);
+ virtual void curveto(double x1, double y1, double x2, double y2, double x3, double y3);
+
+private:
+ Geom::Path &_path;
+
+ ConverterPath(const ConverterPath&);
+ ConverterPath& operator=(const ConverterPath&);
+};
+
+
+} // namespace Spiro
+
+#endif
diff --git a/src/live_effects/spiro.cpp b/src/live_effects/spiro.cpp
index b98e12213..e4b72793c 100644
--- a/src/live_effects/spiro.cpp
+++ b/src/live_effects/spiro.cpp
@@ -1,6 +1,8 @@
/*
-ppedit - A pattern plate editor for Spiro splines.
-Copyright (C) 2007 Raph Levien
+Copyright (C) 2007-2012 Authors
+
+Authors: Raph Levien
+ Johan Engelen
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@@ -20,12 +22,39 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
*/
/* C implementation of third-order polynomial spirals. */
+#include "spiro.h"
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
-#include "bezctx_intf.h"
-#include "spiro.h"
+#include "display/curve.h"
+#include <2geom/math-utils.h>
+
+#define SPIRO_SHOW_INFINITE_COORDINATE_CALLS
+
+namespace Spiro {
+
+void spiro_run(const spiro_cp *src, int src_len, SPCurve &curve)
+{
+ spiro_seg *s = Spiro::run_spiro(src, src_len);
+ Spiro::ConverterSPCurve bc(curve);
+ Spiro::spiro_to_otherpath(s, src_len, bc);
+ free(s);
+}
+
+void spiro_run(const spiro_cp *src, int src_len, Geom::Path &path)
+{
+ spiro_seg *s = Spiro::run_spiro(src, src_len);
+ Spiro::ConverterPath bc(path);
+ Spiro::spiro_to_otherpath(s, src_len, bc);
+ free(s);
+}
+
+
+/************************************
+ * Spiro math
+ */
struct spiro_seg_s {
double x;
@@ -814,15 +843,15 @@ solve_spiro(spiro_seg *s, int nseg)
}
static void
-spiro_seg_to_bpath(const double ks[4],
+spiro_seg_to_otherpath(const double ks[4],
double x0, double y0, double x1, double y1,
- bezctx *bc, int depth)
+ ConverterBase &bc, int depth)
{
double bend = fabs(ks[0]) + fabs(.5 * ks[1]) + fabs(.125 * ks[2]) +
fabs((1./48) * ks[3]);
if (!bend > 1e-8) {
- bezctx_lineto(bc, x1, y1);
+ bc.lineto(x1, y1);
} else {
double seg_ch = hypot(x1 - x0, y1 - y0);
double seg_th = atan2(y1 - y0, x1 - x0);
@@ -845,7 +874,7 @@ spiro_seg_to_bpath(const double ks[4],
vl = (scale * (1./3)) * sin(th_even - th_odd);
ur = (scale * (1./3)) * cos(th_even + th_odd);
vr = (scale * (1./3)) * sin(th_even + th_odd);
- bezctx_curveto(bc, x0 + ul, y0 + vl, x1 - ur, y1 - vr, x1, y1);
+ bc.curveto(x0 + ul, y0 + vl, x1 - ur, y1 - vr, x1, y1);
} else {
/* subdivide */
double ksub[4];
@@ -864,11 +893,11 @@ spiro_seg_to_bpath(const double ks[4],
integrate_spiro(ksub, xysub);
xmid = x0 + cth * xysub[0] - sth * xysub[1];
ymid = y0 + cth * xysub[1] + sth * xysub[0];
- spiro_seg_to_bpath(ksub, x0, y0, xmid, ymid, bc, depth + 1);
+ spiro_seg_to_otherpath(ksub, x0, y0, xmid, ymid, bc, depth + 1);
ksub[0] += .25 * ks[1] + (1./384) * ks[3];
ksub[1] += .125 * ks[2];
ksub[2] += (1./16) * ks[3];
- spiro_seg_to_bpath(ksub, xmid, ymid, x1, y1, bc, depth + 1);
+ spiro_seg_to_otherpath(ksub, xmid, ymid, x1, y1, bc, depth + 1);
}
}
}
@@ -890,7 +919,7 @@ free_spiro(spiro_seg *s)
}
void
-spiro_to_bpath(const spiro_seg *s, int n, bezctx *bc)
+spiro_to_otherpath(const spiro_seg *s, int n, ConverterBase &bc)
{
int i;
int nsegs = s[n - 1].ty == '}' ? n - 1 : n;
@@ -901,10 +930,10 @@ spiro_to_bpath(const spiro_seg *s, int n, bezctx *bc)
double x1 = s[i + 1].x;
double y1 = s[i + 1].y;
- if (i == 0)
- bezctx_moveto(bc, x0, y0, s[0].ty == '{');
- bezctx_mark_knot(bc, i);
- spiro_seg_to_bpath(s[i].ks, x0, y0, x1, y1, bc, 0);
+ if (i == 0) {
+ bc.moveto(x0, y0, s[0].ty == '{');
+ }
+ spiro_seg_to_otherpath(s[i].ks, x0, y0, x1, y1, bc, 0);
}
}
@@ -922,10 +951,20 @@ get_knot_th(const spiro_seg *s, int i)
}
}
+
+} // namespace Spiro
+
+/************************************
+ * Unit_test code
+ */
+
+
#ifdef UNIT_TEST
#include <stdio.h>
#include <sys/time.h> /* for gettimeofday */
+using namespace Spiro;
+
static double
get_time (void)
{
diff --git a/src/live_effects/spiro.h b/src/live_effects/spiro.h
index 54de40465..0d85da74b 100644
--- a/src/live_effects/spiro.h
+++ b/src/live_effects/spiro.h
@@ -1,18 +1,56 @@
+/*
+Copyright (C) 2007-2012 Authors
+
+Authors: Raph Levien
+ Johan Engelen
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA.
+
+*/
+
+#ifndef INKSCAPE_SPIRO_H
+#define INKSCAPE_SPIRO_H
+
+#include "live_effects/spiro-converters.h"
+
+class SPCurve;
+namespace Geom {
+ class Path;
+}
+
+namespace Spiro {
+
typedef struct {
double x;
double y;
char ty;
} spiro_cp;
-typedef struct spiro_seg_s spiro_seg;
-spiro_seg *
-run_spiro(const spiro_cp *src, int n);
+void spiro_run(const spiro_cp *src, int src_len, SPCurve &curve);
+void spiro_run(const spiro_cp *src, int src_len, Geom::Path &path);
-void
-free_spiro(spiro_seg *s);
+/* the following methods are only for expert use: */
+typedef struct spiro_seg_s spiro_seg;
+spiro_seg * run_spiro(const spiro_cp *src, int n);
+void free_spiro(spiro_seg *s);
+void spiro_to_otherpath(const spiro_seg *s, int n, ConverterBase &bc);
+double get_knot_th(const spiro_seg *s, int i);
-void
-spiro_to_bpath(const spiro_seg *s, int n, bezctx *bc);
-double get_knot_th(const spiro_seg *s, int i);
+} // namespace Spiro
+
+#endif // INKSCAPE_SPIRO_H \ No newline at end of file
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt
index e21c3795f..bfd8cca95 100644
--- a/src/ui/CMakeLists.txt
+++ b/src/ui/CMakeLists.txt
@@ -25,6 +25,7 @@ set(ui_SRC
dialog/align-and-distribute.cpp
dialog/calligraphic-profile-rename.cpp
dialog/color-item.cpp
+ dialog/clonetiler.cpp
dialog/debug.cpp
dialog/desktop-tracker.cpp
dialog/dialog-manager.cpp
@@ -135,6 +136,7 @@ set(ui_SRC
dialog/behavior.h
dialog/calligraphic-profile-rename.h
dialog/color-item.h
+ dialog/clonetiler.h
dialog/debug.h
dialog/desktop-tracker.h
dialog/dialog-manager.h
diff --git a/src/ui/context-menu.cpp b/src/ui/context-menu.cpp
index bf116f5fb..9e5c65af9 100644
--- a/src/ui/context-menu.cpp
+++ b/src/ui/context-menu.cpp
@@ -1,679 +1,693 @@
-/*
- * Unser-interface related object extension
- *
- * Authors:
- * Lauris Kaplinski <lauris@kaplinski.com>
- * Jon A. Cruz <jon@joncruz.org>
- * Abhishek Sharma
- *
- * This code is in public domain
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "ui/dialog/dialog-manager.h"
-#include "context-menu.h"
-#include "../xml/repr.h"
-#include "desktop.h"
-#include "document.h"
-#include "document-undo.h"
-#include "helper/action.h" //sp_action_perform
-#include "inkscape.h"
-#include "message-stack.h"
-#include "preferences.h"
-#include "verbs.h"
-
-using Inkscape::DocumentUndo;
-
-static void sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-
-/* Append object-specific part to context menu */
-
-void sp_object_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu)
-{
- GObjectClass *klass;
- klass = G_OBJECT_GET_CLASS(object);
- while (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_OBJECT)) {
- GType type;
- type = G_TYPE_FROM_CLASS(klass);
- sp_object_type_menu(type, object, desktop, menu);
- klass = (GObjectClass*)g_type_class_peek_parent(klass);
- }
-}
-
-/* Implementation */
-
-#include <gtk/gtk.h>
-#include <glibmm/i18n.h>
-
-#include "selection.h"
-#include "selection-chemistry.h"
-#include "sp-anchor.h"
-#include "sp-clippath.h"
-#include "sp-image.h"
-#include "sp-mask.h"
-#include "sp-path.h"
-#include "sp-text.h"
-#include "desktop-handles.h"
-#include "ui/dialog/object-attributes.h"
-#include "ui/dialog/object-properties.h"
-#include "ui/dialog/spellcheck.h"
-
-
-static void sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-static void sp_group_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-static void sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-static void sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-static void sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-static void sp_text_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-
-static void sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu)
-{
- static GHashTable *t2m = NULL;
- void (* handler)(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
- if (!t2m) {
- t2m = g_hash_table_new(NULL, NULL);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_ITEM), (void*)sp_item_menu);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_GROUP), (void*)sp_group_menu);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_ANCHOR), (void*)sp_anchor_menu);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_IMAGE), (void*)sp_image_menu);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_SHAPE), (void*)sp_shape_menu);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_TEXT), (void*)sp_text_menu);
- }
- handler = (void (*)(SPObject*, SPDesktop*, GtkMenu*))g_hash_table_lookup(t2m, GUINT_TO_POINTER(type));
- if (handler) handler(object, desktop, menu);
-}
-
-/* SPItem */
-
-static void sp_item_properties(GtkMenuItem *menuitem, SPItem *item);
-static void sp_item_select_this(GtkMenuItem *menuitem, SPItem *item);
-static void sp_item_create_link(GtkMenuItem *menuitem, SPItem *item);
-static void sp_set_mask(GtkMenuItem *menuitem, SPItem *item);
-static void sp_release_mask(GtkMenuItem *menuitem, SPItem *item);
-static void sp_set_clip(GtkMenuItem *menuitem, SPItem *item);
-static void sp_release_clip(GtkMenuItem *menuitem, SPItem *item);
-
-/* Generate context menu item section */
-static void sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Item dialog */
- w = gtk_menu_item_new_with_mnemonic(_("_Object Properties..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_properties), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Separator */
- w = gtk_menu_item_new();
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Select item */
- w = gtk_menu_item_new_with_mnemonic(_("_Select This"));
- if (sp_desktop_selection(desktop)->includes(item)) {
- gtk_widget_set_sensitive(w, FALSE);
- } else {
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_select_this), item);
- }
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Create link */
- w = gtk_menu_item_new_with_mnemonic(_("_Create Link"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_create_link), item);
- gtk_widget_set_sensitive(w, !SP_IS_ANCHOR(item));
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Set mask */
- w = gtk_menu_item_new_with_mnemonic(_("Set Mask"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_set_mask), item);
- if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) {
- gtk_widget_set_sensitive(w, FALSE);
- } else {
- gtk_widget_set_sensitive(w, TRUE);
- }
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Release mask */
- w = gtk_menu_item_new_with_mnemonic(_("Release Mask"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_release_mask), item);
- if (item && item->mask_ref && item->mask_ref->getObject()) {
- gtk_widget_set_sensitive(w, TRUE);
- } else {
- gtk_widget_set_sensitive(w, FALSE);
- }
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Set Clip */
- w = gtk_menu_item_new_with_mnemonic(_("Set _Clip"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_set_clip), item);
- if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) {
- gtk_widget_set_sensitive(w, FALSE);
- } else {
- gtk_widget_set_sensitive(w, TRUE);
- }
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Release Clip */
- w = gtk_menu_item_new_with_mnemonic(_("Release C_lip"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_release_clip), item);
- if (item && item->clip_ref && item->clip_ref->getObject()) {
- gtk_widget_set_sensitive(w, TRUE);
- } else {
- gtk_widget_set_sensitive(w, FALSE);
- }
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-
-}
-
-static void sp_item_properties(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_desktop_selection(desktop)->set(item);
-
- // sp_item_dialog();
- desktop->_dlg_mgr->showDialog("ObjectProperties");
-}
-
-
-static void sp_set_mask(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_selection_set_mask(desktop, false, false);
-}
-
-
-static void sp_release_mask(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_selection_unset_mask(desktop, false);
-}
-
-
-static void sp_set_clip(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_selection_set_mask(desktop, true, false);
-}
-
-
-static void sp_release_clip(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_selection_unset_mask(desktop, true);
-}
-
-
-static void sp_item_select_this(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_desktop_selection(desktop)->set(item);
-}
-
-static void sp_item_create_link(GtkMenuItem *menuitem, SPItem *item)
-{
- g_assert(SP_IS_ITEM(item));
- g_assert(!SP_IS_ANCHOR(item));
-
- SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc();
- Inkscape::XML::Node *repr = xml_doc->createElement("svg:a");
- item->parent->getRepr()->addChild(repr, item->getRepr());
- SPObject *object = item->document->getObjectByRepr(repr);
- g_return_if_fail(SP_IS_ANCHOR(object));
-
- const char *id = item->getRepr()->attribute("id");
- Inkscape::XML::Node *child = item->getRepr()->duplicate(xml_doc);
- item->deleteObject(false);
- repr->addChild(child, NULL);
- child->setAttribute("id", id);
-
- Inkscape::GC::release(repr);
- Inkscape::GC::release(child);
-
- DocumentUndo::done(object->document, SP_VERB_NONE,
- _("Create link"));
-
- sp_desktop_selection(desktop)->set(SP_ITEM(object));
- desktop->_dlg_mgr->showDialog("ObjectAttributes");
-}
-
-/* SPGroup */
-
-static void sp_item_group_ungroup_activate(GtkMenuItem *menuitem, SPGroup *group);
-
-static void sp_group_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu)
-{
- SPItem *item=SP_ITEM(object);
- GtkWidget *w;
-
- /* "Ungroup" */
- w = gtk_menu_item_new_with_mnemonic(_("_Ungroup"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_group_ungroup_activate), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), w);
-}
-
-static void sp_item_group_ungroup_activate(GtkMenuItem *menuitem, SPGroup *group)
-{
- SPDesktop *desktop;
- GSList *children;
-
- g_assert(SP_IS_GROUP(group));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- children = NULL;
- sp_item_group_ungroup(group, &children);
-
- sp_desktop_selection(desktop)->setList(children);
- g_slist_free(children);
-}
-
-/* SPAnchor */
-
-static void sp_anchor_link_properties(GtkMenuItem *menuitem, SPAnchor *anchor);
-static void sp_anchor_link_follow(GtkMenuItem *menuitem, SPAnchor *anchor);
-static void sp_anchor_link_remove(GtkMenuItem *menuitem, SPAnchor *anchor);
-
-static void sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Link dialog */
- w = gtk_menu_item_new_with_mnemonic(_("Link _Properties..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_properties), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Select item */
- w = gtk_menu_item_new_with_mnemonic(_("_Follow Link"));
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_follow), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Reset transformations */
- w = gtk_menu_item_new_with_mnemonic(_("_Remove Link"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_remove), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-}
-
-static void sp_anchor_link_properties(GtkMenuItem *menuitem, SPAnchor */*anchor*/)
-{
- SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
- desktop->_dlg_mgr->showDialog("ObjectAttributes");
-}
-
-static void sp_anchor_link_follow(GtkMenuItem */*menuitem*/, SPAnchor *anchor)
-{
- g_return_if_fail(anchor != NULL);
- g_return_if_fail(SP_IS_ANCHOR(anchor));
-
- /* shell out to an external browser here */
-}
-
-static void sp_anchor_link_remove(GtkMenuItem */*menuitem*/, SPAnchor *anchor)
-{
- GSList *children;
-
- g_return_if_fail(anchor != NULL);
- g_return_if_fail(SP_IS_ANCHOR(anchor));
-
- children = NULL;
- sp_item_group_ungroup(SP_GROUP(anchor), &children);
-
- g_slist_free(children);
-}
-
-/* Image */
-
-static void sp_image_image_properties(GtkMenuItem *menuitem, SPAnchor *anchor);
-static void sp_image_image_edit(GtkMenuItem *menuitem, SPAnchor *anchor);
-static void sp_image_image_embed(GtkMenuItem *menuitem, SPItem *item);
-static void sp_image_image_extract(GtkMenuItem *menuitem, SPItem *item);
-
-static void sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item = SP_ITEM(object);
- GtkWidget *w;
- Inkscape::XML::Node *ir = object->getRepr();
- const gchar *href = ir->attribute("xlink:href");
-
- /* Image properties */
- w = gtk_menu_item_new_with_mnemonic(_("Image _Properties..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_properties), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-
- /* Edit externally */
- w = gtk_menu_item_new_with_mnemonic(_("Edit Externally..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_edit), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- if ( (!href) || ((strncmp(href, "data:", 5) == 0)) ) {
- gtk_widget_set_sensitive( w, FALSE );
- }
-
- /* Embed image */
- if (Inkscape::Verb::getbyid( "org.ekips.filter.embedselectedimages" )) {
- w = gtk_menu_item_new_with_mnemonic(C_("Context menu", "Embed Image"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_embed), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- if ( (!href) || ((strncmp(href, "data:", 5) == 0)) ) {
- gtk_widget_set_sensitive( w, FALSE );
- }
- }
-
- /* Extract image */
- if (Inkscape::Verb::getbyid( "org.ekips.filter.extractimage" )) {
- w = gtk_menu_item_new_with_mnemonic(C_("Context menu", "Extract Image"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_extract), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- if ( (!href) || ((strncmp(href, "data:", 5) != 0)) ) {
- gtk_widget_set_sensitive( w, FALSE );
- }
- }
-}
-
-/* Image Properties entry */
-static void sp_image_image_properties(GtkMenuItem *menuitem, SPAnchor */*anchor*/)
-{
- SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
- desktop->_dlg_mgr->showDialog("ObjectAttributes");
-}
-
-static gchar* getImageEditorName() {
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gchar* value = 0;
- Glib::ustring choices = prefs->getString("/options/bitmapeditor/value");
- if (!choices.empty()) {
- value = g_strdup(choices.c_str());
- }
- if (!value) {
- value = g_strdup("gimp");
- }
- return value;
-}
-
-/* Edit Externally entry */
-static void sp_image_image_edit(GtkMenuItem *menuitem, SPAnchor *anchor)
-{
- SPObject* obj = anchor;
- Inkscape::XML::Node *ir = obj->getRepr();
- const gchar *href = ir->attribute("xlink:href");
-
- GError* errThing = 0;
- Glib::ustring cmdline = getImageEditorName();
- Glib::ustring name;
- Glib::ustring fullname;
-
-#ifdef WIN32
- // g_spawn_command_line_sync parsing is done according to Unix shell rules,
- // not Windows command interpreter rules. Thus we need to enclose the
- // executable path with sigle quotes.
- int index = cmdline.find(".exe");
- if ( index < 0 ) index = cmdline.find(".bat");
- if ( index < 0 ) index = cmdline.find(".com");
- if ( index >= 0 ) {
- Glib::ustring editorBin = cmdline.substr(0, index + 4).c_str();
- Glib::ustring args = cmdline.substr(index + 4, cmdline.length()).c_str();
- editorBin.insert(0, "'");
- editorBin.append("'");
- cmdline = editorBin;
- cmdline.append(args);
- } else {
- // Enclose the whole command line if no executable path can be extracted.
- cmdline.insert(0, "'");
- cmdline.append("'");
- }
-#endif
-
- if (strncmp (href,"file:",5) == 0) {
- // URI to filename conversion
- name = g_filename_from_uri(href, NULL, NULL);
- } else {
- name.append(href);
- }
-
- if (Glib::path_is_absolute(name)) {
- fullname = name;
- } else if (SP_ACTIVE_DOCUMENT->getBase()) {
- fullname = Glib::build_filename(SP_ACTIVE_DOCUMENT->getBase(), name);
- } else {
- fullname = Glib::build_filename(Glib::get_current_dir(), name);
- }
-
- cmdline.append(" '");
- cmdline.append(fullname.c_str());
- cmdline.append("'");
-
- //g_warning("##Command line: %s\n", cmdline.c_str());
-
- g_spawn_command_line_async(cmdline.c_str(),
- &errThing);
-
- if ( errThing ) {
- g_warning("Problem launching editor (%d). %s", errThing->code, errThing->message);
- SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, errThing->message);
- g_error_free(errThing);
- errThing = 0;
- }
-}
-
-/* Embed Image entry */
-static void sp_image_image_embed(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- if (sp_desktop_selection(desktop)->isEmpty()) {
- sp_desktop_selection(desktop)->set(item);
- }
-
- Inkscape::Verb *verb = Inkscape::Verb::getbyid( "org.ekips.filter.embedselectedimages" );
- if (verb) {
- SPAction *action = verb->get_action(desktop);
- if (action) {
- sp_action_perform(action, NULL);
- }
- }
-}
-
-/* Extract Image entry */
-static void sp_image_image_extract(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- if (sp_desktop_selection(desktop)->isEmpty()) {
- sp_desktop_selection(desktop)->set(item);
- }
-
- Inkscape::Verb *verb = Inkscape::Verb::getbyid( "org.ekips.filter.extractimage" );
- if (verb) {
- SPAction *action = verb->get_action(desktop);
- if (action) {
- sp_action_perform(action, NULL);
- }
- }
-}
-
-/* Fill and Stroke entry */
-static void sp_fill_settings(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- if (sp_desktop_selection(desktop)->isEmpty()) {
- sp_desktop_selection(desktop)->set(item);
- }
-
- desktop->_dlg_mgr->showDialog("FillAndStroke");
-}
-
-/* SPShape */
-static void sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Item dialog */
- w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_fill_settings), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-}
-
-/* Edit Text entry */
-static void sp_text_settings(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- if (sp_desktop_selection(desktop)->isEmpty()) {
- sp_desktop_selection(desktop)->set(item);
- }
-
- desktop->_dlg_mgr->showDialog("TextFont");
-}
-
-/* Spellcheck entry */
-static void sp_spellcheck_settings(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- if (sp_desktop_selection(desktop)->isEmpty()) {
- sp_desktop_selection(desktop)->set(item);
- }
-
- desktop->_dlg_mgr->showDialog("SpellCheck");
-}
-
-/* SPText */
-static void sp_text_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Fill and Stroke dialog */
- w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_fill_settings), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-
- /* Edit Text dialog */
- w = gtk_menu_item_new_with_mnemonic(_("_Text and Font..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_text_settings), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-
- /* Spellcheck dialog */
- w = gtk_menu_item_new_with_mnemonic(_("Check Spellin_g..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_spellcheck_settings), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-}
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+/*
+ * Unser-interface related object extension
+ *
+ * Authors:
+ * Lauris Kaplinski <lauris@kaplinski.com>
+ * Jon A. Cruz <jon@joncruz.org>
+ * Abhishek Sharma
+ *
+ * This code is in public domain
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "ui/dialog/dialog-manager.h"
+#include "context-menu.h"
+#include "../xml/repr.h"
+#include "desktop.h"
+#include "document.h"
+#include "document-undo.h"
+#include "helper/action.h" //sp_action_perform
+#include "inkscape.h"
+#include "message-stack.h"
+#include "preferences.h"
+#include "verbs.h"
+
+using Inkscape::DocumentUndo;
+
+static void sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+
+/* Append object-specific part to context menu */
+
+void sp_object_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu)
+{
+ GObjectClass *klass;
+ klass = G_OBJECT_GET_CLASS(object);
+ while (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_OBJECT)) {
+ GType type;
+ type = G_TYPE_FROM_CLASS(klass);
+ sp_object_type_menu(type, object, desktop, menu);
+ klass = (GObjectClass*)g_type_class_peek_parent(klass);
+ }
+}
+
+/* Implementation */
+
+#include <gtk/gtk.h>
+#include <glibmm/i18n.h>
+
+#include "selection.h"
+#include "selection-chemistry.h"
+#include "sp-anchor.h"
+#include "sp-clippath.h"
+#include "sp-image.h"
+#include "sp-mask.h"
+#include "sp-path.h"
+#include "sp-text.h"
+#include "desktop-handles.h"
+#include "ui/dialog/object-attributes.h"
+#include "ui/dialog/object-properties.h"
+#include "ui/dialog/spellcheck.h"
+
+
+static void sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+static void sp_group_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+static void sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+static void sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+static void sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+static void sp_text_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+
+static void sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu)
+{
+ static GHashTable *t2m = NULL;
+ void (* handler)(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+ if (!t2m) {
+ t2m = g_hash_table_new(NULL, NULL);
+ g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_ITEM), (void*)sp_item_menu);
+ g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_GROUP), (void*)sp_group_menu);
+ g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_ANCHOR), (void*)sp_anchor_menu);
+ g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_IMAGE), (void*)sp_image_menu);
+ g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_SHAPE), (void*)sp_shape_menu);
+ g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_TEXT), (void*)sp_text_menu);
+ }
+ handler = (void (*)(SPObject*, SPDesktop*, GtkMenu*))g_hash_table_lookup(t2m, GUINT_TO_POINTER(type));
+ if (handler) handler(object, desktop, menu);
+}
+
+/* SPItem */
+
+static void sp_item_properties(GtkMenuItem *menuitem, SPItem *item);
+static void sp_item_select_this(GtkMenuItem *menuitem, SPItem *item);
+static void sp_item_create_link(GtkMenuItem *menuitem, SPItem *item);
+static void sp_set_mask(GtkMenuItem *menuitem, SPItem *item);
+static void sp_release_mask(GtkMenuItem *menuitem, SPItem *item);
+static void sp_set_clip(GtkMenuItem *menuitem, SPItem *item);
+static void sp_release_clip(GtkMenuItem *menuitem, SPItem *item);
+
+/* Generate context menu item section */
+static void sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
+{
+ SPItem *item;
+ GtkWidget *w;
+
+ item = (SPItem *) object;
+
+ /* Item dialog */
+ w = gtk_menu_item_new_with_mnemonic(_("_Object Properties..."));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_properties), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ /* Separator */
+ w = gtk_menu_item_new();
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ /* Select item */
+ w = gtk_menu_item_new_with_mnemonic(_("_Select This"));
+ if (sp_desktop_selection(desktop)->includes(item)) {
+ gtk_widget_set_sensitive(w, FALSE);
+ } else {
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_select_this), item);
+ }
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ /* Create link */
+ w = gtk_menu_item_new_with_mnemonic(_("_Create Link"));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_create_link), item);
+ gtk_widget_set_sensitive(w, !SP_IS_ANCHOR(item));
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ /* Set mask */
+ w = gtk_menu_item_new_with_mnemonic(_("Set Mask"));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_set_mask), item);
+ if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) {
+ gtk_widget_set_sensitive(w, FALSE);
+ } else {
+ gtk_widget_set_sensitive(w, TRUE);
+ }
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ /* Release mask */
+ w = gtk_menu_item_new_with_mnemonic(_("Release Mask"));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_release_mask), item);
+ if (item && item->mask_ref && item->mask_ref->getObject()) {
+ gtk_widget_set_sensitive(w, TRUE);
+ } else {
+ gtk_widget_set_sensitive(w, FALSE);
+ }
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ /* Set Clip */
+ w = gtk_menu_item_new_with_mnemonic(_("Set _Clip"));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_set_clip), item);
+ if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) {
+ gtk_widget_set_sensitive(w, FALSE);
+ } else {
+ gtk_widget_set_sensitive(w, TRUE);
+ }
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ /* Release Clip */
+ w = gtk_menu_item_new_with_mnemonic(_("Release C_lip"));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_release_clip), item);
+ if (item && item->clip_ref && item->clip_ref->getObject()) {
+ gtk_widget_set_sensitive(w, TRUE);
+ } else {
+ gtk_widget_set_sensitive(w, FALSE);
+ }
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+
+}
+
+static void sp_item_properties(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ sp_desktop_selection(desktop)->set(item);
+
+ // sp_item_dialog();
+ desktop->_dlg_mgr->showDialog("ObjectProperties");
+}
+
+
+static void sp_set_mask(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ sp_selection_set_mask(desktop, false, false);
+}
+
+
+static void sp_release_mask(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ sp_selection_unset_mask(desktop, false);
+}
+
+
+static void sp_set_clip(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ sp_selection_set_mask(desktop, true, false);
+}
+
+
+static void sp_release_clip(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ sp_selection_unset_mask(desktop, true);
+}
+
+
+static void sp_item_select_this(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ sp_desktop_selection(desktop)->set(item);
+}
+
+static void sp_item_create_link(GtkMenuItem *menuitem, SPItem *item)
+{
+ g_assert(SP_IS_ITEM(item));
+ g_assert(!SP_IS_ANCHOR(item));
+
+ SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc();
+ Inkscape::XML::Node *repr = xml_doc->createElement("svg:a");
+ item->parent->getRepr()->addChild(repr, item->getRepr());
+ SPObject *object = item->document->getObjectByRepr(repr);
+ g_return_if_fail(SP_IS_ANCHOR(object));
+
+ const char *id = item->getRepr()->attribute("id");
+ Inkscape::XML::Node *child = item->getRepr()->duplicate(xml_doc);
+ item->deleteObject(false);
+ repr->addChild(child, NULL);
+ child->setAttribute("id", id);
+
+ Inkscape::GC::release(repr);
+ Inkscape::GC::release(child);
+
+ DocumentUndo::done(object->document, SP_VERB_NONE,
+ _("Create link"));
+
+ sp_desktop_selection(desktop)->set(SP_ITEM(object));
+ desktop->_dlg_mgr->showDialog("ObjectAttributes");
+}
+
+/* SPGroup */
+
+static void sp_item_group_ungroup_activate(GtkMenuItem *menuitem, SPGroup *group);
+
+static void sp_group_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu)
+{
+ SPItem *item=SP_ITEM(object);
+ GtkWidget *w;
+
+ /* "Ungroup" */
+ w = gtk_menu_item_new_with_mnemonic(_("_Ungroup"));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_group_ungroup_activate), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), w);
+}
+
+static void sp_item_group_ungroup_activate(GtkMenuItem *menuitem, SPGroup *group)
+{
+ SPDesktop *desktop;
+ GSList *children;
+
+ g_assert(SP_IS_GROUP(group));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ children = NULL;
+ sp_item_group_ungroup(group, &children);
+
+ sp_desktop_selection(desktop)->setList(children);
+ g_slist_free(children);
+}
+
+/* SPAnchor */
+
+static void sp_anchor_link_properties(GtkMenuItem *menuitem, SPAnchor *anchor);
+static void sp_anchor_link_follow(GtkMenuItem *menuitem, SPAnchor *anchor);
+static void sp_anchor_link_remove(GtkMenuItem *menuitem, SPAnchor *anchor);
+
+static void sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
+{
+ SPItem *item;
+ GtkWidget *w;
+
+ item = (SPItem *) object;
+
+ /* Link dialog */
+ w = gtk_menu_item_new_with_mnemonic(_("Link _Properties..."));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_properties), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ /* Select item */
+ w = gtk_menu_item_new_with_mnemonic(_("_Follow Link"));
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_follow), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ /* Reset transformations */
+ w = gtk_menu_item_new_with_mnemonic(_("_Remove Link"));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_remove), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+}
+
+static void sp_anchor_link_properties(GtkMenuItem *menuitem, SPAnchor */*anchor*/)
+{
+ SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+ desktop->_dlg_mgr->showDialog("ObjectAttributes");
+}
+
+static void sp_anchor_link_follow(GtkMenuItem */*menuitem*/, SPAnchor *anchor)
+{
+ g_return_if_fail(anchor != NULL);
+ g_return_if_fail(SP_IS_ANCHOR(anchor));
+
+ /* shell out to an external browser here */
+}
+
+static void sp_anchor_link_remove(GtkMenuItem */*menuitem*/, SPAnchor *anchor)
+{
+ GSList *children;
+
+ g_return_if_fail(anchor != NULL);
+ g_return_if_fail(SP_IS_ANCHOR(anchor));
+
+ children = NULL;
+ sp_item_group_ungroup(SP_GROUP(anchor), &children);
+
+ g_slist_free(children);
+}
+
+/* Image */
+
+static void sp_image_image_properties(GtkMenuItem *menuitem, SPAnchor *anchor);
+static void sp_image_image_edit(GtkMenuItem *menuitem, SPItem *item);
+static void sp_image_image_embed(GtkMenuItem *menuitem, SPItem *item);
+static void sp_image_image_extract(GtkMenuItem *menuitem, SPItem *item);
+
+static void sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
+{
+ SPItem *item = SP_ITEM(object);
+ GtkWidget *w;
+ Inkscape::XML::Node *ir = object->getRepr();
+ const gchar *href = ir->attribute("xlink:href");
+
+ /* Image properties */
+ w = gtk_menu_item_new_with_mnemonic(_("Image _Properties..."));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_properties), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+
+ /* Edit externally */
+ w = gtk_menu_item_new_with_mnemonic(_("Edit Externally..."));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_edit), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ if ( (!href) || ((strncmp(href, "data:", 5) == 0)) ) {
+ gtk_widget_set_sensitive( w, FALSE );
+ }
+
+ /* Embed image */
+ if (Inkscape::Verb::getbyid( "org.ekips.filter.embedselectedimages" )) {
+ w = gtk_menu_item_new_with_mnemonic(C_("Context menu", "Embed Image"));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_embed), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ if ( (!href) || ((strncmp(href, "data:", 5) == 0)) ) {
+ gtk_widget_set_sensitive( w, FALSE );
+ }
+ }
+
+ /* Extract image */
+ if (Inkscape::Verb::getbyid( "org.ekips.filter.extractimage" )) {
+ w = gtk_menu_item_new_with_mnemonic(C_("Context menu", "Extract Image..."));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_extract), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+ if ( (!href) || ((strncmp(href, "data:", 5) != 0)) ) {
+ gtk_widget_set_sensitive( w, FALSE );
+ }
+ }
+}
+
+/* Image Properties entry */
+static void sp_image_image_properties(GtkMenuItem *menuitem, SPAnchor */*anchor*/)
+{
+ SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+ desktop->_dlg_mgr->showDialog("ObjectAttributes");
+}
+
+static gchar* getImageEditorName() {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ gchar* value = 0;
+ Glib::ustring choices = prefs->getString("/options/bitmapeditor/value");
+ if (!choices.empty()) {
+ value = g_strdup(choices.c_str());
+ }
+ if (!value) {
+ value = g_strdup("gimp");
+ }
+ return value;
+}
+
+/* Edit Externally entry */
+static void sp_image_image_edit(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop = NULL;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ if (sp_desktop_selection(desktop)->isEmpty()) {
+ sp_desktop_selection(desktop)->set(item);
+ }
+
+ GSList const *selected = sp_desktop_selection(desktop)->itemList();
+
+ GError* errThing = 0;
+ Glib::ustring cmdline = getImageEditorName();
+ Glib::ustring name;
+ Glib::ustring fullname;
+
+#ifdef WIN32
+ // g_spawn_command_line_sync parsing is done according to Unix shell rules,
+ // not Windows command interpreter rules. Thus we need to enclose the
+ // executable path with sigle quotes.
+ int index = cmdline.find(".exe");
+ if ( index < 0 ) index = cmdline.find(".bat");
+ if ( index < 0 ) index = cmdline.find(".com");
+ if ( index >= 0 ) {
+ Glib::ustring editorBin = cmdline.substr(0, index + 4).c_str();
+ Glib::ustring args = cmdline.substr(index + 4, cmdline.length()).c_str();
+ editorBin.insert(0, "'");
+ editorBin.append("'");
+ cmdline = editorBin;
+ cmdline.append(args);
+ } else {
+ // Enclose the whole command line if no executable path can be extracted.
+ cmdline.insert(0, "'");
+ cmdline.append("'");
+ }
+#endif
+
+ for (GSList const *iter = selected; iter != NULL; iter = iter->next) {
+ Inkscape::XML::Node *ir = SP_ITEM(iter->data)->getRepr();
+ const gchar *href = ir->attribute("xlink:href");
+
+ if (strncmp (href,"file:",5) == 0) {
+ // URI to filename conversion
+ name = g_filename_from_uri(href, NULL, NULL);
+ } else {
+ name.append(href);
+ }
+
+ if (Glib::path_is_absolute(name)) {
+ fullname = name;
+ } else if (SP_ACTIVE_DOCUMENT->getBase()) {
+ fullname = Glib::build_filename(SP_ACTIVE_DOCUMENT->getBase(), name);
+ } else {
+ fullname = Glib::build_filename(Glib::get_current_dir(), name);
+ }
+
+ cmdline.append(" '");
+ cmdline.append(fullname.c_str());
+ cmdline.append("'");
+ }
+
+ //g_warning("##Command line: %s\n", cmdline.c_str());
+
+ g_spawn_command_line_async(cmdline.c_str(),
+ &errThing);
+
+ if ( errThing ) {
+ g_warning("Problem launching editor (%d). %s", errThing->code, errThing->message);
+ SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, errThing->message);
+ g_error_free(errThing);
+ errThing = 0;
+ }
+}
+
+/* Embed Image entry */
+static void sp_image_image_embed(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ if (sp_desktop_selection(desktop)->isEmpty()) {
+ sp_desktop_selection(desktop)->set(item);
+ }
+
+ Inkscape::Verb *verb = Inkscape::Verb::getbyid( "org.ekips.filter.embedselectedimages" );
+ if (verb) {
+ SPAction *action = verb->get_action(desktop);
+ if (action) {
+ sp_action_perform(action, NULL);
+ }
+ }
+}
+
+/* Extract Image entry */
+static void sp_image_image_extract(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ if (sp_desktop_selection(desktop)->isEmpty()) {
+ sp_desktop_selection(desktop)->set(item);
+ }
+
+ Inkscape::Verb *verb = Inkscape::Verb::getbyid( "org.ekips.filter.extractimage" );
+ if (verb) {
+ SPAction *action = verb->get_action(desktop);
+ if (action) {
+ sp_action_perform(action, NULL);
+ }
+ }
+}
+
+/* Fill and Stroke entry */
+static void sp_fill_settings(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ if (sp_desktop_selection(desktop)->isEmpty()) {
+ sp_desktop_selection(desktop)->set(item);
+ }
+
+ desktop->_dlg_mgr->showDialog("FillAndStroke");
+}
+
+/* SPShape */
+static void sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
+{
+ SPItem *item;
+ GtkWidget *w;
+
+ item = (SPItem *) object;
+
+ /* Item dialog */
+ w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke..."));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_fill_settings), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+}
+
+/* Edit Text entry */
+static void sp_text_settings(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ if (sp_desktop_selection(desktop)->isEmpty()) {
+ sp_desktop_selection(desktop)->set(item);
+ }
+
+ desktop->_dlg_mgr->showDialog("TextFont");
+}
+
+/* Spellcheck entry */
+static void sp_spellcheck_settings(GtkMenuItem *menuitem, SPItem *item)
+{
+ SPDesktop *desktop;
+
+ g_assert(SP_IS_ITEM(item));
+
+ desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ if (sp_desktop_selection(desktop)->isEmpty()) {
+ sp_desktop_selection(desktop)->set(item);
+ }
+
+ desktop->_dlg_mgr->showDialog("SpellCheck");
+}
+
+/* SPText */
+static void sp_text_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
+{
+ SPItem *item;
+ GtkWidget *w;
+
+ item = (SPItem *) object;
+
+ /* Fill and Stroke dialog */
+ w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke..."));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_fill_settings), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+
+ /* Edit Text dialog */
+ w = gtk_menu_item_new_with_mnemonic(_("_Text and Font..."));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_text_settings), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+
+ /* Spellcheck dialog */
+ w = gtk_menu_item_new_with_mnemonic(_("Check Spellin_g..."));
+ g_object_set_data(G_OBJECT(w), "desktop", desktop);
+ g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_spellcheck_settings), item);
+ gtk_widget_show(w);
+ gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
+}
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/Makefile_insert b/src/ui/dialog/Makefile_insert
index 91b1ccaf6..f8b95247a 100644
--- a/src/ui/dialog/Makefile_insert
+++ b/src/ui/dialog/Makefile_insert
@@ -8,6 +8,8 @@ ink_common_sources += \
ui/dialog/behavior.h \
ui/dialog/calligraphic-profile-rename.h \
ui/dialog/calligraphic-profile-rename.cpp \
+ ui/dialog/clonetiler.cpp \
+ ui/dialog/clonetiler.h \
ui/dialog/color-item.cpp \
ui/dialog/color-item.h \
ui/dialog/debug.cpp \
diff --git a/src/dialogs/clonetiler.cpp b/src/ui/dialog/clonetiler.cpp
index c56abc21a..36e79a682 100644
--- a/src/dialogs/clonetiler.cpp
+++ b/src/ui/dialog/clonetiler.cpp
@@ -1,3 +1,4 @@
+
/** @file
* Clone tiling dialog
*/
@@ -16,9 +17,9 @@
# include "config.h"
#endif
-#include <climits>
+#include "clonetiler.h"
-#include "ui/widget/color-picker.h"
+#include <climits>
#include <glib.h>
#include <glibmm/i18n.h>
@@ -27,7 +28,6 @@
#include "desktop.h"
#include "desktop-handles.h"
-#include "dialog-events.h"
#include "display/cairo-utils.h"
#include "display/drawing.h"
#include "display/drawing-context.h"
@@ -58,81 +58,1175 @@
#include "xml/repr.h"
#include "sp-root.h"
-#include <gtk/gtk.h>
-
using Inkscape::DocumentUndo;
-#define MIN_ONSCREEN_DISTANCE 50
+namespace Inkscape {
+namespace UI {
+namespace Dialog {
-static GtkWidget *dlg = NULL;
-static win_data wd;
+#define SB_MARGIN 1
+#define VB_MARGIN 4
-// impossible original values to make sure they are read from prefs
-static gint x = -1000, y = -1000, w = 0, h = 0;
static Glib::ustring const prefs_path = "/dialogs/clonetiler/";
-#define SB_MARGIN 1
-#define VB_MARGIN 4
+static Inkscape::Drawing *trace_drawing = NULL;
+static unsigned trace_visionkey;
+static gdouble trace_zoom;
+static SPDocument *trace_doc = NULL;
-enum {
- PICK_COLOR,
- PICK_OPACITY,
- PICK_R,
- PICK_G,
- PICK_B,
- PICK_H,
- PICK_S,
- PICK_L
-};
-static GtkSizeGroup* table_row_labels = NULL;
+CloneTiler::CloneTiler (void) :
+ UI::Widget::Panel ("", "/dialogs/clonetiler/", SP_VERB_DIALOG_CLONETILER),
+ dlg(NULL),
+ desktop(NULL),
+ deskTrack(),
+ table_row_labels(NULL),
+ selectChangedConn(),
+ subselChangedConn(),
+ selectModifiedConn()
+{
+ Gtk::Box *contents = _getContents();
+ contents->set_spacing(0);
-static sigc::connection _shutdown_connection;
-static sigc::connection _dialogs_hidden_connection;
-static sigc::connection _dialogs_unhidden_connection;
-static sigc::connection _desktop_activated_connection;
-static sigc::connection _color_changed_connection;
+ {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
-static Inkscape::UI::Widget::ColorPicker *color_picker;
+ dlg = GTK_WIDGET(gobj());
-static void clonetiler_dialog_destroy(GtkObject */*object*/, gpointer /*data*/)
-{
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setInt(prefs_path + "visible", 0);
+ GtkWidget *mainbox = gtk_vbox_new(FALSE, 4);
+ gtk_container_set_border_width (GTK_CONTAINER (mainbox), 6);
- sp_signal_disconnect_by_data (INKSCAPE, dlg);
- _color_changed_connection.disconnect();
+ contents->pack_start (*Gtk::manage(Glib::wrap(mainbox)), true, true, 0);
- delete color_picker;
+ GtkWidget *nb = gtk_notebook_new ();
+ gtk_box_pack_start (GTK_BOX (mainbox), nb, FALSE, FALSE, 0);
- wd.win = dlg = NULL;
- wd.stop = 0;
-}
+ // Symmetry
+ {
+ GtkWidget *vb = clonetiler_new_tab (nb, _("_Symmetry"));
-static gboolean clonetiler_dialog_delete(GtkObject */*object*/, GdkEvent * /*event*/, gpointer /*data*/)
-{
- gtk_window_get_position ((GtkWindow *) dlg, &x, &y);
- gtk_window_get_size ((GtkWindow *) dlg, &w, &h);
+ /* TRANSLATORS: For the following 17 symmetry groups, see
+ * http://www.bib.ulb.ac.be/coursmath/doc/17.htm (visual examples);
+ * http://www.clarku.edu/~djoyce/wallpaper/seventeen.html (English vocabulary); or
+ * http://membres.lycos.fr/villemingerard/Geometri/Sym1D.htm (French vocabulary).
+ */
+ struct SymGroups {
+ gint group;
+ gchar const *label;
+ } const sym_groups[] = {
+ // TRANSLATORS: "translation" means "shift" / "displacement" here.
+ {TILE_P1, _("<b>P1</b>: simple translation")},
+ {TILE_P2, _("<b>P2</b>: 180&#176; rotation")},
+ {TILE_PM, _("<b>PM</b>: reflection")},
+ // TRANSLATORS: "glide reflection" is a reflection and a translation combined.
+ // For more info, see http://mathforum.org/sum95/suzanne/symsusan.html
+ {TILE_PG, _("<b>PG</b>: glide reflection")},
+ {TILE_CM, _("<b>CM</b>: reflection + glide reflection")},
+ {TILE_PMM, _("<b>PMM</b>: reflection + reflection")},
+ {TILE_PMG, _("<b>PMG</b>: reflection + 180&#176; rotation")},
+ {TILE_PGG, _("<b>PGG</b>: glide reflection + 180&#176; rotation")},
+ {TILE_CMM, _("<b>CMM</b>: reflection + reflection + 180&#176; rotation")},
+ {TILE_P4, _("<b>P4</b>: 90&#176; rotation")},
+ {TILE_P4M, _("<b>P4M</b>: 90&#176; rotation + 45&#176; reflection")},
+ {TILE_P4G, _("<b>P4G</b>: 90&#176; rotation + 90&#176; reflection")},
+ {TILE_P3, _("<b>P3</b>: 120&#176; rotation")},
+ {TILE_P31M, _("<b>P31M</b>: reflection + 120&#176; rotation, dense")},
+ {TILE_P3M1, _("<b>P3M1</b>: reflection + 120&#176; rotation, sparse")},
+ {TILE_P6, _("<b>P6</b>: 60&#176; rotation")},
+ {TILE_P6M, _("<b>P6M</b>: reflection + 60&#176; rotation")},
+ };
+
+ gint current = prefs->getInt(prefs_path + "symmetrygroup", 0);
+
+ // Create a list structure containing all the data to be displayed in
+ // the symmetry group combo box.
+ GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING);
+ GtkTreeIter iter;
+
+ for (unsigned j = 0; j < G_N_ELEMENTS(sym_groups); ++j) {
+ SymGroups const &sg = sym_groups[j];
+
+ // Add the description of the symgroup to a new row
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0, sg.label, -1);
+ }
+
+ // Add a new combo box widget with the list of symmetry groups to the vbox
+ GtkWidget *combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
+ gtk_widget_set_tooltip_text (combo, _("Select one of the 17 symmetry groups for the tiling"));
+ gtk_box_pack_start (GTK_BOX (vb), combo, FALSE, FALSE, SB_MARGIN);
+
+ // Specify the rendering of data from the list in a combo box cell
+ GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, FALSE);
+ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), renderer, "markup", 0, NULL);
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo), current);
+
+ g_signal_connect(G_OBJECT(combo), "changed",
+ G_CALLBACK(clonetiler_symgroup_changed), NULL);
+ }
+
+ table_row_labels = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+
+ // Shift
+ {
+ GtkWidget *vb = clonetiler_new_tab (nb, _("S_hift"));
+
+ GtkWidget *table = clonetiler_table_x_y_rand (3);
+ gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
+
+ // X
+ {
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "shift" means: the tiles will be shifted (offset) horizontally by this amount
+ // xgettext:no-c-format
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Shift X:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 2, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ // xgettext:no-c-format
+ _("Horizontal shift per row (in % of tile width)"), "shiftx_per_j",
+ -10000, 10000, "%");
+ clonetiler_table_attach (table, l, 0, 2, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ // xgettext:no-c-format
+ _("Horizontal shift per column (in % of tile width)"), "shiftx_per_i",
+ -10000, 10000, "%");
+ clonetiler_table_attach (table, l, 0, 2, 3);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Randomize the horizontal shift by this percentage"), "shiftx_rand",
+ 0, 1000, "%");
+ clonetiler_table_attach (table, l, 0, 2, 4);
+ }
+
+ // Y
+ {
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "shift" means: the tiles will be shifted (offset) vertically by this amount
+ // xgettext:no-c-format
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Shift Y:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 3, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ // xgettext:no-c-format
+ _("Vertical shift per row (in % of tile height)"), "shifty_per_j",
+ -10000, 10000, "%");
+ clonetiler_table_attach (table, l, 0, 3, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ // xgettext:no-c-format
+ _("Vertical shift per column (in % of tile height)"), "shifty_per_i",
+ -10000, 10000, "%");
+ clonetiler_table_attach (table, l, 0, 3, 3);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ _("Randomize the vertical shift by this percentage"), "shifty_rand",
+ 0, 1000, "%");
+ clonetiler_table_attach (table, l, 0, 3, 4);
+ }
+
+ // Exponent
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Exponent:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 4, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ _("Whether rows are spaced evenly (1), converge (<1) or diverge (>1)"), "shifty_exp",
+ 0, 10, "", true);
+ clonetiler_table_attach (table, l, 0, 4, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ _("Whether columns are spaced evenly (1), converge (<1) or diverge (>1)"), "shiftx_exp",
+ 0, 10, "", true);
+ clonetiler_table_attach (table, l, 0, 4, 3);
+ }
+
+ { // alternates
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "Alternate" is a verb here
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 5, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of shifts for each row"), "shifty_alternate");
+ clonetiler_table_attach (table, l, 0, 5, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of shifts for each column"), "shiftx_alternate");
+ clonetiler_table_attach (table, l, 0, 5, 3);
+ }
+
+ { // Cumulate
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "Cumulate" is a verb here
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Cumulate:</small>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 6, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Cumulate the shifts for each row"), "shifty_cumulate");
+ clonetiler_table_attach (table, l, 0, 6, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Cumulate the shifts for each column"), "shiftx_cumulate");
+ clonetiler_table_attach (table, l, 0, 6, 3);
+ }
+
+ { // Exclude tile width and height in shift
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "Cumulate" is a verb here
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Exclude tile:</small>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 7, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Exclude tile height in shift"), "shifty_excludeh");
+ clonetiler_table_attach (table, l, 0, 7, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Exclude tile width in shift"), "shiftx_excludew");
+ clonetiler_table_attach (table, l, 0, 7, 3);
+ }
+
+ }
+
+
+ // Scale
+ {
+ GtkWidget *vb = clonetiler_new_tab (nb, _("Sc_ale"));
+
+ GtkWidget *table = clonetiler_table_x_y_rand (2);
+ gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
+
+ // X
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Scale X:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 2, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ // xgettext:no-c-format
+ _("Horizontal scale per row (in % of tile width)"), "scalex_per_j",
+ -100, 1000, "%");
+ clonetiler_table_attach (table, l, 0, 2, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ // xgettext:no-c-format
+ _("Horizontal scale per column (in % of tile width)"), "scalex_per_i",
+ -100, 1000, "%");
+ clonetiler_table_attach (table, l, 0, 2, 3);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Randomize the horizontal scale by this percentage"), "scalex_rand",
+ 0, 1000, "%");
+ clonetiler_table_attach (table, l, 0, 2, 4);
+ }
+
+ // Y
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Scale Y:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 3, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ // xgettext:no-c-format
+ _("Vertical scale per row (in % of tile height)"), "scaley_per_j",
+ -100, 1000, "%");
+ clonetiler_table_attach (table, l, 0, 3, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ // xgettext:no-c-format
+ _("Vertical scale per column (in % of tile height)"), "scaley_per_i",
+ -100, 1000, "%");
+ clonetiler_table_attach (table, l, 0, 3, 3);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Randomize the vertical scale by this percentage"), "scaley_rand",
+ 0, 1000, "%");
+ clonetiler_table_attach (table, l, 0, 3, 4);
+ }
+
+ // Exponent
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Exponent:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 4, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Whether row scaling is uniform (1), converge (<1) or diverge (>1)"), "scaley_exp",
+ 0, 10, "", true);
+ clonetiler_table_attach (table, l, 0, 4, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Whether column scaling is uniform (1), converge (<1) or diverge (>1)"), "scalex_exp",
+ 0, 10, "", true);
+ clonetiler_table_attach (table, l, 0, 4, 3);
+ }
+
+ // Logarithmic (as in logarithmic spiral)
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Base:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 5, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Base for a logarithmic spiral: not used (0), converge (<1), or diverge (>1)"), "scaley_log",
+ 0, 10, "", false);
+ clonetiler_table_attach (table, l, 0, 5, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Base for a logarithmic spiral: not used (0), converge (<1), or diverge (>1)"), "scalex_log",
+ 0, 10, "", false);
+ clonetiler_table_attach (table, l, 0, 5, 3);
+ }
+
+ { // alternates
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "Alternate" is a verb here
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 6, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of scales for each row"), "scaley_alternate");
+ clonetiler_table_attach (table, l, 0, 6, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of scales for each column"), "scalex_alternate");
+ clonetiler_table_attach (table, l, 0, 6, 3);
+ }
+
+ { // Cumulate
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "Cumulate" is a verb here
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Cumulate:</small>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 7, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Cumulate the scales for each row"), "scaley_cumulate");
+ clonetiler_table_attach (table, l, 0, 7, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Cumulate the scales for each column"), "scalex_cumulate");
+ clonetiler_table_attach (table, l, 0, 7, 3);
+ }
+
+ }
+
+
+ // Rotation
+ {
+ GtkWidget *vb = clonetiler_new_tab (nb, _("_Rotation"));
+
+ GtkWidget *table = clonetiler_table_x_y_rand (1);
+ gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
+
+ // Angle
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Angle:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 2, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ // xgettext:no-c-format
+ _("Rotate tiles by this angle for each row"), "rotate_per_j",
+ -180, 180, "&#176;");
+ clonetiler_table_attach (table, l, 0, 2, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (
+ // xgettext:no-c-format
+ _("Rotate tiles by this angle for each column"), "rotate_per_i",
+ -180, 180, "&#176;");
+ clonetiler_table_attach (table, l, 0, 2, 3);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Randomize the rotation angle by this percentage"), "rotate_rand",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 2, 4);
+ }
+
+ { // alternates
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "Alternate" is a verb here
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 3, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the rotation direction for each row"), "rotate_alternatej");
+ clonetiler_table_attach (table, l, 0, 3, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the rotation direction for each column"), "rotate_alternatei");
+ clonetiler_table_attach (table, l, 0, 3, 3);
+ }
+
+ { // Cumulate
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "Cumulate" is a verb here
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Cumulate:</small>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 4, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Cumulate the rotation for each row"), "rotate_cumulatej");
+ clonetiler_table_attach (table, l, 0, 4, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Cumulate the rotation for each column"), "rotate_cumulatei");
+ clonetiler_table_attach (table, l, 0, 4, 3);
+ }
+
+ }
+
+
+ // Blur and opacity
+ {
+ GtkWidget *vb = clonetiler_new_tab (nb, _("_Blur & opacity"));
+
+ GtkWidget *table = clonetiler_table_x_y_rand (1);
+ gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
+
+
+ // Blur
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Blur:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 2, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Blur tiles by this percentage for each row"), "blur_per_j",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 2, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Blur tiles by this percentage for each column"), "blur_per_i",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 2, 3);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Randomize the tile blur by this percentage"), "blur_rand",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 2, 4);
+ }
+
+ { // alternates
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "Alternate" is a verb here
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 3, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of blur change for each row"), "blur_alternatej");
+ clonetiler_table_attach (table, l, 0, 3, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of blur change for each column"), "blur_alternatei");
+ clonetiler_table_attach (table, l, 0, 3, 3);
+ }
+
+
+
+ // Dissolve
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Opacity:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 4, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Decrease tile opacity by this percentage for each row"), "opacity_per_j",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 4, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Decrease tile opacity by this percentage for each column"), "opacity_per_i",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 4, 3);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Randomize the tile opacity by this percentage"), "opacity_rand",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 4, 4);
+ }
+
+ { // alternates
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "Alternate" is a verb here
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 5, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of opacity change for each row"), "opacity_alternatej");
+ clonetiler_table_attach (table, l, 0, 5, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of opacity change for each column"), "opacity_alternatei");
+ clonetiler_table_attach (table, l, 0, 5, 3);
+ }
+ }
+
+
+ // Color
+ {
+ GtkWidget *vb = clonetiler_new_tab (nb, _("Co_lor"));
+
+ {
+ GtkWidget *hb = gtk_hbox_new (FALSE, 0);
+
+ GtkWidget *l = gtk_label_new (_("Initial color: "));
+ gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
+
+ guint32 rgba = 0x000000ff | sp_svg_read_color (prefs->getString(prefs_path + "initial_color").data(), 0x000000ff);
+ color_picker = new Inkscape::UI::Widget::ColorPicker (*new Glib::ustring(_("Initial color of tiled clones")), *new Glib::ustring(_("Initial color for clones (works only if the original has unset fill or stroke)")), rgba, false);
+ color_changed_connection = color_picker->connectChanged (sigc::ptr_fun(on_picker_color_changed));
+
+ gtk_box_pack_start (GTK_BOX (hb), reinterpret_cast<GtkWidget*>(color_picker->gobj()), FALSE, FALSE, 0);
+
+ gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
+ }
+
+
+ GtkWidget *table = clonetiler_table_x_y_rand (3);
+ gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
+
+ // Hue
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>H:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 2, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Change the tile hue by this percentage for each row"), "hue_per_j",
+ -100, 100, "%");
+ clonetiler_table_attach (table, l, 0, 2, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Change the tile hue by this percentage for each column"), "hue_per_i",
+ -100, 100, "%");
+ clonetiler_table_attach (table, l, 0, 2, 3);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Randomize the tile hue by this percentage"), "hue_rand",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 2, 4);
+ }
+
+
+ // Saturation
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>S:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 3, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Change the color saturation by this percentage for each row"), "saturation_per_j",
+ -100, 100, "%");
+ clonetiler_table_attach (table, l, 0, 3, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Change the color saturation by this percentage for each column"), "saturation_per_i",
+ -100, 100, "%");
+ clonetiler_table_attach (table, l, 0, 3, 3);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Randomize the color saturation by this percentage"), "saturation_rand",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 3, 4);
+ }
+
+ // Lightness
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>L:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 4, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Change the color lightness by this percentage for each row"), "lightness_per_j",
+ -100, 100, "%");
+ clonetiler_table_attach (table, l, 0, 4, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Change the color lightness by this percentage for each column"), "lightness_per_i",
+ -100, 100, "%");
+ clonetiler_table_attach (table, l, 0, 4, 3);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Randomize the color lightness by this percentage"), "lightness_rand",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 4, 4);
+ }
+
+
+ { // alternates
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 5, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of color changes for each row"), "color_alternatej");
+ clonetiler_table_attach (table, l, 0, 5, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of color changes for each column"), "color_alternatei");
+ clonetiler_table_attach (table, l, 0, 5, 3);
+ }
+
+ }
+
+ // Trace
+ {
+ GtkWidget *vb = clonetiler_new_tab (nb, _("_Trace"));
+
+
+ {
+ GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+ gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
+
+ GtkWidget *b = gtk_check_button_new_with_label (_("Trace the drawing under the tiles"));
+ g_object_set_data (G_OBJECT(b), "uncheckable", GINT_TO_POINTER(TRUE));
+ bool old = prefs->getBool(prefs_path + "dotrace");
+ gtk_toggle_button_set_active ((GtkToggleButton *) b, old);
+ gtk_widget_set_tooltip_text (b, _("For each clone, pick a value from the drawing in that clone's location and apply it to the clone"));
+ gtk_box_pack_start (GTK_BOX (hb), b, FALSE, FALSE, 0);
+
+ g_signal_connect(G_OBJECT(b), "toggled",
+ G_CALLBACK(clonetiler_do_pick_toggled), (gpointer)dlg);
+ }
+
+ {
+ GtkWidget *vvb = gtk_vbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vb), vvb, FALSE, FALSE, 0);
+ g_object_set_data (G_OBJECT(dlg), "dotrace", (gpointer) vvb);
+
+
+ {
+ GtkWidget *frame = gtk_frame_new (_("1. Pick from the drawing:"));
+ gtk_box_pack_start (GTK_BOX (vvb), frame, FALSE, FALSE, 0);
+
+ GtkWidget *table = gtk_table_new (3, 3, FALSE);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 4);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_container_add(GTK_CONTAINER(frame), table);
+
+
+ GtkWidget* radio;
+ {
+ radio = gtk_radio_button_new_with_label (NULL, _("Color"));
+ gtk_widget_set_tooltip_text (radio, _("Pick the visible color and opacity"));
+ clonetiler_table_attach (table, radio, 0.0, 1, 1);
+ g_signal_connect (G_OBJECT (radio), "toggled",
+ G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_COLOR));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_COLOR);
+ }
+ {
+ radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), _("Opacity"));
+ gtk_widget_set_tooltip_text (radio, _("Pick the total accumulated opacity"));
+ clonetiler_table_attach (table, radio, 0.0, 2, 1);
+ g_signal_connect (G_OBJECT (radio), "toggled",
+ G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_OPACITY));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_OPACITY);
+ }
+ {
+ radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), _("R"));
+ gtk_widget_set_tooltip_text (radio, _("Pick the Red component of the color"));
+ clonetiler_table_attach (table, radio, 0.0, 1, 2);
+ g_signal_connect (G_OBJECT (radio), "toggled",
+ G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_R));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_R);
+ }
+ {
+ radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), _("G"));
+ gtk_widget_set_tooltip_text (radio, _("Pick the Green component of the color"));
+ clonetiler_table_attach (table, radio, 0.0, 2, 2);
+ g_signal_connect (G_OBJECT (radio), "toggled",
+ G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_G));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_G);
+ }
+ {
+ radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), _("B"));
+ gtk_widget_set_tooltip_text (radio, _("Pick the Blue component of the color"));
+ clonetiler_table_attach (table, radio, 0.0, 3, 2);
+ g_signal_connect (G_OBJECT (radio), "toggled",
+ G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_B));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_B);
+ }
+ {
+ radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), C_("Clonetiler color hue", "H"));
+ gtk_widget_set_tooltip_text (radio, _("Pick the hue of the color"));
+ clonetiler_table_attach (table, radio, 0.0, 1, 3);
+ g_signal_connect (G_OBJECT (radio), "toggled",
+ G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_H));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_H);
+ }
+ {
+ radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), C_("Clonetiler color saturation", "S"));
+ gtk_widget_set_tooltip_text (radio, _("Pick the saturation of the color"));
+ clonetiler_table_attach (table, radio, 0.0, 2, 3);
+ g_signal_connect (G_OBJECT (radio), "toggled",
+ G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_S));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_S);
+ }
+ {
+ radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), C_("Clonetiler color lightness", "L"));
+ gtk_widget_set_tooltip_text (radio, _("Pick the lightness of the color"));
+ clonetiler_table_attach (table, radio, 0.0, 3, 3);
+ g_signal_connect (G_OBJECT (radio), "toggled",
+ G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_L));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_L);
+ }
+
+ }
+
+ {
+ GtkWidget *frame = gtk_frame_new (_("2. Tweak the picked value:"));
+ gtk_box_pack_start (GTK_BOX (vvb), frame, FALSE, FALSE, VB_MARGIN);
+
+ GtkWidget *table = gtk_table_new (4, 2, FALSE);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 4);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_container_add(GTK_CONTAINER(frame), table);
+
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("Gamma-correct:"));
+ clonetiler_table_attach (table, l, 1.0, 1, 1);
+ }
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Shift the mid-range of the picked value upwards (>0) or downwards (<0)"), "gamma_picked",
+ -10, 10, "");
+ clonetiler_table_attach (table, l, 0.0, 1, 2);
+ }
+
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("Randomize:"));
+ clonetiler_table_attach (table, l, 1.0, 1, 3);
+ }
+ {
+ GtkWidget *l = clonetiler_spinbox (_("Randomize the picked value by this percentage"), "rand_picked",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0.0, 1, 4);
+ }
+
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("Invert:"));
+ clonetiler_table_attach (table, l, 1.0, 2, 1);
+ }
+ {
+ GtkWidget *l = clonetiler_checkbox (_("Invert the picked value"), "invert_picked");
+ clonetiler_table_attach (table, l, 0.0, 2, 2);
+ }
+ }
+
+ {
+ GtkWidget *frame = gtk_frame_new (_("3. Apply the value to the clones':"));
+ gtk_box_pack_start (GTK_BOX (vvb), frame, FALSE, FALSE, 0);
+
+
+ GtkWidget *table = gtk_table_new (2, 2, FALSE);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 4);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_container_add(GTK_CONTAINER(frame), table);
+
+ {
+ GtkWidget *b = gtk_check_button_new_with_label (_("Presence"));
+ bool old = prefs->getBool(prefs_path + "pick_to_presence", true);
+ gtk_toggle_button_set_active ((GtkToggleButton *) b, old);
+ gtk_widget_set_tooltip_text (b, _("Each clone is created with the probability determined by the picked value in that point"));
+ clonetiler_table_attach (table, b, 0.0, 1, 1);
+ g_signal_connect(G_OBJECT(b), "toggled",
+ G_CALLBACK(clonetiler_pick_to), (gpointer) "pick_to_presence");
+ }
+
+ {
+ GtkWidget *b = gtk_check_button_new_with_label (_("Size"));
+ bool old = prefs->getBool(prefs_path + "pick_to_size");
+ gtk_toggle_button_set_active ((GtkToggleButton *) b, old);
+ gtk_widget_set_tooltip_text (b, _("Each clone's size is determined by the picked value in that point"));
+ clonetiler_table_attach (table, b, 0.0, 2, 1);
+ g_signal_connect(G_OBJECT(b), "toggled",
+ G_CALLBACK(clonetiler_pick_to), (gpointer) "pick_to_size");
+ }
+
+ {
+ GtkWidget *b = gtk_check_button_new_with_label (_("Color"));
+ bool old = prefs->getBool(prefs_path + "pick_to_color", 0);
+ gtk_toggle_button_set_active ((GtkToggleButton *) b, old);
+ gtk_widget_set_tooltip_text (b, _("Each clone is painted by the picked color (the original must have unset fill or stroke)"));
+ clonetiler_table_attach (table, b, 0.0, 1, 2);
+ g_signal_connect(G_OBJECT(b), "toggled",
+ G_CALLBACK(clonetiler_pick_to), (gpointer) "pick_to_color");
+ }
+
+ {
+ GtkWidget *b = gtk_check_button_new_with_label (_("Opacity"));
+ bool old = prefs->getBool(prefs_path + "pick_to_opacity", 0);
+ gtk_toggle_button_set_active ((GtkToggleButton *) b, old);
+ gtk_widget_set_tooltip_text (b, _("Each clone's opacity is determined by the picked value in that point"));
+ clonetiler_table_attach (table, b, 0.0, 2, 2);
+ g_signal_connect(G_OBJECT(b), "toggled",
+ G_CALLBACK(clonetiler_pick_to), (gpointer) "pick_to_opacity");
+ }
+ }
+ gtk_widget_set_sensitive (vvb, prefs->getBool(prefs_path + "dotrace"));
+ }
+ }
+
+ // Rows/columns, width/height
+ {
+ GtkWidget *table = gtk_table_new (2, 2, FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (table), VB_MARGIN);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 4);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (mainbox), table, FALSE, FALSE, 0);
+
+ {
+ GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+ g_object_set_data (G_OBJECT(dlg), "rowscols", (gpointer) hb);
+
+ {
+ Gtk::Adjustment *a = new Gtk::Adjustment (0.0, 1, 500, 1, 10, 0);
+ int value = prefs->getInt(prefs_path + "jmax", 2);
+ a->set_value (value);
+
+ Inkscape::UI::Widget::SpinButton *sb = new Inkscape::UI::Widget::SpinButton (*a, 1.0, 0);
+ sb->set_tooltip_text (_("How many rows in the tiling"));
+ sb->set_width_chars (7);
+ gtk_box_pack_start (GTK_BOX (hb), GTK_WIDGET(sb->gobj()), TRUE, TRUE, 0);
+
+ // TODO: C++ification
+ g_signal_connect(G_OBJECT(a->gobj()), "value_changed",
+ G_CALLBACK(clonetiler_xy_changed), (gpointer) "jmax");
+ }
+
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), "&#215;");
+ gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
+ }
+
+ {
+ Gtk::Adjustment *a = new Gtk::Adjustment (0.0, 1, 500, 1, 10, 0);
+ int value = prefs->getInt(prefs_path + "imax", 2);
+ a->set_value (value);
+
+ Inkscape::UI::Widget::SpinButton *sb = new Inkscape::UI::Widget::SpinButton (*a, 1.0, 0);
+ sb->set_tooltip_text (_("How many columns in the tiling"));
+ sb->set_width_chars (7);
+ gtk_box_pack_start (GTK_BOX (hb), GTK_WIDGET(sb->gobj()), TRUE, TRUE, 0);
+
+ // TODO: C++ification
+ g_signal_connect(G_OBJECT(a->gobj()), "value_changed",
+ G_CALLBACK(clonetiler_xy_changed), (gpointer) "imax");
+ }
+
+ clonetiler_table_attach (table, hb, 0.0, 1, 2);
+ }
+
+ {
+ GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+ g_object_set_data (G_OBJECT(dlg), "widthheight", (gpointer) hb);
+
+ // unitmenu
+ GtkWidget *u = sp_unit_selector_new (SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE);
+ sp_unit_selector_set_unit (SP_UNIT_SELECTOR(u), sp_desktop_namedview(SP_ACTIVE_DESKTOP)->doc_units);
+
+ {
+ // Width spinbutton
+ Gtk::Adjustment *a = new Gtk::Adjustment (0.0, -1e6, 1e6, 1.0, 10.0, 0);
+ sp_unit_selector_add_adjustment (SP_UNIT_SELECTOR (u), GTK_ADJUSTMENT (a->gobj()));
+
+ double value = prefs->getDouble(prefs_path + "fillwidth", 50.0);
+ SPUnit const &unit = *sp_unit_selector_get_unit(SP_UNIT_SELECTOR(u));
+ gdouble const units = sp_pixels_get_units (value, unit);
+ a->set_value (units);
+
+ Inkscape::UI::Widget::SpinButton *e = new Inkscape::UI::Widget::SpinButton (*a, 1.0, 2);
+ e->set_tooltip_text (_("Width of the rectangle to be filled"));
+ e->set_width_chars (7);
+ e->set_digits (4);
+ gtk_box_pack_start (GTK_BOX (hb), GTK_WIDGET(e->gobj()), TRUE, TRUE, 0);
+ // TODO: C++ification
+ g_signal_connect(G_OBJECT(a->gobj()), "value_changed",
+ G_CALLBACK(clonetiler_fill_width_changed), u);
+ }
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), "&#215;");
+ gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
+ }
+
+ {
+ // Height spinbutton
+ Gtk::Adjustment *a = new Gtk::Adjustment (0.0, -1e6, 1e6, 1.0, 10.0, 0);
+ sp_unit_selector_add_adjustment (SP_UNIT_SELECTOR (u), GTK_ADJUSTMENT (a->gobj()));
+
+ double value = prefs->getDouble(prefs_path + "fillheight", 50.0);
+ SPUnit const &unit = *sp_unit_selector_get_unit(SP_UNIT_SELECTOR(u));
+ gdouble const units = sp_pixels_get_units (value, unit);
+ a->set_value (units);
+
+ Inkscape::UI::Widget::SpinButton *e = new Inkscape::UI::Widget::SpinButton (*a, 1.0, 2);
+ e->set_tooltip_text (_("Height of the rectangle to be filled"));
+ e->set_width_chars (7);
+ e->set_digits (4);
+ gtk_box_pack_start (GTK_BOX (hb), GTK_WIDGET(e->gobj()), TRUE, TRUE, 0);
+ // TODO: C++ification
+ g_signal_connect(G_OBJECT(a->gobj()), "value_changed",
+ G_CALLBACK(clonetiler_fill_height_changed), u);
+ }
+
+ gtk_box_pack_start (GTK_BOX (hb), u, TRUE, TRUE, 0);
+ clonetiler_table_attach (table, hb, 0.0, 2, 2);
+
+ }
+
+ // Switch
+ GtkWidget* radio;
+ {
+ radio = gtk_radio_button_new_with_label (NULL, _("Rows, columns: "));
+ gtk_widget_set_tooltip_text (radio, _("Create the specified number of rows and columns"));
+ clonetiler_table_attach (table, radio, 0.0, 1, 1);
+ g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (clonetiler_switch_to_create), (gpointer) dlg);
+ }
+ if (!prefs->getBool(prefs_path + "fillrect")) {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE);
+ gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (radio));
+ }
+ {
+ radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), _("Width, height: "));
+ gtk_widget_set_tooltip_text (radio, _("Fill the specified width and height with the tiling"));
+ clonetiler_table_attach (table, radio, 0.0, 2, 1);
+ g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (clonetiler_switch_to_fill), (gpointer) dlg);
+ }
+ if (prefs->getBool(prefs_path + "fillrect")) {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE);
+ gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (radio));
+ }
+ }
+
+
+ // Use saved pos
+ {
+ GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+ gtk_box_pack_start (GTK_BOX (mainbox), hb, FALSE, FALSE, 0);
+
+ GtkWidget *b = gtk_check_button_new_with_label (_("Use saved size and position of the tile"));
+ bool keepbbox = prefs->getBool(prefs_path + "keepbbox", true);
+ gtk_toggle_button_set_active ((GtkToggleButton *) b, keepbbox);
+ gtk_widget_set_tooltip_text (b, _("Pretend that the size and position of the tile are the same as the last time you tiled it (if any), instead of using the current size"));
+ gtk_box_pack_start (GTK_BOX (hb), b, FALSE, FALSE, 0);
+
+ g_signal_connect(G_OBJECT(b), "toggled",
+ G_CALLBACK(clonetiler_keep_bbox_toggled), NULL);
+ }
+
+ // Statusbar
+ {
+ GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+ gtk_box_pack_end (GTK_BOX (mainbox), hb, FALSE, FALSE, 0);
+ GtkWidget *l = gtk_label_new("");
+ g_object_set_data (G_OBJECT(dlg), "status", (gpointer) l);
+ gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
+ }
+
+ // Buttons
+ {
+ GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+ gtk_box_pack_start (GTK_BOX (mainbox), hb, FALSE, FALSE, 0);
+
+ {
+ GtkWidget *b = gtk_button_new ();
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup_with_mnemonic (GTK_LABEL(l), _(" <b>_Create</b> "));
+ gtk_container_add (GTK_CONTAINER(b), l);
+ gtk_widget_set_tooltip_text (b, _("Create and tile the clones of the selection"));
+ g_signal_connect (G_OBJECT (b), "clicked", G_CALLBACK (clonetiler_apply), dlg);
+ gtk_box_pack_end (GTK_BOX (hb), b, FALSE, FALSE, 0);
+ }
+
+ { // buttons which are enabled only when there are tiled clones
+ GtkWidget *sb = gtk_hbox_new(FALSE, 0);
+ gtk_box_pack_end (GTK_BOX (hb), sb, FALSE, FALSE, 0);
+ g_object_set_data (G_OBJECT(dlg), "buttons_on_tiles", (gpointer) sb);
+ {
+ // TRANSLATORS: if a group of objects are "clumped" together, then they
+ // are unevenly spread in the given amount of space - as shown in the
+ // diagrams on the left in the following screenshot:
+ // http://www.inkscape.org/screenshots/gallery/inkscape-0.42-CVS-tiles-unclump.png
+ // So unclumping is the process of spreading a number of objects out more evenly.
+ GtkWidget *b = gtk_button_new_with_mnemonic (_(" _Unclump "));
+ gtk_widget_set_tooltip_text (b, _("Spread out clones to reduce clumping; can be applied repeatedly"));
+ g_signal_connect (G_OBJECT (b), "clicked", G_CALLBACK (clonetiler_unclump), NULL);
+ gtk_box_pack_end (GTK_BOX (sb), b, FALSE, FALSE, 0);
+ }
+
+ {
+ GtkWidget *b = gtk_button_new_with_mnemonic (_(" Re_move "));
+ gtk_widget_set_tooltip_text (b, _("Remove existing tiled clones of the selected object (siblings only)"));
+ g_signal_connect (G_OBJECT (b), "clicked", G_CALLBACK (clonetiler_remove), gpointer(dlg));
+ gtk_box_pack_end (GTK_BOX (sb), b, FALSE, FALSE, 0);
+ }
+
+ // connect to global selection changed signal (so we can change desktops) and
+ // external_change (so we're not fooled by undo)
+ g_signal_connect (G_OBJECT (INKSCAPE), "change_selection", G_CALLBACK (clonetiler_change_selection), dlg);
+ g_signal_connect (G_OBJECT (INKSCAPE), "external_change", G_CALLBACK (clonetiler_external_change), dlg);
+ g_signal_connect(G_OBJECT(dlg), "destroy", G_CALLBACK(clonetiler_disconnect_gsignal), G_OBJECT (INKSCAPE));
+
+ // update now
+ clonetiler_change_selection (NULL, sp_desktop_selection(SP_ACTIVE_DESKTOP), dlg);
+ }
+
+ {
+ GtkWidget *b = gtk_button_new_with_mnemonic (_(" R_eset "));
+ // TRANSLATORS: "change" is a noun here
+ gtk_widget_set_tooltip_text (b, _("Reset all shifts, scales, rotates, opacity and color changes in the dialog to zero"));
+ g_signal_connect (G_OBJECT (b), "clicked", G_CALLBACK (clonetiler_reset), dlg);
+ gtk_box_pack_start (GTK_BOX (hb), b, FALSE, FALSE, 0);
+ }
+ }
+
+ gtk_widget_show_all (mainbox);
- if (x < 0) {
- x = 0;
- }
- if (y < 0) {
- y = 0;
}
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setInt(prefs_path + "x", x);
- prefs->setInt(prefs_path + "y", y);
- prefs->setInt(prefs_path + "w", w);
- prefs->setInt(prefs_path + "h", h);
+ show_all();
- return FALSE; // which means, go ahead and destroy it
+ desktopChangeConn = deskTrack.connectDesktopChanged( sigc::mem_fun(*this, &CloneTiler::setTargetDesktop) );
+ deskTrack.connect(GTK_WIDGET(gobj()));
}
-static void on_picker_color_changed(guint rgba)
+CloneTiler::~CloneTiler (void)
+{
+ //subselChangedConn.disconnect();
+ //selectChangedConn.disconnect();
+ //selectModifiedConn.disconnect();
+ desktopChangeConn.disconnect();
+ deskTrack.disconnect();
+ color_changed_connection.disconnect();
+}
+
+void CloneTiler::setDesktop(SPDesktop *desktop)
+{
+ Panel::setDesktop(desktop);
+ deskTrack.setBase(desktop);
+}
+
+void CloneTiler::setTargetDesktop(SPDesktop *desktop)
+{
+ if (this->desktop != desktop) {
+ if (this->desktop) {
+ //selectModifiedConn.disconnect();
+ //subselChangedConn.disconnect();
+ //selectChangedConn.disconnect();
+ }
+ this->desktop = desktop;
+ if (desktop && desktop->selection) {
+ //selectChangedConn = desktop->selection->connectChanged(sigc::hide(sigc::mem_fun(*this, &CloneTiler::clonetiler_change_selection)));
+ //subselChangedConn = desktop->connectToolSubselectionChanged(sigc::hide(sigc::mem_fun(*this, &CloneTiler::clonetiler_change_selection)));
+ //selectModifiedConn = desktop->selection->connectModified(sigc::hide<0>(sigc::mem_fun(*this, &CloneTiler::clonetiler_change_selection)));
+ }
+ }
+}
+
+void CloneTiler::on_picker_color_changed(guint rgba)
{
static bool is_updating = false;
if (is_updating || !SP_ACTIVE_DESKTOP)
@@ -148,9 +1242,7 @@ static void on_picker_color_changed(guint rgba)
is_updating = false;
}
-static guint clonetiler_number_of_clones(SPObject *obj);
-
-static void clonetiler_change_selection(Inkscape::Application * /*inkscape*/, Inkscape::Selection *selection, GtkWidget *dlg)
+void CloneTiler::clonetiler_change_selection(Inkscape::Application * /*inkscape*/, Inkscape::Selection *selection, GtkWidget *dlg)
{
GtkWidget *buttons = (GtkWidget *) g_object_get_data (G_OBJECT(dlg), "buttons_on_tiles");
GtkWidget *status = (GtkWidget *) g_object_get_data (G_OBJECT(dlg), "status");
@@ -179,41 +1271,19 @@ static void clonetiler_change_selection(Inkscape::Application * /*inkscape*/, In
}
}
-static void clonetiler_external_change(Inkscape::Application * /*inkscape*/, GtkWidget *dlg)
+void CloneTiler::clonetiler_external_change(Inkscape::Application * /*inkscape*/, GtkWidget *dlg)
{
clonetiler_change_selection (NULL, sp_desktop_selection(SP_ACTIVE_DESKTOP), dlg);
}
-static void clonetiler_disconnect_gsignal(GObject *widget, gpointer source)
+void CloneTiler::clonetiler_disconnect_gsignal(GObject *widget, gpointer source)
{
if (source && G_IS_OBJECT(source)) {
sp_signal_disconnect_by_data (source, widget);
}
}
-
-enum {
- TILE_P1,
- TILE_P2,
- TILE_PM,
- TILE_PG,
- TILE_CM,
- TILE_PMM,
- TILE_PMG,
- TILE_PGG,
- TILE_CMM,
- TILE_P4,
- TILE_P4M,
- TILE_P4G,
- TILE_P3,
- TILE_P31M,
- TILE_P3M1,
- TILE_P6,
- TILE_P6M
-};
-
-
-static Geom::Affine clonetiler_get_transform(
+Geom::Affine CloneTiler::clonetiler_get_transform(
// symmetry group
int type,
@@ -815,7 +1885,7 @@ static Geom::Affine clonetiler_get_transform(
return Geom::identity();
}
-static bool clonetiler_is_a_clone_of(SPObject *tile, SPObject *obj)
+bool CloneTiler::clonetiler_is_a_clone_of(SPObject *tile, SPObject *obj)
{
bool result = false;
char *id_href = NULL;
@@ -842,12 +1912,7 @@ static bool clonetiler_is_a_clone_of(SPObject *tile, SPObject *obj)
return result;
}
-static Inkscape::Drawing *trace_drawing = NULL;
-static unsigned trace_visionkey;
-static gdouble trace_zoom;
-static SPDocument *trace_doc = NULL;
-
-static void clonetiler_trace_hide_tiled_clones_recursively(SPObject *from)
+void CloneTiler::clonetiler_trace_hide_tiled_clones_recursively(SPObject *from)
{
if (!trace_drawing)
return;
@@ -859,7 +1924,7 @@ static void clonetiler_trace_hide_tiled_clones_recursively(SPObject *from)
}
}
-static void clonetiler_trace_setup(SPDocument *doc, gdouble zoom, SPItem *original)
+void CloneTiler::clonetiler_trace_setup(SPDocument *doc, gdouble zoom, SPItem *original)
{
trace_drawing = new Inkscape::Drawing();
/* Create ArenaItem and set transform */
@@ -877,7 +1942,7 @@ static void clonetiler_trace_setup(SPDocument *doc, gdouble zoom, SPItem *origin
trace_zoom = zoom;
}
-static guint32 clonetiler_trace_pick(Geom::Rect box)
+guint32 CloneTiler::clonetiler_trace_pick(Geom::Rect box)
{
if (!trace_drawing) {
return 0;
@@ -901,7 +1966,7 @@ static guint32 clonetiler_trace_pick(Geom::Rect box)
return SP_RGBA32_F_COMPOSE (R, G, B, A);
}
-static void clonetiler_trace_finish()
+void CloneTiler::clonetiler_trace_finish()
{
if (trace_doc) {
trace_doc->getRoot()->invoke_hide(trace_visionkey);
@@ -911,7 +1976,7 @@ static void clonetiler_trace_finish()
}
}
-static void clonetiler_unclump(GtkWidget */*widget*/, void *)
+void CloneTiler::clonetiler_unclump(GtkWidget */*widget*/, void *)
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
if (desktop == NULL) {
@@ -947,7 +2012,7 @@ static void clonetiler_unclump(GtkWidget */*widget*/, void *)
_("Unclump tiled clones"));
}
-static guint clonetiler_number_of_clones(SPObject *obj)
+guint CloneTiler::clonetiler_number_of_clones(SPObject *obj)
{
SPObject *parent = obj->parent;
@@ -962,7 +2027,7 @@ static guint clonetiler_number_of_clones(SPObject *obj)
return n;
}
-static void clonetiler_remove(GtkWidget */*widget*/, void *, bool do_undo = true)
+void CloneTiler::clonetiler_remove(GtkWidget */*widget*/, GtkWidget *dlg, bool do_undo/* = true*/)
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
if (desktop == NULL) {
@@ -1000,7 +2065,7 @@ static void clonetiler_remove(GtkWidget */*widget*/, void *, bool do_undo = true
}
}
-static Geom::Rect transform_rect(Geom::Rect const &r, Geom::Affine const &m)
+Geom::Rect CloneTiler::transform_rect(Geom::Rect const &r, Geom::Affine const &m)
{
using Geom::X;
using Geom::Y;
@@ -1021,7 +2086,7 @@ static Geom::Rect transform_rect(Geom::Rect const &r, Geom::Affine const &m)
Randomizes \a val by \a rand, with 0 < val < 1 and all values (including 0, 1) having the same
probability of being displaced.
*/
-static double randomize01(double val, double rand)
+double CloneTiler::randomize01(double val, double rand)
{
double base = MIN (val - rand, 1 - 2*rand);
if (base < 0) {
@@ -1032,7 +2097,7 @@ static double randomize01(double val, double rand)
}
-static void clonetiler_apply(GtkWidget */*widget*/, void *)
+void CloneTiler::clonetiler_apply(GtkWidget */*widget*/, GtkWidget *dlg)
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
if (desktop == NULL) {
@@ -1068,7 +2133,7 @@ static void clonetiler_apply(GtkWidget */*widget*/, void *)
const char *id_href = g_strdup_printf("#%s", obj_repr->attribute("id"));
SPObject *parent = obj->parent;
- clonetiler_remove (NULL, NULL, false);
+ clonetiler_remove (NULL, dlg, false);
double shiftx_per_i = 0.01 * prefs->getDoubleLimited(prefs_path + "shiftx_per_i", 0, -10000, 10000);
double shifty_per_i = 0.01 * prefs->getDoubleLimited(prefs_path + "shifty_per_i", 0, -10000, 10000);
@@ -1466,7 +2531,7 @@ static void clonetiler_apply(GtkWidget */*widget*/, void *)
_("Create tiled clones"));
}
-static GtkWidget * clonetiler_new_tab(GtkWidget *nb, const gchar *label)
+GtkWidget * CloneTiler::clonetiler_new_tab(GtkWidget *nb, const gchar *label)
{
GtkWidget *l = gtk_label_new_with_mnemonic (label);
GtkWidget *vb = gtk_vbox_new (FALSE, VB_MARGIN);
@@ -1475,14 +2540,14 @@ static GtkWidget * clonetiler_new_tab(GtkWidget *nb, const gchar *label)
return vb;
}
-static void clonetiler_checkbox_toggled(GtkToggleButton *tb, gpointer *data)
+void CloneTiler::clonetiler_checkbox_toggled(GtkToggleButton *tb, gpointer *data)
{
const gchar *attr = (const gchar *) data;
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
prefs->setBool(prefs_path + attr, gtk_toggle_button_get_active(tb));
}
-static GtkWidget * clonetiler_checkbox(const char *tip, const char *attr)
+GtkWidget * CloneTiler::clonetiler_checkbox(const char *tip, const char *attr)
{
GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
@@ -1502,14 +2567,14 @@ static GtkWidget * clonetiler_checkbox(const char *tip, const char *attr)
return hb;
}
-static void clonetiler_value_changed(GtkAdjustment *adj, gpointer data)
+void CloneTiler::clonetiler_value_changed(GtkAdjustment *adj, gpointer data)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
const gchar *pref = (const gchar *) data;
prefs->setDouble(prefs_path + pref, gtk_adjustment_get_value (adj));
}
-static GtkWidget * clonetiler_spinbox(const char *tip, const char *attr, double lower, double upper, const gchar *suffix, bool exponent = false)
+GtkWidget * CloneTiler::clonetiler_spinbox(const char *tip, const char *attr, double lower, double upper, const gchar *suffix, bool exponent/* = false*/)
{
GtkWidget *hb = gtk_hbox_new(FALSE, 0);
@@ -1557,27 +2622,27 @@ static GtkWidget * clonetiler_spinbox(const char *tip, const char *attr, double
return hb;
}
-static void clonetiler_symgroup_changed(GtkComboBox *cb, gpointer /*data*/)
+void CloneTiler::clonetiler_symgroup_changed(GtkComboBox *cb, gpointer /*data*/)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
gint group_new = gtk_combo_box_get_active (cb);
prefs->setInt(prefs_path + "symmetrygroup", group_new);
}
-static void clonetiler_xy_changed(GtkAdjustment *adj, gpointer data)
+void CloneTiler::clonetiler_xy_changed(GtkAdjustment *adj, gpointer data)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
const gchar *pref = (const gchar *) data;
prefs->setInt(prefs_path + pref, (int) floor(gtk_adjustment_get_value (adj) + 0.5));
}
-static void clonetiler_keep_bbox_toggled(GtkToggleButton *tb, gpointer /*data*/)
+void CloneTiler::clonetiler_keep_bbox_toggled(GtkToggleButton *tb, gpointer /*data*/)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
prefs->setBool(prefs_path + "keepbbox", gtk_toggle_button_get_active(tb));
}
-static void clonetiler_pick_to(GtkToggleButton *tb, gpointer data)
+void CloneTiler::clonetiler_pick_to(GtkToggleButton *tb, gpointer data)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
const gchar *pref = (const gchar *) data;
@@ -1585,7 +2650,7 @@ static void clonetiler_pick_to(GtkToggleButton *tb, gpointer data)
}
-static void clonetiler_reset_recursive(GtkWidget *w)
+void CloneTiler::clonetiler_reset_recursive(GtkWidget *w)
{
if (w && GTK_IS_OBJECT(w)) {
{
@@ -1619,19 +2684,19 @@ static void clonetiler_reset_recursive(GtkWidget *w)
}
}
-static void clonetiler_reset(GtkWidget */*widget*/, void *)
+void CloneTiler::clonetiler_reset(GtkWidget */*widget*/, GtkWidget *dlg)
{
clonetiler_reset_recursive (dlg);
}
-static void clonetiler_table_attach(GtkWidget *table, GtkWidget *widget, float align, int row, int col)
+void CloneTiler::clonetiler_table_attach(GtkWidget *table, GtkWidget *widget, float align, int row, int col)
{
GtkWidget *a = gtk_alignment_new (align, 0, 0, 0);
gtk_container_add(GTK_CONTAINER(a), widget);
gtk_table_attach ( GTK_TABLE (table), a, col, col + 1, row, row + 1, (GtkAttachOptions)4, (GtkAttachOptions)0, 0, 0 );
}
-static GtkWidget * clonetiler_table_x_y_rand(int values)
+GtkWidget * CloneTiler::clonetiler_table_x_y_rand(int values)
{
GtkWidget *table = gtk_table_new (values + 2, 5, FALSE);
gtk_container_set_border_width (GTK_CONTAINER (table), VB_MARGIN);
@@ -1673,7 +2738,7 @@ static GtkWidget * clonetiler_table_x_y_rand(int values)
return table;
}
-static void clonetiler_pick_switched(GtkToggleButton */*tb*/, gpointer data)
+void CloneTiler::clonetiler_pick_switched(GtkToggleButton */*tb*/, gpointer data)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
guint v = GPOINTER_TO_INT (data);
@@ -1681,7 +2746,7 @@ static void clonetiler_pick_switched(GtkToggleButton */*tb*/, gpointer data)
}
-static void clonetiler_switch_to_create(GtkToggleButton */*tb*/, GtkWidget *dlg)
+void CloneTiler::clonetiler_switch_to_create(GtkToggleButton */*tb*/, GtkWidget *dlg)
{
GtkWidget *rowscols = (GtkWidget *) g_object_get_data (G_OBJECT(dlg), "rowscols");
GtkWidget *widthheight = (GtkWidget *) g_object_get_data (G_OBJECT(dlg), "widthheight");
@@ -1698,7 +2763,7 @@ static void clonetiler_switch_to_create(GtkToggleButton */*tb*/, GtkWidget *dlg)
}
-static void clonetiler_switch_to_fill(GtkToggleButton */*tb*/, GtkWidget *dlg)
+void CloneTiler::clonetiler_switch_to_fill(GtkToggleButton */*tb*/, GtkWidget *dlg)
{
GtkWidget *rowscols = (GtkWidget *) g_object_get_data (G_OBJECT(dlg), "rowscols");
GtkWidget *widthheight = (GtkWidget *) g_object_get_data (G_OBJECT(dlg), "widthheight");
@@ -1717,7 +2782,7 @@ static void clonetiler_switch_to_fill(GtkToggleButton */*tb*/, GtkWidget *dlg)
-static void clonetiler_fill_width_changed(GtkAdjustment *adj, GtkWidget *u)
+void CloneTiler::clonetiler_fill_width_changed(GtkAdjustment *adj, GtkWidget *u)
{
gdouble const raw_dist = gtk_adjustment_get_value (adj);
SPUnit const &unit = *sp_unit_selector_get_unit(SP_UNIT_SELECTOR(u));
@@ -1727,7 +2792,7 @@ static void clonetiler_fill_width_changed(GtkAdjustment *adj, GtkWidget *u)
prefs->setDouble(prefs_path + "fillwidth", pixels);
}
-static void clonetiler_fill_height_changed(GtkAdjustment *adj, GtkWidget *u)
+void CloneTiler::clonetiler_fill_height_changed(GtkAdjustment *adj, GtkWidget *u)
{
gdouble const raw_dist = gtk_adjustment_get_value (adj);
SPUnit const &unit = *sp_unit_selector_get_unit(SP_UNIT_SELECTOR(u));
@@ -1738,7 +2803,7 @@ static void clonetiler_fill_height_changed(GtkAdjustment *adj, GtkWidget *u)
}
-static void clonetiler_do_pick_toggled(GtkToggleButton *tb, gpointer /*data*/)
+void CloneTiler::clonetiler_do_pick_toggled(GtkToggleButton *tb, GtkWidget *dlg)
{
GtkWidget *vvb = (GtkWidget *) g_object_get_data (G_OBJECT(dlg), "dotrace");
@@ -1751,1156 +2816,8 @@ static void clonetiler_do_pick_toggled(GtkToggleButton *tb, gpointer /*data*/)
}
-
-
-void clonetiler_dialog(void)
-{
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- if (!dlg)
- {
- gchar title[500];
- sp_ui_dialog_title_string (Inkscape::Verb::get(SP_VERB_DIALOG_CLONETILER), title);
-
- dlg = sp_window_new (title, TRUE);
- if (x == -1000 || y == -1000) {
- x = prefs->getInt(prefs_path + "x", -1000);
- y = prefs->getInt(prefs_path + "y", -1000);
- }
-
- if (w ==0 || h == 0) {
- w = prefs->getInt(prefs_path + "w", 0);
- h = prefs->getInt(prefs_path + "h", 0);
- }
-
- prefs->setInt(prefs_path + "visible", 1);
-
-// if (x<0) x=0;
-// if (y<0) y=0;
-
- if (w && h) {
- gtk_window_resize ((GtkWindow *) dlg, w, h);
- }
- if (x >= 0 && y >= 0 && (x < (gdk_screen_width()-MIN_ONSCREEN_DISTANCE)) && (y < (gdk_screen_height()-MIN_ONSCREEN_DISTANCE))) {
- gtk_window_move ((GtkWindow *) dlg, x, y);
-
- } else {
- gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
- }
-
-
- sp_transientize (dlg);
- wd.win = dlg;
- wd.stop = 0;
-
-
- g_signal_connect ( G_OBJECT (dlg), "event", G_CALLBACK (sp_dialog_event_handler), dlg);
-
- g_signal_connect ( G_OBJECT (dlg), "destroy", G_CALLBACK (clonetiler_dialog_destroy), dlg);
- g_signal_connect ( G_OBJECT (dlg), "delete_event", G_CALLBACK (clonetiler_dialog_delete), dlg);
-
- g_signal_connect ( G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (clonetiler_dialog_delete), dlg);
- g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg);
- g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg);
- g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd);
-
- GtkWidget *mainbox = gtk_vbox_new(FALSE, 4);
- gtk_container_set_border_width (GTK_CONTAINER (mainbox), 6);
- gtk_container_add (GTK_CONTAINER (dlg), mainbox);
-
- GtkWidget *nb = gtk_notebook_new ();
- gtk_box_pack_start (GTK_BOX (mainbox), nb, FALSE, FALSE, 0);
-
-
-// Symmetry
- {
- GtkWidget *vb = clonetiler_new_tab (nb, _("_Symmetry"));
-
- /* TRANSLATORS: For the following 17 symmetry groups, see
- * http://www.bib.ulb.ac.be/coursmath/doc/17.htm (visual examples);
- * http://www.clarku.edu/~djoyce/wallpaper/seventeen.html (English vocabulary); or
- * http://membres.lycos.fr/villemingerard/Geometri/Sym1D.htm (French vocabulary).
- */
- struct SymGroups {
- gint group;
- gchar const *label;
- } const sym_groups[] = {
- // TRANSLATORS: "translation" means "shift" / "displacement" here.
- {TILE_P1, _("<b>P1</b>: simple translation")},
- {TILE_P2, _("<b>P2</b>: 180&#176; rotation")},
- {TILE_PM, _("<b>PM</b>: reflection")},
- // TRANSLATORS: "glide reflection" is a reflection and a translation combined.
- // For more info, see http://mathforum.org/sum95/suzanne/symsusan.html
- {TILE_PG, _("<b>PG</b>: glide reflection")},
- {TILE_CM, _("<b>CM</b>: reflection + glide reflection")},
- {TILE_PMM, _("<b>PMM</b>: reflection + reflection")},
- {TILE_PMG, _("<b>PMG</b>: reflection + 180&#176; rotation")},
- {TILE_PGG, _("<b>PGG</b>: glide reflection + 180&#176; rotation")},
- {TILE_CMM, _("<b>CMM</b>: reflection + reflection + 180&#176; rotation")},
- {TILE_P4, _("<b>P4</b>: 90&#176; rotation")},
- {TILE_P4M, _("<b>P4M</b>: 90&#176; rotation + 45&#176; reflection")},
- {TILE_P4G, _("<b>P4G</b>: 90&#176; rotation + 90&#176; reflection")},
- {TILE_P3, _("<b>P3</b>: 120&#176; rotation")},
- {TILE_P31M, _("<b>P31M</b>: reflection + 120&#176; rotation, dense")},
- {TILE_P3M1, _("<b>P3M1</b>: reflection + 120&#176; rotation, sparse")},
- {TILE_P6, _("<b>P6</b>: 60&#176; rotation")},
- {TILE_P6M, _("<b>P6M</b>: reflection + 60&#176; rotation")},
- };
-
- gint current = prefs->getInt(prefs_path + "symmetrygroup", 0);
-
- // Create a list structure containing all the data to be displayed in
- // the symmetry group combo box.
- GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING);
- GtkTreeIter iter;
-
- for (unsigned j = 0; j < G_N_ELEMENTS(sym_groups); ++j) {
- SymGroups const &sg = sym_groups[j];
-
- // Add the description of the symgroup to a new row
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter,
- 0, sg.label,
- -1);
- }
-
- // Add a new combo box widget with the list of symmetry groups to the vbox
- GtkWidget *combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
- gtk_widget_set_tooltip_text (combo, _("Select one of the 17 symmetry groups for the tiling"));
- gtk_box_pack_start (GTK_BOX (vb), combo, FALSE, FALSE, SB_MARGIN);
-
- // Specify the rendering of data from the list in a combo box cell
- GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, FALSE);
- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer,
- "markup", 0,
- NULL);
-
- gtk_combo_box_set_active (GTK_COMBO_BOX (combo), current);
-
- g_signal_connect (G_OBJECT (combo), "changed",
- G_CALLBACK (clonetiler_symgroup_changed),
- NULL);
- }
-
- table_row_labels = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-
-// Shift
- {
- GtkWidget *vb = clonetiler_new_tab (nb, _("S_hift"));
-
- GtkWidget *table = clonetiler_table_x_y_rand (3);
- gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
-
- // X
- {
- GtkWidget *l = gtk_label_new ("");
- // TRANSLATORS: "shift" means: the tiles will be shifted (offset) horizontally by this amount
- // xgettext:no-c-format
- gtk_label_set_markup (GTK_LABEL(l), _("<b>Shift X:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 2, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- // xgettext:no-c-format
- _("Horizontal shift per row (in % of tile width)"), "shiftx_per_j",
- -10000, 10000, "%");
- clonetiler_table_attach (table, l, 0, 2, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- // xgettext:no-c-format
- _("Horizontal shift per column (in % of tile width)"), "shiftx_per_i",
- -10000, 10000, "%");
- clonetiler_table_attach (table, l, 0, 2, 3);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Randomize the horizontal shift by this percentage"), "shiftx_rand",
- 0, 1000, "%");
- clonetiler_table_attach (table, l, 0, 2, 4);
- }
-
- // Y
- {
- GtkWidget *l = gtk_label_new ("");
- // TRANSLATORS: "shift" means: the tiles will be shifted (offset) vertically by this amount
- // xgettext:no-c-format
- gtk_label_set_markup (GTK_LABEL(l), _("<b>Shift Y:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 3, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- // xgettext:no-c-format
- _("Vertical shift per row (in % of tile height)"), "shifty_per_j",
- -10000, 10000, "%");
- clonetiler_table_attach (table, l, 0, 3, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- // xgettext:no-c-format
- _("Vertical shift per column (in % of tile height)"), "shifty_per_i",
- -10000, 10000, "%");
- clonetiler_table_attach (table, l, 0, 3, 3);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- _("Randomize the vertical shift by this percentage"), "shifty_rand",
- 0, 1000, "%");
- clonetiler_table_attach (table, l, 0, 3, 4);
- }
-
- // Exponent
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>Exponent:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 4, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- _("Whether rows are spaced evenly (1), converge (<1) or diverge (>1)"), "shifty_exp",
- 0, 10, "", true);
- clonetiler_table_attach (table, l, 0, 4, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- _("Whether columns are spaced evenly (1), converge (<1) or diverge (>1)"), "shiftx_exp",
- 0, 10, "", true);
- clonetiler_table_attach (table, l, 0, 4, 3);
- }
-
- { // alternates
- GtkWidget *l = gtk_label_new ("");
- // TRANSLATORS: "Alternate" is a verb here
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 5, 1);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of shifts for each row"), "shifty_alternate");
- clonetiler_table_attach (table, l, 0, 5, 2);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of shifts for each column"), "shiftx_alternate");
- clonetiler_table_attach (table, l, 0, 5, 3);
- }
-
- { // Cumulate
- GtkWidget *l = gtk_label_new ("");
- // TRANSLATORS: "Cumulate" is a verb here
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Cumulate:</small>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 6, 1);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Cumulate the shifts for each row"), "shifty_cumulate");
- clonetiler_table_attach (table, l, 0, 6, 2);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Cumulate the shifts for each column"), "shiftx_cumulate");
- clonetiler_table_attach (table, l, 0, 6, 3);
- }
-
- { // Exclude tile width and height in shift
- GtkWidget *l = gtk_label_new ("");
- // TRANSLATORS: "Cumulate" is a verb here
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Exclude tile:</small>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 7, 1);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Exclude tile height in shift"), "shifty_excludeh");
- clonetiler_table_attach (table, l, 0, 7, 2);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Exclude tile width in shift"), "shiftx_excludew");
- clonetiler_table_attach (table, l, 0, 7, 3);
- }
-
- }
-
-
-// Scale
- {
- GtkWidget *vb = clonetiler_new_tab (nb, _("Sc_ale"));
-
- GtkWidget *table = clonetiler_table_x_y_rand (2);
- gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
-
- // X
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>Scale X:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 2, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- // xgettext:no-c-format
- _("Horizontal scale per row (in % of tile width)"), "scalex_per_j",
- -100, 1000, "%");
- clonetiler_table_attach (table, l, 0, 2, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- // xgettext:no-c-format
- _("Horizontal scale per column (in % of tile width)"), "scalex_per_i",
- -100, 1000, "%");
- clonetiler_table_attach (table, l, 0, 2, 3);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Randomize the horizontal scale by this percentage"), "scalex_rand",
- 0, 1000, "%");
- clonetiler_table_attach (table, l, 0, 2, 4);
- }
-
- // Y
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>Scale Y:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 3, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- // xgettext:no-c-format
- _("Vertical scale per row (in % of tile height)"), "scaley_per_j",
- -100, 1000, "%");
- clonetiler_table_attach (table, l, 0, 3, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- // xgettext:no-c-format
- _("Vertical scale per column (in % of tile height)"), "scaley_per_i",
- -100, 1000, "%");
- clonetiler_table_attach (table, l, 0, 3, 3);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Randomize the vertical scale by this percentage"), "scaley_rand",
- 0, 1000, "%");
- clonetiler_table_attach (table, l, 0, 3, 4);
- }
-
- // Exponent
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>Exponent:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 4, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Whether row scaling is uniform (1), converge (<1) or diverge (>1)"), "scaley_exp",
- 0, 10, "", true);
- clonetiler_table_attach (table, l, 0, 4, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Whether column scaling is uniform (1), converge (<1) or diverge (>1)"), "scalex_exp",
- 0, 10, "", true);
- clonetiler_table_attach (table, l, 0, 4, 3);
- }
-
- // Logarithmic (as in logarithmic spiral)
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>Base:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 5, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Base for a logarithmic spiral: not used (0), converge (<1), or diverge (>1)"), "scaley_log",
- 0, 10, "", false);
- clonetiler_table_attach (table, l, 0, 5, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Base for a logarithmic spiral: not used (0), converge (<1), or diverge (>1)"), "scalex_log",
- 0, 10, "", false);
- clonetiler_table_attach (table, l, 0, 5, 3);
- }
-
- { // alternates
- GtkWidget *l = gtk_label_new ("");
- // TRANSLATORS: "Alternate" is a verb here
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 6, 1);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of scales for each row"), "scaley_alternate");
- clonetiler_table_attach (table, l, 0, 6, 2);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of scales for each column"), "scalex_alternate");
- clonetiler_table_attach (table, l, 0, 6, 3);
- }
-
- { // Cumulate
- GtkWidget *l = gtk_label_new ("");
- // TRANSLATORS: "Cumulate" is a verb here
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Cumulate:</small>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 7, 1);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Cumulate the scales for each row"), "scaley_cumulate");
- clonetiler_table_attach (table, l, 0, 7, 2);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Cumulate the scales for each column"), "scalex_cumulate");
- clonetiler_table_attach (table, l, 0, 7, 3);
- }
-
- }
-
-
-// Rotation
- {
- GtkWidget *vb = clonetiler_new_tab (nb, _("_Rotation"));
-
- GtkWidget *table = clonetiler_table_x_y_rand (1);
- gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
-
- // Angle
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>Angle:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 2, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- // xgettext:no-c-format
- _("Rotate tiles by this angle for each row"), "rotate_per_j",
- -180, 180, "&#176;");
- clonetiler_table_attach (table, l, 0, 2, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (
- // xgettext:no-c-format
- _("Rotate tiles by this angle for each column"), "rotate_per_i",
- -180, 180, "&#176;");
- clonetiler_table_attach (table, l, 0, 2, 3);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Randomize the rotation angle by this percentage"), "rotate_rand",
- 0, 100, "%");
- clonetiler_table_attach (table, l, 0, 2, 4);
- }
-
- { // alternates
- GtkWidget *l = gtk_label_new ("");
- // TRANSLATORS: "Alternate" is a verb here
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 3, 1);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the rotation direction for each row"), "rotate_alternatej");
- clonetiler_table_attach (table, l, 0, 3, 2);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the rotation direction for each column"), "rotate_alternatei");
- clonetiler_table_attach (table, l, 0, 3, 3);
- }
-
- { // Cumulate
- GtkWidget *l = gtk_label_new ("");
- // TRANSLATORS: "Cumulate" is a verb here
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Cumulate:</small>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 4, 1);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Cumulate the rotation for each row"), "rotate_cumulatej");
- clonetiler_table_attach (table, l, 0, 4, 2);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Cumulate the rotation for each column"), "rotate_cumulatei");
- clonetiler_table_attach (table, l, 0, 4, 3);
- }
-
- }
-
-
-// Blur and opacity
- {
- GtkWidget *vb = clonetiler_new_tab (nb, _("_Blur & opacity"));
-
- GtkWidget *table = clonetiler_table_x_y_rand (1);
- gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
-
-
- // Blur
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>Blur:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 2, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Blur tiles by this percentage for each row"), "blur_per_j",
- 0, 100, "%");
- clonetiler_table_attach (table, l, 0, 2, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Blur tiles by this percentage for each column"), "blur_per_i",
- 0, 100, "%");
- clonetiler_table_attach (table, l, 0, 2, 3);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Randomize the tile blur by this percentage"), "blur_rand",
- 0, 100, "%");
- clonetiler_table_attach (table, l, 0, 2, 4);
- }
-
- { // alternates
- GtkWidget *l = gtk_label_new ("");
- // TRANSLATORS: "Alternate" is a verb here
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 3, 1);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of blur change for each row"), "blur_alternatej");
- clonetiler_table_attach (table, l, 0, 3, 2);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of blur change for each column"), "blur_alternatei");
- clonetiler_table_attach (table, l, 0, 3, 3);
- }
-
-
-
- // Dissolve
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>Opacity:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 4, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Decrease tile opacity by this percentage for each row"), "opacity_per_j",
- 0, 100, "%");
- clonetiler_table_attach (table, l, 0, 4, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Decrease tile opacity by this percentage for each column"), "opacity_per_i",
- 0, 100, "%");
- clonetiler_table_attach (table, l, 0, 4, 3);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Randomize the tile opacity by this percentage"), "opacity_rand",
- 0, 100, "%");
- clonetiler_table_attach (table, l, 0, 4, 4);
- }
-
- { // alternates
- GtkWidget *l = gtk_label_new ("");
- // TRANSLATORS: "Alternate" is a verb here
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 5, 1);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of opacity change for each row"), "opacity_alternatej");
- clonetiler_table_attach (table, l, 0, 5, 2);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of opacity change for each column"), "opacity_alternatei");
- clonetiler_table_attach (table, l, 0, 5, 3);
- }
- }
-
-
-// Color
- {
- GtkWidget *vb = clonetiler_new_tab (nb, _("Co_lor"));
-
- {
- GtkWidget *hb = gtk_hbox_new (FALSE, 0);
-
- GtkWidget *l = gtk_label_new (_("Initial color: "));
- gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
-
- guint32 rgba = 0x000000ff | sp_svg_read_color (prefs->getString(prefs_path + "initial_color").data(), 0x000000ff);
- color_picker = new Inkscape::UI::Widget::ColorPicker (*new Glib::ustring(_("Initial color of tiled clones")), *new Glib::ustring(_("Initial color for clones (works only if the original has unset fill or stroke)")), rgba, false);
- _color_changed_connection = color_picker->connectChanged (sigc::ptr_fun(on_picker_color_changed));
-
- gtk_box_pack_start (GTK_BOX (hb), reinterpret_cast<GtkWidget*>(color_picker->gobj()), FALSE, FALSE, 0);
-
- gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
- }
-
-
- GtkWidget *table = clonetiler_table_x_y_rand (3);
- gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
-
- // Hue
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>H:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 2, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Change the tile hue by this percentage for each row"), "hue_per_j",
- -100, 100, "%");
- clonetiler_table_attach (table, l, 0, 2, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Change the tile hue by this percentage for each column"), "hue_per_i",
- -100, 100, "%");
- clonetiler_table_attach (table, l, 0, 2, 3);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Randomize the tile hue by this percentage"), "hue_rand",
- 0, 100, "%");
- clonetiler_table_attach (table, l, 0, 2, 4);
- }
-
-
- // Saturation
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>S:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 3, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Change the color saturation by this percentage for each row"), "saturation_per_j",
- -100, 100, "%");
- clonetiler_table_attach (table, l, 0, 3, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Change the color saturation by this percentage for each column"), "saturation_per_i",
- -100, 100, "%");
- clonetiler_table_attach (table, l, 0, 3, 3);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Randomize the color saturation by this percentage"), "saturation_rand",
- 0, 100, "%");
- clonetiler_table_attach (table, l, 0, 3, 4);
- }
-
- // Lightness
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>L:</b>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 4, 1);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Change the color lightness by this percentage for each row"), "lightness_per_j",
- -100, 100, "%");
- clonetiler_table_attach (table, l, 0, 4, 2);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Change the color lightness by this percentage for each column"), "lightness_per_i",
- -100, 100, "%");
- clonetiler_table_attach (table, l, 0, 4, 3);
- }
-
- {
- GtkWidget *l = clonetiler_spinbox (_("Randomize the color lightness by this percentage"), "lightness_rand",
- 0, 100, "%");
- clonetiler_table_attach (table, l, 0, 4, 4);
- }
-
-
- { // alternates
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
- gtk_size_group_add_widget(table_row_labels, l);
- clonetiler_table_attach (table, l, 1, 5, 1);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of color changes for each row"), "color_alternatej");
- clonetiler_table_attach (table, l, 0, 5, 2);
- }
-
- {
- GtkWidget *l = clonetiler_checkbox (_("Alternate the sign of color changes for each column"), "color_alternatei");
- clonetiler_table_attach (table, l, 0, 5, 3);
- }
-
- }
-
-// Trace
- {
- GtkWidget *vb = clonetiler_new_tab (nb, _("_Trace"));
-
-
- {
- GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
- gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
-
- GtkWidget *b = gtk_check_button_new_with_label (_("Trace the drawing under the tiles"));
- g_object_set_data (G_OBJECT(b), "uncheckable", GINT_TO_POINTER(TRUE));
- bool old = prefs->getBool(prefs_path + "dotrace");
- gtk_toggle_button_set_active ((GtkToggleButton *) b, old);
- gtk_widget_set_tooltip_text (b, _("For each clone, pick a value from the drawing in that clone's location and apply it to the clone"));
- gtk_box_pack_start (GTK_BOX (hb), b, FALSE, FALSE, 0);
-
- g_signal_connect(G_OBJECT(b), "toggled",
- G_CALLBACK(clonetiler_do_pick_toggled), dlg);
- }
-
- {
- GtkWidget *vvb = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vb), vvb, FALSE, FALSE, 0);
- g_object_set_data (G_OBJECT(dlg), "dotrace", (gpointer) vvb);
-
-
- {
- GtkWidget *frame = gtk_frame_new (_("1. Pick from the drawing:"));
- gtk_box_pack_start (GTK_BOX (vvb), frame, FALSE, FALSE, 0);
-
- GtkWidget *table = gtk_table_new (3, 3, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 4);
- gtk_table_set_col_spacings (GTK_TABLE (table), 6);
- gtk_container_add(GTK_CONTAINER(frame), table);
-
-
- GtkWidget* radio;
- {
- radio = gtk_radio_button_new_with_label (NULL, _("Color"));
- gtk_widget_set_tooltip_text (radio, _("Pick the visible color and opacity"));
- clonetiler_table_attach (table, radio, 0.0, 1, 1);
- g_signal_connect (G_OBJECT (radio), "toggled",
- G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_COLOR));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_COLOR);
- }
- {
- radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), _("Opacity"));
- gtk_widget_set_tooltip_text (radio, _("Pick the total accumulated opacity"));
- clonetiler_table_attach (table, radio, 0.0, 2, 1);
- g_signal_connect (G_OBJECT (radio), "toggled",
- G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_OPACITY));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_OPACITY);
- }
- {
- radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), _("R"));
- gtk_widget_set_tooltip_text (radio, _("Pick the Red component of the color"));
- clonetiler_table_attach (table, radio, 0.0, 1, 2);
- g_signal_connect (G_OBJECT (radio), "toggled",
- G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_R));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_R);
- }
- {
- radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), _("G"));
- gtk_widget_set_tooltip_text (radio, _("Pick the Green component of the color"));
- clonetiler_table_attach (table, radio, 0.0, 2, 2);
- g_signal_connect (G_OBJECT (radio), "toggled",
- G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_G));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_G);
- }
- {
- radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), _("B"));
- gtk_widget_set_tooltip_text (radio, _("Pick the Blue component of the color"));
- clonetiler_table_attach (table, radio, 0.0, 3, 2);
- g_signal_connect (G_OBJECT (radio), "toggled",
- G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_B));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_B);
- }
- {
- radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), C_("Clonetiler color hue", "H"));
- gtk_widget_set_tooltip_text (radio, _("Pick the hue of the color"));
- clonetiler_table_attach (table, radio, 0.0, 1, 3);
- g_signal_connect (G_OBJECT (radio), "toggled",
- G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_H));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_H);
- }
- {
- radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), C_("Clonetiler color saturation", "S"));
- gtk_widget_set_tooltip_text (radio, _("Pick the saturation of the color"));
- clonetiler_table_attach (table, radio, 0.0, 2, 3);
- g_signal_connect (G_OBJECT (radio), "toggled",
- G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_S));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_S);
- }
- {
- radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), C_("Clonetiler color lightness", "L"));
- gtk_widget_set_tooltip_text (radio, _("Pick the lightness of the color"));
- clonetiler_table_attach (table, radio, 0.0, 3, 3);
- g_signal_connect (G_OBJECT (radio), "toggled",
- G_CALLBACK (clonetiler_pick_switched), GINT_TO_POINTER(PICK_L));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), prefs->getInt(prefs_path + "pick", 0) == PICK_L);
- }
-
- }
-
- {
- GtkWidget *frame = gtk_frame_new (_("2. Tweak the picked value:"));
- gtk_box_pack_start (GTK_BOX (vvb), frame, FALSE, FALSE, VB_MARGIN);
-
- GtkWidget *table = gtk_table_new (4, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 4);
- gtk_table_set_col_spacings (GTK_TABLE (table), 6);
- gtk_container_add(GTK_CONTAINER(frame), table);
-
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("Gamma-correct:"));
- clonetiler_table_attach (table, l, 1.0, 1, 1);
- }
- {
- GtkWidget *l = clonetiler_spinbox (_("Shift the mid-range of the picked value upwards (>0) or downwards (<0)"), "gamma_picked",
- -10, 10, "");
- clonetiler_table_attach (table, l, 0.0, 1, 2);
- }
-
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("Randomize:"));
- clonetiler_table_attach (table, l, 1.0, 1, 3);
- }
- {
- GtkWidget *l = clonetiler_spinbox (_("Randomize the picked value by this percentage"), "rand_picked",
- 0, 100, "%");
- clonetiler_table_attach (table, l, 0.0, 1, 4);
- }
-
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("Invert:"));
- clonetiler_table_attach (table, l, 1.0, 2, 1);
- }
- {
- GtkWidget *l = clonetiler_checkbox (_("Invert the picked value"), "invert_picked");
- clonetiler_table_attach (table, l, 0.0, 2, 2);
- }
- }
-
- {
- GtkWidget *frame = gtk_frame_new (_("3. Apply the value to the clones':"));
- gtk_box_pack_start (GTK_BOX (vvb), frame, FALSE, FALSE, 0);
-
-
- GtkWidget *table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 4);
- gtk_table_set_col_spacings (GTK_TABLE (table), 6);
- gtk_container_add(GTK_CONTAINER(frame), table);
-
- {
- GtkWidget *b = gtk_check_button_new_with_label (_("Presence"));
- bool old = prefs->getBool(prefs_path + "pick_to_presence", true);
- gtk_toggle_button_set_active ((GtkToggleButton *) b, old);
- gtk_widget_set_tooltip_text (b, _("Each clone is created with the probability determined by the picked value in that point"));
- clonetiler_table_attach (table, b, 0.0, 1, 1);
- g_signal_connect(G_OBJECT(b), "toggled",
- G_CALLBACK(clonetiler_pick_to), (gpointer) "pick_to_presence");
- }
-
- {
- GtkWidget *b = gtk_check_button_new_with_label (_("Size"));
- bool old = prefs->getBool(prefs_path + "pick_to_size");
- gtk_toggle_button_set_active ((GtkToggleButton *) b, old);
- gtk_widget_set_tooltip_text (b, _("Each clone's size is determined by the picked value in that point"));
- clonetiler_table_attach (table, b, 0.0, 2, 1);
- g_signal_connect(G_OBJECT(b), "toggled",
- G_CALLBACK(clonetiler_pick_to), (gpointer) "pick_to_size");
- }
-
- {
- GtkWidget *b = gtk_check_button_new_with_label (_("Color"));
- bool old = prefs->getBool(prefs_path + "pick_to_color", 0);
- gtk_toggle_button_set_active ((GtkToggleButton *) b, old);
- gtk_widget_set_tooltip_text (b, _("Each clone is painted by the picked color (the original must have unset fill or stroke)"));
- clonetiler_table_attach (table, b, 0.0, 1, 2);
- g_signal_connect(G_OBJECT(b), "toggled",
- G_CALLBACK(clonetiler_pick_to), (gpointer) "pick_to_color");
- }
-
- {
- GtkWidget *b = gtk_check_button_new_with_label (_("Opacity"));
- bool old = prefs->getBool(prefs_path + "pick_to_opacity", 0);
- gtk_toggle_button_set_active ((GtkToggleButton *) b, old);
- gtk_widget_set_tooltip_text (b, _("Each clone's opacity is determined by the picked value in that point"));
- clonetiler_table_attach (table, b, 0.0, 2, 2);
- g_signal_connect(G_OBJECT(b), "toggled",
- G_CALLBACK(clonetiler_pick_to), (gpointer) "pick_to_opacity");
- }
- }
- gtk_widget_set_sensitive (vvb, prefs->getBool(prefs_path + "dotrace"));
- }
- }
-
-// Rows/columns, width/height
- {
- GtkWidget *table = gtk_table_new (2, 2, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (table), VB_MARGIN);
- gtk_table_set_row_spacings (GTK_TABLE (table), 4);
- gtk_table_set_col_spacings (GTK_TABLE (table), 6);
- gtk_box_pack_start (GTK_BOX (mainbox), table, FALSE, FALSE, 0);
-
- {
- GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
- g_object_set_data (G_OBJECT(dlg), "rowscols", (gpointer) hb);
-
- {
- Gtk::Adjustment *a = new Gtk::Adjustment (0.0, 1, 500, 1, 10, 0);
- int value = prefs->getInt(prefs_path + "jmax", 2);
- a->set_value (value);
-
- Inkscape::UI::Widget::SpinButton *sb = new Inkscape::UI::Widget::SpinButton (*a, 1.0, 0);
- sb->set_tooltip_text (_("How many rows in the tiling"));
- sb->set_width_chars (7);
- gtk_box_pack_start (GTK_BOX (hb), GTK_WIDGET(sb->gobj()), TRUE, TRUE, 0);
-
- // TODO: C++ification
- g_signal_connect(G_OBJECT(a->gobj()), "value_changed",
- G_CALLBACK(clonetiler_xy_changed), (gpointer) "jmax");
- }
-
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), "&#215;");
- gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
- gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
- }
-
- {
- Gtk::Adjustment *a = new Gtk::Adjustment (0.0, 1, 500, 1, 10, 0);
- int value = prefs->getInt(prefs_path + "imax", 2);
- a->set_value (value);
-
- Inkscape::UI::Widget::SpinButton *sb = new Inkscape::UI::Widget::SpinButton (*a, 1.0, 0);
- sb->set_tooltip_text (_("How many columns in the tiling"));
- sb->set_width_chars (7);
- gtk_box_pack_start (GTK_BOX (hb), GTK_WIDGET(sb->gobj()), TRUE, TRUE, 0);
-
- // TODO: C++ification
- g_signal_connect(G_OBJECT(a->gobj()), "value_changed",
- G_CALLBACK(clonetiler_xy_changed), (gpointer) "imax");
- }
-
- clonetiler_table_attach (table, hb, 0.0, 1, 2);
- }
-
- {
- GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
- g_object_set_data (G_OBJECT(dlg), "widthheight", (gpointer) hb);
-
- // unitmenu
- GtkWidget *u = sp_unit_selector_new (SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE);
- sp_unit_selector_set_unit (SP_UNIT_SELECTOR(u), sp_desktop_namedview(SP_ACTIVE_DESKTOP)->doc_units);
-
- {
- // Width spinbutton
- Gtk::Adjustment *a = new Gtk::Adjustment (0.0, -1e6, 1e6, 1.0, 10.0, 0);
- sp_unit_selector_add_adjustment (SP_UNIT_SELECTOR (u), GTK_ADJUSTMENT (a->gobj()));
-
- double value = prefs->getDouble(prefs_path + "fillwidth", 50.0);
- SPUnit const &unit = *sp_unit_selector_get_unit(SP_UNIT_SELECTOR(u));
- gdouble const units = sp_pixels_get_units (value, unit);
- a->set_value (units);
-
- Inkscape::UI::Widget::SpinButton *e = new Inkscape::UI::Widget::SpinButton (*a, 1.0, 2);
- e->set_tooltip_text (_("Width of the rectangle to be filled"));
- e->set_width_chars (7);
- e->set_digits (4);
- gtk_box_pack_start (GTK_BOX (hb), GTK_WIDGET(e->gobj()), TRUE, TRUE, 0);
- // TODO: C++ification
- g_signal_connect(G_OBJECT(a->gobj()), "value_changed",
- G_CALLBACK(clonetiler_fill_width_changed), u);
- }
- {
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), "&#215;");
- gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
- gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
- }
-
- {
- // Height spinbutton
- Gtk::Adjustment *a = new Gtk::Adjustment (0.0, -1e6, 1e6, 1.0, 10.0, 0);
- sp_unit_selector_add_adjustment (SP_UNIT_SELECTOR (u), GTK_ADJUSTMENT (a->gobj()));
-
- double value = prefs->getDouble(prefs_path + "fillheight", 50.0);
- SPUnit const &unit = *sp_unit_selector_get_unit(SP_UNIT_SELECTOR(u));
- gdouble const units = sp_pixels_get_units (value, unit);
- a->set_value (units);
-
- Inkscape::UI::Widget::SpinButton *e = new Inkscape::UI::Widget::SpinButton (*a, 1.0, 2);
- e->set_tooltip_text (_("Height of the rectangle to be filled"));
- e->set_width_chars (7);
- e->set_digits (4);
- gtk_box_pack_start (GTK_BOX (hb), GTK_WIDGET(e->gobj()), TRUE, TRUE, 0);
- // TODO: C++ification
- g_signal_connect(G_OBJECT(a->gobj()), "value_changed",
- G_CALLBACK(clonetiler_fill_height_changed), u);
- }
-
- gtk_box_pack_start (GTK_BOX (hb), u, TRUE, TRUE, 0);
- clonetiler_table_attach (table, hb, 0.0, 2, 2);
-
- }
-
- // Switch
- GtkWidget* radio;
- {
- radio = gtk_radio_button_new_with_label (NULL, _("Rows, columns: "));
- gtk_widget_set_tooltip_text (radio, _("Create the specified number of rows and columns"));
- clonetiler_table_attach (table, radio, 0.0, 1, 1);
- g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (clonetiler_switch_to_create), (gpointer) dlg);
- }
- if (!prefs->getBool(prefs_path + "fillrect")) {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE);
- gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (radio));
- }
- {
- radio = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), _("Width, height: "));
- gtk_widget_set_tooltip_text (radio, _("Fill the specified width and height with the tiling"));
- clonetiler_table_attach (table, radio, 0.0, 2, 1);
- g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (clonetiler_switch_to_fill), (gpointer) dlg);
- }
- if (prefs->getBool(prefs_path + "fillrect")) {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE);
- gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (radio));
- }
- }
-
-
-// Use saved pos
- {
- GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
- gtk_box_pack_start (GTK_BOX (mainbox), hb, FALSE, FALSE, 0);
-
- GtkWidget *b = gtk_check_button_new_with_label (_("Use saved size and position of the tile"));
- bool keepbbox = prefs->getBool(prefs_path + "keepbbox", true);
- gtk_toggle_button_set_active ((GtkToggleButton *) b, keepbbox);
- gtk_widget_set_tooltip_text (b, _("Pretend that the size and position of the tile are the same as the last time you tiled it (if any), instead of using the current size"));
- gtk_box_pack_start (GTK_BOX (hb), b, FALSE, FALSE, 0);
-
- g_signal_connect(G_OBJECT(b), "toggled",
- G_CALLBACK(clonetiler_keep_bbox_toggled), NULL);
- }
-
-// Statusbar
- {
- GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
- gtk_box_pack_end (GTK_BOX (mainbox), hb, FALSE, FALSE, 0);
- GtkWidget *l = gtk_label_new("");
- g_object_set_data (G_OBJECT(dlg), "status", (gpointer) l);
- gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
- }
-
-// Buttons
- {
- GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
- gtk_box_pack_start (GTK_BOX (mainbox), hb, FALSE, FALSE, 0);
-
- {
- GtkWidget *b = gtk_button_new ();
- GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup_with_mnemonic (GTK_LABEL(l), _(" <b>_Create</b> "));
- gtk_container_add (GTK_CONTAINER(b), l);
- gtk_widget_set_tooltip_text (b, _("Create and tile the clones of the selection"));
- g_signal_connect (G_OBJECT (b), "clicked", G_CALLBACK (clonetiler_apply), NULL);
- gtk_box_pack_end (GTK_BOX (hb), b, FALSE, FALSE, 0);
- }
-
- { // buttons which are enabled only when there are tiled clones
- GtkWidget *sb = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_end (GTK_BOX (hb), sb, FALSE, FALSE, 0);
- g_object_set_data (G_OBJECT(dlg), "buttons_on_tiles", (gpointer) sb);
- {
- // TRANSLATORS: if a group of objects are "clumped" together, then they
- // are unevenly spread in the given amount of space - as shown in the
- // diagrams on the left in the following screenshot:
- // http://www.inkscape.org/screenshots/gallery/inkscape-0.42-CVS-tiles-unclump.png
- // So unclumping is the process of spreading a number of objects out more evenly.
- GtkWidget *b = gtk_button_new_with_mnemonic (_(" _Unclump "));
- gtk_widget_set_tooltip_text (b, _("Spread out clones to reduce clumping; can be applied repeatedly"));
- g_signal_connect (G_OBJECT (b), "clicked", G_CALLBACK (clonetiler_unclump), NULL);
- gtk_box_pack_end (GTK_BOX (sb), b, FALSE, FALSE, 0);
- }
-
- {
- GtkWidget *b = gtk_button_new_with_mnemonic (_(" Re_move "));
- gtk_widget_set_tooltip_text (b, _("Remove existing tiled clones of the selected object (siblings only)"));
- g_signal_connect (G_OBJECT (b), "clicked", G_CALLBACK (clonetiler_remove), NULL);
- gtk_box_pack_end (GTK_BOX (sb), b, FALSE, FALSE, 0);
- }
-
- // connect to global selection changed signal (so we can change desktops) and
- // external_change (so we're not fooled by undo)
- g_signal_connect (G_OBJECT (INKSCAPE), "change_selection", G_CALLBACK (clonetiler_change_selection), dlg);
- g_signal_connect (G_OBJECT (INKSCAPE), "external_change", G_CALLBACK (clonetiler_external_change), dlg);
- g_signal_connect(G_OBJECT(dlg), "destroy", G_CALLBACK(clonetiler_disconnect_gsignal), G_OBJECT (INKSCAPE));
-
- // update now
- clonetiler_change_selection (NULL, sp_desktop_selection(SP_ACTIVE_DESKTOP), dlg);
- }
-
- {
- GtkWidget *b = gtk_button_new_with_mnemonic (_(" R_eset "));
- // TRANSLATORS: "change" is a noun here
- gtk_widget_set_tooltip_text (b, _("Reset all shifts, scales, rotates, opacity and color changes in the dialog to zero"));
- g_signal_connect (G_OBJECT (b), "clicked", G_CALLBACK (clonetiler_reset), NULL);
- gtk_box_pack_start (GTK_BOX (hb), b, FALSE, FALSE, 0);
- }
- }
-
- gtk_widget_show_all (mainbox);
-
- } // end of if (!dlg)
-
- gtk_window_present ((GtkWindow *) dlg);
+}
+}
}
diff --git a/src/ui/dialog/clonetiler.h b/src/ui/dialog/clonetiler.h
new file mode 100644
index 000000000..2cad30e9e
--- /dev/null
+++ b/src/ui/dialog/clonetiler.h
@@ -0,0 +1,183 @@
+/** @file
+ * @brief Clone tiling dialog
+ */
+/* Authors:
+ * bulia byak <buliabyak@users.sf.net>
+ *
+ * Copyright (C) 2004 Authors
+ * Released under the GNU GPL, read the file 'COPYING' for more information
+ */
+#ifndef __SP_CLONE_TILER_H__
+#define __SP_CLONE_TILER_H__
+
+#include "ui/widget/panel.h"
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include "ui/dialog/desktop-tracker.h"
+#include "ui/widget/color-picker.h"
+#include "sp-root.h"
+
+namespace Inkscape {
+namespace UI {
+namespace Dialog {
+
+class CloneTiler : public Widget::Panel {
+public:
+ CloneTiler();
+ virtual ~CloneTiler();
+
+ static CloneTiler &getInstance() { return *new CloneTiler(); }
+
+protected:
+
+ GtkWidget * clonetiler_new_tab(GtkWidget *nb, const gchar *label);
+ GtkWidget * clonetiler_table_x_y_rand(int values);
+ GtkWidget * clonetiler_spinbox(const char *tip, const char *attr, double lower, double upper, const gchar *suffix, bool exponent = false);
+ GtkWidget * clonetiler_checkbox(const char *tip, const char *attr);
+ void clonetiler_table_attach(GtkWidget *table, GtkWidget *widget, float align, int row, int col);
+
+ static void clonetiler_symgroup_changed(GtkComboBox *cb, gpointer /*data*/);
+ static void clonetiler_remove(GtkWidget */*widget*/, GtkWidget *dlg, bool do_undo = true);
+ static void on_picker_color_changed(guint rgba);
+ static void clonetiler_trace_hide_tiled_clones_recursively(SPObject *from);
+ static void clonetiler_checkbox_toggled(GtkToggleButton *tb, gpointer *data);
+ static void clonetiler_pick_switched(GtkToggleButton */*tb*/, gpointer data);
+ static void clonetiler_do_pick_toggled(GtkToggleButton *tb, GtkWidget *dlg);
+ static void clonetiler_pick_to(GtkToggleButton *tb, gpointer data);
+ static void clonetiler_xy_changed(GtkAdjustment *adj, gpointer data);
+ static void clonetiler_fill_width_changed(GtkAdjustment *adj, GtkWidget *u);
+ static void clonetiler_fill_height_changed(GtkAdjustment *adj, GtkWidget *u);
+ static void clonetiler_switch_to_create(GtkToggleButton */*tb*/, GtkWidget *dlg);
+ static void clonetiler_switch_to_fill(GtkToggleButton */*tb*/, GtkWidget *dlg);
+ static void clonetiler_keep_bbox_toggled(GtkToggleButton *tb, gpointer /*data*/);
+ static void clonetiler_apply(GtkWidget */*widget*/, GtkWidget *dlg);
+ static void clonetiler_unclump(GtkWidget */*widget*/, void *);
+ static void clonetiler_change_selection(Inkscape::Application * /*inkscape*/, Inkscape::Selection *selection, GtkWidget *dlg);
+ static void clonetiler_external_change(Inkscape::Application * /*inkscape*/, GtkWidget *dlg);
+ static void clonetiler_disconnect_gsignal(GObject *widget, gpointer source);
+ static void clonetiler_reset(GtkWidget */*widget*/, GtkWidget *dlg);
+ static guint clonetiler_number_of_clones(SPObject *obj);
+ static void clonetiler_trace_setup(SPDocument *doc, gdouble zoom, SPItem *original);
+ static guint32 clonetiler_trace_pick(Geom::Rect box);
+ static void clonetiler_trace_finish();
+ static bool clonetiler_is_a_clone_of(SPObject *tile, SPObject *obj);
+ static Geom::Rect transform_rect(Geom::Rect const &r, Geom::Affine const &m);
+ static double randomize01(double val, double rand);
+ static void clonetiler_value_changed(GtkAdjustment *adj, gpointer data);
+ static void clonetiler_reset_recursive(GtkWidget *w);
+
+ static Geom::Affine clonetiler_get_transform( // symmetry group
+ int type,
+
+ // row, column
+ int i, int j,
+
+ // center, width, height of the tile
+ double cx, double cy,
+ double w, double h,
+
+ // values from the dialog:
+ // Shift
+ double shiftx_per_i, double shifty_per_i,
+ double shiftx_per_j, double shifty_per_j,
+ double shiftx_rand, double shifty_rand,
+ double shiftx_exp, double shifty_exp,
+ int shiftx_alternate, int shifty_alternate,
+ int shiftx_cumulate, int shifty_cumulate,
+ int shiftx_excludew, int shifty_excludeh,
+
+ // Scale
+ double scalex_per_i, double scaley_per_i,
+ double scalex_per_j, double scaley_per_j,
+ double scalex_rand, double scaley_rand,
+ double scalex_exp, double scaley_exp,
+ double scalex_log, double scaley_log,
+ int scalex_alternate, int scaley_alternate,
+ int scalex_cumulate, int scaley_cumulate,
+
+ // Rotation
+ double rotate_per_i, double rotate_per_j,
+ double rotate_rand,
+ int rotate_alternatei, int rotate_alternatej,
+ int rotate_cumulatei, int rotate_cumulatej
+ );
+
+
+private:
+ CloneTiler(CloneTiler const &d);
+ CloneTiler& operator=(CloneTiler const &d);
+
+ GtkWidget *dlg;
+ SPDesktop *desktop;
+ DesktopTracker deskTrack;
+ Inkscape::UI::Widget::ColorPicker *color_picker;
+ GtkSizeGroup* table_row_labels;
+
+ sigc::connection desktopChangeConn;
+ sigc::connection selectChangedConn;
+ sigc::connection subselChangedConn;
+ sigc::connection selectModifiedConn;
+ sigc::connection color_changed_connection;
+
+ /**
+ * Can be invoked for setting the desktop. Currently not used.
+ */
+ void setDesktop(SPDesktop *desktop);
+
+ /**
+ * Is invoked by the desktop tracker when the desktop changes.
+ */
+ void setTargetDesktop(SPDesktop *desktop);
+
+};
+
+
+enum {
+ PICK_COLOR,
+ PICK_OPACITY,
+ PICK_R,
+ PICK_G,
+ PICK_B,
+ PICK_H,
+ PICK_S,
+ PICK_L
+};
+
+enum {
+ TILE_P1,
+ TILE_P2,
+ TILE_PM,
+ TILE_PG,
+ TILE_CM,
+ TILE_PMM,
+ TILE_PMG,
+ TILE_PGG,
+ TILE_CMM,
+ TILE_P4,
+ TILE_P4M,
+ TILE_P4G,
+ TILE_P3,
+ TILE_P31M,
+ TILE_P3M1,
+ TILE_P6,
+ TILE_P6M
+};
+
+} // namespace Dialog
+} // namespace UI
+} // namespace Inkscape
+
+
+#endif
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/dialog-manager.cpp b/src/ui/dialog/dialog-manager.cpp
index 2e7ffa1c2..60011ca9d 100644
--- a/src/ui/dialog/dialog-manager.cpp
+++ b/src/ui/dialog/dialog-manager.cpp
@@ -51,6 +51,7 @@
#include "ui/dialog/spellcheck.h"
#include "ui/dialog/export.h"
#include "ui/dialog/xml-tree.h"
+#include "ui/dialog/clonetiler.h"
#ifdef ENABLE_SVG_FONTS
#include "ui/dialog/svg-fonts-dialog.h"
@@ -129,6 +130,7 @@ DialogManager::DialogManager() {
registerFactory("SpellCheck", &create<SpellCheck, FloatingBehavior>);
registerFactory("Export", &create<Export, FloatingBehavior>);
registerFactory("XmlTree", &create<XmlTree, FloatingBehavior>);
+ registerFactory("CloneTiler", &create<CloneTiler, FloatingBehavior>);
} else {
@@ -163,6 +165,7 @@ DialogManager::DialogManager() {
registerFactory("SpellCheck", &create<SpellCheck, DockBehavior>);
registerFactory("Export", &create<Export, DockBehavior>);
registerFactory("XmlTree", &create<XmlTree, DockBehavior>);
+ registerFactory("CloneTiler", &create<CloneTiler, DockBehavior>);
}
}
diff --git a/src/ui/dialog/find.cpp b/src/ui/dialog/find.cpp
index 9d3508c53..f5745e02b 100644
--- a/src/ui/dialog/find.cpp
+++ b/src/ui/dialog/find.cpp
@@ -24,12 +24,14 @@
#include "inkscape.h"
#include "desktop.h"
#include "document.h"
+#include "document-undo.h"
#include "selection.h"
#include "desktop-handles.h"
#include "dialogs/dialog-events.h"
#include "verbs.h"
#include "interface.h"
+#include "preferences.h"
#include "sp-text.h"
#include "sp-flowtext.h"
#include "text-editing.h"
@@ -50,6 +52,8 @@
#include "sp-offset.h"
#include "sp-root.h"
#include "xml/repr.h"
+#include "xml/node-iterators.h"
+#include "xml/attribute-record.h"
#include <glibmm/i18n.h>
@@ -59,112 +63,278 @@ namespace Dialog {
Find::Find()
: UI::Widget::Panel("", "/dialogs/find", SP_VERB_DIALOG_FIND),
- _entry_text(_("_Text:"), _("Find objects by their text content (exact or partial match)")),
- _entry_id(_("_ID:"), _("Find objects by the value of the id attribute (exact or partial match)")),
- _entry_style(_("_Style:"), _("Find objects by the value of the style attribute (exact or partial match)")),
- _entry_attribute(_("_Attribute:"), _("Find objects by the name of an attribute (exact or partial match)")),
- _check_search_selection(_("Search in s_election"), _("Limit search to the current selection")),
- _check_search_layer(_("Search in current _layer"), _("Limit search to the current layer")),
- _check_include_hidden(_("Include _hidden"), _("Include hidden objects in search")),
- _check_include_locked(_("Include l_ocked"), _("Include locked objects in search")),
-
- _check_all(_("All types"), _("Search in all object types")),
- _check_all_shapes(_("All shapes"), _("Search all shapes")),
- _check_rects(_("Rectangles"), _("Search rectangles")),
- _check_ellipses(_("Ellipses"), _("Search ellipses, arcs, circles")),
- _check_stars(_("Stars"), _("Search stars and polygons")),
- _check_spirals(_("Spirals"), _("Search spirals")),
- _check_paths(_("Paths"), _("Search paths, lines, polylines")),
- _check_texts(_("Texts"), _("Search text objects")),
- _check_groups(_("Groups"), _("Search groups")),
- _check_clones(
+
+ entry_find(_("F_ind:"), _("Find objects by their content (exact or partial match)")),
+ entry_replace(_("Re_place:"), _("Replace found objects with this value ")),
+
+ check_scope_all(_("_All"), _("Search in all layers")),
+ check_scope_layer(_("Current _layer"), _("Limit search to the current layer")),
+ check_scope_selection(_("S_election"), _("Limit search to the current selection")),
+ check_searchin_text(_("Te_xt"), _("Search in text objects")),
+ check_searchin_property(_("_Properties"), _("Search in object properties, styles, attributes and IDs")),
+ frame_searchin(_("Search in")),
+ frame_scope(_("Scope")),
+
+
+ check_case_sensitive(_("Case sensiti_ve"), _("Match upper/lower case"), false),
+ check_exact_match(_("E_xact match"), _("Match whole objects only"), false),
+ check_include_hidden(_("Include _hidden"), _("Include hidden objects in search"), false),
+ check_include_locked(_("Include loc_ked"), _("Include locked objects in search"), false),
+ expander_options(_("Options")),
+ frame_options(_("General")),
+
+ check_ids(_("_ID"), _("Search id name"), true),
+ check_attributename(_("Attribute _Name"), _("Search attribute name"), false),
+ check_attributevalue(_("Attribute _Value"), _("Search attribute value"), true),
+ check_style(_("_Style"), _("Search style"), true),
+ check_font(_("_Font"), _("Search fonts"), false),
+ frame_properties(_("Properties")),
+
+ check_alltypes(_("All types"), _("Search all object types"), true),
+ check_rects(_("Rectangles"), _("Search rectangles"), false),
+ check_ellipses(_("Ellipses"), _("Search ellipses, arcs, circles"), false),
+ check_stars(_("Stars"), _("Search stars and polygons"), false),
+ check_spirals(_("Spirals"), _("Search spirals"), false),
+ check_paths(_("Paths"), _("Search paths, lines, polylines"), false),
+ check_texts(_("Texts"), _("Search text objects"), false),
+ check_groups(_("Groups"), _("Search groups"), false),
+ check_clones(
//TRANSLATORS: "Clones" is a noun indicating type of object to find
- C_("Find dialog", "Clones"), _("Search clones")),
- _check_images(_("Images"), _("Search images")),
- _check_offsets(_("Offsets"), _("Search offset objects")),
-
- _button_clear(_("_Clear"), _("Clear values")),
- _button_find(_("_Find"), _("Select objects matching all of the fields you filled in"))
+ C_("Find dialog", "Clones"), _("Search clones"), false),
+
+ check_images(_("Images"), _("Search images"), false),
+ check_offsets(_("Offsets"), _("Search offset objects"), false),
+ frame_types(_("Object Types")),
+
+ status(""),
+ button_find(_("_Find"), _("Select all objects matching the selected fields ")),
+ button_replace(_("_Replace All"), _("Replace all the matching objects")),
+ _action_replace(false),
+ blocked(false),
+ desktop(NULL),
+ deskTrack()
+
{
+ entry_find.getEntry()->set_width_chars(25);
+ entry_replace.getEntry()->set_width_chars(25);
+
+ Gtk::RadioButtonGroup grp_searchin = check_searchin_text.get_group();
+ check_searchin_property.set_group(grp_searchin);
+ vbox_searchin.pack_start(check_searchin_text, true, true);
+ vbox_searchin.pack_start(check_searchin_property, true, true);
+ frame_searchin.add(vbox_searchin);
+
+ Gtk::RadioButtonGroup grp_scope = check_scope_all.get_group();
+ check_scope_layer.set_group(grp_scope);
+ check_scope_selection.set_group(grp_scope);
+ vbox_scope.pack_start(check_scope_all, true, true);
+ vbox_scope.pack_start(check_scope_layer, true, true);
+ vbox_scope.pack_start(check_scope_selection, true, true);
+ frame_scope.add(vbox_scope);
+
+ hbox_searchin.set_spacing(4);
+ hbox_searchin.pack_start(frame_searchin, true, true);
+ hbox_searchin.pack_start(frame_scope, true, true);
+
+ vbox_options1.pack_start(check_case_sensitive, true, true);
+ vbox_options1.pack_start(check_include_hidden, true, true);
+ vbox_options2.pack_start(check_exact_match, true, true);
+ vbox_options2.pack_start(check_include_locked, true, true);
+ hbox_options.pack_start(vbox_options1, true, true, 4);
+ hbox_options.pack_start(vbox_options2, true, true, 4);
+ frame_options.add(hbox_options);
+
+ hbox_properties1.set_homogeneous(false);
+ hbox_properties1.pack_start(check_ids, false, false, 4 );
+ hbox_properties1.pack_start(check_style, false, false, 8);
+ hbox_properties1.pack_start(check_font, false, false, 8);
+ hbox_properties2.set_homogeneous(false);
+ hbox_properties2.pack_start(check_attributevalue, false, false, 4);
+ hbox_properties2.pack_start(check_attributename, false, false, 4);
+ vbox_properties.pack_start(hbox_properties1, true, true, 0);
+ vbox_properties.pack_start(hbox_properties2, true, true, 2);
+ frame_properties.add(vbox_properties);
+
+ vbox_types1.pack_start(check_alltypes, true, true);
+ vbox_types1.pack_start(check_paths, true, true);
+ vbox_types1.pack_start(check_texts, true, true);
+ vbox_types1.pack_start(check_groups, true, true);
+ vbox_types1.pack_start(check_clones, true, true);
+ vbox_types1.pack_start(check_images, true, true);
+ vbox_types2.pack_start(check_offsets, true, true);
+ vbox_types2.pack_start(check_rects, true, true);
+ vbox_types2.pack_start(check_ellipses, true, true);
+ vbox_types2.pack_start(check_stars, true, true);
+ vbox_types2.pack_start(check_spirals, true, true);
+ hbox_types.pack_start(vbox_types1, true, true, 4);
+ hbox_types.pack_start(vbox_types2, true, true, 4);
+ frame_types.add(hbox_types);
+
+ vbox_expander.pack_start(frame_options, true, true, 4);
+ vbox_expander.pack_start(frame_properties, true, true, 4);
+ vbox_expander.pack_start(frame_types, true, true, 4);
+
+ expander_options.set_use_underline();
+ expander_options.add(vbox_expander);
+
+ box_buttons.set_layout(Gtk::BUTTONBOX_END);
+ box_buttons.set_spacing(4);
+ box_buttons.pack_start(button_find, true, true, 6);
+ box_buttons.pack_start(button_replace, true, true, 6);
+ hboxbutton_row.pack_start(status, true, true, 6);
+ hboxbutton_row.pack_end(box_buttons, true, true);
+
Gtk::Box *contents = _getContents();
- contents->set_spacing(4);
-
- contents->pack_start(_entry_text, true, true);
- contents->pack_start(_entry_id, true, true);
- contents->pack_start(_entry_style, true, true);
- contents->pack_start(_entry_attribute, true, true);
-
- contents->pack_start(_check_all, true, true);
- contents->pack_start(_check_all_shapes, true, true);
- contents->pack_start(_check_rects, true, true);
- contents->pack_start(_check_ellipses, true, true);
- contents->pack_start(_check_stars, true, true);
- contents->pack_start(_check_spirals, true, true);
- contents->pack_start(_check_paths, true, true);
- contents->pack_start(_check_texts, true, true);
- contents->pack_start(_check_groups, true, true);
- contents->pack_start(_check_clones, true, true);
- contents->pack_start(_check_images, true, true);
- contents->pack_start(_check_offsets, true, true);
-
- contents->pack_start(_check_search_selection, true, true);
- contents->pack_start(_check_search_layer, true, true);
- contents->pack_start(_check_include_hidden, true, true);
- contents->pack_start(_check_include_locked, true, true);
-
- contents->pack_start(_button_clear, true, true);
- contents->pack_start(_button_find, true, true);
+ contents->set_spacing(6);
+ contents->pack_start(entry_find, false, false);
+ contents->pack_start(entry_replace, false, false);
+ contents->pack_start(hbox_searchin, false, false);
+ contents->pack_start(expander_options, false, false);
+ contents->pack_end(hboxbutton_row, false, false);
+
+ checkProperties.push_back(&check_ids);
+ checkProperties.push_back(&check_style);
+ checkProperties.push_back(&check_font);
+ checkProperties.push_back(&check_attributevalue);
+ checkProperties.push_back(&check_attributename);
+
+ checkTypes.push_back(&check_paths);
+ checkTypes.push_back(&check_texts);
+ checkTypes.push_back(&check_groups);
+ checkTypes.push_back(&check_clones);
+ checkTypes.push_back(&check_images);
+ checkTypes.push_back(&check_offsets);
+ checkTypes.push_back(&check_rects);
+ checkTypes.push_back(&check_ellipses);
+ checkTypes.push_back(&check_stars);
+ checkTypes.push_back(&check_spirals);
+ checkTypes.push_back(&check_offsets);
// set signals to handle clicks
- _check_all.signal_clicked().connect(sigc::mem_fun(*this, &Find::onToggleAlltypes));
- _check_all_shapes.signal_clicked().connect(sigc::mem_fun(*this, &Find::onToggleShapes));
- _button_clear.signal_clicked().connect(sigc::mem_fun(*this, &Find::onClear));
- _button_find.signal_clicked().connect(sigc::mem_fun(*this, &Find::onFind));
+ expander_options.property_expanded().signal_changed().connect(sigc::mem_fun(*this, &Find::onExpander));
+ button_find.signal_clicked().connect(sigc::mem_fun(*this, &Find::onFind));
+ button_replace.signal_clicked().connect(sigc::mem_fun(*this, &Find::onReplace));
+ check_searchin_text.signal_clicked().connect(sigc::mem_fun(*this, &Find::onSearchinText));
+ check_searchin_property.signal_clicked().connect(sigc::mem_fun(*this, &Find::onSearchinProperty));
+ check_alltypes.signal_clicked().connect(sigc::mem_fun(*this, &Find::onToggleAlltypes));
+
+ for(size_t i = 0; i < checkProperties.size(); i++) {
+ checkProperties[i]->signal_clicked().connect(sigc::mem_fun(*this, &Find::onToggleCheck));
+ }
+
+ for(size_t i = 0; i < checkTypes.size(); i++) {
+ checkTypes[i]->signal_clicked().connect(sigc::mem_fun(*this, &Find::onToggleCheck));
+ }
+
+ onSearchinText();
+ onToggleAlltypes();
- _button_find.set_can_default();
- // set_default (_button_find); // activatable by Enter
- _entry_text.getEntry()->grab_focus();
+ desktopChangeConn = deskTrack.connectDesktopChanged( sigc::mem_fun(*this, &Find::setTargetDesktop) );
+ deskTrack.connect(GTK_WIDGET(gobj()));
show_all_children();
- onClear();
+
+ Inkscape::Selection *selection = sp_desktop_selection (SP_ACTIVE_DESKTOP);
+ SPItem *item = selection->singleItem();
+ if (item) {
+ if (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) {
+ gchar *str;
+ str = sp_te_get_string_multiline (item);
+ entry_find.getEntry()->set_text(str);
+ }
+ }
+
+ button_find.set_can_default();
+ //button_find.grab_default(); // activatable by Enter
+ entry_find.getEntry()->grab_focus();
}
-Find::~Find()
+Find::~Find()
{
+ desktopChangeConn.disconnect();
+ selectChangedConn.disconnect();
+ deskTrack.disconnect();
}
+void Find::setDesktop(SPDesktop *desktop)
+{
+ Panel::setDesktop(desktop);
+ deskTrack.setBase(desktop);
+}
+
+void Find::setTargetDesktop(SPDesktop *desktop)
+{
+ if (this->desktop != desktop) {
+ if (this->desktop) {
+ selectChangedConn.disconnect();
+ }
+ this->desktop = desktop;
+ if (desktop && desktop->selection) {
+ selectChangedConn = desktop->selection->connectChanged(sigc::hide(sigc::mem_fun(*this, &Find::onSelectionChange)));
+ }
+ }
+}
+
+void Find::onSelectionChange(void)
+{
+ if (!blocked) {
+ status.set_text("");
+ }
+}
/*########################################################################
# FIND helper functions
########################################################################*/
-
-bool
-Find::item_id_match (SPItem *item, const gchar *id, bool exact)
+Glib::ustring Find::find_replace(const gchar *str, const gchar *find, const gchar *replace, bool exact, bool casematch, bool replaceall)
{
- if (item->getRepr() == NULL) {
- return false;
+ Glib::ustring ustr = str;
+ Glib::ustring ufind = find;
+ if (!casematch) {
+ ufind = ufind.lowercase();
}
-
- if (SP_IS_STRING(item)) { // SPStrings have "on demand" ids which are useless for searching
- return false;
+ gsize n = find_strcmp_pos(ustr.c_str(), ufind.c_str(), exact, casematch);
+ while (n != std::string::npos) {
+ ustr.replace(n, ufind.length(), replace);
+ if (!replaceall) {
+ return ustr;
+ }
+ // Start the next search after the last replace character to avoid infinite loops (replace "a" with "aaa" etc)
+ n = find_strcmp_pos(ustr.c_str(), ufind.c_str(), exact, casematch, n + strlen(replace) + 1);
}
+ return ustr;
+}
- const gchar *item_id = item->getRepr()->attribute("id");
- if (item_id == NULL) {
- return false;
+gsize Find::find_strcmp_pos(const gchar *str, const gchar *find, bool exact, bool casematch, gsize start/*=0*/)
+{
+ Glib::ustring ustr = str;
+ Glib::ustring ufind = find;
+
+ if (!casematch) {
+ ustr = ustr.lowercase();
+ ufind = ufind.lowercase();
}
+ gsize pos = std::string::npos;
if (exact) {
- return ((bool) !strcmp(item_id, id));
+ if (ustr == ufind) {
+ pos = 0;
+ }
} else {
-// g_print ("strstr: %s %s: %s\n", item_id, id, strstr(item_id, id) != NULL? "yes":"no");
- return ((bool) (strstr(item_id, id) != NULL));
+ pos = ustr.find(ufind, start);
}
+
+ return pos;
+}
+
+
+bool Find::find_strcmp(const gchar *str, const gchar *find, bool exact, bool casematch)
+{
+ return (std::string::npos != find_strcmp_pos(str, find, exact, casematch));
}
bool
-Find::item_text_match (SPItem *item, const gchar *text, bool exact)
+Find::item_text_match (SPItem *item, const gchar *find, bool exact, bool casematch, bool replace/*=false*/)
{
if (item->getRepr() == NULL) {
return false;
@@ -172,111 +342,317 @@ Find::item_text_match (SPItem *item, const gchar *text, bool exact)
if (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) {
const gchar *item_text = sp_te_get_string_multiline (item);
- if (item_text == NULL)
+ if (item_text == NULL) {
return false;
- bool ret;
- if (exact) {
- ret = ((bool) !strcasecmp(item_text, text));
- } else {
- //FIXME: strcasestr
- ret = ((bool) (strstr(item_text, text) != NULL));
}
- g_free ((void*) item_text);
- return ret;
+ bool found = find_strcmp(item_text, find, exact, casematch);
+
+ if (found && replace) {
+ Glib::ustring ufind = find;
+ if (!casematch) {
+ ufind = ufind.lowercase();
+ }
+
+ Inkscape::Text::Layout const *layout = te_get_layout (item);
+ if (!layout) {
+ return found;
+ }
+
+ gchar* replace_text = g_strdup(entry_replace.getEntry()->get_text().c_str());
+ gsize n = find_strcmp_pos(item_text, ufind.c_str(), exact, casematch);
+ static Inkscape::Text::Layout::iterator _begin_w;
+ static Inkscape::Text::Layout::iterator _end_w;
+ while (n != std::string::npos) {
+ _begin_w = layout->charIndexToIterator(n);
+ _end_w = layout->charIndexToIterator(n + strlen(find));
+ sp_te_replace(item, _begin_w, _end_w, replace_text);
+ item_text = sp_te_get_string_multiline (item);
+ n = find_strcmp_pos(item_text, ufind.c_str(), exact, casematch, n + strlen(replace_text) + 1);
+ }
+
+ g_free(replace_text);
+ }
+
+ return found;
}
return false;
}
+
bool
-Find::item_style_match (SPItem *item, const gchar *text, bool exact)
+Find::item_id_match (SPItem *item, const gchar *id, bool exact, bool casematch, bool replace/*=false*/)
{
if (item->getRepr() == NULL) {
return false;
}
- const gchar *item_text = item->getRepr()->attribute("style");
- if (item_text == NULL) {
+ if (SP_IS_STRING(item)) { // SPStrings have "on demand" ids which are useless for searching
+ return false;
+ }
+
+ const gchar *item_id = item->getRepr()->attribute("id");
+ if (item_id == NULL) {
+ return false;
+ }
+
+ bool found = find_strcmp(item_id, id, exact, casematch);
+
+ if (found && replace) {
+ gchar * replace_text = g_strdup(entry_replace.getEntry()->get_text().c_str());
+ Glib::ustring new_item_style = find_replace(item_id, id, replace_text , exact, casematch, true);
+ if (new_item_style != item_id) {
+ item->getRepr()->setAttribute("id", new_item_style.data());
+ }
+ g_free(replace_text);
+ }
+
+ return found;
+}
+
+bool
+Find::item_style_match (SPItem *item, const gchar *text, bool exact, bool casematch, bool replace/*=false*/)
+{
+ if (item->getRepr() == NULL) {
+ return false;
+ }
+
+ gchar *item_style = g_strdup(item->getRepr()->attribute("style"));
+ if (item_style == NULL) {
+ return false;
+ }
+
+ bool found = find_strcmp(item_style, text, exact, casematch);
+
+ if (found && replace) {
+ gchar * replace_text = g_strdup(entry_replace.getEntry()->get_text().c_str());
+ Glib::ustring new_item_style = find_replace(item_style, text, replace_text , exact, casematch, true);
+ if (new_item_style != item_style) {
+ item->getRepr()->setAttribute("style", new_item_style.data());
+ }
+ g_free(replace_text);
+ }
+
+ g_free(item_style);
+ return found;
+}
+
+bool Find::item_attr_match(SPItem *item, const gchar *text, bool exact, bool casematch, bool replace/*=false*/)
+{
+ bool found = false;
+
+ if (item->getRepr() == NULL) {
return false;
}
+ gchar *attr_value = g_strdup(item->getRepr()->attribute(text));
if (exact) {
- return ((bool) !strcmp(item_text, text));
+ found = (attr_value != NULL);
} else {
- return ((bool) (strstr(item_text, text) != NULL));
+ found = item->getRepr()->matchAttributeName(text);
}
+ g_free(attr_value);
+
+ // TODO - Rename attribute name ?
+ if (found && replace) {
+ found = false;
+ }
+
+ return found;
}
-bool Find::item_attr_match(SPItem *item, const gchar *name, bool exact)
+bool Find::item_attrvalue_match(SPItem *item, const gchar *text, bool exact, bool casematch, bool replace/*=false*/)
{
- bool result = false;
- if (item->getRepr()) {
- if (exact) {
- const gchar *attr_value = item->getRepr()->attribute(name);
- result = (attr_value != NULL);
- } else {
- result = item->getRepr()->matchAttributeName(name);
+ bool ret = false;
+
+ if (item->getRepr() == NULL) {
+ return false;
+ }
+
+ Inkscape::Util::List<Inkscape::XML::AttributeRecord const> iter = item->getRepr()->attributeList();
+ for (; iter; ++iter) {
+ const gchar* key = g_quark_to_string(iter->key);
+ gchar *attr_value = g_strdup(item->getRepr()->attribute(key));
+ bool found = find_strcmp(attr_value, text, exact, casematch);
+ if (found) {
+ ret = true;
+ }
+
+ if (found && replace) {
+ gchar * replace_text = g_strdup(entry_replace.getEntry()->get_text().c_str());
+ Glib::ustring new_item_style = find_replace(attr_value, text, replace_text , exact, casematch, true);
+ if (new_item_style != attr_value) {
+ item->getRepr()->setAttribute(key, new_item_style.data());
+ }
+ }
+
+ g_free(attr_value);
+ }
+
+ return ret;
+}
+
+
+bool Find::item_font_match(SPItem *item, const gchar *text, bool exact, bool casematch, bool replace/*=false*/)
+{
+ bool ret = false;
+
+ if (item->getRepr() == NULL) {
+ return false;
+ }
+
+ const gchar *item_style = item->getRepr()->attribute("style");
+ if (item_style == NULL) {
+ return false;
+ }
+
+ std::vector<Glib::ustring> vFontTokenNames;
+ vFontTokenNames.push_back("font-family:");
+ vFontTokenNames.push_back("-inkscape-font-specification:");
+
+ std::vector<Glib::ustring> vStyleTokens = Glib::Regex::split_simple(";", item_style);
+ for(size_t i=0; i<vStyleTokens.size(); i++) {
+ Glib::ustring token = vStyleTokens[i];
+ for(size_t j=0; j<vFontTokenNames.size(); j++) {
+ if ( token.find(vFontTokenNames[j]) != std::string::npos) {
+ Glib::ustring font1 = Glib::ustring(vFontTokenNames[j]).append(text);
+ bool found = find_strcmp(token.c_str(), font1.c_str(), exact, casematch);
+ if (found) {
+ ret = true;
+ if (_action_replace) {
+ gchar *replace_text = g_strdup(entry_replace.getEntry()->get_text().c_str());
+ gchar *orig_str = g_strdup(token.c_str());
+ // Exact match fails since the "font-family:" is in the token, since the find was exact it still works with false below
+ Glib::ustring new_item_style = find_replace(orig_str, text, replace_text , false /*exact*/, casematch, true);
+ if (new_item_style != orig_str) {
+ vStyleTokens.at(i) = new_item_style;
+ }
+ g_free(orig_str);
+ g_free(replace_text);
+ }
+ }
+ }
}
}
- return result;
+
+ if (ret && _action_replace) {
+ Glib::ustring new_item_style;
+ for(size_t i=0; i<vStyleTokens.size(); i++) {
+ new_item_style.append(vStyleTokens.at(i)).append(";");
+ }
+ new_item_style.erase(new_item_style.size()-1);
+ item->getRepr()->setAttribute("style", new_item_style.data());
+ }
+
+ return ret;
}
GSList *
-Find::filter_fields (GSList *l, bool exact)
+Find::filter_fields (GSList *l, bool exact, bool casematch)
{
- const gchar* text = _entry_text.getEntry()->get_text().c_str();
- const gchar* id = _entry_id.getEntry()->get_text().c_str();
- const gchar* style = _entry_style.getEntry()->get_text().c_str();
- const gchar* attr = _entry_attribute.getEntry()->get_text().c_str();
-
+ Glib::ustring tmp = entry_find.getEntry()->get_text();
+ if (tmp.empty()) {
+ return l;
+ }
+ gchar* text = g_strdup(tmp.c_str());
+
GSList *in = l;
GSList *out = NULL;
- if (strlen (text) != 0) {
+
+ if (check_searchin_text.get_active()) {
for (GSList *i = in; i != NULL; i = i->next) {
- if (item_text_match (SP_ITEM(i->data), text, exact)) {
- out = g_slist_prepend (out, i->data);
+ if (item_text_match (SP_ITEM(i->data), text, exact, casematch)) {
+ if (!g_slist_find(out, i->data)) {
+ out = g_slist_prepend (out, i->data);
+ if (_action_replace) {
+ item_text_match (SP_ITEM(i->data), text, exact, casematch, _action_replace);
+ }
+ }
}
}
- } else {
- out = in;
}
-
- in = out;
- out = NULL;
- if (strlen (id) != 0) {
- for (GSList *i = in; i != NULL; i = i->next) {
- if (item_id_match (SP_ITEM(i->data), id, exact)) {
- out = g_slist_prepend (out, i->data);
+ else if (check_searchin_property.get_active()) {
+
+ bool ids = check_ids.get_active();
+ bool style = check_style.get_active();
+ bool font = check_font.get_active();
+ bool attrname = check_attributename.get_active();
+ bool attrvalue = check_attributevalue.get_active();
+
+ if (ids) {
+ for (GSList *i = in; i != NULL; i = i->next) {
+ if (item_id_match (SP_ITEM(i->data), text, exact, casematch)) {
+ if (!g_slist_find(out, i->data)) {
+ out = g_slist_prepend (out, i->data);
+ if (_action_replace) {
+ item_id_match (SP_ITEM(i->data), text, exact, casematch, _action_replace);
+ }
+ }
+ }
}
}
- } else {
- out = in;
- }
- in = out;
- out = NULL;
- if (strlen (style) != 0) {
- for (GSList *i = in; i != NULL; i = i->next) {
- if (item_style_match (SP_ITEM(i->data), style, exact)) {
- out = g_slist_prepend (out, i->data);
+
+ if (style) {
+ for (GSList *i = in; i != NULL; i = i->next) {
+ if (item_style_match (SP_ITEM(i->data), text, exact, casematch)) {
+ if (!g_slist_find(out, i->data))
+ if (!g_slist_find(out, i->data)) {
+ out = g_slist_prepend (out, i->data);
+ if (_action_replace) {
+ item_style_match (SP_ITEM(i->data), text, exact, casematch, _action_replace);
+ }
+ }
+ }
}
}
- } else {
- out = in;
- }
- in = out;
- out = NULL;
- if (strlen (attr) != 0) {
- for (GSList *i = in; i != NULL; i = i->next) {
- if (item_attr_match (SP_ITEM(i->data), attr, exact)) {
- out = g_slist_prepend (out, i->data);
+
+ if (attrname) {
+ for (GSList *i = in; i != NULL; i = i->next) {
+ if (item_attr_match (SP_ITEM(i->data), text, exact, casematch)) {
+ if (!g_slist_find(out, i->data)) {
+ out = g_slist_prepend (out, i->data);
+ if (_action_replace) {
+ item_attr_match (SP_ITEM(i->data), text, exact, casematch, _action_replace);
+ }
+ }
+ }
}
}
- } else {
- out = in;
+
+
+ if (attrvalue) {
+ for (GSList *i = in; i != NULL; i = i->next) {
+ if (item_attrvalue_match (SP_ITEM(i->data), text, exact, casematch)) {
+ if (!g_slist_find(out, i->data)) {
+ out = g_slist_prepend (out, i->data);
+ if (_action_replace) {
+ item_attrvalue_match (SP_ITEM(i->data), text, exact, casematch, _action_replace);
+ }
+ }
+ }
+ }
+ }
+
+
+ if (font) {
+ for (GSList *i = in; i != NULL; i = i->next) {
+ if (item_font_match (SP_ITEM(i->data), text, exact, casematch)) {
+ if (!g_slist_find(out, i->data)) {
+ out = g_slist_prepend (out, i->data);
+ if (_action_replace) {
+ item_font_match (SP_ITEM(i->data), text, exact, casematch, _action_replace);
+ }
+ }
+ }
+ }
+ }
+
}
+ g_free(text);
+
return out;
}
@@ -284,37 +660,37 @@ Find::filter_fields (GSList *l, bool exact)
bool
Find::item_type_match (SPItem *item)
{
- SPDesktop *desktop = getDesktop();
+ bool all =check_alltypes.get_active();
- if (SP_IS_RECT(item)) {
- return (_check_all_shapes.get_active() || _check_rects.get_active());
+ if ( SP_IS_RECT(item)) {
+ return ( all ||check_rects.get_active());
} else if (SP_IS_GENERICELLIPSE(item) || SP_IS_ELLIPSE(item) || SP_IS_ARC(item) || SP_IS_CIRCLE(item)) {
- return (_check_all_shapes.get_active() || _check_ellipses.get_active());
+ return ( all || check_ellipses.get_active());
} else if (SP_IS_STAR(item) || SP_IS_POLYGON(item)) {
- return (_check_all_shapes.get_active() || _check_stars.get_active());
+ return ( all || check_stars.get_active());
} else if (SP_IS_SPIRAL(item)) {
- return (_check_all_shapes.get_active() || _check_spirals.get_active());
+ return ( all || check_spirals.get_active());
} else if (SP_IS_PATH(item) || SP_IS_LINE(item) || SP_IS_POLYLINE(item)) {
- return (_check_paths.get_active());
+ return (all || check_paths.get_active());
} else if (SP_IS_TEXT(item) || SP_IS_TSPAN(item) || SP_IS_TREF(item) || SP_IS_STRING(item)) {
- return (_check_texts.get_active());
+ return (all || check_texts.get_active());
} else if (SP_IS_GROUP(item) && !desktop->isLayer(item) ) { // never select layers!
- return (_check_groups.get_active());
+ return (all || check_groups.get_active());
} else if (SP_IS_USE(item)) {
- return (_check_clones.get_active());
+ return (all || check_clones.get_active());
} else if (SP_IS_IMAGE(item)) {
- return (_check_images.get_active());
+ return (all || check_images.get_active());
} else if (SP_IS_OFFSET(item)) {
- return (_check_offsets.get_active());
+ return (all || check_offsets.get_active());
}
return false;
@@ -323,8 +699,6 @@ Find::item_type_match (SPItem *item)
GSList *
Find::filter_types (GSList *l)
{
- if (_check_all.get_active()) return l;
-
GSList *n = NULL;
for (GSList *i = l; i != NULL; i = i->next) {
if (item_type_match (SP_ITEM(i->data))) {
@@ -336,18 +710,16 @@ Find::filter_types (GSList *l)
GSList *
-Find::filter_list (GSList *l, bool exact)
+Find::filter_list (GSList *l, bool exact, bool casematch)
{
- l = filter_fields (l, exact);
l = filter_types (l);
+ l = filter_fields (l, exact, casematch);
return l;
}
GSList *
Find::all_items (SPObject *r, GSList *l, bool hidden, bool locked)
{
- SPDesktop *desktop = getDesktop();
-
if (SP_IS_DEFS(r)) {
return l; // we're not interested in items in defs
}
@@ -371,8 +743,6 @@ Find::all_items (SPObject *r, GSList *l, bool hidden, bool locked)
GSList *
Find::all_selection_items (Inkscape::Selection *s, GSList *l, SPObject *ancestor, bool hidden, bool locked)
{
- SPDesktop *desktop = getDesktop();
-
for (GSList *i = (GSList *) s->itemList(); i != NULL; i = i->next) {
if (SP_IS_ITEM (i->data) && !reinterpret_cast<SPItem *>(i->data)->cloned && !desktop->isLayer(SP_ITEM(i->data))) {
SPItem *item = reinterpret_cast<SPItem *>(i->data);
@@ -388,43 +758,56 @@ Find::all_selection_items (Inkscape::Selection *s, GSList *l, SPObject *ancestor
}
return l;
}
-
-
+
+
/*########################################################################
# BUTTON CLICK HANDLERS (callbacks)
########################################################################*/
void
-Find::onClear()
-{
- _entry_text.getEntry()->set_text(Glib::ustring(""));
- _entry_id.getEntry()->set_text(Glib::ustring(""));
- _entry_style.getEntry()->set_text(Glib::ustring(""));
- _entry_attribute.getEntry()->set_text(Glib::ustring(""));
-
- _check_all.set_active();
+Find::onFind()
+{
+ _action_replace = false;
+ onAction();
+
+ // Return focus to the find entry
+ entry_find.getEntry()->grab_focus();
}
-
-
void
-Find::onFind()
-{
- SPDesktop *desktop = getDesktop();
+Find::onReplace()
+{
+ if (entry_find.getEntry()->get_text().length() < 1) {
+ status.set_text(_("Nothing to replace"));
+ return;
+ }
+ _action_replace = true;
+ onAction();
- bool hidden = _check_include_hidden.get_active();
- bool locked = _check_include_locked.get_active();
+ // Return focus to the find entry
+ entry_find.getEntry()->grab_focus();
+}
+
+void
+Find::onAction()
+{
+
+ bool hidden = check_include_hidden.get_active();
+ bool locked = check_include_locked.get_active();
+ bool exact = check_exact_match.get_active();
+ bool casematch = check_case_sensitive.get_active();
+ blocked = true;
GSList *l = NULL;
- if (_check_search_selection.get_active()) {
- if (_check_search_layer.get_active()) {
+ if (check_scope_selection.get_active()) {
+ if (check_scope_layer.get_active()) {
l = all_selection_items (desktop->selection, l, desktop->currentLayer(), hidden, locked);
} else {
l = all_selection_items (desktop->selection, l, NULL, hidden, locked);
}
} else {
- if (_check_search_layer.get_active()) {
+ if (check_scope_layer.get_active()) {
l = all_items (desktop->currentLayer(), l, hidden, locked);
} else {
l = all_items(sp_desktop_document(desktop)->getRoot(), l, hidden, locked);
@@ -432,13 +815,7 @@ Find::onFind()
}
guint all = g_slist_length (l);
- bool exact = true;
- GSList *n = NULL;
- n = filter_list (l, exact);
- if (n == NULL) {
- exact = false;
- n = filter_list (l, exact);
- }
+ GSList *n = filter_list (l, exact, casematch);
if (n != NULL) {
int count = g_slist_length (n);
@@ -448,88 +825,124 @@ Find::onFind()
"<b>%d</b> objects found (out of <b>%d</b>), %s match.",
count),
count, all, exact? _("exact") : _("partial"));
+ status.set_text(Glib::ustring::compose("%1 %2 %3", count, _("objects"), _action_replace? _("replaced") : _("found") ));
Inkscape::Selection *selection = sp_desktop_selection (desktop);
selection->clear();
selection->setList(n);
scroll_to_show_item (desktop, SP_ITEM(n->data));
+
+ if (_action_replace) {
+ DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT, _("Text Replace"));
+ }
+
} else {
+ status.set_text(_("Not found"));
+ if (!check_scope_selection.get_active()) {
+ Inkscape::Selection *selection = sp_desktop_selection (desktop);
+ selection->clear();
+ }
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No objects found"));
}
+ blocked = false;
+
+}
+void
+Find::onToggleCheck ()
+{
+ bool objectok = false;
+ status.set_text("");
+
+ if (check_alltypes.get_active()) {
+ objectok = true;
+ }
+ for(int i = 0; i < 11; i++) {
+ if (checkTypes[i]->get_active()) {
+ objectok = true;
+ }
+ }
+
+ if (!objectok) {
+ status.set_text(_("Select an object"));
+ }
+
+
+ bool propertyok = false;
+
+ if (!check_searchin_property.get_active()) {
+ propertyok = true;
+ } else {
+
+ for(size_t i = 0; i < checkProperties.size(); i++) {
+ if (checkProperties[i]->get_active()) {
+ propertyok = true;
+ }
+ }
+ }
+
+ if (!propertyok) {
+ status.set_text(_("Select a property"));
+ }
+
+ // Can't replace attribute names
+ bool attributenameyok = !check_attributename.get_active();
+
+ button_find.set_sensitive(objectok && propertyok);
+ button_replace.set_sensitive(objectok && propertyok && attributenameyok);
+
}
void
Find::onToggleAlltypes ()
{
- if (_check_all.get_active()) {
- // explicit toggle to make sure its handler gets called, no matter what was the original state
- _check_all_shapes.toggled();
- _check_all_shapes.set_active();
- _check_all_shapes.hide();
- _check_paths.hide();
- _check_texts.hide();
- _check_groups.hide();
- _check_clones.hide();
- _check_images.hide();
- _check_offsets.hide();
- } else {
- // explicit toggle to make sure its handler gets called, no matter what was the original state
- _check_all_shapes.toggled();
- _check_all_shapes.set_active();
- _check_all_shapes.show();
-
- _check_paths.set_active();
- _check_paths.show();
- _check_texts.set_active();
- _check_texts.show();
- _check_groups.set_active();
- _check_groups.show();
- _check_clones.set_active();
- _check_clones.show();
- _check_images.set_active();
- _check_images.show();
- _check_offsets.set_active();
- _check_offsets.show();
- }
- squeeze_window();
+ bool all =check_alltypes.get_active();
+ for(size_t i = 0; i < checkTypes.size(); i++) {
+ checkTypes[i]->set_sensitive(!all);
+ }
+
+ onToggleCheck();
}
void
-Find::onToggleShapes ()
+Find::onSearchinText ()
{
- if (_check_all_shapes.get_active()) {
- _check_rects.hide();
- _check_ellipses.hide();
- _check_stars.hide();
- _check_spirals.hide();
- } else {
- _check_rects.set_active();
- _check_rects.show();
- _check_ellipses.set_active();
- _check_ellipses.show();
- _check_stars.set_active();
- _check_stars.show();
- _check_spirals.set_active();
- _check_spirals.show();
- }
- squeeze_window();
+ searchinToggle(false);
+ onToggleCheck();
}
+void
+Find::onSearchinProperty ()
+{
+ searchinToggle(true);
+ onToggleCheck();
+}
+
+void
+Find::searchinToggle(bool on)
+{
+ for(size_t i = 0; i < checkProperties.size(); i++) {
+ checkProperties[i]->set_sensitive(on);
+ }
+}
+
+void
+Find::onExpander ()
+{
+ if (!expander_options.get_expanded())
+ squeeze_window();
+}
/*########################################################################
# UTILITY
########################################################################*/
-
-
void
Find::squeeze_window()
{
- // TO DO: make window as small as possible
+ // TODO: resize dialog window when the expander is closed
+ // set_size_request(-1, -1);
}
-
-
} // namespace Dialog
} // namespace UI
} // namespace Inkscape
diff --git a/src/ui/dialog/find.h b/src/ui/dialog/find.h
index 15263caac..62ecd1763 100644
--- a/src/ui/dialog/find.h
+++ b/src/ui/dialog/find.h
@@ -16,6 +16,10 @@
#include "ui/widget/button.h"
#include "ui/widget/entry.h"
#include <glib.h>
+#include <gtkmm.h>
+
+#include "desktop.h"
+#include "ui/dialog/desktop-tracker.h"
class SPItem;
class SPObject;
@@ -26,66 +30,268 @@ class Selection;
namespace UI {
namespace Dialog {
+/**
+ * The Find class defines the Find and replace dialog.
+ *
+ * The Find and replace dialog allows you to search within the
+ * current document for specific text or properties of items.
+ * Matches items are highlighted and can be replaced as well.
+ * Scope can be limited to the entire document, current layer or selected items.
+ * Other options allow searching on specific object types and properties.
+ */
+
class Find : public UI::Widget::Panel {
public:
Find();
virtual ~Find();
+ /**
+ * Helper function which returns a new instance of the dialog.
+ * getInstance is needed by the dialog manager (Inkscape::UI::Dialog::DialogManager).
+ */
static Find &getInstance() { return *new Find(); }
protected:
- // Widgets:
- Inkscape::UI::Widget::Entry _entry_text;
- Inkscape::UI::Widget::Entry _entry_id;
- Inkscape::UI::Widget::Entry _entry_style;
- Inkscape::UI::Widget::Entry _entry_attribute;
-
- Inkscape::UI::Widget::CheckButton _check_search_selection;
- Inkscape::UI::Widget::CheckButton _check_search_layer;
- Inkscape::UI::Widget::CheckButton _check_include_hidden;
- Inkscape::UI::Widget::CheckButton _check_include_locked;
-
- // Type checkbutton widgets...
- Inkscape::UI::Widget::CheckButton _check_all;
- Inkscape::UI::Widget::CheckButton _check_all_shapes;
- Inkscape::UI::Widget::CheckButton _check_rects;
- Inkscape::UI::Widget::CheckButton _check_ellipses;
- Inkscape::UI::Widget::CheckButton _check_stars;
- Inkscape::UI::Widget::CheckButton _check_spirals;
- Inkscape::UI::Widget::CheckButton _check_paths;
- Inkscape::UI::Widget::CheckButton _check_texts;
- Inkscape::UI::Widget::CheckButton _check_groups;
- Inkscape::UI::Widget::CheckButton _check_clones;
- Inkscape::UI::Widget::CheckButton _check_images;
- Inkscape::UI::Widget::CheckButton _check_offsets;
-
- // Button-click handlers
- void onClear();
+
+
+ /**
+ * Callbacks for pressing the dialog buttons.
+ */
void onFind();
+ void onReplace();
+ void onExpander();
+ void onAction();
void onToggleAlltypes();
- void onToggleShapes();
+ void onToggleCheck();
+ void onSearchinText();
+ void onSearchinProperty();
+ /**
+ * Toggle all the properties checkboxes
+ */
+ void searchinToggle(bool on);
- // onFind helper functions
- bool item_id_match (SPItem *item, const gchar *id, bool exact);
- bool item_text_match (SPItem *item, const gchar *text, bool exact);
- bool item_style_match (SPItem *item, const gchar *text, bool exact);
- bool item_attr_match (SPItem *item, const gchar *name, bool exact);
- GSList * filter_fields (GSList *l, bool exact);
+ /**
+ * Returns true if the SPItem 'item' has the same id
+ *
+ * @param item the SPItem to check
+ * @param id the value to compare with
+ * @param exact do an exacty match
+ * @param casematch match the text case exactly
+ * @param replace replace the value if found
+ *
+ */
+ bool item_id_match (SPItem *item, const gchar *id, bool exact, bool casematch, bool replace=false);
+ /**
+ * Returns true if the SPItem 'item' has the same text content
+ *
+ * @param item the SPItem to check
+ * @param name the value to compare with
+ * @param exact do an exacty match
+ * @param casematch match the text case exactly
+ * @param replace replace the value if found
+ *
+ *
+ */
+ bool item_text_match (SPItem *item, const gchar *text, bool exact, bool casematch, bool replace=false);
+ /**
+ * Returns true if the SPItem 'item' has the same text in the style attribute
+ *
+ * @param item the SPItem to check
+ * @param name the value to compare with
+ * @param exact do an exacty match
+ * @param casematch match the text case exactly
+ * @param replace replace the value if found
+ *
+ */
+ bool item_style_match (SPItem *item, const gchar *text, bool exact, bool casematch, bool replace=false);
+ /**
+ * Returns true if found the SPItem 'item' has the same attribute name
+ *
+ * @param item the SPItem to check
+ * @param name the value to compare with
+ * @param exact do an exacty match
+ * @param casematch match the text case exactly
+ * @param replace replace the value if found
+ *
+ */
+ bool item_attr_match (SPItem *item, const gchar *name, bool exact, bool casematch, bool replace=false);
+ /**
+ * Returns true if the SPItem 'item' has the same attribute value
+ *
+ * @param item the SPItem to check
+ * @param name the value to compare with
+ * @param exact do an exacty match
+ * @param casematch match the text case exactly
+ * @param replace replace the value if found
+ *
+ */
+ bool item_attrvalue_match (SPItem *item, const gchar *name, bool exact, bool casematch, bool replace=false);
+ /**
+ * Returns true if the SPItem 'item' has the same font values
+ *
+ * @param item the SPItem to check
+ * @param name the value to compare with
+ * @param exact do an exacty match
+ * @param casematch match the text case exactly
+ * @param replace replace the value if found
+ *
+ */
+ bool item_font_match (SPItem *item, const gchar *name, bool exact, bool casematch, bool replace=false);
+ /**
+ * Function to filter a list of items based on the item type by calling each item_XXX_match function
+ */
+ GSList * filter_fields (GSList *l, bool exact, bool casematch);
bool item_type_match (SPItem *item);
GSList * filter_types (GSList *l);
- GSList * filter_list (GSList *l, bool exact);
+ GSList * filter_list (GSList *l, bool exact, bool casematch);
+
+ /**
+ * Find a string within a string and returns true if found with options for exact and casematching
+ */
+ bool find_strcmp(const gchar *str, const gchar *find, bool exact, bool casematch);
+
+ /**
+ * Find a string within a string and return the position with options for exact, casematching and search start location
+ */
+ gsize find_strcmp_pos(const gchar *str, const gchar *find, bool exact, bool casematch, gsize start=0);
+
+ /**
+ * Replace a string with another string with options for exact and casematching and replace once/all
+ */
+ Glib::ustring find_replace(const gchar *str, const gchar *find, const gchar *replace, bool exact, bool casematch, bool replaceall);
+
+ /**
+ * recursive function to return a list of all the items in the SPObject tree
+ *
+ */
GSList * all_items (SPObject *r, GSList *l, bool hidden, bool locked);
+ /**
+ * to return a list of all the selected items
+ *
+ */
GSList * all_selection_items (Inkscape::Selection *s, GSList *l, SPObject *ancestor, bool hidden, bool locked);
+ /**
+ * Shrink the dialog size when the expander widget is closed
+ * Currently not working, no known way to do this
+ */
void squeeze_window();
+ /**
+ * Can be invoked for setting the desktop. Currently not used.
+ */
+ void setDesktop(SPDesktop *desktop);
+ /**
+ * Is invoked by the desktop tracker when the desktop changes.
+ */
+ void setTargetDesktop(SPDesktop *desktop);
+ /**
+ * Called when desktop selection changes
+ */
+ void onSelectionChange(void);
+
private:
Find(Find const &d);
Find& operator=(Find const &d);
-
- Inkscape::UI::Widget::Button _button_clear;
- Inkscape::UI::Widget::Button _button_find;
+
+ /*
+ * Find and replace combo box widgets
+ */
+ Inkscape::UI::Widget::Entry entry_find;
+ Inkscape::UI::Widget::Entry entry_replace;
+
+ /**
+ * Scope and search in widgets
+ */
+ Inkscape::UI::Widget::RadioButton check_scope_all;
+ Inkscape::UI::Widget::RadioButton check_scope_layer;
+ Inkscape::UI::Widget::RadioButton check_scope_selection;
+ Inkscape::UI::Widget::RadioButton check_searchin_text;
+ Inkscape::UI::Widget::RadioButton check_searchin_property;
+ Gtk::HBox hbox_searchin;
+ Gtk::VBox vbox_scope;
+ Gtk::VBox vbox_searchin;
+ Gtk::Frame frame_searchin;
+ Gtk::Frame frame_scope;
+
+ /**
+ * General option widgets
+ */
+ Inkscape::UI::Widget::CheckButton check_case_sensitive;
+ Inkscape::UI::Widget::CheckButton check_exact_match;
+ Inkscape::UI::Widget::CheckButton check_include_hidden;
+ Inkscape::UI::Widget::CheckButton check_include_locked;
+ Gtk::VBox vbox_options1;
+ Gtk::VBox vbox_options2;
+ Gtk::HBox hbox_options;
+ Gtk::VBox vbox_expander;
+ Gtk::Expander expander_options;
+ Gtk::Frame frame_options;
+
+ /**
+ * Property type widgets
+ */
+ Inkscape::UI::Widget::CheckButton check_ids;
+ Inkscape::UI::Widget::CheckButton check_attributename;
+ Inkscape::UI::Widget::CheckButton check_attributevalue;
+ Inkscape::UI::Widget::CheckButton check_style;
+ Inkscape::UI::Widget::CheckButton check_font;
+ Gtk::VBox vbox_properties;
+ Gtk::HBox hbox_properties1;
+ Gtk::HBox hbox_properties2;
+ Gtk::Frame frame_properties;
+
+ /**
+ * A vector of all the properties widgets for easy processing
+ */
+ std::vector<Inkscape::UI::Widget::CheckButton *> checkProperties;
+
+ /**
+ * Object type widgets
+ */
+ Inkscape::UI::Widget::CheckButton check_alltypes;
+ Inkscape::UI::Widget::CheckButton check_rects;
+ Inkscape::UI::Widget::CheckButton check_ellipses;
+ Inkscape::UI::Widget::CheckButton check_stars;
+ Inkscape::UI::Widget::CheckButton check_spirals;
+ Inkscape::UI::Widget::CheckButton check_paths;
+ Inkscape::UI::Widget::CheckButton check_texts;
+ Inkscape::UI::Widget::CheckButton check_groups;
+ Inkscape::UI::Widget::CheckButton check_clones;
+ Inkscape::UI::Widget::CheckButton check_images;
+ Inkscape::UI::Widget::CheckButton check_offsets;
+ Gtk::VBox vbox_types1;
+ Gtk::VBox vbox_types2;
+ Gtk::HBox hbox_types;
+ Gtk::Frame frame_types;
+
+ /**
+ * A vector of all the check option widgets for easy processing
+ */
+ std::vector<Inkscape::UI::Widget::CheckButton *> checkTypes;
+
+ //Gtk::HBox hbox_text;
+
+ /**
+ * Action Buttons and status
+ */
+ Gtk::Label status;
+ Inkscape::UI::Widget::Button button_find;
+ Inkscape::UI::Widget::Button button_replace;
+ Gtk::HButtonBox box_buttons;
+ Gtk::HBox hboxbutton_row;
+
+ /**
+ * Finding or replacing
+ */
+ bool _action_replace;
+ bool blocked;
+
+ SPDesktop *desktop;
+ DesktopTracker deskTrack;
+ sigc::connection desktopChangeConn;
+ sigc::connection selectChangedConn;
};
} // namespace Dialog
diff --git a/src/ui/dialog/guides.cpp b/src/ui/dialog/guides.cpp
index 61b4fe389..088290b6f 100644
--- a/src/ui/dialog/guides.cpp
+++ b/src/ui/dialog/guides.cpp
@@ -54,7 +54,7 @@ GuidelinePropertiesDialog::GuidelinePropertiesDialog(SPGuide *guide, SPDesktop *
}
bool GuidelinePropertiesDialog::_relative_toggle_status = false; // initialize relative checkbox status for when this dialog is opened for first time
-Glib::ustring GuidelinePropertiesDialog::_angle_unit_status = "deg"; // initialize angle unit status
+Glib::ustring GuidelinePropertiesDialog::_angle_unit_status = DEG; // initialize angle unit status
GuidelinePropertiesDialog::~GuidelinePropertiesDialog() {
// save current status
@@ -87,7 +87,7 @@ void GuidelinePropertiesDialog::_modeChanged()
_spin_button_x.setValue(0);
} else {
// absolute
- _spin_angle.setValueKeepUnit(_oldangle, "deg");
+ _spin_angle.setValueKeepUnit(_oldangle, DEG);
_spin_button_x.setValueKeepUnit(_oldpos[Geom::X], "px");
_spin_button_y.setValueKeepUnit(_oldpos[Geom::Y], "px");
@@ -96,7 +96,7 @@ void GuidelinePropertiesDialog::_modeChanged()
void GuidelinePropertiesDialog::_onApply()
{
- double deg_angle = _spin_angle.getValue("deg");
+ double deg_angle = _spin_angle.getValue(DEG);
if (!_mode)
deg_angle += _oldangle;
Geom::Point normal;
diff --git a/src/ui/dialog/transformation.cpp b/src/ui/dialog/transformation.cpp
index 9b65c1f68..1951dc92a 100644
--- a/src/ui/dialog/transformation.cpp
+++ b/src/ui/dialog/transformation.cpp
@@ -724,7 +724,7 @@ void Transformation::applyPageScale(Inkscape::Selection *selection)
void Transformation::applyPageRotate(Inkscape::Selection *selection)
{
- double angle = _scalar_rotate.getValue("deg");
+ double angle = _scalar_rotate.getValue(DEG);
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
if (prefs->getBool("/dialogs/transformation/applyseparately")) {
diff --git a/src/ui/dialog/xml-tree.cpp b/src/ui/dialog/xml-tree.cpp
index cdbb2257c..ae1ebf5ca 100644
--- a/src/ui/dialog/xml-tree.cpp
+++ b/src/ui/dialog/xml-tree.cpp
@@ -233,7 +233,7 @@ XmlTree::XmlTree (void) :
GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(attributes));
g_signal_connect (G_OBJECT(selection), "changed", G_CALLBACK (on_attr_select_row), this);
-
+ g_signal_connect( G_OBJECT(attributes), "row-value-changed", G_CALLBACK(on_attr_row_changed), this);
xml_element_new_button.signal_clicked().connect(sigc::mem_fun(*this, &XmlTree::cmd_new_element_node));
xml_text_new_button.signal_clicked().connect(sigc::mem_fun(*this, &XmlTree::cmd_new_text_node));
@@ -738,11 +738,12 @@ void XmlTree::on_attr_select_row(GtkTreeSelection *selection, gpointer data)
GtkTreeModel *model;
if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
-/* self->selected_attr = 0;
+ // Nothing selected
+ self->selected_attr = 0;
self->attr_reset_context(self->selected_attr);
self->xml_attribute_delete_button.set_sensitive(false);
- self->on_attr_unselect_row_clear_text();*/
+ self->on_attr_unselect_row_clear_text();
return;
}
@@ -763,6 +764,22 @@ void XmlTree::on_attr_select_row(GtkTreeSelection *selection, gpointer data)
}
+void XmlTree::on_attr_row_changed(SPXMLViewAttrList *attributes, const gchar * name, gpointer data)
+{
+ // Reselect the selected row if the data changes to refresh the attribute and value edit boxes.
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(attributes));
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ const gchar *attr_name;
+ if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+ gtk_tree_model_get (model, &iter, 0, &attr_name, -1);
+ if (!strcmp(name, attr_name)) {
+ gtk_tree_selection_unselect_all(selection);
+ gtk_tree_selection_select_iter(selection, &iter);
+ }
+ }
+}
+
void XmlTree::on_attr_unselect_row_clear_text()
{
attr_name.set_text("");
diff --git a/src/ui/dialog/xml-tree.h b/src/ui/dialog/xml-tree.h
index eeb828771..bf43f5ae8 100644
--- a/src/ui/dialog/xml-tree.h
+++ b/src/ui/dialog/xml-tree.h
@@ -126,11 +126,16 @@ private:
static void after_tree_move(GtkCTree *tree, GtkCTreeNode *node, GtkCTreeNode *new_parent, GtkCTreeNode *new_sibling, gpointer data);
/**
- * Callback functions for when attribute selection changes
+ * Callback for when attribute selection changes
*/
static void on_attr_select_row(GtkTreeSelection *selection, gpointer data);
/**
+ * Callback for when attribute list values change
+ */
+ static void on_attr_row_changed(SPXMLViewAttrList *attributes, const gchar * name, gpointer data);
+
+ /**
* Enable widgets based on current selections
*/
void on_tree_select_row_enable(GtkCTreeNode *node);
diff --git a/src/ui/widget/button.cpp b/src/ui/widget/button.cpp
index 1ba531ddf..bac866920 100644
--- a/src/ui/widget/button.cpp
+++ b/src/ui/widget/button.cpp
@@ -31,6 +31,22 @@ CheckButton::CheckButton(Glib::ustring const &label, Glib::ustring const &toolti
set_tooltip_text(tooltip);
}
+CheckButton::CheckButton(Glib::ustring const &label, Glib::ustring const &tooltip, bool active)
+{
+ set_use_underline (true);
+ set_label (label);
+ set_tooltip_text(tooltip);
+ set_active(active);
+}
+
+RadioButton::RadioButton(Glib::ustring const &label, Glib::ustring const &tooltip)
+{
+ set_use_underline (true);
+ set_label (label);
+ set_tooltip_text(tooltip);
+}
+
+
} // namespace Widget
} // namespace UI
} // namespace Inkscape
diff --git a/src/ui/widget/button.h b/src/ui/widget/button.h
index 362cdf8ff..b219fc3db 100644
--- a/src/ui/widget/button.h
+++ b/src/ui/widget/button.h
@@ -11,6 +11,7 @@
#define INKSCAPE_UI_WIDGET_BUTTON_H
#include <gtkmm/checkbutton.h>
+#include <gtkmm/radiobutton.h>
namespace Inkscape {
namespace UI {
@@ -34,6 +35,19 @@ class CheckButton : public Gtk::CheckButton
public:
CheckButton();
CheckButton(Glib::ustring const &label, Glib::ustring const &tooltip);
+ CheckButton(Glib::ustring const &label, Glib::ustring const &tooltip, bool active);
+
+};
+
+/**
+ * RadioButton widget.
+ */
+class RadioButton : public Gtk::RadioButton
+{
+public:
+ RadioButton();
+ RadioButton(Glib::ustring const &label, Glib::ustring const &tooltip);
+
};
} // namespace Widget
diff --git a/src/ui/widget/entry.cpp b/src/ui/widget/entry.cpp
index 7ac8532fb..173e014d9 100644
--- a/src/ui/widget/entry.cpp
+++ b/src/ui/widget/entry.cpp
@@ -24,7 +24,6 @@ Entry::Entry( Glib::ustring const &label, Glib::ustring const &tooltip,
: Labelled(label, tooltip, new Gtk::Entry(), suffix, icon, mnemonic)
{
}
-
} // namespace Widget
} // namespace UI
diff --git a/src/ui/widget/entry.h b/src/ui/widget/entry.h
index d332dde1b..53b848fc9 100644
--- a/src/ui/widget/entry.h
+++ b/src/ui/widget/entry.h
@@ -11,8 +11,10 @@
#define INKSCAPE_UI_WIDGET_ENTRY__H
#include "labelled.h"
+#include <gtkmm.h>
#include <gtkmm/entry.h>
+#include <gtkmm/comboboxtext.h>
namespace Inkscape {
namespace UI {
diff --git a/src/util/units.h b/src/util/units.h
index d45109a8f..b22bdb1f2 100644
--- a/src/util/units.h
+++ b/src/util/units.h
@@ -32,6 +32,8 @@ enum UnitType {
UNIT_TYPE_NONE = -1
};
+const char DEG[] = "°";
+
class Unit {
public:
Glib::ustring name;
diff --git a/src/verbs.cpp b/src/verbs.cpp
index b00315248..9b750e123 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -39,7 +39,6 @@
#include "bind/javabind.h"
#include "desktop.h"
#include "desktop-handles.h"
-#include "dialogs/clonetiler.h"
#include "dialogs/find.h"
#include "display/curve.h"
#include "document.h"
@@ -67,6 +66,7 @@
#include "sp-namedview.h"
#include "text-chemistry.h"
#include "tools-switch.h"
+#include "ui/dialog/clonetiler.h"
#include "ui/dialog/dialog-manager.h"
#include "ui/dialog/document-properties.h"
#include "ui/dialog/extensions.h"
@@ -1822,9 +1822,7 @@ void DialogVerb::perform(SPAction *action, void *data)
dt->_dlg_mgr->showDialog("XmlTree");
break;
case SP_VERB_DIALOG_FIND:
- sp_find_dialog();
-// Please test the new find dialog if you have time:
-// dt->_dlg_mgr->showDialog("Find");
+ dt->_dlg_mgr->showDialog("Find");
break;
case SP_VERB_DIALOG_FINDREPLACE:
// not implemented yet
@@ -1846,7 +1844,8 @@ void DialogVerb::perform(SPAction *action, void *data)
inkscape_dialogs_toggle();
break;
case SP_VERB_DIALOG_CLONETILER:
- clonetiler_dialog();
+ //clonetiler_dialog();
+ dt->_dlg_mgr->showDialog("CloneTiler");
break;
case SP_VERB_DIALOG_ATTR:
//sp_item_dialog();
diff --git a/src/widgets/sp-xmlview-attr-list.cpp b/src/widgets/sp-xmlview-attr-list.cpp
index 1dd1f79bc..1c92476fa 100644
--- a/src/widgets/sp-xmlview-attr-list.cpp
+++ b/src/widgets/sp-xmlview-attr-list.cpp
@@ -54,11 +54,13 @@ sp_xmlview_attr_list_new (Inkscape::XML::Node * repr)
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
gtk_tree_view_column_set_sort_column_id (column, COL_NAME);
gtk_tree_sortable_set_sort_column_id ( GTK_TREE_SORTABLE(attr_list->store), COL_NAME, GTK_SORT_ASCENDING);
+ gtk_cell_renderer_set_padding (cell, 2, 0);
cell = gtk_cell_renderer_text_new ();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(attr_list), COL_VALUE, _("Value"), cell, "text", COL_VALUE, NULL);
column = gtk_tree_view_get_column (GTK_TREE_VIEW(attr_list), COL_VALUE);
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+ gtk_cell_renderer_set_padding (cell, 2, 0);
sp_xmlview_attr_list_set_repr (attr_list, repr);
@@ -205,6 +207,6 @@ event_attr_changed (Inkscape::XML::Node * /*repr*/,
}
// send a "changed" signal so widget owners will know I've updated
- g_signal_emit_by_name(G_OBJECT (list), "row-value-changed", row );
+ g_signal_emit_by_name(G_OBJECT (list), "row-value-changed", name );
}