|
8 | 8 | [renderer.document.events :as-alias document.e]
|
9 | 9 | [renderer.document.subs :as-alias document.s]
|
10 | 10 | [renderer.element.events :as-alias element.e]
|
| 11 | + [renderer.element.subs :as-alias element.s] |
11 | 12 | [renderer.frame.events :as-alias frame.e]
|
12 | 13 | [renderer.history.events :as-alias history.e]
|
| 14 | + [renderer.history.subs :as-alias history.s] |
13 | 15 | [renderer.window.events :as-alias window.e]
|
14 | 16 | [renderer.window.subs :as-alias window.s]))
|
15 | 17 |
|
|
47 | 49 | {:key :recent
|
48 | 50 | :label "Recent"
|
49 | 51 | :type :sub-menu
|
50 |
| - :disabled? [::document.s/recent-disabled?] |
| 52 | + :disabled? (not @(rf/subscribe [::document.s/recent?])) |
51 | 53 | :items (recent-submenu)}
|
52 | 54 | {:key :divider-2
|
53 | 55 | :type :separator}
|
54 | 56 | {:key :save
|
55 | 57 | :label "Save"
|
56 | 58 | :icon "save"
|
57 | 59 | :action [::document.e/save]
|
58 |
| - :disabled? [::document.s/active-saved?]} |
| 60 | + :disabled? (or (not @(rf/subscribe [::document.s/documents?])) |
| 61 | + @(rf/subscribe [::document.s/active-saved?]))} |
59 | 62 | {:key :save-as
|
60 | 63 | :label "Save as…"
|
61 | 64 | :icon "save-as"
|
62 |
| - :action [::document.e/save-as]} |
| 65 | + :action [::document.e/save-as] |
| 66 | + :disabled? (not @(rf/subscribe [::document.s/documents?]))} |
63 | 67 | {:key :download
|
64 | 68 | :icon "download"
|
65 | 69 | :label "Download"
|
| 70 | + :disabled? (not @(rf/subscribe [::document.s/documents?])) |
66 | 71 | :action [::document.e/download]}
|
67 | 72 | {:key :divider-3
|
68 | 73 | :type :separator}
|
69 | 74 | {:key :export
|
70 | 75 | :label "Export as SVG"
|
71 | 76 | :icon "export"
|
| 77 | + :disabled? (not @(rf/subscribe [::document.s/documents?])) |
72 | 78 | :action [::element.e/export]}
|
73 | 79 | {:key :divider-4
|
74 | 80 | :type :separator}
|
75 | 81 | {:key :close
|
76 | 82 | :label "Close"
|
77 | 83 | :icon "times"
|
| 84 | + :disabled? (not @(rf/subscribe [::document.s/documents?])) |
78 | 85 | :action [::document.e/close-active]}
|
79 | 86 | {:key :exit
|
80 | 87 | :label "Exit"
|
|
86 | 93 | {:key :edit
|
87 | 94 | :label "Edit"
|
88 | 95 | :type :root
|
| 96 | + :disabled? (not @(rf/subscribe [::document.s/documents?])) |
89 | 97 | :items [{:key :undo
|
90 | 98 | :label "Undo"
|
91 | 99 | :icon "undo"
|
| 100 | + :disabled? (not @(rf/subscribe [::history.s/undos?])) |
92 | 101 | :action [::history.e/undo]}
|
93 | 102 | {:key :redo
|
94 | 103 | :label "Redo"
|
95 | 104 | :icon "redo"
|
| 105 | + :disabled? (not @(rf/subscribe [::history.s/redos?])) |
96 | 106 | :action [::history.e/redo]}
|
97 | 107 | {:key :divider-1
|
98 | 108 | :type :separator}
|
99 | 109 | {:key :cut
|
100 | 110 | :label "Cut"
|
| 111 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
101 | 112 | :action [::element.e/cut]}
|
102 | 113 | {:key :copy
|
103 | 114 | :icon "copy"
|
104 | 115 | :label "Copy"
|
| 116 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
105 | 117 | :action [::element.e/copy]}
|
106 | 118 | {:key :paste
|
107 | 119 | :label "Paste"
|
|
120 | 132 | {:key :duplicate
|
121 | 133 | :icon "copy"
|
122 | 134 | :label "Duplicate"
|
| 135 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
123 | 136 | :action [::element.e/duplicate-in-place]}
|
124 | 137 | {:key :divider-3
|
125 | 138 | :type :separator}
|
|
130 | 143 | {:key :deselect-all
|
131 | 144 | :icon "deselect-all"
|
132 | 145 | :label "Deselect all"
|
| 146 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
133 | 147 | :action [::element.e/deselect-all]}
|
134 | 148 | {:key :invert-selection
|
135 | 149 | :label "Invert selection"
|
136 | 150 | :action [::element.e/invert-selection]}
|
137 | 151 | {:key :select-same-tags
|
138 | 152 | :icon "select-same"
|
139 | 153 | :label "Select same tags"
|
| 154 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
140 | 155 | :action [::element.e/select-same-tags]}
|
141 | 156 | {:key :divider-4
|
142 | 157 | :type :separator}
|
143 | 158 | {:key :delete
|
144 | 159 | :icon "delete"
|
145 | 160 | :label "Delete"
|
| 161 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
146 | 162 | :action [::element.e/delete]}]})
|
147 | 163 |
|
148 | 164 | (defn align-submenu
|
149 | 165 | []
|
150 | 166 | [{:key :align-left
|
151 | 167 | :label "Left"
|
152 | 168 | :icon "objects-align-left"
|
| 169 | + :disabled @(rf/subscribe [::element.s/top-level?]) |
153 | 170 | :action [::element.e/align :left]}
|
154 | 171 | {:key :align-center-horizontally
|
155 | 172 | :label "Center horizontally"
|
|
235 | 252 | {:key :object
|
236 | 253 | :label "Object"
|
237 | 254 | :type :root
|
| 255 | + :disabled? (not @(rf/subscribe [::document.s/documents?])) |
238 | 256 | :items [{:key :to-path
|
239 | 257 | :label "Object to path"
|
| 258 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
240 | 259 | :action [::element.e/->path]}
|
241 | 260 | {:key :stroke-to-path
|
242 | 261 | :label "Stroke to path"
|
| 262 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
243 | 263 | :action [::element.e/stroke->path]}
|
244 | 264 | {:key :divider-1
|
245 | 265 | :type :separator}
|
246 | 266 | {:key :group
|
247 | 267 | :label "Group"
|
248 | 268 | :icon "group"
|
| 269 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
249 | 270 | :action [::element.e/group]}
|
250 | 271 | {:key :ungroup
|
251 | 272 | :label "Ungroup"
|
252 | 273 | :icon "ungroup"
|
| 274 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
253 | 275 | :action [::element.e/ungroup]}
|
254 | 276 | {:key :divider-2
|
255 | 277 | :type :separator}
|
256 | 278 | {:key :lock
|
257 | 279 | :label "Lock"
|
258 | 280 | :icon "lock"
|
| 281 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
259 | 282 | :action [::element.e/lock]}
|
260 | 283 | {:key :unlock
|
261 | 284 | :label "Unlock"
|
262 | 285 | :icon "unlock"
|
| 286 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
263 | 287 | :action [::element.e/unlock]}
|
264 | 288 | {:key :divider-3
|
265 | 289 | :type :separator}
|
266 | 290 | {:key :path
|
267 | 291 | :label "Align"
|
268 | 292 | :type :sub-menu
|
| 293 | + :disabled? @(rf/subscribe [::element.s/top-level?]) |
269 | 294 | :items (align-submenu)}
|
270 | 295 | {:key :boolean
|
271 | 296 | :label "Animate"
|
272 | 297 | :type :sub-menu
|
| 298 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
273 | 299 | :items (animate-submenu)}
|
274 | 300 | {:key :boolean
|
275 | 301 | :label "Boolean operation"
|
276 | 302 | :type :sub-menu
|
| 303 | + :disabled? (not @(rf/subscribe [::element.s/multiple-selected?])) |
277 | 304 | :items (boolean-submenu)}
|
278 | 305 | {:key :divider-4
|
279 | 306 | :type :separator}
|
280 | 307 | {:key :raise
|
281 | 308 | :label "Raise"
|
282 | 309 | :icon "bring-forward"
|
| 310 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
283 | 311 | :action [::element.e/raise]}
|
284 | 312 | {:key :lower
|
285 | 313 | :label "Lower"
|
286 | 314 | :icon "send-backward"
|
| 315 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
287 | 316 | :action [::element.e/lower]}
|
288 | 317 | {:key :raise-to-top
|
289 | 318 | :label "Raise to top"
|
290 | 319 | :icon "bring-front"
|
| 320 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
291 | 321 | :action [::element.e/raise-to-top]}
|
292 | 322 | {:key :lower-to-bottom
|
293 | 323 | :label "Lower to bottom"
|
294 | 324 | :icon "send-back"
|
| 325 | + :disabled? (not @(rf/subscribe [::element.s/selected?])) |
295 | 326 | :action [::element.e/lower-to-bottom]}
|
296 | 327 | {:key :divider-5
|
297 | 328 | :type :separator}
|
|
392 | 423 | {:key :view
|
393 | 424 | :label "View"
|
394 | 425 | :type :root
|
| 426 | + :disabled? (not @(rf/subscribe [::document.s/documents?])) |
395 | 427 | :items [{:key :zoom
|
396 | 428 | :label "Zoom"
|
397 | 429 | :type :sub-menu
|
|
497 | 529 | [:> Menubar/Sub
|
498 | 530 | [:> Menubar/SubTrigger
|
499 | 531 | {:class "sub-menu-item menu-item"
|
500 |
| - :disabled (when disabled? @(rf/subscribe disabled?))} |
| 532 | + :disabled disabled?} |
501 | 533 | label
|
502 | 534 | [:div.right-slot.sub-menu-chevron
|
503 | 535 | [comp/icon "chevron-right" {:class "icon small"}]]]
|
|
509 | 541 | (map menu-item items))]])
|
510 | 542 |
|
511 | 543 | (defmethod menu-item :root
|
512 |
| - [{:keys [label items key action]}] |
| 544 | + [{:keys [label items key action disabled?]}] |
513 | 545 | [:> Menubar/Menu
|
514 | 546 | [:> Menubar/Trigger
|
515 | 547 | {:class "menubar-trigger"
|
516 | 548 | :id (name key)
|
| 549 | + :disabled disabled? |
517 | 550 | :on-click (when action #(rf/dispatch action))
|
518 | 551 | :on-key-down (fn [e]
|
519 | 552 | ; FIXME: Doesn't work when the menu content is open.
|
|
534 | 567 | {:class "menu-item"
|
535 | 568 | :onSelect #(do (rf/dispatch action)
|
536 | 569 | (rf/dispatch [:focus nil]))
|
537 |
| - :disabled (when disabled? @(rf/subscribe disabled?))} |
| 570 | + :disabled disabled?} |
538 | 571 | label
|
539 | 572 | [:div.right-slot
|
540 | 573 | [comp/shortcuts action]]])
|
|
0 commit comments