summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Boguszewski <adrbogus1@student.pg.gda.pl>2016-06-16 22:52:06 +0000
committerAdrian Boguszewski <adrbogus1@student.pg.gda.pl>2016-06-16 22:52:06 +0000
commitc3b5e15737dc84cb2dafbdfb8d735e2dd7c8b08c (patch)
treeadc28ff36e9d801c626f01f994447931d2685ff8
parentReplaced old selection containers (diff)
parentMerging lp:~inkscape+alexander/inkscape/comments into lp:inkscape. (diff)
downloadinkscape-c3b5e15737dc84cb2dafbdfb8d735e2dd7c8b08c.tar.gz
inkscape-c3b5e15737dc84cb2dafbdfb8d735e2dd7c8b08c.zip
Moved most functions from Selection to ObjectSet
(bzr r14954.1.7)
-rw-r--r--po/uk.po1460
-rw-r--r--src/document.cpp22
-rw-r--r--src/document.h2
-rw-r--r--src/live_effects/lpe-transform_2pts.cpp2
-rw-r--r--src/main-cmdlineact.cpp2
-rw-r--r--src/object-set.cpp259
-rw-r--r--src/object-set.h148
-rw-r--r--src/selection.cpp300
-rw-r--r--src/selection.h158
-rw-r--r--src/sp-object.cpp15
-rw-r--r--src/ui/tools/eraser-tool.cpp1
-rw-r--r--src/ui/widget/style-subject.cpp2
-rw-r--r--testfiles/src/object-set-test.cpp163
13 files changed, 1310 insertions, 1224 deletions
diff --git a/po/uk.po b/po/uk.po
index 0b49b31dc..32df22f9e 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: uk\n"
"Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2016-06-02 12:12+0200\n"
-"PO-Revision-Date: 2016-05-29 11:47+0300\n"
+"POT-Creation-Date: 2016-06-13 13:39+0300\n"
+"PO-Revision-Date: 2016-06-13 13:50+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <translation@linux.org.ua>\n"
"Language: uk\n"
@@ -706,7 +706,8 @@ msgstr "Чорна діра"
#: ../share/filters/filters.svg.h:279 ../share/filters/filters.svg.h:835
#: ../share/filters/filters.svg.h:839 ../share/filters/filters.svg.h:843
#: ../src/extension/internal/filter/morphology.h:76
-#: ../src/extension/internal/filter/morphology.h:203 ../src/filter-enums.cpp:32
+#: ../src/extension/internal/filter/morphology.h:203
+#: ../src/filter-enums.cpp:32
msgid "Morphology"
msgstr "Морфологія"
@@ -3418,1033 +3419,1033 @@ msgstr "Сукно (растр)"
msgid "Old paint (bitmap)"
msgstr "Стара картина (растр)"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:2
msgctxt "Symbol"
-msgid "AIGA Symbol Signs"
-msgstr "Знаки-символи AIGA"
+msgid "United States National Park Service Map Symbols"
+msgstr "Символи карт служб національних парків США"
-#. Symbols: ./AigaSymbols.svg
#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:3 ../share/symbols/symbols.h:4
-#: ../share/symbols/symbols.h:281 ../share/symbols/symbols.h:282
msgctxt "Symbol"
-msgid "Telephone"
-msgstr "Телефон"
+msgid "Airport"
+msgstr "Аеропорт"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:5 ../share/symbols/symbols.h:6
msgctxt "Symbol"
-msgid "Mail"
-msgstr "Пошта"
+msgid "Amphitheatre"
+msgstr "Амфітеатр"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:7 ../share/symbols/symbols.h:8
msgctxt "Symbol"
-msgid "Currency Exchange"
-msgstr "Обмін валют"
+msgid "Bicycle Trail"
+msgstr "Велосипедна траса"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:9 ../share/symbols/symbols.h:10
msgctxt "Symbol"
-msgid "Currency Exchange - Euro"
-msgstr "Обмін валют — євро"
+msgid "Boat Launch"
+msgstr "Місце спуску човнів"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:11 ../share/symbols/symbols.h:12
msgctxt "Symbol"
-msgid "Cashier"
-msgstr "Каса"
+msgid "Boat Tour"
+msgstr "Човновий маршрут"
-#. Symbols: ./AigaSymbols.svg
#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:13 ../share/symbols/symbols.h:14
-#: ../share/symbols/symbols.h:213 ../share/symbols/symbols.h:214
msgctxt "Symbol"
-msgid "First Aid"
-msgstr "Перша допомога"
+msgid "Bus Stop"
+msgstr "Автобусна зупинка"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:15 ../share/symbols/symbols.h:16
msgctxt "Symbol"
-msgid "Lost and Found"
-msgstr "Втрачено і знайдено"
+msgid "Campfire"
+msgstr "Місце для багаття"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:17 ../share/symbols/symbols.h:18
msgctxt "Symbol"
-msgid "Coat Check"
-msgstr "Гардероб"
+msgid "Campground"
+msgstr "Майданчик для табору"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:19 ../share/symbols/symbols.h:20
msgctxt "Symbol"
-msgid "Baggage Lockers"
-msgstr "Шафи для зберігання речей"
+msgid "CanoeAccess"
+msgstr "Доступ до каное"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:21 ../share/symbols/symbols.h:22
msgctxt "Symbol"
-msgid "Escalator"
-msgstr "Ескалатор"
+msgid "Crosscountry Ski Trail"
+msgstr "Траса для лижного кросу"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:23 ../share/symbols/symbols.h:24
msgctxt "Symbol"
-msgid "Escalator Down"
-msgstr "Ескалатор вниз"
+msgid "Downhill Skiing"
+msgstr "Лижний спуск"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:25 ../share/symbols/symbols.h:26
msgctxt "Symbol"
-msgid "Escalator Up"
-msgstr "Ескалатор вгору"
+msgid "Drinking Water"
+msgstr "Питна вода"
+#. Symbols: ./MapSymbolsNPS.svg
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:27 ../share/symbols/symbols.h:28
+#: ../share/symbols/symbols.h:172 ../share/symbols/symbols.h:173
msgctxt "Symbol"
-msgid "Stairs"
-msgstr "Сходи"
+msgid "First Aid"
+msgstr "Перша допомога"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:29 ../share/symbols/symbols.h:30
msgctxt "Symbol"
-msgid "Stairs Down"
-msgstr "Сходи вниз"
+msgid "Fishing"
+msgstr "Риболовля"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:31 ../share/symbols/symbols.h:32
msgctxt "Symbol"
-msgid "Stairs Up"
-msgstr "Сходи вгору"
+msgid "Food Service"
+msgstr "Служба харчування"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:33 ../share/symbols/symbols.h:34
msgctxt "Symbol"
-msgid "Elevator"
-msgstr "Ліфт"
+msgid "Four Wheel Drive Road"
+msgstr "Дорога для чотириколісних машин"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:35 ../share/symbols/symbols.h:36
msgctxt "Symbol"
-msgid "Toilets - Men"
-msgstr "Чоловічий туалет"
+msgid "Gas Station"
+msgstr "Автозаправка"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:37 ../share/symbols/symbols.h:38
msgctxt "Symbol"
-msgid "Toilets - Women"
-msgstr "Жіночий туалет"
+msgid "Golfing"
+msgstr "Гольф"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:39 ../share/symbols/symbols.h:40
msgctxt "Symbol"
-msgid "Toilets"
-msgstr "Туалети"
+msgid "Horseback Riding"
+msgstr "Траса для кінської їзди"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:41 ../share/symbols/symbols.h:42
msgctxt "Symbol"
-msgid "Nursery"
-msgstr "Ясла"
+msgid "Hospital"
+msgstr "Лікарня"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:43 ../share/symbols/symbols.h:44
msgctxt "Symbol"
-msgid "Drinking Fountain"
-msgstr "Питний фонтанчик"
+msgid "Ice Skating"
+msgstr "Катання на ковзанах"
+#. Symbols: ./MapSymbolsNPS.svg
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:45 ../share/symbols/symbols.h:46
+#: ../share/symbols/symbols.h:206 ../share/symbols/symbols.h:207
msgctxt "Symbol"
-msgid "Waiting Room"
-msgstr "Зала очікування"
+msgid "Information"
+msgstr "Довідкова служба"
-#. Symbols: ./AigaSymbols.svg
#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:47 ../share/symbols/symbols.h:48
-#: ../share/symbols/symbols.h:231 ../share/symbols/symbols.h:232
msgctxt "Symbol"
-msgid "Information"
-msgstr "Довідкова служба"
+msgid "Litter Receptacle"
+msgstr "Сховище нош"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:49 ../share/symbols/symbols.h:50
msgctxt "Symbol"
-msgid "Hotel Information"
-msgstr "Інформація щодо готелів"
+msgid "Lodging"
+msgstr "Кімнати"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:51 ../share/symbols/symbols.h:52
msgctxt "Symbol"
-msgid "Air Transportation"
-msgstr "Повітряний транспорт"
+msgid "Marina"
+msgstr "Пристань"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:53 ../share/symbols/symbols.h:54
msgctxt "Symbol"
-msgid "Heliport"
-msgstr "Вертодром"
+msgid "Motorbike Trail"
+msgstr "Траса для мотоциклів"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:55 ../share/symbols/symbols.h:56
msgctxt "Symbol"
-msgid "Taxi"
-msgstr "Таксі"
+msgid "Radiator Water"
+msgstr "Вода для опалювання"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:57 ../share/symbols/symbols.h:58
msgctxt "Symbol"
-msgid "Bus"
-msgstr "Автобус"
+msgid "Recycling"
+msgstr "Пункт переробки"
+#. Symbols: ./MapSymbolsNPS.svg
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:59 ../share/symbols/symbols.h:60
+#: ../share/symbols/symbols.h:258 ../share/symbols/symbols.h:259
msgctxt "Symbol"
-msgid "Ground Transportation"
-msgstr "Наземний транспорт"
+msgid "Parking"
+msgstr "Паркувальний майданчик"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:61 ../share/symbols/symbols.h:62
msgctxt "Symbol"
-msgid "Rail Transportation"
-msgstr "Залізничний транспорт"
+msgid "Pets On Leash"
+msgstr "Домашні тварини на повідді"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:63 ../share/symbols/symbols.h:64
msgctxt "Symbol"
-msgid "Water Transportation"
-msgstr "Водний транспорт"
+msgid "Picnic Area"
+msgstr "Місце для пікніків"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:65 ../share/symbols/symbols.h:66
msgctxt "Symbol"
-msgid "Car Rental"
-msgstr "Оренда автомобілів"
+msgid "Post Office"
+msgstr "Поштове відділення"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:67 ../share/symbols/symbols.h:68
msgctxt "Symbol"
-msgid "Restaurant"
-msgstr "Ресторан"
+msgid "Ranger Station"
+msgstr "Станція рейнджерів"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:69 ../share/symbols/symbols.h:70
msgctxt "Symbol"
-msgid "Coffeeshop"
-msgstr "Кав’ярня"
+msgid "RV Campground"
+msgstr "Майданчик для трейлерів"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:71 ../share/symbols/symbols.h:72
msgctxt "Symbol"
-msgid "Bar"
-msgstr "Бар"
+msgid "Restrooms"
+msgstr "Туалети"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:73 ../share/symbols/symbols.h:74
msgctxt "Symbol"
-msgid "Shops"
-msgstr "Крамниці"
+msgid "Sailing"
+msgstr "Парусний спорт"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:75 ../share/symbols/symbols.h:76
msgctxt "Symbol"
-msgid "Barber Shop - Beauty Salon"
-msgstr "Перукарня і салон краси"
+msgid "Sanitary Disposal Station"
+msgstr "Станція утилізації відходів"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:77 ../share/symbols/symbols.h:78
msgctxt "Symbol"
-msgid "Barber Shop"
-msgstr "Перукарня"
+msgid "Scuba Diving"
+msgstr "Пірнання з аквалангом"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:79 ../share/symbols/symbols.h:80
msgctxt "Symbol"
-msgid "Beauty Salon"
-msgstr "Салон краси"
+msgid "Self Guided Trail"
+msgstr "Стежка для самостійного огляду"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:81 ../share/symbols/symbols.h:82
msgctxt "Symbol"
-msgid "Ticket Purchase"
-msgstr "Придбання квитків"
+msgid "Shelter"
+msgstr "Притулок"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:83 ../share/symbols/symbols.h:84
msgctxt "Symbol"
-msgid "Baggage Check In"
-msgstr "Приймання багажу"
+msgid "Showers"
+msgstr "Душові"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:85 ../share/symbols/symbols.h:86
msgctxt "Symbol"
-msgid "Baggage Claim"
-msgstr "Видача багажу"
+msgid "Sledding"
+msgstr "Катання на санях"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:87 ../share/symbols/symbols.h:88
msgctxt "Symbol"
-msgid "Customs"
-msgstr "Митні послуги"
+msgid "SnowmobileTrail"
+msgstr "Траса для снігоходів"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:89 ../share/symbols/symbols.h:90
msgctxt "Symbol"
-msgid "Immigration"
-msgstr "Міграційна служба"
+msgid "Stable"
+msgstr "Стайня"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:91 ../share/symbols/symbols.h:92
msgctxt "Symbol"
-msgid "Departing Flights"
-msgstr "Відправлення"
+msgid "Store"
+msgstr "Склад"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:93 ../share/symbols/symbols.h:94
msgctxt "Symbol"
-msgid "Arriving Flights"
-msgstr "Прибуття"
+msgid "Swimming"
+msgstr "Плавання"
+#. Symbols: ./MapSymbolsNPS.svg
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:95 ../share/symbols/symbols.h:96
+#: ../share/symbols/symbols.h:162 ../share/symbols/symbols.h:163
msgctxt "Symbol"
-msgid "Smoking"
-msgstr "Місце для куріння"
+msgid "Telephone"
+msgstr "Телефон"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:97 ../share/symbols/symbols.h:98
msgctxt "Symbol"
-msgid "No Smoking"
-msgstr "Куріння заборонено"
+msgid "Emergency Telephone"
+msgstr "Телефон виклику служб надзвичайних ситуацій"
-#. Symbols: ./AigaSymbols.svg
#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:99 ../share/symbols/symbols.h:100
-#: ../share/symbols/symbols.h:245 ../share/symbols/symbols.h:246
msgctxt "Symbol"
-msgid "Parking"
-msgstr "Паркувальний майданчик"
+msgid "Trailhead"
+msgstr "Початок маршруту"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:101 ../share/symbols/symbols.h:102
msgctxt "Symbol"
-msgid "No Parking"
-msgstr "Паркування заборонено"
+msgid "Wheelchair Accessible"
+msgstr "Візок"
-#. Symbols: ./AigaSymbols.svg
+#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:103 ../share/symbols/symbols.h:104
msgctxt "Symbol"
-msgid "No Dogs"
-msgstr "Вигулювання собак заборонено"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:105 ../share/symbols/symbols.h:106
-msgctxt "Symbol"
-msgid "No Entry"
-msgstr "Вхід заборонено"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:107 ../share/symbols/symbols.h:108
-msgctxt "Symbol"
-msgid "Exit"
-msgstr "Вихід"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:109 ../share/symbols/symbols.h:110
-msgctxt "Symbol"
-msgid "Fire Extinguisher"
-msgstr "Вогнегасник"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:111 ../share/symbols/symbols.h:112
-msgctxt "Symbol"
-msgid "Right Arrow"
-msgstr "Стрілка праворуч"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:113 ../share/symbols/symbols.h:114
-msgctxt "Symbol"
-msgid "Forward and Right Arrow"
-msgstr "Стрілка вперед і праворуч"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:115 ../share/symbols/symbols.h:116
-msgctxt "Symbol"
-msgid "Up Arrow"
-msgstr "Стрілка вгору"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:117 ../share/symbols/symbols.h:118
-msgctxt "Symbol"
-msgid "Forward and Left Arrow"
-msgstr "Стрілка вперед і ліворуч"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:119 ../share/symbols/symbols.h:120
-msgctxt "Symbol"
-msgid "Left Arrow"
-msgstr "Стрілка ліворуч"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:121 ../share/symbols/symbols.h:122
-msgctxt "Symbol"
-msgid "Left and Down Arrow"
-msgstr "Стрілка ліворуч і вниз"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:123 ../share/symbols/symbols.h:124
-msgctxt "Symbol"
-msgid "Down Arrow"
-msgstr "Стрілка вниз"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:125 ../share/symbols/symbols.h:126
-msgctxt "Symbol"
-msgid "Right and Down Arrow"
-msgstr "Стрілка праворуч і вниз"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:127 ../share/symbols/symbols.h:128
-msgctxt "Symbol"
-msgid "NPS Wheelchair Accessible - 1996"
-msgstr "Візок NPS — 1996"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:129 ../share/symbols/symbols.h:130
-msgctxt "Symbol"
-msgid "NPS Wheelchair Accessible"
-msgstr "Візок NPS"
-
-#. Symbols: ./AigaSymbols.svg
-#: ../share/symbols/symbols.h:131 ../share/symbols/symbols.h:132
-msgctxt "Symbol"
-msgid "New Wheelchair Accessible"
-msgstr "Новий візок"
-
-#. Symbols: ./BalloonSymbols.svg
-#: ../share/symbols/symbols.h:133
-msgctxt "Symbol"
-msgid "Word Balloons"
-msgstr "Мовні бульки"
-
-#. Symbols: ./BalloonSymbols.svg
-#: ../share/symbols/symbols.h:134
-msgctxt "Symbol"
-msgid "Thought Balloon"
-msgstr "Булька думок"
-
-#. Symbols: ./BalloonSymbols.svg
-#: ../share/symbols/symbols.h:135
-msgctxt "Symbol"
-msgid "Dream Speaking"
-msgstr "Висловлення мрій"
-
-#. Symbols: ./BalloonSymbols.svg
-#: ../share/symbols/symbols.h:136
-msgctxt "Symbol"
-msgid "Rounded Balloon"
-msgstr "Заокруглена булька"
-
-#. Symbols: ./BalloonSymbols.svg
-#: ../share/symbols/symbols.h:137
-msgctxt "Symbol"
-msgid "Squared Balloon"
-msgstr "Квадрата булька"
-
-#. Symbols: ./BalloonSymbols.svg
-#: ../share/symbols/symbols.h:138
-msgctxt "Symbol"
-msgid "Over the Phone"
-msgstr "Телефоном"
-
-#. Symbols: ./BalloonSymbols.svg
-#: ../share/symbols/symbols.h:139
-msgctxt "Symbol"
-msgid "Hip Balloon"
-msgstr "Булька смутку"
-
-#. Symbols: ./BalloonSymbols.svg
-#: ../share/symbols/symbols.h:140
-msgctxt "Symbol"
-msgid "Circle Balloon"
-msgstr "Кругова булька"
+msgid "Wind Surfing"
+msgstr "Віндсерфінг"
-#. Symbols: ./BalloonSymbols.svg
-#: ../share/symbols/symbols.h:141
+#. Symbols: ./MapSymbolsNPS.svg
+#: ../share/symbols/symbols.h:105
msgctxt "Symbol"
-msgid "Exclaim Balloon"
-msgstr "Булька вигуку"
+msgid "Blank"
+msgstr "Порожньо"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:142
+#: ../share/symbols/symbols.h:106
msgctxt "Symbol"
msgid "Flow Chart Shapes"
msgstr "Форми блок-схем"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:143
+#: ../share/symbols/symbols.h:107
msgctxt "Symbol"
msgid "Process"
msgstr "Обробляти"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:144
+#: ../share/symbols/symbols.h:108
msgctxt "Symbol"
msgid "Input/Output"
msgstr "Вхід/Вихід"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:145
+#: ../share/symbols/symbols.h:109
msgctxt "Symbol"
msgid "Document"
msgstr "Документ"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:146
+#: ../share/symbols/symbols.h:110
msgctxt "Symbol"
msgid "Manual Operation"
msgstr "Ручна дія"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:147
+#: ../share/symbols/symbols.h:111
msgctxt "Symbol"
msgid "Preparation"
msgstr "Підготовка"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:148
+#: ../share/symbols/symbols.h:112
msgctxt "Symbol"
msgid "Merge"
msgstr "Об’єднання"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:149
+#: ../share/symbols/symbols.h:113
msgctxt "Symbol"
msgid "Decision"
msgstr "Рішення"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:150
+#: ../share/symbols/symbols.h:114
msgctxt "Symbol"
msgid "Magnetic Tape"
msgstr "Магнітна стрічка"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:151
+#: ../share/symbols/symbols.h:115
msgctxt "Symbol"
msgid "Display"
msgstr "Показ"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:152
+#: ../share/symbols/symbols.h:116
msgctxt "Symbol"
msgid "Auxiliary Operation"
msgstr "Допоміжна операція"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:153
+#: ../share/symbols/symbols.h:117
msgctxt "Symbol"
msgid "Manual Input"
msgstr "Ручний ввід"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:154
+#: ../share/symbols/symbols.h:118
msgctxt "Symbol"
msgid "Extract"
msgstr "Видобування"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:155
+#: ../share/symbols/symbols.h:119
msgctxt "Symbol"
msgid "Terminal/Interrupt"
msgstr "Завершення/Переривання"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:156
+#: ../share/symbols/symbols.h:120
msgctxt "Symbol"
msgid "Punched Card"
msgstr "Перфокартка"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:157
+#: ../share/symbols/symbols.h:121
msgctxt "Symbol"
msgid "Punch Tape"
msgstr "Перфострічка"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:158
+#: ../share/symbols/symbols.h:122
msgctxt "Symbol"
msgid "Online Storage"
msgstr "Сховище даних у мережі"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:159
+#: ../share/symbols/symbols.h:123
msgctxt "Symbol"
msgid "Keying"
msgstr "Набір"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:160
+#: ../share/symbols/symbols.h:124
msgctxt "Symbol"
msgid "Sort"
msgstr "Упорядкування"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:161
+#: ../share/symbols/symbols.h:125
msgctxt "Symbol"
msgid "Connector"
msgstr "З’єднання"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:162
+#: ../share/symbols/symbols.h:126
msgctxt "Symbol"
msgid "Off-Page Connector"
msgstr "З'єднання поза сторінкою"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:163
+#: ../share/symbols/symbols.h:127
msgctxt "Symbol"
msgid "Transmittal Tape"
msgstr "Передавальна стрічка"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:164
+#: ../share/symbols/symbols.h:128
msgctxt "Symbol"
msgid "Communication Link"
msgstr "З’єднання для обміну даними"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:165
+#: ../share/symbols/symbols.h:129
msgctxt "Symbol"
msgid "Collate"
msgstr "Об’єднання"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:166
+#: ../share/symbols/symbols.h:130
msgctxt "Symbol"
msgid "Comment/Annotation"
msgstr "Коментар/Анотація"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:167
+#: ../share/symbols/symbols.h:131
msgctxt "Symbol"
msgid "Core"
msgstr "Ядро"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:168
+#: ../share/symbols/symbols.h:132
msgctxt "Symbol"
msgid "Predefined Process"
msgstr "Наперед визначений процес"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:169
+#: ../share/symbols/symbols.h:133
msgctxt "Symbol"
msgid "Magnetic Disk (Database)"
msgstr "Магнітний диск (база даних)"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:170
+#: ../share/symbols/symbols.h:134
msgctxt "Symbol"
msgid "Magnetic Drum (Direct Access)"
msgstr "Магнітний барабан (безпосередній доступ)"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:171
+#: ../share/symbols/symbols.h:135
msgctxt "Symbol"
msgid "Offline Storage"
msgstr "Автономне сховище даних"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:172
+#: ../share/symbols/symbols.h:136
msgctxt "Symbol"
msgid "Logical Or"
msgstr "Логічне «АБО»"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:173
+#: ../share/symbols/symbols.h:137
msgctxt "Symbol"
msgid "Logical And"
msgstr "Логічне «ТА»"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:174
+#: ../share/symbols/symbols.h:138
msgctxt "Symbol"
msgid "Delay"
msgstr "Затримка"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:175
+#: ../share/symbols/symbols.h:139
msgctxt "Symbol"
msgid "Loop Limit Begin"
msgstr "Початок циклу"
#. Symbols: ./FlowSymbols.svg
-#: ../share/symbols/symbols.h:176
+#: ../share/symbols/symbols.h:140
msgctxt "Symbol"
msgid "Loop Limit End"
msgstr "Кінець циклу"
+#. Symbols: ./BalloonSymbols.svg
+#: ../share/symbols/symbols.h:141
+msgctxt "Symbol"
+msgid "Word Balloons"
+msgstr "Мовні бульки"
+
+#. Symbols: ./BalloonSymbols.svg
+#: ../share/symbols/symbols.h:142
+msgctxt "Symbol"
+msgid "Thought Balloon"
+msgstr "Булька думок"
+
+#. Symbols: ./BalloonSymbols.svg
+#: ../share/symbols/symbols.h:143
+msgctxt "Symbol"
+msgid "Dream Speaking"
+msgstr "Висловлення мрій"
+
+#. Symbols: ./BalloonSymbols.svg
+#: ../share/symbols/symbols.h:144
+msgctxt "Symbol"
+msgid "Rounded Balloon"
+msgstr "Заокруглена булька"
+
+#. Symbols: ./BalloonSymbols.svg
+#: ../share/symbols/symbols.h:145
+msgctxt "Symbol"
+msgid "Squared Balloon"
+msgstr "Квадрата булька"
+
+#. Symbols: ./BalloonSymbols.svg
+#: ../share/symbols/symbols.h:146
+msgctxt "Symbol"
+msgid "Over the Phone"
+msgstr "Телефоном"
+
+#. Symbols: ./BalloonSymbols.svg
+#: ../share/symbols/symbols.h:147
+msgctxt "Symbol"
+msgid "Hip Balloon"
+msgstr "Булька смутку"
+
+#. Symbols: ./BalloonSymbols.svg
+#: ../share/symbols/symbols.h:148
+msgctxt "Symbol"
+msgid "Circle Balloon"
+msgstr "Кругова булька"
+
+#. Symbols: ./BalloonSymbols.svg
+#: ../share/symbols/symbols.h:149
+msgctxt "Symbol"
+msgid "Exclaim Balloon"
+msgstr "Булька вигуку"
+
#. Symbols: ./LogicSymbols.svg
-#: ../share/symbols/symbols.h:177
+#: ../share/symbols/symbols.h:150
msgctxt "Symbol"
msgid "Logic Symbols"
msgstr "Символи логіки"
#. Symbols: ./LogicSymbols.svg
-#: ../share/symbols/symbols.h:178
+#: ../share/symbols/symbols.h:151
msgctxt "Symbol"
msgid "Xnor Gate"
msgstr "Ключ виключне заперечувальне АБО»"
#. Symbols: ./LogicSymbols.svg
-#: ../share/symbols/symbols.h:179
+#: ../share/symbols/symbols.h:152
msgctxt "Symbol"
msgid "Xor Gate"
msgstr "Ключ виключне І"
#. Symbols: ./LogicSymbols.svg
-#: ../share/symbols/symbols.h:180
+#: ../share/symbols/symbols.h:153
msgctxt "Symbol"
msgid "Nor Gate"
msgstr "Ключ АБО-НІ"
#. Symbols: ./LogicSymbols.svg
-#: ../share/symbols/symbols.h:181
+#: ../share/symbols/symbols.h:154
msgctxt "Symbol"
msgid "Or Gate"
msgstr "Ключ АБО"
#. Symbols: ./LogicSymbols.svg
-#: ../share/symbols/symbols.h:182
+#: ../share/symbols/symbols.h:155
msgctxt "Symbol"
msgid "Nand Gate"
msgstr "Ключ І-НІ"
#. Symbols: ./LogicSymbols.svg
-#: ../share/symbols/symbols.h:183
+#: ../share/symbols/symbols.h:156
msgctxt "Symbol"
msgid "And Gate"
msgstr "Ключ І"
#. Symbols: ./LogicSymbols.svg
-#: ../share/symbols/symbols.h:184
+#: ../share/symbols/symbols.h:157
msgctxt "Symbol"
msgid "Buffer"
msgstr "Буфер"
#. Symbols: ./LogicSymbols.svg
-#: ../share/symbols/symbols.h:185
+#: ../share/symbols/symbols.h:158
msgctxt "Symbol"
msgid "Not Gate"
msgstr "Ключ НІ"
#. Symbols: ./LogicSymbols.svg
-#: ../share/symbols/symbols.h:186
+#: ../share/symbols/symbols.h:159
msgctxt "Symbol"
msgid "Buffer Small"
msgstr "Малий буфер"
#. Symbols: ./LogicSymbols.svg
-#: ../share/symbols/symbols.h:187
+#: ../share/symbols/symbols.h:160
msgctxt "Symbol"
msgid "Not Gate Small"
msgstr "Малий ключ НІ"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:188
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:161
msgctxt "Symbol"
-msgid "United States National Park Service Map Symbols"
-msgstr "Символи карт служб національних парків США"
+msgid "AIGA Symbol Signs"
+msgstr "Знаки-символи AIGA"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:189 ../share/symbols/symbols.h:190
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:164 ../share/symbols/symbols.h:165
msgctxt "Symbol"
-msgid "Airport"
-msgstr "Аеропорт"
+msgid "Mail"
+msgstr "Пошта"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:191 ../share/symbols/symbols.h:192
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:166 ../share/symbols/symbols.h:167
msgctxt "Symbol"
-msgid "Amphitheatre"
-msgstr "Амфітеатр"
+msgid "Currency Exchange"
+msgstr "Обмін валют"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:193 ../share/symbols/symbols.h:194
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:168 ../share/symbols/symbols.h:169
msgctxt "Symbol"
-msgid "Bicycle Trail"
-msgstr "Велосипедна траса"
+msgid "Currency Exchange - Euro"
+msgstr "Обмін валют — євро"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:195 ../share/symbols/symbols.h:196
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:170 ../share/symbols/symbols.h:171
msgctxt "Symbol"
-msgid "Boat Launch"
-msgstr "Місце спуску човнів"
+msgid "Cashier"
+msgstr "Каса"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:197 ../share/symbols/symbols.h:198
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:174 ../share/symbols/symbols.h:175
msgctxt "Symbol"
-msgid "Boat Tour"
-msgstr "Човновий маршрут"
+msgid "Lost and Found"
+msgstr "Втрачено і знайдено"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:199 ../share/symbols/symbols.h:200
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:176 ../share/symbols/symbols.h:177
msgctxt "Symbol"
-msgid "Bus Stop"
-msgstr "Автобусна зупинка"
+msgid "Coat Check"
+msgstr "Гардероб"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:201 ../share/symbols/symbols.h:202
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:178 ../share/symbols/symbols.h:179
msgctxt "Symbol"
-msgid "Campfire"
-msgstr "Місце для багаття"
+msgid "Baggage Lockers"
+msgstr "Шафи для зберігання речей"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:203 ../share/symbols/symbols.h:204
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:180 ../share/symbols/symbols.h:181
msgctxt "Symbol"
-msgid "Campground"
-msgstr "Майданчик для табору"
+msgid "Escalator"
+msgstr "Ескалатор"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:205 ../share/symbols/symbols.h:206
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:182 ../share/symbols/symbols.h:183
msgctxt "Symbol"
-msgid "CanoeAccess"
-msgstr "Доступ до каное"
+msgid "Escalator Down"
+msgstr "Ескалатор вниз"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:207 ../share/symbols/symbols.h:208
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:184 ../share/symbols/symbols.h:185
msgctxt "Symbol"
-msgid "Crosscountry Ski Trail"
-msgstr "Траса для лижного кросу"
+msgid "Escalator Up"
+msgstr "Ескалатор вгору"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:209 ../share/symbols/symbols.h:210
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:186 ../share/symbols/symbols.h:187
msgctxt "Symbol"
-msgid "Downhill Skiing"
-msgstr "Лижний спуск"
+msgid "Stairs"
+msgstr "Сходи"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:211 ../share/symbols/symbols.h:212
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:188 ../share/symbols/symbols.h:189
msgctxt "Symbol"
-msgid "Drinking Water"
-msgstr "Питна вода"
+msgid "Stairs Down"
+msgstr "Сходи вниз"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:215 ../share/symbols/symbols.h:216
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:190 ../share/symbols/symbols.h:191
msgctxt "Symbol"
-msgid "Fishing"
-msgstr "Риболовля"
+msgid "Stairs Up"
+msgstr "Сходи вгору"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:217 ../share/symbols/symbols.h:218
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:192 ../share/symbols/symbols.h:193
msgctxt "Symbol"
-msgid "Food Service"
-msgstr "Служба харчування"
+msgid "Elevator"
+msgstr "Ліфт"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:219 ../share/symbols/symbols.h:220
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:194 ../share/symbols/symbols.h:195
msgctxt "Symbol"
-msgid "Four Wheel Drive Road"
-msgstr "Дорога для чотириколісних машин"
+msgid "Toilets - Men"
+msgstr "Чоловічий туалет"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:221 ../share/symbols/symbols.h:222
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:196 ../share/symbols/symbols.h:197
msgctxt "Symbol"
-msgid "Gas Station"
-msgstr "Автозаправка"
+msgid "Toilets - Women"
+msgstr "Жіночий туалет"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:223 ../share/symbols/symbols.h:224
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:198 ../share/symbols/symbols.h:199
msgctxt "Symbol"
-msgid "Golfing"
-msgstr "Гольф"
+msgid "Toilets"
+msgstr "Туалети"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:225 ../share/symbols/symbols.h:226
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:200 ../share/symbols/symbols.h:201
msgctxt "Symbol"
-msgid "Horseback Riding"
-msgstr "Траса для кінської їзди"
+msgid "Nursery"
+msgstr "Ясла"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:227 ../share/symbols/symbols.h:228
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:202 ../share/symbols/symbols.h:203
msgctxt "Symbol"
-msgid "Hospital"
-msgstr "Лікарня"
+msgid "Drinking Fountain"
+msgstr "Питний фонтанчик"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:229 ../share/symbols/symbols.h:230
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:204 ../share/symbols/symbols.h:205
msgctxt "Symbol"
-msgid "Ice Skating"
-msgstr "Катання на ковзанах"
+msgid "Waiting Room"
+msgstr "Зала очікування"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:233 ../share/symbols/symbols.h:234
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:208 ../share/symbols/symbols.h:209
msgctxt "Symbol"
-msgid "Litter Receptacle"
-msgstr "Сховище нош"
+msgid "Hotel Information"
+msgstr "Інформація щодо готелів"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:235 ../share/symbols/symbols.h:236
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:210 ../share/symbols/symbols.h:211
msgctxt "Symbol"
-msgid "Lodging"
-msgstr "Кімнати"
+msgid "Air Transportation"
+msgstr "Повітряний транспорт"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:237 ../share/symbols/symbols.h:238
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:212 ../share/symbols/symbols.h:213
msgctxt "Symbol"
-msgid "Marina"
-msgstr "Пристань"
+msgid "Heliport"
+msgstr "Вертодром"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:239 ../share/symbols/symbols.h:240
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:214 ../share/symbols/symbols.h:215
msgctxt "Symbol"
-msgid "Motorbike Trail"
-msgstr "Траса для мотоциклів"
+msgid "Taxi"
+msgstr "Таксі"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:241 ../share/symbols/symbols.h:242
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:216 ../share/symbols/symbols.h:217
msgctxt "Symbol"
-msgid "Radiator Water"
-msgstr "Вода для опалювання"
+msgid "Bus"
+msgstr "Автобус"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:243 ../share/symbols/symbols.h:244
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:218 ../share/symbols/symbols.h:219
msgctxt "Symbol"
-msgid "Recycling"
-msgstr "Пункт переробки"
+msgid "Ground Transportation"
+msgstr "Наземний транспорт"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:247 ../share/symbols/symbols.h:248
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:220 ../share/symbols/symbols.h:221
msgctxt "Symbol"
-msgid "Pets On Leash"
-msgstr "Домашні тварини на повідді"
+msgid "Rail Transportation"
+msgstr "Залізничний транспорт"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:249 ../share/symbols/symbols.h:250
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:222 ../share/symbols/symbols.h:223
msgctxt "Symbol"
-msgid "Picnic Area"
-msgstr "Місце для пікніків"
+msgid "Water Transportation"
+msgstr "Водний транспорт"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:251 ../share/symbols/symbols.h:252
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:224 ../share/symbols/symbols.h:225
msgctxt "Symbol"
-msgid "Post Office"
-msgstr "Поштове відділення"
+msgid "Car Rental"
+msgstr "Оренда автомобілів"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:253 ../share/symbols/symbols.h:254
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:226 ../share/symbols/symbols.h:227
msgctxt "Symbol"
-msgid "Ranger Station"
-msgstr "Станція рейнджерів"
+msgid "Restaurant"
+msgstr "Ресторан"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:255 ../share/symbols/symbols.h:256
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:228 ../share/symbols/symbols.h:229
msgctxt "Symbol"
-msgid "RV Campground"
-msgstr "Майданчик для трейлерів"
+msgid "Coffeeshop"
+msgstr "Кав’ярня"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:257 ../share/symbols/symbols.h:258
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:230 ../share/symbols/symbols.h:231
msgctxt "Symbol"
-msgid "Restrooms"
-msgstr "Туалети"
+msgid "Bar"
+msgstr "Бар"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:259 ../share/symbols/symbols.h:260
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:232 ../share/symbols/symbols.h:233
msgctxt "Symbol"
-msgid "Sailing"
-msgstr "Парусний спорт"
+msgid "Shops"
+msgstr "Крамниці"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:261 ../share/symbols/symbols.h:262
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:234 ../share/symbols/symbols.h:235
msgctxt "Symbol"
-msgid "Sanitary Disposal Station"
-msgstr "Станція утилізації відходів"
+msgid "Barber Shop - Beauty Salon"
+msgstr "Перукарня і салон краси"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:263 ../share/symbols/symbols.h:264
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:236 ../share/symbols/symbols.h:237
msgctxt "Symbol"
-msgid "Scuba Diving"
-msgstr "Пірнання з аквалангом"
+msgid "Barber Shop"
+msgstr "Перукарня"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:265 ../share/symbols/symbols.h:266
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:238 ../share/symbols/symbols.h:239
msgctxt "Symbol"
-msgid "Self Guided Trail"
-msgstr "Стежка для самостійного огляду"
+msgid "Beauty Salon"
+msgstr "Салон краси"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:267 ../share/symbols/symbols.h:268
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:240 ../share/symbols/symbols.h:241
msgctxt "Symbol"
-msgid "Shelter"
-msgstr "Притулок"
+msgid "Ticket Purchase"
+msgstr "Придбання квитків"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:269 ../share/symbols/symbols.h:270
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:242 ../share/symbols/symbols.h:243
msgctxt "Symbol"
-msgid "Showers"
-msgstr "Душові"
+msgid "Baggage Check In"
+msgstr "Приймання багажу"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:271 ../share/symbols/symbols.h:272
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:244 ../share/symbols/symbols.h:245
msgctxt "Symbol"
-msgid "Sledding"
-msgstr "Катання на санях"
+msgid "Baggage Claim"
+msgstr "Видача багажу"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:273 ../share/symbols/symbols.h:274
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:246 ../share/symbols/symbols.h:247
msgctxt "Symbol"
-msgid "SnowmobileTrail"
-msgstr "Траса для снігоходів"
+msgid "Customs"
+msgstr "Митні послуги"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:275 ../share/symbols/symbols.h:276
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:248 ../share/symbols/symbols.h:249
msgctxt "Symbol"
-msgid "Stable"
-msgstr "Стайня"
+msgid "Immigration"
+msgstr "Міграційна служба"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:277 ../share/symbols/symbols.h:278
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:250 ../share/symbols/symbols.h:251
msgctxt "Symbol"
-msgid "Store"
-msgstr "Склад"
+msgid "Departing Flights"
+msgstr "Відправлення"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:279 ../share/symbols/symbols.h:280
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:252 ../share/symbols/symbols.h:253
msgctxt "Symbol"
-msgid "Swimming"
-msgstr "Плавання"
+msgid "Arriving Flights"
+msgstr "Прибуття"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:283 ../share/symbols/symbols.h:284
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:254 ../share/symbols/symbols.h:255
msgctxt "Symbol"
-msgid "Emergency Telephone"
-msgstr "Телефон виклику служб надзвичайних ситуацій"
+msgid "Smoking"
+msgstr "Місце для куріння"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:285 ../share/symbols/symbols.h:286
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:256 ../share/symbols/symbols.h:257
msgctxt "Symbol"
-msgid "Trailhead"
-msgstr "Початок маршруту"
+msgid "No Smoking"
+msgstr "Куріння заборонено"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:287 ../share/symbols/symbols.h:288
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:260 ../share/symbols/symbols.h:261
msgctxt "Symbol"
-msgid "Wheelchair Accessible"
-msgstr "Візок"
+msgid "No Parking"
+msgstr "Паркування заборонено"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:289 ../share/symbols/symbols.h:290
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:262 ../share/symbols/symbols.h:263
msgctxt "Symbol"
-msgid "Wind Surfing"
-msgstr "Віндсерфінг"
+msgid "No Dogs"
+msgstr "Вигулювання собак заборонено"
-#. Symbols: ./MapSymbolsNPS.svg
-#: ../share/symbols/symbols.h:291
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:264 ../share/symbols/symbols.h:265
msgctxt "Symbol"
-msgid "Blank"
-msgstr "Порожньо"
+msgid "No Entry"
+msgstr "Вхід заборонено"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:266 ../share/symbols/symbols.h:267
+msgctxt "Symbol"
+msgid "Exit"
+msgstr "Вихід"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:268 ../share/symbols/symbols.h:269
+msgctxt "Symbol"
+msgid "Fire Extinguisher"
+msgstr "Вогнегасник"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:270 ../share/symbols/symbols.h:271
+msgctxt "Symbol"
+msgid "Right Arrow"
+msgstr "Стрілка праворуч"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:272 ../share/symbols/symbols.h:273
+msgctxt "Symbol"
+msgid "Forward and Right Arrow"
+msgstr "Стрілка вперед і праворуч"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:274 ../share/symbols/symbols.h:275
+msgctxt "Symbol"
+msgid "Up Arrow"
+msgstr "Стрілка вгору"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:276 ../share/symbols/symbols.h:277
+msgctxt "Symbol"
+msgid "Forward and Left Arrow"
+msgstr "Стрілка вперед і ліворуч"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:278 ../share/symbols/symbols.h:279
+msgctxt "Symbol"
+msgid "Left Arrow"
+msgstr "Стрілка ліворуч"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:280 ../share/symbols/symbols.h:281
+msgctxt "Symbol"
+msgid "Left and Down Arrow"
+msgstr "Стрілка ліворуч і вниз"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:282 ../share/symbols/symbols.h:283
+msgctxt "Symbol"
+msgid "Down Arrow"
+msgstr "Стрілка вниз"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:284 ../share/symbols/symbols.h:285
+msgctxt "Symbol"
+msgid "Right and Down Arrow"
+msgstr "Стрілка праворуч і вниз"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:286 ../share/symbols/symbols.h:287
+msgctxt "Symbol"
+msgid "NPS Wheelchair Accessible - 1996"
+msgstr "Візок NPS — 1996"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:288 ../share/symbols/symbols.h:289
+msgctxt "Symbol"
+msgid "NPS Wheelchair Accessible"
+msgstr "Візок NPS"
+
+#. Symbols: ./AigaSymbols.svg
+#: ../share/symbols/symbols.h:290 ../share/symbols/symbols.h:291
+msgctxt "Symbol"
+msgid "New Wheelchair Accessible"
+msgstr "Новий візок"
#: ../share/templates/templates.h:1
msgid "CD Label 120mmx120mm "
@@ -4500,16 +4501,16 @@ msgstr "типографічне полотно з напрямними"
msgid "3D Box"
msgstr "Просторовий об'єкт"
-#: ../src/color-profile.cpp:842
+#: ../src/color-profile.cpp:856
#, c-format
msgid "Color profiles directory (%s) is unavailable."
msgstr "Каталог з профілями кольорів (%s) недоступний."
-#: ../src/color-profile.cpp:901 ../src/color-profile.cpp:918
+#: ../src/color-profile.cpp:928 ../src/color-profile.cpp:945
msgid "(invalid UTF-8 string)"
msgstr "(некоректний рядок UTF-8)"
-#: ../src/color-profile.cpp:903
+#: ../src/color-profile.cpp:930
msgctxt "Profile name"
msgid "None"
msgstr "Немає"
@@ -4917,21 +4918,21 @@ msgstr "Кратність проміжку між лініями сітки"
msgid " to "
msgstr " у "
-#: ../src/document.cpp:531
+#: ../src/document.cpp:526
#, c-format
msgid "New document %d"
msgstr "Новий документ %d"
-#: ../src/document.cpp:536
+#: ../src/document.cpp:531
#, c-format
msgid "Memory document %d"
msgstr "Документ у пам'яті %d"
-#: ../src/document.cpp:565
+#: ../src/document.cpp:560
msgid "Memory document %1"
msgstr "Документ у пам'яті %1"
-#: ../src/document.cpp:864
+#: ../src/document.cpp:859
#, c-format
msgid "Unnamed document %d"
msgstr "Документ без назви %d"
@@ -5087,7 +5088,7 @@ msgstr ""
"відвідайте сайт Inkscape або запитайте у списках листування, якщо у вас "
"виникли питання, що стосуються цього додатка."
-#: ../src/extension/implementation/script.cpp:1108
+#: ../src/extension/implementation/script.cpp:1111
msgid ""
"Inkscape has received additional data from the script executed. The script "
"did not return an error, but this may indicate the results will not be as "
@@ -5127,7 +5128,8 @@ msgstr "Адаптивна постеризація"
#: ../src/ui/widget/page-sizer.cpp:249
#: ../src/widgets/calligraphy-toolbar.cpp:430
#: ../src/widgets/eraser-toolbar.cpp:154 ../src/widgets/spray-toolbar.cpp:297
-#: ../src/widgets/tweak-toolbar.cpp:128 ../share/extensions/foldablebox.inx.h:2
+#: ../src/widgets/tweak-toolbar.cpp:128
+#: ../share/extensions/foldablebox.inx.h:2
msgid "Width:"
msgstr "Ширина:"
@@ -6590,13 +6592,15 @@ msgid "Transparency type:"
msgstr "Тип прозорості:"
#: ../src/extension/internal/filter/bumps.h:353
-#: ../src/extension/internal/filter/morphology.h:176 ../src/filter-enums.cpp:91
+#: ../src/extension/internal/filter/morphology.h:176
+#: ../src/filter-enums.cpp:91
msgid "Atop"
msgstr "Згори (Atop)"
#: ../src/extension/internal/filter/bumps.h:354
#: ../src/extension/internal/filter/distort.h:70
-#: ../src/extension/internal/filter/morphology.h:174 ../src/filter-enums.cpp:89
+#: ../src/extension/internal/filter/morphology.h:174
+#: ../src/filter-enums.cpp:89
msgid "In"
msgstr "Вхід"
@@ -7110,7 +7114,8 @@ msgid "Felt Feather"
msgstr "Фетрове розтушування"
#: ../src/extension/internal/filter/distort.h:71
-#: ../src/extension/internal/filter/morphology.h:175 ../src/filter-enums.cpp:90
+#: ../src/extension/internal/filter/morphology.h:175
+#: ../src/filter-enums.cpp:90
msgid "Out"
msgstr "Вихід"
@@ -7306,11 +7311,13 @@ msgstr "Приховати зображення"
msgid "Composite type:"
msgstr "Тип суміщення:"
-#: ../src/extension/internal/filter/morphology.h:173 ../src/filter-enums.cpp:88
+#: ../src/extension/internal/filter/morphology.h:173
+#: ../src/filter-enums.cpp:88
msgid "Over"
msgstr "Накладання"
-#: ../src/extension/internal/filter/morphology.h:177 ../src/filter-enums.cpp:92
+#: ../src/extension/internal/filter/morphology.h:177
+#: ../src/filter-enums.cpp:92
msgid "XOR"
msgstr "Виключне АБО (XOR)"
@@ -7384,8 +7391,8 @@ msgstr "Заливання шумом"
#: ../src/ui/dialog/tracedialog.cpp:747
#: ../share/extensions/color_HSL_adjust.inx.h:2
#: ../share/extensions/color_custom.inx.h:2
-#: ../share/extensions/color_randomize.inx.h:2 ../share/extensions/dots.inx.h:2
-#: ../share/extensions/dxf_input.inx.h:2
+#: ../share/extensions/color_randomize.inx.h:2
+#: ../share/extensions/dots.inx.h:2 ../share/extensions/dxf_input.inx.h:2
#: ../share/extensions/dxf_outlines.inx.h:2
#: ../share/extensions/gcodetools_area.inx.h:29
#: ../share/extensions/gcodetools_engraving.inx.h:7
@@ -7988,13 +7995,15 @@ msgstr "Вертикальний зсув:"
#: ../src/extension/internal/grid.cpp:209
#: ../src/ui/dialog/inkscape-preferences.cpp:1532
#: ../share/extensions/draw_from_triangle.inx.h:58
-#: ../share/extensions/eqtexsvg.inx.h:4 ../share/extensions/foldablebox.inx.h:9
+#: ../share/extensions/eqtexsvg.inx.h:4
+#: ../share/extensions/foldablebox.inx.h:9
#: ../share/extensions/funcplot.inx.h:38
#: ../share/extensions/grid_cartesian.inx.h:23
#: ../share/extensions/grid_isometric.inx.h:11
#: ../share/extensions/grid_polar.inx.h:22
#: ../share/extensions/guides_creator.inx.h:25
-#: ../share/extensions/hershey.inx.h:52 ../share/extensions/layout_nup.inx.h:35
+#: ../share/extensions/hershey.inx.h:52
+#: ../share/extensions/layout_nup.inx.h:35
#: ../share/extensions/lindenmayer.inx.h:34
#: ../share/extensions/nicechart.inx.h:45
#: ../share/extensions/param_curves.inx.h:30
@@ -8354,7 +8363,8 @@ msgid "Map all fill patterns to standard WMF hatches"
msgstr "Пов’язати усі заповнення візерунками зі стандартними шаблонами WMF"
#: ../src/extension/internal/wmf-inout.cpp:3208
-#: ../share/extensions/wmf_input.inx.h:2 ../share/extensions/wmf_output.inx.h:2
+#: ../share/extensions/wmf_input.inx.h:2
+#: ../share/extensions/wmf_output.inx.h:2
msgid "Windows Metafile (*.wmf)"
msgstr "Метафайл Windows (*.wmf)"
@@ -8390,42 +8400,42 @@ msgstr "Не вдається визначити формат файла. Фай
msgid "default.svg"
msgstr "типовий.svg"
-#: ../src/file.cpp:332
+#: ../src/file.cpp:338
msgid "Broken links have been changed to point to existing files."
msgstr "Помилкові посилання змінено так, щоб вони вказували на поточні файли."
-#: ../src/file.cpp:343 ../src/file.cpp:1278
+#: ../src/file.cpp:349 ../src/file.cpp:1292
#, c-format
msgid "Failed to load the requested file %s"
msgstr "Не вдається завантажити потрібний файл %s"
-#: ../src/file.cpp:369
+#: ../src/file.cpp:375
msgid "Document not saved yet. Cannot revert."
msgstr ""
"Документ ще не був збережений. Неможливо повернутись до попереднього стану."
-#: ../src/file.cpp:375
+#: ../src/file.cpp:381
msgid "Changes will be lost! Are you sure you want to reload document %1?"
msgstr ""
"Зміни буде втрачено! Ви впевнені, що бажаєте перезавантажити документ %1?"
-#: ../src/file.cpp:401
+#: ../src/file.cpp:407
msgid "Document reverted."
msgstr "Документ повернутий до попереднього стану."
-#: ../src/file.cpp:403
+#: ../src/file.cpp:409
msgid "Document not reverted."
msgstr "Документ не повернутий до попереднього стану."
-#: ../src/file.cpp:553
+#: ../src/file.cpp:559
msgid "Select file to open"
msgstr "Виберіть файл"
-#: ../src/file.cpp:635
+#: ../src/file.cpp:641
msgid "Clean up document"
msgstr "Очистити документ"
-#: ../src/file.cpp:642
+#: ../src/file.cpp:648
#, c-format
msgid "Removed <b>%i</b> unused definition in &lt;defs&gt;."
msgid_plural "Removed <b>%i</b> unused definitions in &lt;defs&gt;."
@@ -8433,11 +8443,11 @@ msgstr[0] "Вилучено <b>%i</b> непотрібний елемент у &
msgstr[1] "Вилучено <b>%i</b> непотрібні елементи у &lt;defs&gt;."
msgstr[2] "Вилучено <b>%i</b> непотрібних елементів у &lt;defs&gt;."
-#: ../src/file.cpp:647
+#: ../src/file.cpp:653
msgid "No unused definitions in &lt;defs&gt;."
msgstr "Немає непотрібних елементів у &lt;defs&gt;."
-#: ../src/file.cpp:679
+#: ../src/file.cpp:687
#, c-format
msgid ""
"No Inkscape extension found to save document (%s). This may have been "
@@ -8446,12 +8456,12 @@ msgstr ""
"Не знайдено модуль збереження документа (%s). Можливо, невідомий суфікс "
"назви файла."
-#: ../src/file.cpp:680 ../src/file.cpp:688 ../src/file.cpp:696
-#: ../src/file.cpp:702 ../src/file.cpp:707
+#: ../src/file.cpp:688 ../src/file.cpp:698 ../src/file.cpp:707
+#: ../src/file.cpp:714 ../src/file.cpp:720
msgid "Document not saved."
msgstr "Документ не збережено."
-#: ../src/file.cpp:687
+#: ../src/file.cpp:697
#, c-format
msgid ""
"File %s is write protected. Please remove write protection and try again."
@@ -8459,54 +8469,54 @@ msgstr ""
"Файл %s захищено від запису. Будь ласка, зніміть захист від запису і "
"повторіть спробу."
-#: ../src/file.cpp:695
+#: ../src/file.cpp:706
#, c-format
msgid "File %s could not be saved."
msgstr "Файл %s неможливо зберегти."
-#: ../src/file.cpp:725 ../src/file.cpp:727
+#: ../src/file.cpp:739 ../src/file.cpp:741
msgid "Document saved."
msgstr "Документ збережено."
#. We are saving for the first time; create a unique default filename
-#: ../src/file.cpp:870 ../src/file.cpp:1437
+#: ../src/file.cpp:884 ../src/file.cpp:1451
msgid "drawing"
msgstr "рисунок"
-#: ../src/file.cpp:875
+#: ../src/file.cpp:889
msgid "drawing-%1"
msgstr "рисунок-%1"
-#: ../src/file.cpp:892
+#: ../src/file.cpp:906
msgid "Select file to save a copy to"
msgstr "Оберіть файл для збереження копії"
-#: ../src/file.cpp:894
+#: ../src/file.cpp:908
msgid "Select file to save to"
msgstr "Виберіть файл для збереження"
-#: ../src/file.cpp:999 ../src/file.cpp:1001
+#: ../src/file.cpp:1013 ../src/file.cpp:1015
msgid "No changes need to be saved."
msgstr "Файл не було змінено. Збереження непотрібне."
-#: ../src/file.cpp:1020
+#: ../src/file.cpp:1034
msgid "Saving document..."
msgstr "Збереження документа…"
-#: ../src/file.cpp:1275 ../src/ui/dialog/inkscape-preferences.cpp:1505
+#: ../src/file.cpp:1289 ../src/ui/dialog/inkscape-preferences.cpp:1505
#: ../src/ui/dialog/ocaldialogs.cpp:1244
msgid "Import"
msgstr "Імпорт"
-#: ../src/file.cpp:1325
+#: ../src/file.cpp:1339
msgid "Select file to import"
msgstr "Виберіть файл для імпорту"
-#: ../src/file.cpp:1458
+#: ../src/file.cpp:1472
msgid "Select file to export to"
msgstr "Оберіть файл для експорту"
-#: ../src/file.cpp:1711
+#: ../src/file.cpp:1725
msgid "Import Clip Art"
msgstr "Імпортування шаблонів"
@@ -8627,7 +8637,8 @@ msgstr "Обертання відтінку"
msgid "Luminance to Alpha"
msgstr "Освітленість до прозорості"
-#: ../src/filter-enums.cpp:87 ../share/extensions/jessyInk_mouseHandler.inx.h:3
+#: ../src/filter-enums.cpp:87
+#: ../share/extensions/jessyInk_mouseHandler.inx.h:3
#: ../share/extensions/jessyInk_transitions.inx.h:7
#: ../share/extensions/measure.inx.h:20 ../share/extensions/nicechart.inx.h:33
msgid "Default"
@@ -8944,7 +8955,8 @@ msgstr "Згорнути цю панель"
msgid "Close this dock"
msgstr "Закрити цю панель"
-#: ../src/libgdl/gdl-dock-item-grip.c:723 ../src/libgdl/gdl-dock-tablabel.c:125
+#: ../src/libgdl/gdl-dock-item-grip.c:723
+#: ../src/libgdl/gdl-dock-tablabel.c:125
msgid "Controlling dock item"
msgstr "Контролюючий елемент панелі"
@@ -9114,7 +9126,8 @@ msgstr "Індекс поточної сторінки"
#: ../src/libgdl/gdl-dock-object.c:125
#: ../src/live_effects/parameter/originalpatharray.cpp:82
#: ../src/ui/dialog/inkscape-preferences.cpp:1566
-#: ../src/ui/widget/page-sizer.cpp:285 ../src/widgets/gradient-selector.cpp:150
+#: ../src/ui/widget/page-sizer.cpp:285
+#: ../src/widgets/gradient-selector.cpp:150
#: ../src/widgets/sp-xmlview-attr-list.cpp:49
msgid "Name"
msgstr "Назва"
@@ -9542,12 +9555,12 @@ msgstr ""
"Будь ласка, вкажіть параметр контуру для геометричних побудов «%s» за "
"допомогою %d клацань мишею"
-#: ../src/live_effects/effect.cpp:765
+#: ../src/live_effects/effect.cpp:766
#, c-format
msgid "Editing parameter <b>%s</b>."
msgstr "Редагування параметра <b>%s</b>."
-#: ../src/live_effects/effect.cpp:770
+#: ../src/live_effects/effect.cpp:771
msgid "None of the applied path effect's parameters can be edited on-canvas."
msgstr ""
"Жоден із застосованих параметрів ефекту контуру не можна редагувати на "
@@ -11099,13 +11112,13 @@ msgstr "Немає"
#: ../src/live_effects/lpe-ruler.cpp:33
#: ../src/live_effects/lpe-transform_2pts.cpp:37
-#: ../src/ui/tools/measure-tool.cpp:756 ../src/widgets/arc-toolbar.cpp:319
+#: ../src/ui/tools/measure-tool.cpp:755 ../src/widgets/arc-toolbar.cpp:319
msgid "Start"
msgstr "Початок"
#: ../src/live_effects/lpe-ruler.cpp:34
#: ../src/live_effects/lpe-transform_2pts.cpp:38
-#: ../src/ui/tools/measure-tool.cpp:757 ../src/widgets/arc-toolbar.cpp:332
+#: ../src/ui/tools/measure-tool.cpp:756 ../src/widgets/arc-toolbar.cpp:332
msgid "End"
msgstr "Кінець"
@@ -11117,7 +11130,8 @@ msgstr "Ві_дстань між позначками:"
msgid "Distance between successive ruler marks"
msgstr "Відстань між послідовними позначками на лінійці"
-#: ../src/live_effects/lpe-ruler.cpp:42 ../share/extensions/foldablebox.inx.h:7
+#: ../src/live_effects/lpe-ruler.cpp:42
+#: ../share/extensions/foldablebox.inx.h:7
#: ../share/extensions/interp_att_g.inx.h:9
#: ../share/extensions/layout_nup.inx.h:3
#: ../share/extensions/printing_marks.inx.h:11
@@ -11642,7 +11656,7 @@ msgstr "Обернути"
#: ../src/live_effects/parameter/originalpatharray.cpp:130
#: ../src/live_effects/parameter/originalpatharray.cpp:315
-#: ../src/live_effects/parameter/path.cpp:486
+#: ../src/live_effects/parameter/path.cpp:510
msgid "Link path parameter to path"
msgstr "Пов'язати параметр контуру з контуром"
@@ -11672,23 +11686,23 @@ msgstr "Пересунути контур нижче"
msgid "Remove path"
msgstr "Вилучити контур"
-#: ../src/live_effects/parameter/path.cpp:170
+#: ../src/live_effects/parameter/path.cpp:184
msgid "Edit on-canvas"
msgstr "Редагувати на полотні"
-#: ../src/live_effects/parameter/path.cpp:180
+#: ../src/live_effects/parameter/path.cpp:194
msgid "Copy path"
msgstr "Копіювати контур"
-#: ../src/live_effects/parameter/path.cpp:190
+#: ../src/live_effects/parameter/path.cpp:204
msgid "Paste path"
msgstr "Вставити контур"
-#: ../src/live_effects/parameter/path.cpp:200
+#: ../src/live_effects/parameter/path.cpp:214
msgid "Link to path on clipboard"
msgstr "Пов’язати з контуром у буфері обміну"
-#: ../src/live_effects/parameter/path.cpp:454
+#: ../src/live_effects/parameter/path.cpp:478
msgid "Paste path parameter"
msgstr "Вставити параметр контуру"
@@ -12493,7 +12507,8 @@ msgstr "<b>Нічого</b> не було вилучено."
#: ../src/widgets/eraser-toolbar.cpp:120
#: ../src/widgets/gradient-toolbar.cpp:1181
#: ../src/widgets/gradient-toolbar.cpp:1195
-#: ../src/widgets/gradient-toolbar.cpp:1209 ../src/widgets/node-toolbar.cpp:401
+#: ../src/widgets/gradient-toolbar.cpp:1209
+#: ../src/widgets/node-toolbar.cpp:401
msgid "Delete"
msgstr "Вилучити"
@@ -13180,20 +13195,20 @@ msgstr[0] "(%d символ%s)"
msgstr[1] "(%d символи%s)"
msgstr[2] "(%d символів%s)"
-#: ../src/sp-guide.cpp:261
+#: ../src/sp-guide.cpp:262
msgid "Create Guides Around the Page"
msgstr "Створити напрямні навколо сторінки"
-#: ../src/sp-guide.cpp:274 ../src/verbs.cpp:2544
+#: ../src/sp-guide.cpp:275 ../src/verbs.cpp:2544
msgid "Delete All Guides"
msgstr "Вилучити всі напрямні"
#. Guide has probably been deleted and no longer has an attached namedview.
-#: ../src/sp-guide.cpp:485
+#: ../src/sp-guide.cpp:486
msgid "Deleted"
msgstr "Вилучено"
-#: ../src/sp-guide.cpp:494
+#: ../src/sp-guide.cpp:495
msgid ""
"<b>Shift+drag</b> to rotate, <b>Ctrl+drag</b> to move origin, <b>Del</b> to "
"delete"
@@ -13201,17 +13216,17 @@ msgstr ""
"<b>Shift+Перетягування</b> починає обертання. <b>Ctrl+Перетягування</b> "
"пересуває центр обертання. <b>Del</b> вилучає."
-#: ../src/sp-guide.cpp:498
+#: ../src/sp-guide.cpp:499
#, c-format
msgid "vertical, at %s"
msgstr "вертикальна, на %s"
-#: ../src/sp-guide.cpp:501
+#: ../src/sp-guide.cpp:502
#, c-format
msgid "horizontal, at %s"
msgstr "горизонтальна, на %s"
-#: ../src/sp-guide.cpp:506
+#: ../src/sp-guide.cpp:507
#, c-format
msgid "at %d degrees, through (%s,%s)"
msgstr "на %d градусів, через (%s,%s)"
@@ -13244,26 +13259,26 @@ msgstr "з <b>%d</b> об'єкта"
msgid "of <b>%d</b> objects"
msgstr "з <b>%d</b> об'єкта"
-#: ../src/sp-item.cpp:1031 ../src/verbs.cpp:213
+#: ../src/sp-item.cpp:1030 ../src/verbs.cpp:213
msgid "Object"
msgstr "Об'єкт"
-#: ../src/sp-item.cpp:1043
+#: ../src/sp-item.cpp:1042
#, c-format
msgid "%s; <i>clipped</i>"
msgstr "%s; <i>закріплено</i>"
-#: ../src/sp-item.cpp:1049
+#: ../src/sp-item.cpp:1048
#, c-format
msgid "%s; <i>masked</i>"
msgstr "%s; <i>масковано</i>"
-#: ../src/sp-item.cpp:1059
+#: ../src/sp-item.cpp:1058
#, c-format
msgid "%s; <i>filtered (%s)</i>"
msgstr "%s; <i>відфільтровано (%s)</i>"
-#: ../src/sp-item.cpp:1061
+#: ../src/sp-item.cpp:1060
#, c-format
msgid "%s; <i>filtered</i>"
msgstr "%s; <i>відфільтровано</i>"
@@ -13372,8 +13387,8 @@ msgstr "Умовна група"
#: ../src/sp-text.cpp:361 ../src/verbs.cpp:347
#: ../share/extensions/lorem_ipsum.inx.h:8
-#: ../share/extensions/replace_font.inx.h:11 ../share/extensions/split.inx.h:10
-#: ../share/extensions/text_braille.inx.h:2
+#: ../share/extensions/replace_font.inx.h:11
+#: ../share/extensions/split.inx.h:10 ../share/extensions/text_braille.inx.h:2
#: ../share/extensions/text_extract.inx.h:14
#: ../share/extensions/text_flipcase.inx.h:2
#: ../share/extensions/text_lowercase.inx.h:2
@@ -14841,12 +14856,12 @@ msgid "License"
msgstr "Ліцензія"
#: ../src/ui/dialog/document-metadata.cpp:126
-#: ../src/ui/dialog/document-properties.cpp:994
+#: ../src/ui/dialog/document-properties.cpp:1037
msgid "<b>Dublin Core Entities</b>"
msgstr "<b>Пункти Dublin Core</b>"
#: ../src/ui/dialog/document-metadata.cpp:168
-#: ../src/ui/dialog/document-properties.cpp:1056
+#: ../src/ui/dialog/document-properties.cpp:1099
msgid "<b>License</b>"
msgstr "<b>Ліцензія</b>"
@@ -15099,7 +15114,8 @@ msgstr "Ви_лучити"
msgid "Remove selected grid."
msgstr "Вилучити вибрану сітку."
-#: ../src/ui/dialog/document-properties.cpp:162 ../src/widgets/toolbox.cpp:1903
+#: ../src/ui/dialog/document-properties.cpp:162
+#: ../src/widgets/toolbox.cpp:1903
msgid "Guides"
msgstr "Напрямні"
@@ -15155,136 +15171,136 @@ msgstr "<b>Інше</b>"
#. Inkscape::GC::release(defsRepr);
#. inform the document, so we can undo
#. Color Management
-#: ../src/ui/dialog/document-properties.cpp:526 ../src/verbs.cpp:3020
+#: ../src/ui/dialog/document-properties.cpp:542 ../src/verbs.cpp:3020
msgid "Link Color Profile"
msgstr "Пов'язати профіль кольорів"
-#: ../src/ui/dialog/document-properties.cpp:623
+#: ../src/ui/dialog/document-properties.cpp:654
msgid "Remove linked color profile"
msgstr "Вилучити пов'язаний профіль кольорів"
-#: ../src/ui/dialog/document-properties.cpp:636
+#: ../src/ui/dialog/document-properties.cpp:673
msgid "<b>Linked Color Profiles:</b>"
msgstr "<b>Пов'язані профілі кольорів:</b>"
-#: ../src/ui/dialog/document-properties.cpp:638
+#: ../src/ui/dialog/document-properties.cpp:675
msgid "<b>Available Color Profiles:</b>"
msgstr "<b>Доступні профілі кольорів:</b>"
-#: ../src/ui/dialog/document-properties.cpp:640
+#: ../src/ui/dialog/document-properties.cpp:677
msgid "Link Profile"
msgstr "Пов'язати з профілем"
-#: ../src/ui/dialog/document-properties.cpp:643
+#: ../src/ui/dialog/document-properties.cpp:680
msgid "Unlink Profile"
msgstr "Від'єднати від профілю"
-#: ../src/ui/dialog/document-properties.cpp:721
+#: ../src/ui/dialog/document-properties.cpp:764
msgid "Profile Name"
msgstr "Назва профілю"
-#: ../src/ui/dialog/document-properties.cpp:757
+#: ../src/ui/dialog/document-properties.cpp:800
msgid "External scripts"
msgstr "Зовнішні скрипти"
-#: ../src/ui/dialog/document-properties.cpp:758
+#: ../src/ui/dialog/document-properties.cpp:801
msgid "Embedded scripts"
msgstr "Вбудовані скрипти"
-#: ../src/ui/dialog/document-properties.cpp:763
+#: ../src/ui/dialog/document-properties.cpp:806
msgid "<b>External script files:</b>"
msgstr "<b>Файли зовнішніх скриптів:</b>"
-#: ../src/ui/dialog/document-properties.cpp:765
+#: ../src/ui/dialog/document-properties.cpp:808
msgid "Add the current file name or browse for a file"
msgstr "Додайте назву поточного файла або вкажіть якийсь файл"
-#: ../src/ui/dialog/document-properties.cpp:768
-#: ../src/ui/dialog/document-properties.cpp:845
+#: ../src/ui/dialog/document-properties.cpp:811
+#: ../src/ui/dialog/document-properties.cpp:888
#: ../src/ui/widget/selected-style.cpp:357
msgid "Remove"
msgstr "Вилучити"
-#: ../src/ui/dialog/document-properties.cpp:832
+#: ../src/ui/dialog/document-properties.cpp:875
msgid "Filename"
msgstr "Назва файла"
-#: ../src/ui/dialog/document-properties.cpp:840
+#: ../src/ui/dialog/document-properties.cpp:883
msgid "<b>Embedded script files:</b>"
msgstr "<b>Файли вбудованих скриптів:</b>"
-#: ../src/ui/dialog/document-properties.cpp:842
+#: ../src/ui/dialog/document-properties.cpp:885
#: ../src/ui/dialog/objects.cpp:1894
msgid "New"
msgstr "Створити"
-#: ../src/ui/dialog/document-properties.cpp:909
+#: ../src/ui/dialog/document-properties.cpp:952
msgid "Script id"
msgstr "Ід. скрипту"
-#: ../src/ui/dialog/document-properties.cpp:915
+#: ../src/ui/dialog/document-properties.cpp:958
msgid "<b>Content:</b>"
msgstr "<b>Вміст:</b>"
-#: ../src/ui/dialog/document-properties.cpp:1032
+#: ../src/ui/dialog/document-properties.cpp:1075
msgid "_Save as default"
msgstr "З_берегти як типові"
-#: ../src/ui/dialog/document-properties.cpp:1033
+#: ../src/ui/dialog/document-properties.cpp:1076
msgid "Save this metadata as the default metadata"
msgstr "Зберегти ці метадані як типові метадані"
-#: ../src/ui/dialog/document-properties.cpp:1034
+#: ../src/ui/dialog/document-properties.cpp:1077
msgid "Use _default"
msgstr "Використовувати _типові"
-#: ../src/ui/dialog/document-properties.cpp:1035
+#: ../src/ui/dialog/document-properties.cpp:1078
msgid "Use the previously saved default metadata here"
msgstr "Скористатися тут раніше збереженими типовими метаданими"
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1108
+#: ../src/ui/dialog/document-properties.cpp:1151
msgid "Add external script..."
msgstr "Додати зовнішній скрипт…"
-#: ../src/ui/dialog/document-properties.cpp:1147
+#: ../src/ui/dialog/document-properties.cpp:1190
msgid "Select a script to load"
msgstr "Виберіть скрипт для завантаження"
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1175
+#: ../src/ui/dialog/document-properties.cpp:1218
msgid "Add embedded script..."
msgstr "Додати вбудований скрипт…"
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1206
+#: ../src/ui/dialog/document-properties.cpp:1249
msgid "Remove external script"
msgstr "Вилучити зовнішній скрипт"
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1235
+#: ../src/ui/dialog/document-properties.cpp:1278
msgid "Remove embedded script"
msgstr "Вилучити вбудований скрипт"
#. TODO repr->set_content(_EmbeddedContent.get_buffer()->get_text());
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1331
+#: ../src/ui/dialog/document-properties.cpp:1374
msgid "Edit embedded script"
msgstr "Редагувати вбудований скрипт"
-#: ../src/ui/dialog/document-properties.cpp:1415
+#: ../src/ui/dialog/document-properties.cpp:1458
msgid "<b>Creation</b>"
msgstr "<b>Створення</b>"
-#: ../src/ui/dialog/document-properties.cpp:1416
+#: ../src/ui/dialog/document-properties.cpp:1459
msgid "<b>Defined grids</b>"
msgstr "<b>Визначені сітки</b>"
-#: ../src/ui/dialog/document-properties.cpp:1660
+#: ../src/ui/dialog/document-properties.cpp:1703
msgid "Remove grid"
msgstr "Вилучити сітку"
-#: ../src/ui/dialog/document-properties.cpp:1752
+#: ../src/ui/dialog/document-properties.cpp:1795
msgid "Changed default display unit"
msgstr "Змінено типову одиницю виміру"
@@ -15539,7 +15555,8 @@ msgstr "Інформація"
#: ../share/extensions/jitternodes.inx.h:12
#: ../share/extensions/layout_nup.inx.h:24
#: ../share/extensions/lindenmayer.inx.h:13
-#: ../share/extensions/lorem_ipsum.inx.h:6 ../share/extensions/measure.inx.h:33
+#: ../share/extensions/lorem_ipsum.inx.h:6
+#: ../share/extensions/measure.inx.h:33
#: ../share/extensions/pathalongpath.inx.h:16
#: ../share/extensions/pathscatter.inx.h:18
#: ../share/extensions/restack.inx.h:25 ../share/extensions/split.inx.h:8
@@ -19518,7 +19535,7 @@ msgstr "Зберігати канал K під час перетворень CMY
#: ../src/ui/dialog/inkscape-preferences.cpp:1091
#: ../src/ui/widget/color-icc-selector.cpp:394
-#: ../src/ui/widget/color-icc-selector.cpp:685
+#: ../src/ui/widget/color-icc-selector.cpp:699
msgid "<none>"
msgstr "<немає>"
@@ -20778,7 +20795,8 @@ msgstr "Нахил за X"
msgid "Y tilt"
msgstr "Нахил за Y"
-#: ../src/ui/dialog/input.cpp:1616 ../src/ui/widget/color-wheel-selector.cpp:29
+#: ../src/ui/dialog/input.cpp:1616
+#: ../src/ui/widget/color-wheel-selector.cpp:29
msgid "Wheel"
msgstr "Колесо"
@@ -21585,15 +21603,18 @@ msgstr "Алгоритм Копфа-Ліщинського"
msgid "Output"
msgstr "Вивід"
-#: ../src/ui/dialog/pixelartdialog.cpp:297 ../src/ui/dialog/tracedialog.cpp:814
+#: ../src/ui/dialog/pixelartdialog.cpp:297
+#: ../src/ui/dialog/tracedialog.cpp:814
msgid "Reset all settings to defaults"
msgstr "Скинути значення всіх параметрів до типових"
-#: ../src/ui/dialog/pixelartdialog.cpp:302 ../src/ui/dialog/tracedialog.cpp:819
+#: ../src/ui/dialog/pixelartdialog.cpp:302
+#: ../src/ui/dialog/tracedialog.cpp:819
msgid "Abort a trace in progress"
msgstr "Перервати векторизацію"
-#: ../src/ui/dialog/pixelartdialog.cpp:306 ../src/ui/dialog/tracedialog.cpp:823
+#: ../src/ui/dialog/pixelartdialog.cpp:306
+#: ../src/ui/dialog/tracedialog.cpp:823
msgid "Execute the trace"
msgstr "Провести векторизацію"
@@ -21964,7 +21985,8 @@ msgid "Preview Text:"
msgstr "Перегляд тексту:"
#: ../src/ui/dialog/swatches.cpp:202 ../src/ui/tools/gradient-tool.cpp:360
-#: ../src/ui/tools/gradient-tool.cpp:458 ../src/widgets/gradient-vector.cpp:801
+#: ../src/ui/tools/gradient-tool.cpp:458
+#: ../src/widgets/gradient-vector.cpp:801
msgid "Add gradient stop"
msgstr "Додавання опорної точки градієнта"
@@ -23245,12 +23267,11 @@ msgstr ""
"елементи керування"
#: ../src/ui/tool/node.cpp:529
-#, fuzzy
msgctxt "Path handle tip"
msgid "<b>Ctrl</b>: Snap handle to steps defined in BSpline Live Path Effect"
msgstr ""
-"<b>Ctrl</b>: пересунути вус за його справжніми кроками у інтерактивному "
-"ефекті B-сплайнів"
+"<b>Ctrl</b>: приліпити елемент керування за кроками, визначеним у "
+"інтерактивному ефекті B-сплайнів"
#: ../src/ui/tool/node.cpp:532
#, c-format
@@ -23398,7 +23419,8 @@ msgid "Rotate handle"
msgstr "Обертати вус"
#. We need to call MPM's method because it could have been our last node
-#: ../src/ui/tool/path-manipulator.cpp:1555 ../src/widgets/node-toolbar.cpp:397
+#: ../src/ui/tool/path-manipulator.cpp:1555
+#: ../src/widgets/node-toolbar.cpp:397
msgid "Delete node"
msgstr "Вилучити вузол"
@@ -24058,31 +24080,31 @@ msgstr "Початкова точка вимірювання, <b>Shift+клац
msgid "Measure end, <b>Shift+Click</b> for position dialog"
msgstr "Кінцева точка вимірювання, <b>Shift+клацання</b> — вікно позиції"
-#: ../src/ui/tools/measure-tool.cpp:747 ../share/extensions/measure.inx.h:2
+#: ../src/ui/tools/measure-tool.cpp:746 ../share/extensions/measure.inx.h:2
msgid "Measure"
msgstr "Міра"
-#: ../src/ui/tools/measure-tool.cpp:752
+#: ../src/ui/tools/measure-tool.cpp:751
msgid "Base"
msgstr "Основа"
-#: ../src/ui/tools/measure-tool.cpp:761
+#: ../src/ui/tools/measure-tool.cpp:760
msgid "Add guides from measure tool"
msgstr "Додати напрямні з інструмента вимірювання"
-#: ../src/ui/tools/measure-tool.cpp:781
-msgid "Add Stored to measure tool"
-msgstr "Додати збережене до інструмента вимірювання"
+#: ../src/ui/tools/measure-tool.cpp:780
+msgid "Keep last measure on the canvas, for reference"
+msgstr "Зберігати останнє вимірювання на полотні для порівняння"
-#: ../src/ui/tools/measure-tool.cpp:801
+#: ../src/ui/tools/measure-tool.cpp:800
msgid "Convert measure to items"
msgstr "Перетворити вимірювання на об’єкти"
-#: ../src/ui/tools/measure-tool.cpp:839
+#: ../src/ui/tools/measure-tool.cpp:838
msgid "Add global measure line"
msgstr "Додати загальну лінію вимірювання"
-#: ../src/ui/tools/measure-tool.cpp:1290 ../src/ui/tools/measure-tool.cpp:1292
+#: ../src/ui/tools/measure-tool.cpp:1289 ../src/ui/tools/measure-tool.cpp:1291
#, c-format
msgid "Crossing %lu"
msgstr "Перетин %lu"
@@ -24721,7 +24743,7 @@ msgstr[2] ""
msgid "Type text"
msgstr "Друк тексту"
-#: ../src/ui/tools/tool-base.cpp:700
+#: ../src/ui/tools/tool-base.cpp:705
msgid "<b>Space+mouse move</b> to pan canvas"
msgstr "<b>Пробіл+пересування миші</b> для переміщення полотна"
@@ -29262,27 +29284,33 @@ msgstr "радіальний"
msgid "Create radial (elliptic or circular) gradient"
msgstr "Створити радіальний (еліптичний чи круговий) градієнт"
-#: ../src/widgets/gradient-toolbar.cpp:1044 ../src/widgets/mesh-toolbar.cpp:387
+#: ../src/widgets/gradient-toolbar.cpp:1044
+#: ../src/widgets/mesh-toolbar.cpp:387
msgid "New:"
msgstr "Створити:"
-#: ../src/widgets/gradient-toolbar.cpp:1067 ../src/widgets/mesh-toolbar.cpp:410
+#: ../src/widgets/gradient-toolbar.cpp:1067
+#: ../src/widgets/mesh-toolbar.cpp:410
msgid "fill"
msgstr "заповнення"
-#: ../src/widgets/gradient-toolbar.cpp:1067 ../src/widgets/mesh-toolbar.cpp:410
+#: ../src/widgets/gradient-toolbar.cpp:1067
+#: ../src/widgets/mesh-toolbar.cpp:410
msgid "Create gradient in the fill"
msgstr "Створити градієнт у заповненні"
-#: ../src/widgets/gradient-toolbar.cpp:1071 ../src/widgets/mesh-toolbar.cpp:414
+#: ../src/widgets/gradient-toolbar.cpp:1071
+#: ../src/widgets/mesh-toolbar.cpp:414
msgid "stroke"
msgstr "штрих"
-#: ../src/widgets/gradient-toolbar.cpp:1071 ../src/widgets/mesh-toolbar.cpp:414
+#: ../src/widgets/gradient-toolbar.cpp:1071
+#: ../src/widgets/mesh-toolbar.cpp:414
msgid "Create gradient in the stroke"
msgstr "Створити градієнт у штриху"
-#: ../src/widgets/gradient-toolbar.cpp:1074 ../src/widgets/mesh-toolbar.cpp:417
+#: ../src/widgets/gradient-toolbar.cpp:1074
+#: ../src/widgets/mesh-toolbar.cpp:417
msgid "on:"
msgstr "на:"
@@ -29381,7 +29409,8 @@ msgstr "Зв'язати градієнти"
msgid "Link gradients to change all related gradients"
msgstr "Зв'язати градієнти, щоб вони змінювалися у всіх пов'язаних градієнтів"
-#: ../src/widgets/gradient-vector.cpp:317 ../src/widgets/paint-selector.cpp:965
+#: ../src/widgets/gradient-vector.cpp:317
+#: ../src/widgets/paint-selector.cpp:965
#: ../src/widgets/stroke-marker-selector.cpp:154
msgid "No document selected"
msgstr "Документ не вибрано"
@@ -31790,7 +31819,7 @@ msgstr ""
#: ../share/extensions/convert2dashes.py:56
msgid "Total number of objects not converted: {}\n"
-msgstr ""
+msgstr "Загальна кількість неперетворених об’єктів: {}\n"
#: ../share/extensions/dimension.py:108
msgid "Please select an object."
@@ -32531,7 +32560,8 @@ msgid "Area is zero, cannot calculate Center of Mass"
msgstr "Площа дорівнює нулю. Визначення центра мас позбавлене сенсу."
#: ../share/extensions/pathalongpath.py:207
-#: ../share/extensions/pathscatter.py:226 ../share/extensions/perspective.py:50
+#: ../share/extensions/pathscatter.py:226
+#: ../share/extensions/perspective.py:50
msgid "This extension requires two selected paths."
msgstr "Для роботи цього додатка потрібно вибрати два контури."
@@ -32569,7 +32599,8 @@ msgstr ""
"системах, заснованих на Debian, цю операцію можна виконати командою sudo apt-"
"get install python-numpy."
-#: ../share/extensions/perspective.py:58 ../share/extensions/summersnight.py:49
+#: ../share/extensions/perspective.py:58
+#: ../share/extensions/summersnight.py:49
#, python-format
msgid ""
"The first selected object is of type '%s'.\n"
@@ -32578,14 +32609,16 @@ msgstr ""
"Перший вибраний об'єкт належить до типу «%s».\n"
"Спробуйте скористатися пунктом меню Контур -> Об'єкт у контур."
-#: ../share/extensions/perspective.py:65 ../share/extensions/summersnight.py:57
+#: ../share/extensions/perspective.py:65
+#: ../share/extensions/summersnight.py:57
msgid ""
"This extension requires that the second selected path be four nodes long."
msgstr ""
"Для роботи цього додатка потрібно, щоб другий вибраний контур складався "
"принаймні з чотирьох вузлів."
-#: ../share/extensions/perspective.py:91 ../share/extensions/summersnight.py:90
+#: ../share/extensions/perspective.py:91
+#: ../share/extensions/summersnight.py:90
msgid ""
"The second selected object is a group, not a path.\n"
"Try using the procedure Object->Ungroup."
@@ -32593,7 +32626,8 @@ msgstr ""
"Другий з вибраних об'єктів є групою, а не контуром.\n"
"Спробуйте скористатися пунктом меню Контур -> Розділити."
-#: ../share/extensions/perspective.py:93 ../share/extensions/summersnight.py:92
+#: ../share/extensions/perspective.py:93
+#: ../share/extensions/summersnight.py:92
msgid ""
"The second selected object is not a path.\n"
"Try using the procedure Path->Object to Path."
@@ -32601,7 +32635,8 @@ msgstr ""
"Другий з вибраних об'єктів не є контуром.\n"
"Спробуйте скористатися пунктом меню Контур -> Об'єкт у контур."
-#: ../share/extensions/perspective.py:96 ../share/extensions/summersnight.py:95
+#: ../share/extensions/perspective.py:96
+#: ../share/extensions/summersnight.py:95
msgid ""
"The first selected object is not a path.\n"
"Try using the procedure Path->Object to Path."
@@ -35448,12 +35483,14 @@ msgstr ""
"спробу відкриття."
#: ../share/extensions/hpgl_input.inx.h:3
-#: ../share/extensions/hpgl_output.inx.h:4 ../share/extensions/plotter.inx.h:32
+#: ../share/extensions/hpgl_output.inx.h:4
+#: ../share/extensions/plotter.inx.h:32
msgid "Resolution X (dpi):"
msgstr "Роздільна здатність за X (у т/дюйм):"
#: ../share/extensions/hpgl_input.inx.h:4
-#: ../share/extensions/hpgl_output.inx.h:5 ../share/extensions/plotter.inx.h:33
+#: ../share/extensions/hpgl_output.inx.h:5
+#: ../share/extensions/plotter.inx.h:33
msgid ""
"The amount of steps the plotter moves if it moves for 1 inch on the X axis "
"(Default: 1016.0)"
@@ -35461,12 +35498,14 @@ msgstr ""
"Кількість кроків різця у одному дюймі за віссю X (типове значення — 1016.0)"
#: ../share/extensions/hpgl_input.inx.h:5
-#: ../share/extensions/hpgl_output.inx.h:6 ../share/extensions/plotter.inx.h:34
+#: ../share/extensions/hpgl_output.inx.h:6
+#: ../share/extensions/plotter.inx.h:34
msgid "Resolution Y (dpi):"
msgstr "Роздільна здатність за Y (у т/дюйм):"
#: ../share/extensions/hpgl_input.inx.h:6
-#: ../share/extensions/hpgl_output.inx.h:7 ../share/extensions/plotter.inx.h:35
+#: ../share/extensions/hpgl_output.inx.h:7
+#: ../share/extensions/plotter.inx.h:35
msgid ""
"The amount of steps the plotter moves if it moves for 1 inch on the Y axis "
"(Default: 1016.0)"
@@ -35506,15 +35545,18 @@ msgstr ""
"контури. Скористайтеся додатком плотера (меню «Додатки»), щоб виконати "
"вирізання безпосередньо за допомогою послідовного з’єднання."
-#: ../share/extensions/hpgl_output.inx.h:3 ../share/extensions/plotter.inx.h:31
+#: ../share/extensions/hpgl_output.inx.h:3
+#: ../share/extensions/plotter.inx.h:31
msgid "Plotter Settings "
msgstr "Параметри вирізання "
-#: ../share/extensions/hpgl_output.inx.h:8 ../share/extensions/plotter.inx.h:36
+#: ../share/extensions/hpgl_output.inx.h:8
+#: ../share/extensions/plotter.inx.h:36
msgid "Pen number:"
msgstr "Номер різця:"
-#: ../share/extensions/hpgl_output.inx.h:9 ../share/extensions/plotter.inx.h:37
+#: ../share/extensions/hpgl_output.inx.h:9
+#: ../share/extensions/plotter.inx.h:37
msgid "The number of the pen (tool) to use (Standard: '1')"
msgstr ""
"Номер різця (інструмента), яким слід скористатися. (Типове значення: 1)"
@@ -35822,9 +35864,8 @@ msgstr "Довідка з використання клавіатури та м
#. i18n. Please don't translate it unless a page exists in your language
#: ../share/extensions/inkscape_help_keys.inx.h:3
-#, fuzzy
msgid "http://inkscape.org/doc/keys092.html"
-msgstr "http://inkscape.org/doc/keys091.html"
+msgstr "http://inkscape.org/doc/keys092.html"
#: ../share/extensions/inkscape_help_manual.inx.h:1
msgid "Inkscape Manual"
@@ -35841,9 +35882,8 @@ msgstr "Нове у поточній версії"
#. i18n. Please don't translate it unless a page exists in your language
#: ../share/extensions/inkscape_help_relnotes.inx.h:3
-#, fuzzy
msgid "http://wiki.inkscape.org/wiki/index.php/Release_notes/0.92"
-msgstr "http://wiki.inkscape.org/wiki/index.php/Release_notes/0.91"
+msgstr "http://wiki.inkscape.org/wiki/index.php/Release_notes/0.92"
#: ../share/extensions/inkscape_help_reportabug.inx.h:1
msgid "Report a Bug"
@@ -35873,11 +35913,13 @@ msgstr "Дублювати кінцеві контури"
msgid "Interpolate style"
msgstr "Інтерполяція стилю"
-#: ../share/extensions/interp.inx.h:7 ../share/extensions/interp_att_g.inx.h:10
+#: ../share/extensions/interp.inx.h:7
+#: ../share/extensions/interp_att_g.inx.h:10
msgid "Use Z-order"
msgstr "Використати порядок за Z"
-#: ../share/extensions/interp.inx.h:8 ../share/extensions/interp_att_g.inx.h:11
+#: ../share/extensions/interp.inx.h:8
+#: ../share/extensions/interp_att_g.inx.h:11
msgid "Workaround for reversed selection order in Live Preview cycles"
msgstr ""
"Обхідний захід для зворотного порядку позначення у циклах інтерактивного "
@@ -37534,7 +37576,8 @@ msgstr ""
msgid "AutoCAD Plot Input"
msgstr "Імпорт з креслення AutoCAD"
-#: ../share/extensions/plt_input.inx.h:2 ../share/extensions/plt_output.inx.h:2
+#: ../share/extensions/plt_input.inx.h:2
+#: ../share/extensions/plt_output.inx.h:2
msgid "HP Graphics Language Plot file [AutoCAD] (*.plt)"
msgstr "Файл креслення графічною мовою HP [AutoCAD] (*.plt)"
@@ -38460,7 +38503,6 @@ msgid "Custom Height (px):"
msgstr "Нетипова висота (у пк):"
#: ../share/extensions/seamless_pattern.inx.h:4
-#, fuzzy
msgid "This extension overwrites the current document"
msgstr "Це розширення перезапише поточний документ"
@@ -38496,7 +38538,8 @@ msgstr "Нижній елемент:"
msgid "sK1 vector graphics files input"
msgstr "Імпорт файлів векторної графіки sK1"
-#: ../share/extensions/sk1_input.inx.h:2 ../share/extensions/sk1_output.inx.h:2
+#: ../share/extensions/sk1_input.inx.h:2
+#: ../share/extensions/sk1_output.inx.h:2
msgid "sK1 vector graphics files (*.sk1)"
msgstr "Файли векторної графіки sK1 (*.sk1)"
@@ -38969,28 +39012,24 @@ msgid "From Side c and Angles a, b"
msgstr "За стороною c і кутами a, b"
#: ../share/extensions/ungroup_deep.inx.h:1
-#, fuzzy
msgid "Deep Ungroup"
-msgstr "Розгрупувати"
+msgstr "Глибинне розгрупування"
#: ../share/extensions/ungroup_deep.inx.h:2
-#, fuzzy
msgid "Ungroup all groups in the selected object."
-msgstr "Створити групу-обгортку на основі позначених об’єктів"
+msgstr "Розгрупувати усі групи у позначеному об’єкті."
#: ../share/extensions/ungroup_deep.inx.h:3
-#, fuzzy
msgid "Starting Depth"
-msgstr "Початковий контур:"
+msgstr "Початкова глибина"
#: ../share/extensions/ungroup_deep.inx.h:4
-#, fuzzy
msgid "Stopping Depth (from top)"
-msgstr "Вилучити контур-обгортку з позначених об'єктів'"
+msgstr "Кінцева глибина (згори)"
#: ../share/extensions/ungroup_deep.inx.h:5
msgid "Depth to Keep (from bottom)"
-msgstr ""
+msgstr "Глибина зберігання (знизу)"
#: ../share/extensions/voronoi2svg.inx.h:1
msgid "Voronoi Diagram"
@@ -39472,11 +39511,13 @@ msgstr "Нахил (у градусах):"
msgid "Hide lines behind the sphere"
msgstr "Ховати лінії за сферою"
-#: ../share/extensions/wmf_input.inx.h:1 ../share/extensions/wmf_output.inx.h:1
+#: ../share/extensions/wmf_input.inx.h:1
+#: ../share/extensions/wmf_output.inx.h:1
msgid "Windows Metafile Input"
msgstr "Імпорт метафайла Windows"
-#: ../share/extensions/wmf_input.inx.h:3 ../share/extensions/wmf_output.inx.h:3
+#: ../share/extensions/wmf_input.inx.h:3
+#: ../share/extensions/wmf_output.inx.h:3
msgid "A popular graphics file format for clipart"
msgstr "Популярний графічний формат для кліпарту"
@@ -39484,6 +39525,9 @@ msgstr "Популярний графічний формат для кліпар
msgid "XAML Input"
msgstr "Імпорт з XAML"
+#~ msgid "Add Stored to measure tool"
+#~ msgstr "Додати збережене до інструмента вимірювання"
+
#~ msgid "Vertical Page Center"
#~ msgstr "Центр сторінки за вертикаллю"
diff --git a/src/document.cpp b/src/document.cpp
index d8c3f1269..902dabbc3 100644
--- a/src/document.cpp
+++ b/src/document.cpp
@@ -1602,11 +1602,22 @@ static unsigned int count_objects_recursive(SPObject *obj, unsigned int count)
return count;
}
+/**
+ * Count the number of objects in a given document recursively using the count_objects_recursive helper function
+ *
+ * @param[in] document Pointer to the document for counting objects
+ * @return Numer of objects in the document
+ */
static unsigned int objects_in_document(SPDocument *document)
{
return count_objects_recursive(document->getRoot(), 0);
}
+/**
+ * Remove unused definitions etc. recursively from an object and its siblings
+ *
+ * @param[inout] obj Object which shall be "cleaned"
+ */
static void vacuum_document_recursive(SPObject *obj)
{
if (SP_IS_DEFS(obj)) {
@@ -1621,6 +1632,11 @@ static void vacuum_document_recursive(SPObject *obj)
}
}
+/**
+ * Remove unused definitions etc. recursively from an entire document.
+ *
+ * @return Number of removed objects
+ */
unsigned int SPDocument::vacuumDocument()
{
unsigned int start = objects_in_document(this);
@@ -1639,6 +1655,7 @@ unsigned int SPDocument::vacuumDocument()
newend = objects_in_document(this);
} while (iterations < 100 && newend < end);
+ // We stop if vacuum_document_recursive doesn't remove any more objects or after 100 iterations, whichever occurs first.
return start - newend;
}
@@ -1647,6 +1664,11 @@ bool SPDocument::isSeeking() const {
return priv->seeking;
}
+/**
+ * Indicate to the user if the document has been modified since the last save by displaying a "*" in front of the name of the file in the window title.
+ *
+ * @param[in] modified True if the document has been modified.
+ */
void SPDocument::setModifiedSinceSave(bool modified) {
this->modified_since_save = modified;
if (SP_ACTIVE_DESKTOP) {
diff --git a/src/document.h b/src/document.h
index e95042155..813d4ae49 100644
--- a/src/document.h
+++ b/src/document.h
@@ -198,7 +198,7 @@ public:
bool isSeeking() const;
bool isModifiedSinceSave() const { return modified_since_save; }
- void setModifiedSinceSave(bool modified = true);
+ void setModifiedSinceSave(bool const modified = true);
private:
SPDocument(SPDocument const &); // no copy
diff --git a/src/live_effects/lpe-transform_2pts.cpp b/src/live_effects/lpe-transform_2pts.cpp
index 1cd59b7fa..3c4ce0708 100644
--- a/src/live_effects/lpe-transform_2pts.cpp
+++ b/src/live_effects/lpe-transform_2pts.cpp
@@ -434,7 +434,7 @@ LPETransform2Pts::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<
}
if(!lock_angle && lock_lenght) {
char const * svgd;
- svgd = "m 7.07,7.07 c -3.9,3.91 -10.24,3.91 -14.14,0 -3.91,-3.9 -3.91,-10.24 0,-14.14 3.9,-3.91 10.24,-3.91 14.14,0 l -2.83,-4.24 -0.7,2.12";
+ svgd = "M 0,9.94 C -2.56,9.91 -5.17,8.98 -7.07,7.07 c -3.91,-3.9 -3.91,-10.24 0,-14.14 1.97,-1.97 4.51,-3.02 7.07,-3.04 2.56,0.02 5.1,1.07 7.07,3.04 3.91,3.9 3.91,10.24 0,14.14 C 5.17,8.98 2.56,9.91 0,9.94 Z";
PathVector pathv_turn = sp_svg_read_pathv(svgd);
pathv_turn *= Geom::Rotate(previous_angle);
pathv_turn *= Affine(r,0,0,r,0,0) * Translate(Geom::Point(end));
diff --git a/src/main-cmdlineact.cpp b/src/main-cmdlineact.cpp
index 496c16d5d..76d707131 100644
--- a/src/main-cmdlineact.cpp
+++ b/src/main-cmdlineact.cpp
@@ -62,7 +62,7 @@ CmdLineAction::doIt (ActionContext const & context) {
}
Inkscape::Selection * selection = context.getSelection();
- selection->add(obj, false);
+ selection->add(obj);
}
return;
}
diff --git a/src/object-set.cpp b/src/object-set.cpp
index 8aaa68e70..46c932505 100644
--- a/src/object-set.cpp
+++ b/src/object-set.cpp
@@ -10,15 +10,23 @@
*/
#include <sigc++/sigc++.h>
+#include <glib.h>
#include "object-set.h"
+#include "box3d.h"
+#include "persp3d.h"
+#include "preferences.h"
bool ObjectSet::add(SPObject* object) {
+ g_return_val_if_fail(object != NULL, false);
+ g_return_val_if_fail(SP_IS_OBJECT(object), false);
+
+
// any ancestor is in the set - do nothing
if (_anyAncestorIsInSet(object)) {
return false;
}
- // very nice function, but needs refinement
+ // very nice function, but changes selection behavior (probably needs new selection option to deal with it)
// check if there is mutual ancestor for some elements, which can replace all of them in the set
// object = _getMutualAncestor(object);
@@ -26,19 +34,25 @@ bool ObjectSet::add(SPObject* object) {
_removeDescendantsFromSet(object);
_add(object);
+ _emitSignals();
return true;
}
bool ObjectSet::remove(SPObject* object) {
+ g_return_val_if_fail(object != NULL, false);
+ g_return_val_if_fail(SP_IS_OBJECT(object), false);
+
// object is the top of subtree
- if (contains(object)) {
+ if (includes(object)) {
_remove(object);
+ _emitSignals();
return true;
}
// any ancestor of object is in the set
if (_anyAncestorIsInSet(object)) {
_removeAncestorsFromSet(object);
+ _emitSignals();
return true;
}
@@ -46,7 +60,10 @@ bool ObjectSet::remove(SPObject* object) {
return false;
}
-bool ObjectSet::contains(SPObject* object) {
+bool ObjectSet::includes(SPObject *object) {
+ g_return_val_if_fail(object != NULL, false);
+ g_return_val_if_fail(SP_IS_OBJECT(object), false);
+
return container.get<hashed>().find(object) != container.get<hashed>().end();
}
@@ -54,6 +71,7 @@ void ObjectSet::clear() {
for (auto object: container) {
_remove(object);
}
+ _emitSignals();
}
int ObjectSet::size() {
@@ -63,7 +81,7 @@ int ObjectSet::size() {
bool ObjectSet::_anyAncestorIsInSet(SPObject *object) {
SPObject* o = object;
while (o != nullptr) {
- if (contains(o)) {
+ if (includes(o)) {
return true;
}
o = o->parent;
@@ -74,7 +92,7 @@ bool ObjectSet::_anyAncestorIsInSet(SPObject *object) {
void ObjectSet::_removeDescendantsFromSet(SPObject *object) {
for (auto& child: object->childList(false)) {
- if (contains(child)) {
+ if (includes(child)) {
_remove(child);
// there is certainly no children of this child in the set
continue;
@@ -88,11 +106,15 @@ void ObjectSet::_remove(SPObject *object) {
releaseConnections[object].disconnect();
releaseConnections.erase(object);
container.get<hashed>().erase(object);
+ _remove_3D_boxes_recursively(object);
+ _releaseSignals(object);
}
void ObjectSet::_add(SPObject *object) {
releaseConnections[object] = object->connectRelease(sigc::hide_return(sigc::mem_fun(*this, &ObjectSet::remove)));
container.push_back(object);
+ _add_3D_boxes_recursively(object);
+ _connectSignals(object);
}
SPObject *ObjectSet::_getMutualAncestor(SPObject *object) {
@@ -101,7 +123,7 @@ SPObject *ObjectSet::_getMutualAncestor(SPObject *object) {
bool flag = true;
while (o->parent != nullptr) {
for (auto &child: o->parent->childList(false)) {
- if(child != o && !contains(child)) {
+ if(child != o && !includes(child)) {
flag = false;
break;
}
@@ -122,7 +144,7 @@ void ObjectSet::_removeAncestorsFromSet(SPObject *object) {
_add(child);
}
}
- if (contains(o->parent)) {
+ if (includes(o->parent)) {
_remove(o->parent);
break;
}
@@ -141,3 +163,226 @@ multi_index_container::iterator ObjectSet::begin() {
multi_index_container::iterator ObjectSet::end() {
return container.end();
}
+
+void ObjectSet::toggle(SPObject *obj) {
+ if (includes(obj)) {
+ remove(obj);
+ } else {
+ add(obj);
+ }
+}
+
+bool ObjectSet::isEmpty() {
+ return container.size() == 0;
+}
+
+
+SPObject *ObjectSet::single() {
+ if (container.size() == 1) {
+ return *container.begin();
+ }
+
+ return nullptr;
+}
+
+SPItem *ObjectSet::singleItem() {
+ if (container.size() == 1) {
+ SPObject* obj = *container.begin();
+ if (SP_IS_ITEM(obj)) {
+ return SP_ITEM(obj);
+ }
+ }
+
+ return nullptr;
+}
+
+SPItem *ObjectSet::smallestItem(CompareSize compare) {
+ return _sizeistItem(true, compare);
+}
+
+SPItem *ObjectSet::largestItem(CompareSize compare) {
+ return _sizeistItem(false, compare);
+}
+
+SPItem *ObjectSet::_sizeistItem(bool sml, CompareSize compare) {
+ std::vector<SPItem*> const items = itemList();
+ gdouble max = sml ? 1e18 : 0;
+ SPItem *ist = NULL;
+
+ for ( std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end(); ++i) {
+ Geom::OptRect obox = SP_ITEM(*i)->desktopPreferredBounds();
+ if (!obox || obox.empty()) {
+ continue;
+ }
+
+ Geom::Rect bbox = *obox;
+
+ gdouble size = compare == AREA ? bbox.area() :
+ (compare == VERTICAL ? bbox.width() : bbox.height());
+ size = sml ? size : size * -1;
+ if (size < max) {
+ max = size;
+ ist = SP_ITEM(*i);
+ }
+ }
+
+ return ist;
+}
+
+std::vector<SPObject*> ObjectSet::list() {
+ return std::vector<SPObject*>(container.begin(), container.end());
+}
+
+std::vector<SPItem*> ObjectSet::itemList() {
+ std::vector<SPObject *> tmp = list();
+ std::vector<SPItem*> result;
+ std::remove_if(tmp.begin(), tmp.end(), [](SPObject* o){return !SP_IS_ITEM(o);});
+ std::transform(tmp.begin(), tmp.end(), std::back_inserter(result), [](SPObject* o){return SP_ITEM(o);});
+ return result;
+}
+
+void ObjectSet::set(SPObject *object) {
+ clear();
+ _add(object);
+ // can't emit signal here due to boolean argument in Selection
+// _emitSignals();
+}
+
+void ObjectSet::setList(const std::vector<SPItem *> &objs) {
+ clear();
+ addList(objs);
+}
+
+void ObjectSet::addList(const std::vector<SPItem *> &objs) {
+ for (std::vector<SPItem*>::const_iterator iter = objs.begin(); iter != objs.end(); ++iter) {
+ SPObject *obj = *iter;
+ if (!includes(obj)) {
+ add(obj);
+ }
+ }
+}
+
+void ObjectSet::add(const std::vector<SPItem*>::iterator& from, const std::vector<SPItem*>::iterator& to) {
+ for(auto it = from; it != to; ++it) {
+ _add(*it);
+ }
+}
+
+
+Geom::OptRect ObjectSet::bounds(SPItem::BBoxType type) const
+{
+ return (type == SPItem::GEOMETRIC_BBOX) ?
+ geometricBounds() : visualBounds();
+}
+
+Geom::OptRect ObjectSet::geometricBounds() const
+{
+ std::vector<SPItem*> const items = const_cast<ObjectSet *>(this)->itemList();
+
+ Geom::OptRect bbox;
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end(); ++iter) {
+ bbox.unionWith(SP_ITEM(*iter)->desktopGeometricBounds());
+ }
+ return bbox;
+}
+
+Geom::OptRect ObjectSet::visualBounds() const
+{
+ std::vector<SPItem*> const items = const_cast<ObjectSet *>(this)->itemList();
+
+ Geom::OptRect bbox;
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end(); ++iter) {
+ bbox.unionWith(SP_ITEM(*iter)->desktopVisualBounds());
+ }
+ return bbox;
+}
+
+Geom::OptRect ObjectSet::preferredBounds() const
+{
+ if (Inkscape::Preferences::get()->getInt("/tools/bounding_box") == 0) {
+ return bounds(SPItem::VISUAL_BBOX);
+ } else {
+ return bounds(SPItem::GEOMETRIC_BBOX);
+ }
+}
+
+Geom::OptRect ObjectSet::documentBounds(SPItem::BBoxType type) const
+{
+ Geom::OptRect bbox;
+ std::vector<SPItem*> const items = const_cast<ObjectSet *>(this)->itemList();
+ if (items.empty()) return bbox;
+
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end(); ++iter) {
+ SPItem *item = SP_ITEM(*iter);
+ bbox |= item->documentBounds(type);
+ }
+
+ return bbox;
+}
+
+// If we have a selection of multiple items, then the center of the first item
+// will be returned; this is also the case in SelTrans::centerRequest()
+boost::optional<Geom::Point> ObjectSet::center() const {
+ std::vector<SPItem*> const items = const_cast<ObjectSet *>(this)->itemList();
+ if (!items.empty()) {
+ SPItem *first = items.back(); // from the first item in selection
+ if (first->isCenterSet()) { // only if set explicitly
+ return first->getCenter();
+ }
+ }
+ Geom::OptRect bbox = preferredBounds();
+ if (bbox) {
+ return bbox->midpoint();
+ } else {
+ return boost::optional<Geom::Point>();
+ }
+}
+
+
+std::list<Persp3D *> const ObjectSet::perspList() {
+ std::list<Persp3D *> pl;
+ for (std::list<SPBox3D *>::iterator i = _3dboxes.begin(); i != _3dboxes.end(); ++i) {
+ Persp3D *persp = box3d_get_perspective(*i);
+ if (std::find(pl.begin(), pl.end(), persp) == pl.end())
+ pl.push_back(persp);
+ }
+ return pl;
+}
+
+std::list<SPBox3D *> const ObjectSet::box3DList(Persp3D *persp) {
+ std::list<SPBox3D *> boxes;
+ if (persp) {
+ for (std::list<SPBox3D *>::iterator i = _3dboxes.begin(); i != _3dboxes.end(); ++i) {
+ SPBox3D *box = *i;
+ if (persp == box3d_get_perspective(box)) {
+ boxes.push_back(box);
+ }
+ }
+ } else {
+ boxes = _3dboxes;
+ }
+ return boxes;
+}
+
+void ObjectSet::_add_3D_boxes_recursively(SPObject *obj) {
+ std::list<SPBox3D *> boxes = box3d_extract_boxes(obj);
+
+ for (std::list<SPBox3D *>::iterator i = boxes.begin(); i != boxes.end(); ++i) {
+ SPBox3D *box = *i;
+ _3dboxes.push_back(box);
+ }
+}
+
+void ObjectSet::_remove_3D_boxes_recursively(SPObject *obj) {
+ std::list<SPBox3D *> boxes = box3d_extract_boxes(obj);
+
+ for (std::list<SPBox3D *>::iterator i = boxes.begin(); i != boxes.end(); ++i) {
+ SPBox3D *box = *i;
+ std::list<SPBox3D *>::iterator b = std::find(_3dboxes.begin(), _3dboxes.end(), box);
+ if (b == _3dboxes.end()) {
+ g_print ("Warning! Trying to remove unselected box from selection.\n");
+ return;
+ }
+ _3dboxes.erase(b);
+ }
+} \ No newline at end of file
diff --git a/src/object-set.h b/src/object-set.h
index 7a52788f3..391046ab8 100644
--- a/src/object-set.h
+++ b/src/object-set.h
@@ -20,6 +20,10 @@
#include <boost/multi_index/hashed_index.hpp>
#include <sigc++/connection.h>
#include "sp-object.h"
+#include "sp-item.h"
+
+class SPBox3D;
+class Persp3D;
struct hashed{};
@@ -34,26 +38,164 @@ typedef boost::multi_index_container<
class ObjectSet {
public:
+ enum CompareSize {HORIZONTAL, VERTICAL, AREA};
+
ObjectSet() {};
- ~ObjectSet();
+ virtual ~ObjectSet();
+
+ /**
+ * Add an SPObject to the set of selected objects.
+ *
+ * @param obj the SPObject to add
+ */
bool add(SPObject* object);
+
+ /** Add items from an STL iterator range to the selection.
+ * \param from the begin iterator
+ * \param to the end iterator
+ */
+ void add(const std::vector<SPItem*>::iterator& from, const std::vector<SPItem*>::iterator& to);
+
+ /**
+ * Removes an item from the set of selected objects.
+ *
+ * It is ok to call this method for an unselected item.
+ *
+ * @param item the item to unselect
+ *
+ * @return is success
+ */
bool remove(SPObject* object);
- bool contains(SPObject* object);
+
+ /**
+ * Returns true if the given object is selected.
+ */
+ bool includes(SPObject *object);
+
+ /**
+ * Set the selection to a single specific object.
+ *
+ * @param obj the object to select
+ */
+ void set(SPObject *object);
+
+ /**
+ * Unselects all selected objects.
+ */
void clear();
+
+ /**
+ * Returns size of the selection.
+ */
int size();
+
+ /**
+ * Returns true if no items are selected.
+ */
+ bool isEmpty();
+
+ /**
+ * Removes an item if selected, adds otherwise.
+ *
+ * @param item the item to unselect
+ */
+ void toggle(SPObject *obj);
+
+ /**
+ * Returns a single selected object.
+ *
+ * @return NULL unless exactly one object is selected
+ */
+ SPObject *single();
+
+ /**
+ * Returns a single selected item.
+ *
+ * @return NULL unless exactly one object is selected
+ */
+ SPItem *singleItem();
+
+ /**
+ * Returns the smallest item from this selection.
+ */
+ SPItem *smallestItem(CompareSize compare);
+
+ /**
+ * Returns the largest item from this selection.
+ */
+ SPItem *largestItem(CompareSize compare);
+
+ /** Returns the list of selected objects. */
+ std::vector<SPObject*> list();
+
+ /** Returns the list of selected SPItems. */
+ std::vector<SPItem*> itemList();
+
+ /**
+ * Selects exactly the specified objects.
+ *
+ * @param objs the objects to select
+ */
+ void setList(const std::vector<SPItem *> &objs);
+
+ /**
+ * Adds the specified objects to selection, without deselecting first.
+ *
+ * @param objs the objects to select
+ */
+ void addList(std::vector<SPItem*> const &objs);
+
+ /** Returns the bounding rectangle of the selection. */
+ Geom::OptRect bounds(SPItem::BBoxType type) const;
+ Geom::OptRect visualBounds() const;
+ Geom::OptRect geometricBounds() const;
+
+ /**
+ * Returns either the visual or geometric bounding rectangle of the selection, based on the
+ * preferences specified for the selector tool
+ */
+ Geom::OptRect preferredBounds() const;
+
+ /* Returns the bounding rectangle of the selectionin document coordinates.*/
+ Geom::OptRect documentBounds(SPItem::BBoxType type) const;
+
+ /**
+ * Returns the rotation/skew center of the selection.
+ */
+ boost::optional<Geom::Point> center() const;
+
+ /** Returns a list of all perspectives which have a 3D box in the current selection.
+ (these may also be nested in groups) */
+ std::list<Persp3D *> const perspList();
+
+ /**
+ * Returns a list of all 3D boxes in the current selection which are associated to @c
+ * persp. If @c pers is @c NULL, return all selected boxes.
+ */
+ std::list<SPBox3D *> const box3DList(Persp3D *persp = NULL);
+
+
multi_index_container::iterator begin();
multi_index_container::iterator end();
-private:
+protected:
+ virtual void _connectSignals(SPObject* object) {};
+ virtual void _releaseSignals(SPObject* object) {};
+ virtual void _emitSignals() {};
void _add(SPObject* object);
void _remove(SPObject* object);
bool _anyAncestorIsInSet(SPObject *object);
void _removeDescendantsFromSet(SPObject *object);
void _removeAncestorsFromSet(SPObject *object);
+ SPItem *_sizeistItem(bool sml, CompareSize compare);
SPObject *_getMutualAncestor(SPObject *object);
+ virtual void _add_3D_boxes_recursively(SPObject *obj);
+ virtual void _remove_3D_boxes_recursively(SPObject *obj);
multi_index_container container;
+ std::list<SPBox3D *> _3dboxes;
std::unordered_map<SPObject*, sigc::connection> releaseConnections;
+
};
diff --git a/src/selection.cpp b/src/selection.cpp
index 146d07a9d..32e27f2d4 100644
--- a/src/selection.cpp
+++ b/src/selection.cpp
@@ -7,8 +7,10 @@
* bulia byak <buliabyak@users.sf.net>
* Andrius R. <knutux@gmail.com>
* Abhishek Sharma
+ * Adrian Boguszewski
*
- * Copyright (C) 2006 Andrius R.
+ * Copyright (C) 2016 Adrian Boguszewski
+ * Copyright (C) 2006 Andrius R.
* Copyright (C) 2004-2005 MenTaLguY
* Copyright (C) 1999-2002 Lauris Kaplinski
* Copyright (C) 2001-2002 Ximian, Inc.
@@ -20,17 +22,12 @@
#endif
#include "inkscape.h"
-#include "document.h"
#include "xml/repr.h"
#include "preferences.h"
#include "sp-shape.h"
#include "sp-path.h"
-#include "sp-item-group.h"
-#include "box3d.h"
-#include "persp3d.h"
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/casts.hpp>
+#include "document.h"
#define SP_SELECTION_UPDATE_PRIORITY (G_PRIORITY_HIGH_IDLE + 1)
@@ -46,7 +43,6 @@ Selection::Selection(LayerModel *layers, SPDesktop *desktop) :
}
Selection::~Selection() {
- _clear();
_layers = NULL;
if (_idle) {
g_source_remove(_idle);
@@ -66,8 +62,7 @@ void Selection::_schedule_modified(SPObject */*obj*/, guint flags) {
this->_flags |= flags;
}
-gboolean
-Selection::_emit_modified(Selection *selection)
+gboolean Selection::_emit_modified(Selection *selection)
{
/* force new handler to be created if requested before we return */
selection->_idle = 0;
@@ -100,8 +95,7 @@ void Selection::_emitChanged(bool persist_selection_context/* = false */) {
_changed_signal.emit(this);
}
-void
-Selection::_releaseContext(SPObject *obj)
+void Selection::_releaseContext(SPObject *obj)
{
if (NULL == _selection_context || _selection_context != obj)
return;
@@ -112,148 +106,30 @@ Selection::_releaseContext(SPObject *obj)
_selection_context = NULL;
}
-void Selection::_clear() {
- _selectionSet.clear();
-}
-
SPObject *Selection::activeContext() {
if (NULL != _selection_context)
return _selection_context;
return _layers->currentLayer();
- }
-
-bool Selection::includes(SPObject *obj) {
- g_return_val_if_fail(obj != NULL, false);
- g_return_val_if_fail(SP_IS_OBJECT(obj), false);
-
- return _selectionSet.contains(obj);
-}
-
-void Selection::add(SPObject *obj, bool persist_selection_context/* = false */) {
- g_return_if_fail(obj != NULL);
- g_return_if_fail(SP_IS_OBJECT(obj));
- g_return_if_fail(obj->document != NULL);
-
- _add(obj);
- _emitChanged(persist_selection_context);
-}
-
-void Selection::add_3D_boxes_recursively(SPObject *obj) {
- std::list<SPBox3D *> boxes = box3d_extract_boxes(obj);
-
- for (std::list<SPBox3D *>::iterator i = boxes.begin(); i != boxes.end(); ++i) {
- SPBox3D *box = *i;
- _3dboxes.push_back(box);
- }
-}
-
-void Selection::_add(SPObject *obj) {
- _selectionSet.add(obj);
- add_3D_boxes_recursively(obj);
- _modified_connections[obj] = obj->connectModified(sigc::mem_fun(*this, &Selection::_schedule_modified));
}
void Selection::set(SPObject *object, bool persist_selection_context) {
- _clear();
- add(object, persist_selection_context);
-}
-
-void Selection::toggle(SPObject *obj) {
- if (includes(obj)) {
- remove(obj);
- } else {
- add(obj);
- }
-}
-
-void Selection::remove(SPObject *obj) {
- g_return_if_fail(obj != NULL);
- g_return_if_fail(SP_IS_OBJECT(obj));
-
- _remove(obj);
- _emitChanged();
-}
-
-void Selection::remove_3D_boxes_recursively(SPObject *obj) {
- std::list<SPBox3D *> boxes = box3d_extract_boxes(obj);
-
- for (std::list<SPBox3D *>::iterator i = boxes.begin(); i != boxes.end(); ++i) {
- SPBox3D *box = *i;
- std::list<SPBox3D *>::iterator b = std::find(_3dboxes.begin(), _3dboxes.end(), box);
- if (b == _3dboxes.end()) {
- g_print ("Warning! Trying to remove unselected box from selection.\n");
- return;
- }
- _3dboxes.erase(b);
- }
-}
-
-void Selection::_remove(SPObject *obj) {
- _modified_connections[obj].disconnect();
- _modified_connections.erase(obj);
-
- _selectionSet.remove(obj);
- remove_3D_boxes_recursively(obj);
-}
-
-void Selection::setList(std::vector<SPItem*> const &list) {
- // Clear and add, or just clear with emit.
- if (!list.empty()) {
- _clear();
- addList(list);
- } else {
- clear();
- }
-}
-
-void Selection::addList(std::vector<SPItem*> const &list) {
- if (list.empty())
- return;
-
- for (std::vector<SPItem*>::const_iterator iter = list.begin(); iter != list.end(); ++iter) {
- SPObject *obj = *iter;
- if (!includes(obj)) {
- _add(obj);
- }
- }
-
- _emitChanged();
+ ObjectSet::set(object);
+ _emitChanged(persist_selection_context);
}
void Selection::setReprList(std::vector<XML::Node*> const &list) {
- _clear();
+ clear();
for (std::vector<XML::Node*>::const_reverse_iterator iter = list.rbegin(); iter != list.rend(); ++iter) {
SPObject *obj = _objectForXMLNode(*iter);
if (obj) {
- _add(obj);
+ add(obj);
}
}
_emitChanged();
}
-void Selection::clear() {
- _clear();
- _emitChanged();
-}
-
-bool Selection::isEmpty() {
- return _selectionSet.size() == 0;
-}
-
-std::vector<SPObject*> Selection::list() {
- return std::vector<SPObject*>(_selectionSet.begin(), _selectionSet.end());
-}
-
-std::vector<SPItem*> Selection::itemList() {
- std::vector<SPObject *> tmp = list();
- std::vector<SPItem*> result;
- std::remove_if(tmp.begin(), tmp.end(), [](SPObject* o){return !SP_IS_ITEM(o);});
- std::transform(tmp.begin(), tmp.end(), std::back_inserter(result), [](SPObject* o){return SP_ITEM(o);});
- return result;
-}
-
std::vector<XML::Node*> Selection::reprList() {
std::vector<SPItem*> list = itemList();
std::vector<XML::Node*> result;
@@ -261,154 +137,11 @@ std::vector<XML::Node*> Selection::reprList() {
return result;
}
-std::list<Persp3D *> const Selection::perspList() {
- std::list<Persp3D *> pl;
- for (std::list<SPBox3D *>::iterator i = _3dboxes.begin(); i != _3dboxes.end(); ++i) {
- Persp3D *persp = box3d_get_perspective(*i);
- if (std::find(pl.begin(), pl.end(), persp) == pl.end())
- pl.push_back(persp);
- }
- return pl;
-}
-
-std::list<SPBox3D *> const Selection::box3DList(Persp3D *persp) {
- std::list<SPBox3D *> boxes;
- if (persp) {
- for (std::list<SPBox3D *>::iterator i = _3dboxes.begin(); i != _3dboxes.end(); ++i) {
- SPBox3D *box = *i;
- if (persp == box3d_get_perspective(box)) {
- boxes.push_back(box);
- }
- }
- } else {
- boxes = _3dboxes;
- }
- return boxes;
-}
-
-SPObject *Selection::single() {
- if (_selectionSet.size() == 1) {
- return *_selectionSet.begin();
- }
-
- return nullptr;
-}
-
-SPItem *Selection::singleItem() {
- if (_selectionSet.size() == 1) {
- SPObject* obj = *_selectionSet.begin();
- if (SP_IS_ITEM(obj)) {
- return SP_ITEM(obj);
- }
- }
-
- return nullptr;
-}
-
-SPItem *Selection::smallestItem(Selection::CompareSize compare) {
- return _sizeistItem(true, compare);
-}
-
-SPItem *Selection::largestItem(Selection::CompareSize compare) {
- return _sizeistItem(false, compare);
-}
-
-SPItem *Selection::_sizeistItem(bool sml, Selection::CompareSize compare) {
- std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
- gdouble max = sml ? 1e18 : 0;
- SPItem *ist = NULL;
-
- for ( std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end(); ++i) {
- Geom::OptRect obox = SP_ITEM(*i)->desktopPreferredBounds();
- if (!obox || obox.empty()) continue;
- Geom::Rect bbox = *obox;
-
- gdouble size = compare == 2 ? bbox.area() :
- (compare == 1 ? bbox.width() : bbox.height());
- size = sml ? size : size * -1;
- if (size < max) {
- max = size;
- ist = SP_ITEM(*i);
- }
- }
-
- return ist;
-}
-
Inkscape::XML::Node *Selection::singleRepr() {
SPObject *obj = single();
return obj ? obj->getRepr() : nullptr;
}
-Geom::OptRect Selection::bounds(SPItem::BBoxType type) const
-{
- return (type == SPItem::GEOMETRIC_BBOX) ?
- geometricBounds() : visualBounds();
-}
-
-Geom::OptRect Selection::geometricBounds() const
-{
- std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
-
- Geom::OptRect bbox;
- for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end(); ++iter) {
- bbox.unionWith(SP_ITEM(*iter)->desktopGeometricBounds());
- }
- return bbox;
-}
-
-Geom::OptRect Selection::visualBounds() const
-{
- std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
-
- Geom::OptRect bbox;
- for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end(); ++iter) {
- bbox.unionWith(SP_ITEM(*iter)->desktopVisualBounds());
- }
- return bbox;
-}
-
-Geom::OptRect Selection::preferredBounds() const
-{
- if (Inkscape::Preferences::get()->getInt("/tools/bounding_box") == 0) {
- return bounds(SPItem::VISUAL_BBOX);
- } else {
- return bounds(SPItem::GEOMETRIC_BBOX);
- }
-}
-
-Geom::OptRect Selection::documentBounds(SPItem::BBoxType type) const
-{
- Geom::OptRect bbox;
- std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
- if (items.empty()) return bbox;
-
- for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end(); ++iter) {
- SPItem *item = SP_ITEM(*iter);
- bbox |= item->documentBounds(type);
- }
-
- return bbox;
-}
-
-// If we have a selection of multiple items, then the center of the first item
-// will be returned; this is also the case in SelTrans::centerRequest()
-boost::optional<Geom::Point> Selection::center() const {
- std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
- if (!items.empty()) {
- SPItem *first = items.back(); // from the first item in selection
- if (first->isCenterSet()) { // only if set explicitly
- return first->getCenter();
- }
- }
- Geom::OptRect bbox = preferredBounds();
- if (bbox) {
- return bbox->midpoint();
- } else {
- return boost::optional<Geom::Point>();
- }
-}
-
std::vector<Inkscape::SnapCandidatePoint> Selection::getSnapPoints(SnapPreferences const *snapprefs) const {
std::vector<Inkscape::SnapCandidatePoint> p;
@@ -461,6 +194,19 @@ size_t Selection::numberOfParents() {
return parents.size();
}
+void Selection::_emitSignals() {
+ _emitChanged();
+}
+
+void Selection::_connectSignals(SPObject *object) {
+ _modified_connections[object] = object->connectModified(sigc::mem_fun(*this, &Selection::_schedule_modified));
+}
+
+void Selection::_releaseSignals(SPObject *object) {
+ _modified_connections[object].disconnect();
+ _modified_connections.erase(object);
+}
+
}
/*
diff --git a/src/selection.h b/src/selection.h
index 91d033d58..8f43d51e7 100644
--- a/src/selection.h
+++ b/src/selection.h
@@ -5,7 +5,9 @@
* Lauris Kaplinski <lauris@kaplinski.com>
* MenTaLguY <mental@rydia.net>
* bulia byak <buliabyak@users.sf.net>
+ * Adrian Boguszewski
*
+ * Copyright (C) 2016 Adrian Boguszewski
* Copyright (C) 2004-2005 MenTaLguY
* Copyright (C) 1999-2002 Lauris Kaplinski
* Copyright (C) 2001-2002 Ximian, Inc.
@@ -15,8 +17,6 @@
#include <vector>
#include <map>
-#include <list>
-#include <set>
#include <stddef.h>
#include <sigc++/sigc++.h>
@@ -27,11 +27,8 @@
#include "sp-item.h"
#include "object-set.h"
-
class SPDesktop;
class SPItem;
-class SPBox3D;
-class Persp3D;
namespace Inkscape {
class LayerModel;
@@ -62,10 +59,10 @@ namespace Inkscape {
*/
class Selection : public Inkscape::GC::Managed<>,
public Inkscape::GC::Finalized,
- public Inkscape::GC::Anchored
+ public Inkscape::GC::Anchored,
+ public ObjectSet
{
public:
- enum CompareSize { HORIZONTAL, VERTICAL, AREA };
/**
* Constructs an selection object, bound to a particular
* layer model
@@ -98,12 +95,7 @@ public:
*/
SPObject *activeContext();
- /**
- * Add an SPObject to the set of selected objects.
- *
- * @param obj the SPObject to add
- */
- void add(SPObject *obj, bool persist_selection_context = false);
+ using ObjectSet::add;
/**
* Add an XML node's SPObject to the set of selected objects.
@@ -130,21 +122,7 @@ public:
set(_objectForXMLNode(repr));
}
- /**
- * Removes an item from the set of selected objects.
- *
- * It is ok to call this method for an unselected item.
- *
- * @param item the item to unselect
- */
- void remove(SPObject *obj);
-
- /**
- * Removes an item if selected, adds otherwise.
- *
- * @param item the item to unselect
- */
- void toggle(SPObject *obj);
+ using ObjectSet::remove;
/**
* Removes an item from the set of selected objects.
@@ -153,21 +131,9 @@ public:
*
* @param repr the xml node of the item to remove
*/
- void remove(XML::Node *repr) { remove(_objectForXMLNode(repr)); }
-
- /**
- * Selects exactly the specified objects.
- *
- * @param objs the objects to select
- */
- void setList(std::vector<SPItem*> const &objs);
-
- /**
- * Adds the specified objects to selection, without deselecting first.
- *
- * @param objs the objects to select
- */
- void addList(std::vector<SPItem*> const &objs);
+ void remove(XML::Node *repr) {
+ remove(_objectForXMLNode(repr));
+ }
/**
* Clears the selection and selects the specified objects.
@@ -176,33 +142,7 @@ public:
*/
void setReprList(std::vector<XML::Node*> const &reprs);
- /** Add items from an STL iterator range to the selection.
- * \param from the begin iterator
- * \param to the end iterator
- */
- template <typename InputIterator>
- void add(InputIterator from, InputIterator to) {
- while (from != to) {
- _add(*from);
- ++from;
- }
- _emitChanged();
- }
-
- /**
- * Unselects all selected objects..
- */
- void clear();
-
- /**
- * Returns true if no items are selected.
- */
- bool isEmpty();
-
- /**
- * Returns true if the given object is selected.
- */
- bool includes(SPObject *obj);
+ using ObjectSet::includes;
/**
* Returns true if the given item is selected.
@@ -212,80 +152,21 @@ public:
}
/**
- * Returns a single selected object.
- *
- * @return NULL unless exactly one object is selected
- */
- SPObject *single();
-
- /**
- * Returns a single selected item.
- *
- * @return NULL unless exactly one object is selected
- */
- SPItem *singleItem();
-
- /**
- * Returns the smallest item from this selection.
- */
- SPItem *smallestItem(CompareSize compare);
-
- /**
- * Returns the largest item from this selection.
- */
- SPItem *largestItem(CompareSize compare);
-
- /**
* Returns a single selected object's xml node.
*
* @return NULL unless exactly one object is selected
*/
XML::Node *singleRepr();
- /** Returns the list of selected objects. */
- std::vector<SPObject*> list();
- /** Returns the list of selected SPItems. */
- std::vector<SPItem*> itemList();
/** Returns a list of the xml nodes of all selected objects. */
- /// \todo only returns reprs of SPItems currently; need a separate
- /// method for that
std::vector<XML::Node*> reprList();
- /** Returns a list of all perspectives which have a 3D box in the current selection.
- (these may also be nested in groups) */
- std::list<Persp3D *> const perspList();
-
- /**
- * Returns a list of all 3D boxes in the current selection which are associated to @c
- * persp. If @c pers is @c NULL, return all selected boxes.
- */
- std::list<SPBox3D *> const box3DList(Persp3D *persp = NULL);
-
/** Returns the number of layers in which there are selected objects. */
size_t numberOfLayers();
/** Returns the number of parents to which the selected objects belong. */
size_t numberOfParents();
- /** Returns the bounding rectangle of the selection. */
- Geom::OptRect bounds(SPItem::BBoxType type) const;
- Geom::OptRect visualBounds() const;
- Geom::OptRect geometricBounds() const;
-
- /**
- * Returns either the visual or geometric bounding rectangle of the selection, based on the
- * preferences specified for the selector tool
- */
- Geom::OptRect preferredBounds() const;
-
- /// Returns the bounding rectangle of the selectionin document coordinates.
- Geom::OptRect documentBounds(SPItem::BBoxType type) const;
-
- /**
- * Returns the rotation/skew center of the selection.
- */
- boost::optional<Geom::Point> center() const;
-
/**
* Compute the list of points in the selection that are to be considered for snapping from.
*
@@ -332,6 +213,11 @@ public:
return _modified_signal.slots().insert(_modified_signal.slots().begin(), slot);
}
+protected:
+ void _emitSignals();
+ void _connectSignals(SPObject* object);
+ void _releaseSignals(SPObject* object);
+
private:
/** no copy. */
Selection(Selection const &);
@@ -347,25 +233,11 @@ private:
void _emitModified(unsigned int flags);
/** Issues changed selection signal. */
void _emitChanged(bool persist_selection_context = false);
- /** clears the selection (without issuing a notification). */
- void _clear();
- /** adds an object (without issuing a notification). */
- void _add(SPObject *obj);
- /** removes an object (without issuing a notification). */
- void _remove(SPObject *obj);
/** returns the SPObject corresponding to an xml node (if any). */
SPObject *_objectForXMLNode(XML::Node *repr) const;
/** Releases an active layer object that is being removed. */
void _releaseContext(SPObject *obj);
- ObjectSet _selectionSet;
-
- void add_3D_boxes_recursively(SPObject *obj);
- void remove_3D_boxes_recursively(SPObject *obj);
- SPItem *_sizeistItem(bool sml, CompareSize compare);
-
- std::list<SPBox3D *> _3dboxes;
-
LayerModel *_layers;
GC::soft_ptr<SPDesktop> _desktop;
SPObject* _selection_context;
diff --git a/src/sp-object.cpp b/src/sp-object.cpp
index db66eb3e6..d1659eedc 100644
--- a/src/sp-object.cpp
+++ b/src/sp-object.cpp
@@ -71,13 +71,17 @@ Inkscape::XML::NodeEventVector object_event_vector = {
SPObject::repr_order_changed
};
-// A friend class used to set internal members on SPObject so as to not expose settors in SPObject's public API
+/**
+ * A friend class used to set internal members on SPObject so as to not expose settors in SPObject's public API
+ */
class SPObjectImpl
{
public:
/**
* Null's the id member of an SPObject without attempting to free prior contents.
+ *
+ * @param[inout] obj Pointer to the object which's id shall be nulled.
*/
static void setIdNull( SPObject* obj ) {
if (obj) {
@@ -87,6 +91,9 @@ public:
/**
* Sets the id member of an object, freeing any prior content.
+ *
+ * @param[inout] obj Pointer to the object which's id shall be set.
+ * @param[in] id New id
*/
static void setId( SPObject* obj, gchar const* id ) {
if (obj && (id != obj->id) ) {
@@ -104,6 +111,9 @@ public:
static gchar *sp_object_get_unique_id(SPObject *object,
gchar const *defid);
+/**
+ * Constructor, sets all attributes to default values.
+ */
SPObject::SPObject()
: cloned(0), uflags(0), mflags(0), hrefcount(0), _total_hrefcount(0),
document(NULL), parent(NULL), children(NULL), _last_child(NULL),
@@ -126,6 +136,9 @@ SPObject::SPObject()
this->context_style = NULL;
}
+/**
+ * Destructor, frees the used memory and unreferences a potential successor of the object.
+ */
SPObject::~SPObject() {
g_free(this->_label);
g_free(this->_default_label);
diff --git a/src/ui/tools/eraser-tool.cpp b/src/ui/tools/eraser-tool.cpp
index 6b32b5901..cb7747b2b 100644
--- a/src/ui/tools/eraser-tool.cpp
+++ b/src/ui/tools/eraser-tool.cpp
@@ -708,7 +708,6 @@ void EraserTool::set_to_accumulated() {
item->deleteObject(true);
sp_object_unref(item);
workDone = true;
- workDone = true;
} else if (SP_IS_GROUP(item) || use ) {
/*Do nothing*/
} else {
diff --git a/src/ui/widget/style-subject.cpp b/src/ui/widget/style-subject.cpp
index da3bbcd20..47a899c0f 100644
--- a/src/ui/widget/style-subject.cpp
+++ b/src/ui/widget/style-subject.cpp
@@ -55,7 +55,7 @@ Inkscape::Selection *StyleSubject::Selection::_getSelection() const {
}
}
-std::vector<SPObject*> StyleSubject::Selection::list(){
+std::vector<SPObject*> StyleSubject::Selection::list() {
Inkscape::Selection *selection = _getSelection();
if(selection)
return selection->list();
diff --git a/testfiles/src/object-set-test.cpp b/testfiles/src/object-set-test.cpp
index 124740495..5c564c0dc 100644
--- a/testfiles/src/object-set-test.cpp
+++ b/testfiles/src/object-set-test.cpp
@@ -24,8 +24,12 @@ public:
G = new SPObject();
H = new SPObject();
X = new SPObject();
+ set = new ObjectSet();
+ set2 = new ObjectSet();
}
~ObjectSetTest() {
+ delete set;
+ delete set2;
delete X;
delete H;
delete G;
@@ -45,57 +49,57 @@ public:
SPObject* G;
SPObject* H;
SPObject* X;
- ObjectSet set;
- ObjectSet set2;
+ ObjectSet* set;
+ ObjectSet* set2;
};
TEST_F(ObjectSetTest, Basics) {
- EXPECT_EQ(0, set.size());
- set.add(A);
- EXPECT_EQ(1, set.size());
- EXPECT_TRUE(set.contains(A));
- set.add(B);
- set.add(C);
- EXPECT_EQ(3, set.size());
- EXPECT_TRUE(set.contains(B));
- EXPECT_TRUE(set.contains(C));
- EXPECT_FALSE(set.contains(D));
- EXPECT_FALSE(set.contains(X));
- set.remove(A);
- EXPECT_EQ(2, set.size());
- EXPECT_FALSE(set.contains(A));
- set.clear();
- EXPECT_EQ(0, set.size());
+ EXPECT_EQ(0, set->size());
+ set->add(A);
+ EXPECT_EQ(1, set->size());
+ EXPECT_TRUE(set->includes(A));
+ set->add(B);
+ set->add(C);
+ EXPECT_EQ(3, set->size());
+ EXPECT_TRUE(set->includes(B));
+ EXPECT_TRUE(set->includes(C));
+ EXPECT_FALSE(set->includes(D));
+ EXPECT_FALSE(set->includes(X));
+ set->remove(A);
+ EXPECT_EQ(2, set->size());
+ EXPECT_FALSE(set->includes(A));
+ set->clear();
+ EXPECT_EQ(0, set->size());
}
TEST_F(ObjectSetTest, Autoremoving) {
SPObject* Q = new SPObject();
Q->invoke_build(_doc, _doc->rroot, 1);
- set.add(Q);
- EXPECT_TRUE(set.contains(Q));
- EXPECT_EQ(1, set.size());
+ set->add(Q);
+ EXPECT_TRUE(set->includes(Q));
+ EXPECT_EQ(1, set->size());
Q->releaseReferences();
- EXPECT_EQ(0, set.size());
+ EXPECT_EQ(0, set->size());
}
TEST_F(ObjectSetTest, BasicDescendants) {
A->attach(B, nullptr);
B->attach(C, nullptr);
A->attach(D, nullptr);
- bool resultB = set.add(B);
- bool resultB2 = set.add(B);
+ bool resultB = set->add(B);
+ bool resultB2 = set->add(B);
EXPECT_TRUE(resultB);
EXPECT_FALSE(resultB2);
- EXPECT_TRUE(set.contains(B));
- bool resultC = set.add(C);
+ EXPECT_TRUE(set->includes(B));
+ bool resultC = set->add(C);
EXPECT_FALSE(resultC);
- EXPECT_FALSE(set.contains(C));
- EXPECT_EQ(1, set.size());
- bool resultA = set.add(A);
+ EXPECT_FALSE(set->includes(C));
+ EXPECT_EQ(1, set->size());
+ bool resultA = set->add(A);
EXPECT_TRUE(resultA);
- EXPECT_EQ(1, set.size());
- EXPECT_TRUE(set.contains(A));
- EXPECT_FALSE(set.contains(B));
+ EXPECT_EQ(1, set->size());
+ EXPECT_TRUE(set->includes(A));
+ EXPECT_FALSE(set->includes(B));
}
TEST_F(ObjectSetTest, AdvancedDescendants) {
@@ -107,19 +111,19 @@ TEST_F(ObjectSetTest, AdvancedDescendants) {
C->attach(F, nullptr);
C->attach(G, nullptr);
C->attach(H, nullptr);
- set.add(A);
- bool resultF = set.remove(F);
+ set->add(A);
+ bool resultF = set->remove(F);
EXPECT_TRUE(resultF);
- EXPECT_EQ(4, set.size());
- EXPECT_FALSE(set.contains(F));
- EXPECT_TRUE(set.contains(B));
- EXPECT_TRUE(set.contains(G));
- EXPECT_TRUE(set.contains(H));
- EXPECT_TRUE(set.contains(X));
- bool resultF2 = set.add(F);
+ EXPECT_EQ(4, set->size());
+ EXPECT_FALSE(set->includes(F));
+ EXPECT_TRUE(set->includes(B));
+ EXPECT_TRUE(set->includes(G));
+ EXPECT_TRUE(set->includes(H));
+ EXPECT_TRUE(set->includes(X));
+ bool resultF2 = set->add(F);
EXPECT_TRUE(resultF2);
- EXPECT_EQ(5, set.size());
- EXPECT_TRUE(set.contains(F));
+ EXPECT_EQ(5, set->size());
+ EXPECT_TRUE(set->includes(F));
}
TEST_F(ObjectSetTest, Removing) {
@@ -131,27 +135,27 @@ TEST_F(ObjectSetTest, Removing) {
C->attach(F, nullptr);
C->attach(G, nullptr);
C->attach(H, nullptr);
- bool removeH = set.remove(H);
+ bool removeH = set->remove(H);
EXPECT_FALSE(removeH);
- set.add(A);
- bool removeX = set.remove(X);
+ set->add(A);
+ bool removeX = set->remove(X);
EXPECT_TRUE(removeX);
- EXPECT_EQ(2, set.size());
- EXPECT_TRUE(set.contains(B));
- EXPECT_TRUE(set.contains(C));
- EXPECT_FALSE(set.contains(X));
- EXPECT_FALSE(set.contains(A));
- bool removeX2 = set.remove(X);
+ EXPECT_EQ(2, set->size());
+ EXPECT_TRUE(set->includes(B));
+ EXPECT_TRUE(set->includes(C));
+ EXPECT_FALSE(set->includes(X));
+ EXPECT_FALSE(set->includes(A));
+ bool removeX2 = set->remove(X);
EXPECT_FALSE(removeX2);
- EXPECT_EQ(2, set.size());
- bool removeA = set.remove(A);
+ EXPECT_EQ(2, set->size());
+ bool removeA = set->remove(A);
EXPECT_FALSE(removeA);
- EXPECT_EQ(2, set.size());
- bool removeC = set.remove(C);
+ EXPECT_EQ(2, set->size());
+ bool removeC = set->remove(C);
EXPECT_TRUE(removeC);
- EXPECT_EQ(1, set.size());
- EXPECT_TRUE(set.contains(B));
- EXPECT_FALSE(set.contains(C));
+ EXPECT_EQ(1, set->size());
+ EXPECT_TRUE(set->includes(B));
+ EXPECT_FALSE(set->includes(C));
}
TEST_F(ObjectSetTest, TwoSets) {
@@ -159,19 +163,19 @@ TEST_F(ObjectSetTest, TwoSets) {
Q->invoke_build(_doc, _doc->rroot, 1);
A->attach(B, nullptr);
A->attach(Q, nullptr);
- set.add(A);
- set2.add(A);
- EXPECT_EQ(1, set.size());
- EXPECT_EQ(1, set2.size());
- set.remove(B);
- EXPECT_EQ(1, set.size());
- EXPECT_TRUE(set.contains(Q));
- EXPECT_EQ(1, set2.size());
- EXPECT_TRUE(set2.contains(A));
+ set->add(A);
+ set2->add(A);
+ EXPECT_EQ(1, set->size());
+ EXPECT_EQ(1, set2->size());
+ set->remove(B);
+ EXPECT_EQ(1, set->size());
+ EXPECT_TRUE(set->includes(Q));
+ EXPECT_EQ(1, set2->size());
+ EXPECT_TRUE(set2->includes(A));
Q->releaseReferences();
- EXPECT_EQ(0, set.size());
- EXPECT_EQ(1, set2.size());
- EXPECT_TRUE(set2.contains(A));
+ EXPECT_EQ(0, set->size());
+ EXPECT_EQ(1, set2->size());
+ EXPECT_TRUE(set2->includes(A));
}
TEST_F(ObjectSetTest, SetRemoving) {
@@ -186,18 +190,17 @@ TEST_F(ObjectSetTest, SetRemoving) {
}
TEST_F(ObjectSetTest, SetOrder) {
- set.add(A);
- set.add(D);
- set.add(B);
- set.add(E);
- set.add(C);
- EXPECT_EQ(5, set.size());
- auto it = set.begin();
+ set->add(A);
+ set->add(D);
+ set->add(B);
+ set->add(E);
+ set->add(C);
+ EXPECT_EQ(5, set->size());
+ auto it = set->begin();
EXPECT_EQ(A, *it++);
EXPECT_EQ(D, *it++);
EXPECT_EQ(B, *it++);
EXPECT_EQ(E, *it++);
EXPECT_EQ(C, *it++);
- EXPECT_EQ(set.end(), it);
-
+ EXPECT_EQ(set->end(), it);
} \ No newline at end of file