diff --git a/.clj-kondo/metosin/malli-types-cljs/config.edn b/.clj-kondo/metosin/malli-types-cljs/config.edn index 309427e7..c582d625 100644 --- a/.clj-kondo/metosin/malli-types-cljs/config.edn +++ b/.clj-kondo/metosin/malli-types-cljs/config.edn @@ -1,144 +1,144 @@ {:linters {:unresolved-symbol {:exclude [(malli.core/=>)]}, :type-mismatch {:namespaces {renderer.utils.element {snapping-points {:arities {2 {:args [{:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}} :set], :ret :seqable}}}, attributes {:arities {1 {:args [{:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}}], :ret :map}}}, supported-attr? {:arities {2 {:args [{:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}} :keyword], :ret :boolean}}}, style->map {:arities {1 {:args [:map], :ret :any}}}, ->path {:arities {1 {:args [{:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}}], :ret {:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}}}}}, attrs-map {:arities {1 {:args [:any], :ret :map}}}, root? {:arities {1 {:args [{:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}}], :ret :boolean}}}, stroke->path {:arities {1 {:args [{:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}}], :ret {:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}}}}}, united-bounds {:arities {1 {:args [:sequential], :ret :nilable/seqable}}}, offset {:arities {1 {:args [{:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}}], :ret :seqable}}}, svg? {:arities {1 {:args [{:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}}], :ret :boolean}}}, wrap-to-svg {:arities {2 {:args [:string :seqable], @@ -147,16 +147,16 @@ ->string {:arities {1 {:args [:any], :ret :string}}}, container? {:arities {1 {:args [{:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}}], :ret :boolean}}}}, renderer.ui {icon {:arities {:varargs {:args [:string {:op :rest, :spec :map}], @@ -184,6 +184,7 @@ {:op :keys, :req {:buttons :nilable/keyword, :pressure :nilable/number, + :primary :boolean, :element :any, :button :nilable/keyword, :type :string, @@ -191,8 +192,7 @@ :pointer-id :number, :modifiers :set, :pointer-type :string, - :target :any, - :primary? :boolean}} + :target :any}} :number], :ret :any}}}, wheel-handler {:arities {2 {:args [:any @@ -316,7 +316,7 @@ :save :any, :version :string, :temp-element :map, - :focused? :boolean}, + :focused :boolean}, :req {:ignored-ids :set, :zoom :any, :stroke :string, @@ -433,16 +433,16 @@ renderer.tool.transform.select {hovered? {:arities {3 {:args [:any {:op :keys, :opt {:children :vector, - :visible? :boolean, + :selected :boolean, :parent :any, :content :string, :type :any, :bounds :seqable, + :locked :boolean, :label :string, :id :any, - :locked? :boolean, :attrs :map, - :selected? :boolean}, + :visible :boolean}, :req {:tag :any}} :boolean], :ret :boolean}}}, @@ -466,7 +466,7 @@ {:op :keys, :opt {:title :any, :content :any, - :close-button? :boolean, + :close-button :boolean, :attrs {:op :keys, :opt {:as-child :boolean, :force-mount :boolean, diff --git a/src/renderer/app/db.cljs b/src/renderer/app/db.cljs index 802d5e9d..ead86622 100644 --- a/src/renderer/app/db.cljs +++ b/src/renderer/app/db.cljs @@ -8,6 +8,7 @@ [renderer.document.db :refer [Document]] [renderer.element.db :refer [Element Handle]] [renderer.notification.db :refer [Notification]] + [renderer.ruler.db :refer [Ruler]] [renderer.snap.db :refer [Snap]] [renderer.theme.db :refer [Theme]] [renderer.timeline.db :refer [Timeline]] @@ -17,13 +18,13 @@ [renderer.window.db :refer [Window]])) (def Panels - [:map-of {:default {:tree {:visible? true} - :properties {:visible? true} - :timeline {:visible? false} - :xml {:visible? false} - :history {:visible? false} - :repl-history {:visible? false}}} - keyword? [:map [:visible? boolean?]]]) + [:map-of {:default {:tree {:visible true} + :properties {:visible true} + :timeline {:visible false} + :xml {:visible false} + :history {:visible false} + :repl-history {:visible false}}} + keyword? [:map [:visible boolean?]]]) (def DomRect [:map {:closed true} @@ -54,30 +55,28 @@ [:pointer-offset {:optional true} Vec2D] [:adjusted-pointer-pos {:default [0 0]} Vec2D] [:adjusted-pointer-offset {:optional true} Vec2D] - [:drag? {:optional true} boolean?] + [:drag {:optional true} boolean?] [:zoom-sensitivity {:default 0.75} [:and number? pos?]] [:event-time {:optional true} number?] [:double-click-delta {:default 250} [:and number? pos?]] [:state {:default :default} State] - [:grid-visible? {:default false :persist true} boolean?] - [:rulers-visible? {:default true :persist true} boolean?] + [:grid {:default false :persist true} boolean?] + [:ruler {:persist true} Ruler] [:snap {:persist true} Snap] [:active-document {:optional true :persist true} [:maybe uuid?]] [:cursor {:default "default"} string?] [:dom-rect {:optional true} DomRect] - [:rulers-locked? {:default false} boolean?] [:dialogs {:default []} [:vector Dialog]] [:documents {:default {} :persist true} [:map-of uuid? Document]] [:document-tabs {:default [] :persist true} [:vector uuid?]] [:recent {:max 10 :default [] :persist true} [:vector string?]] [:drag-threshold {:default 1} number?] - [:ruler-size {:default 23} number?] [:system-fonts {:optional true} vector?] [:notifications {:default []} [:* Notification]] - [:debug-info? {:default false} boolean?] - [:pen-mode? {:default false} boolean?] - [:backdrop? {:default false} boolean?] - [:loading? {:default false} boolean?] + [:debug-info {:default false} boolean?] + [:pen-mode {:default false} boolean?] + [:backdrop {:default false} boolean?] + [:loading {:default false} boolean?] [:explanation {:optional true} string?] [:lang {:default :en-Us :persist true} Lang] [:repl-mode {:default :cljs} keyword?] diff --git a/src/renderer/app/events.cljs b/src/renderer/app/events.cljs index c5bdc8e2..3088bd0b 100644 --- a/src/renderer/app/events.cljs +++ b/src/renderer/app/events.cljs @@ -75,36 +75,25 @@ (rf/reg-event-db ::toggle-debug-info (fn [db [_]] - (update db :debug-info? not))) + (update db :debug-info not))) (rf/reg-event-db ::set-backdrop - (fn [db [_ visible?]] - (assoc db :backdrop? visible?))) - -(rf/reg-event-db - ::toggle-rulers - persist - (fn [db [_]] - (update db :rulers-visible? not))) - -(rf/reg-event-db - ::toggle-rulers-locked - (fn [db [_]] - (update db :rulers-locked? not))) + (fn [db [_ visible]] + (assoc db :backdrop visible))) (rf/reg-event-db ::toggle-grid persist (fn [db [_]] - (update db :grid-visible? not))) + (update db :grid not))) (rf/reg-event-db ::toggle-panel [persist (rf/path :panels)] (fn [db [_ k]] - (update-in db [k :visible?] not))) + (update-in db [k :visible] not))) (rf/reg-event-fx ::pointer-event diff --git a/src/renderer/app/handlers.cljs b/src/renderer/app/handlers.cljs index 3096b98e..5d767a26 100644 --- a/src/renderer/app/handlers.cljs +++ b/src/renderer/app/handlers.cljs @@ -35,7 +35,7 @@ (mx/defn pointer-handler [db, e :- PointerEvent, now :- number?] - (let [{:keys [pointer-offset tool dom-rect drag? primary-tool drag-threshold]} db + (let [{:keys [pointer-offset tool dom-rect drag primary-tool drag-threshold]} db {:keys [button buttons pointer-pos]} e adjusted-pointer-pos (frame.h/adjust-pointer-pos db pointer-pos)] (case (:type e) @@ -46,10 +46,10 @@ (not= tool :pan) (frame.h/pan-out-of-canvas dom-rect pointer-pos pointer-offset) - (not drag?) + (not drag) (-> (tool.hierarchy/drag-start e) (add-fx [::fx/set-pointer-capture (:pointer-id e)]) - (assoc :drag? true)) + (assoc :drag true)) :always (tool.hierarchy/drag e)) @@ -72,7 +72,7 @@ (tool.hierarchy/pointer-down e)) "pointerup" - (cond-> (if drag? + (cond-> (if drag (-> (tool.hierarchy/drag-end db e) (add-fx [::fx/release-pointer-capture (:pointer-id e)])) (if (= button :right) @@ -87,7 +87,7 @@ (dissoc :primary-tool)) :always - (-> (dissoc :pointer-offset :drag?) + (-> (dissoc :pointer-offset :drag) (update :snap dissoc :nearest-neighbor))) db))) diff --git a/src/renderer/app/subs.cljs b/src/renderer/app/subs.cljs index a530d544..275f53df 100644 --- a/src/renderer/app/subs.cljs +++ b/src/renderer/app/subs.cljs @@ -32,16 +32,12 @@ :-> :pivot-point) (rf/reg-sub - ::drag? - :-> :drag?) + ::drag + :-> :drag) (rf/reg-sub - ::ruler-size - :-> :ruler-size) - -(rf/reg-sub - ::loading? - :-> :loading?) + ::loading + :-> :loading) (rf/reg-sub ::cursor @@ -107,12 +103,12 @@ (merge css-property webref-css-property)))) (rf/reg-sub - ::backdrop? - :-> :backdrop?) + ::backdrop + :-> :backdrop) (rf/reg-sub - ::debug-info? - :-> :debug-info?) + ::debug-info + :-> :debug-info) (rf/reg-sub ::clicked-element @@ -141,21 +137,13 @@ :-> :lang) (rf/reg-sub - ::rulers-locked? - :-> :rulers-locked?) - -(rf/reg-sub - ::rulers-visible? - :-> :rulers-visible?) - -(rf/reg-sub - ::grid-visible? - :-> :grid-visible?) + ::grid + :-> :grid) (rf/reg-sub - ::panel-visible? + ::panel-visible (fn [db [_ k]] - (-> db :panels k :visible?))) + (-> db :panels k :visible))) (rf/reg-sub ::font-options diff --git a/src/renderer/app/views.cljs b/src/renderer/app/views.cljs index 73680d70..8d22a7a1 100644 --- a/src/renderer/app/views.cljs +++ b/src/renderer/app/views.cljs @@ -19,6 +19,8 @@ [renderer.history.views :as history.v] [renderer.notification.views :as notification] [renderer.reepl.views :as repl.v] + [renderer.ruler.events :as-alias ruler.e] + [renderer.ruler.subs :as-alias ruler.s] [renderer.ruler.views :as ruler.v] [renderer.timeline.views :as timeline.v] [renderer.tool.hierarchy :as tool.hierarchy] @@ -33,34 +35,36 @@ (defn frame-panel [] - (let [rulers? @(rf/subscribe [::app.s/rulers-visible?]) - read-only? @(rf/subscribe [::document.s/read-only?]) - ruler-size @(rf/subscribe [::app.s/ruler-size]) - rulers-locked? @(rf/subscribe [::app.s/rulers-locked?])] + (let [ruler-visible @(rf/subscribe [::ruler.s/visible]) + read-only @(rf/subscribe [::document.s/read-only]) + ruler-size @(rf/subscribe [::ruler.s/size]) + ruler-locked @(rf/subscribe [::ruler.s/locked])] [:div.flex.flex-col.flex-1.h-full.gap-px [:div [ui/scroll-area [toolbar.tools/root]] - (when rulers? + (when ruler-visible [:div.flex.gap-px - [:div.bg-primary {:style {:width ruler-size :height ruler-size}} + [:div.bg-primary + {:style {:width ruler-size + :height ruler-size}} [ui/icon-button - (if rulers-locked? "lock" "unlock") + (if ruler-locked "lock" "unlock") {:class "small hidden" - :title (if rulers-locked? "unlock" "lock") - :on-click #(rf/dispatch [::e/toggle-rulers-locked])}]] + :title (if ruler-locked "unlock" "lock") + :on-click #(rf/dispatch [::ruler.e/toggle-locked])}]] [:div.bg-primary.flex-1 [ruler.v/ruler :horizontal]]])] [:div.flex.flex-1.relative.gap-px - (when rulers? + (when ruler-visible [:div.bg-primary [ruler.v/ruler :vertical]]) [:div.relative.grow.flex [frame.v/root] - (if read-only? + (if read-only [:div.absolute.inset-0.border-4.border-accent] - (when @(rf/subscribe [::app.s/debug-info?]) + (when @(rf/subscribe [::app.s/debug-info]) [overlay/debug-info])) - (when @(rf/subscribe [::app.s/backdrop?]) + (when @(rf/subscribe [::app.s/backdrop]) [:div.absolute.inset-0 {:on-click #(rf/dispatch [::e/set-backdrop false])}])]]])) @@ -76,7 +80,7 @@ {:id "frame-panel" :order 1} [frame-panel]] - (when @(rf/subscribe [::app.s/panel-visible? :history]) + (when @(rf/subscribe [::app.s/panel-visible :history]) [:<> [:> PanelResizeHandle {:id "history-resize-handle" @@ -88,7 +92,7 @@ [:div.bg-primary.h-full [history.v/root]]]]) - (when @(rf/subscribe [::app.s/panel-visible? :xml]) + (when @(rf/subscribe [::app.s/panel-visible :xml]) (let [xml @(rf/subscribe [::element.s/xml])] [:<> [:> PanelResizeHandle @@ -108,7 +112,7 @@ (defn editor [] - (let [timeline? @(rf/subscribe [::app.s/panel-visible? :timeline])] + (let [timeline-visible @(rf/subscribe [::app.s/panel-visible :timeline])] [:> PanelGroup {:direction "vertical" :id "editor-group" @@ -118,11 +122,11 @@ :order 1} [center-top-group]] [toolbar.status/root] - (when timeline? + (when timeline-visible [:> PanelResizeHandle {:id "timeline-resize-handle" :className "resize-handle"}]) - (when timeline? + (when timeline-visible [:> Panel {:id "timeline-panel" :minSize 10 @@ -246,34 +250,33 @@ (defn root [] - (let [properties-panel? @(rf/subscribe [::app.s/panel-visible? :properties])] - [:> Tooltip/Provider - [:div.flex.flex-col.flex-1.h-dvh.overflow-hidden - [window.v/app-header] - (if (seq @(rf/subscribe [::app.s/documents])) - [:div.flex.h-full.flex-1.overflow-hidden.gap-px - (when @(rf/subscribe [::app.s/panel-visible? :tree]) - [:div.flex-col.hidden.md:flex.overflow-hidden - {:style {:width "227px"}} - [document.v/actions] - [tree.v/root]]) - [:div.flex.flex-col.flex-1.overflow-hidden.h-full - [document.v/tab-bar] - [:div.flex.h-full.flex-1.gap-px.overflow-hidden - [:div.flex.h-full.flex-col.flex-1.overflow-hidden - [editor]] - [:div.flex - (when properties-panel? - [:div.hidden.md:flex - [:div.flex.flex-col.h-full.w-80 - [ui/scroll-area - (tool.hierarchy/right-panel @(rf/subscribe [::app.s/tool]))] - [:div.bg-primary.grow.flex.mr-px]]]) - [:div.bg-primary.flex - [ui/scroll-area [toolbar.object/root]]]]]]] - [home])] - [dialog.v/root] - [notification/main] - (when @(rf/subscribe [::app.s/loading?]) - [:div.absolute.inset-0.backdrop - [:div.loader]])])) + [:> Tooltip/Provider + [:div.flex.flex-col.flex-1.h-dvh.overflow-hidden + [window.v/app-header] + (if (seq @(rf/subscribe [::app.s/documents])) + [:div.flex.h-full.flex-1.overflow-hidden.gap-px + (when @(rf/subscribe [::app.s/panel-visible :tree]) + [:div.flex-col.hidden.md:flex.overflow-hidden + {:style {:width "227px"}} + [document.v/actions] + [tree.v/root]]) + [:div.flex.flex-col.flex-1.overflow-hidden.h-full + [document.v/tab-bar] + [:div.flex.h-full.flex-1.gap-px.overflow-hidden + [:div.flex.h-full.flex-col.flex-1.overflow-hidden + [editor]] + [:div.flex + (when @(rf/subscribe [::app.s/panel-visible :properties]) + [:div.hidden.md:flex + [:div.flex.flex-col.h-full.w-80 + [ui/scroll-area + (tool.hierarchy/right-panel @(rf/subscribe [::app.s/tool]))] + [:div.bg-primary.grow.flex.mr-px]]]) + [:div.bg-primary.flex + [ui/scroll-area [toolbar.object/root]]]]]]] + [home])] + [dialog.v/root] + [notification/main] + (when @(rf/subscribe [::app.s/loading]) + [:div.absolute.inset-0.backdrop + [:div.loader]])]) diff --git a/src/renderer/attribute/views.cljs b/src/renderer/attribute/views.cljs index 14fda21d..9438b721 100644 --- a/src/renderer/attribute/views.cljs +++ b/src/renderer/attribute/views.cljs @@ -196,13 +196,13 @@ (let [clicked-element @(rf/subscribe [::app.s/clicked-element]) property @(rf/subscribe [::app.s/property k]) dispatch-tag (if (contains? (methods hierarchy/description) [tag k]) tag :default) - active? (and (= (:type clicked-element) :handle) + active (and (= (:type clicked-element) :handle) (= (:key clicked-element) key))] [:> HoverCard/Root [:> HoverCard/Trigger [:label.w-28.truncate {:for (name k) - :class (when active? "text-active")} k]] + :class (when active "text-active")} k]] [:> HoverCard/Portal [:> HoverCard/Content {:side "left" @@ -219,14 +219,14 @@ [:> HoverCard/Arrow {:class "popover-arrow"}]]]])) (defn row - [k v locked? tag] + [k v locked tag] (let [property @(rf/subscribe [::app.s/property k]) initial (:initial property) dispatch-tag (if (contains? (methods hierarchy/form-element) [tag k]) tag :default)] [:<> [label tag k] [:div.flex.w-full - [hierarchy/form-element dispatch-tag k v {:disabled locked? + [hierarchy/form-element dispatch-tag k v {:disabled locked :placeholder initial}]]])) (defn tag-info @@ -257,7 +257,7 @@ (let [selected-elements @(rf/subscribe [::element.s/selected]) selected-tags @(rf/subscribe [::element.s/selected-tags]) selected-attrs @(rf/subscribe [::element.s/selected-attrs]) - locked? @(rf/subscribe [::element.s/selected-locked?]) + locked @(rf/subscribe [::element.s/selected-locked]) tag (first selected-tags)] (when-first [el selected-elements] [:div.pr-px @@ -272,6 +272,6 @@ [:div.grid.grid-cols-2.grid-flow-row.my-px.w-full.gap-px {:style {:grid-template-columns "minmax(100px, auto) 1fr"}} (for [[k v] selected-attrs] - ^{:key k} [row k v locked? tag])]]))) + ^{:key k} [row k v locked tag])]]))) (defmethod tool.hierarchy/right-panel :default [] [form]) diff --git a/src/renderer/core.cljs b/src/renderer/core.cljs index 6694e20f..84576c7d 100644 --- a/src/renderer/core.cljs +++ b/src/renderer/core.cljs @@ -112,7 +112,7 @@ (rf/dispatch-sync [::app.e/set-lang platform/system-language]) (rf/dispatch-sync [::app.e/load-local-db]) (rf/dispatch-sync [::document.e/init]) - (rf/dispatch-sync [::theme.e/set-native-mode (theme.fx/native theme.fx/native-query)]) + (rf/dispatch-sync [::theme.e/set-native-mode (theme.fx/native-mode! theme.fx/native-query!)]) (rf/dispatch-sync [::theme.e/add-native-listener]) (rf/dispatch-sync [::theme.e/set-document-attr]) (rf/dispatch-sync [::app.e/set-mdn (js->clj mdn :keywordize-keys true)]) diff --git a/src/renderer/dialog/db.cljs b/src/renderer/dialog/db.cljs index ecb55d30..18a4e93d 100644 --- a/src/renderer/dialog/db.cljs +++ b/src/renderer/dialog/db.cljs @@ -6,7 +6,7 @@ [:map [:title {:optional true} Hiccup] [:content {:optional true} any?] - [:close-button? {:optional true} boolean?] + [:close-button {:optional true} boolean?] [:attrs {:optional true} [:map [:as-child {:optional true :default false} boolean?] [:force-mount {:optional true} boolean?] [:on-open-auto-focus {:optional true} fn?] diff --git a/src/renderer/dialog/events.cljs b/src/renderer/dialog/events.cljs index a6b332d2..dd8e4d72 100644 --- a/src/renderer/dialog/events.cljs +++ b/src/renderer/dialog/events.cljs @@ -18,14 +18,14 @@ ::about (fn [db [_]] (h/create db {:title config/app-name - :close-button? true + :close-button true :content [v/about]}))) (rf/reg-event-db ::confirmation (fn [db [_ data]] (h/create db {:title (:title data) - :close-button? true + :close-button true :content (v/confirmation data)}))) (rf/reg-event-db diff --git a/src/renderer/dialog/views.cljs b/src/renderer/dialog/views.cljs index d17c717b..53de05a1 100644 --- a/src/renderer/dialog/views.cljs +++ b/src/renderer/dialog/views.cljs @@ -121,7 +121,7 @@ (cond->> title (string? title) (into [:div.text-xl.pl-5.pr-10.pt-5]))]) - (when (:close-button? (last dialogs)) + (when (:close-button (last dialogs)) [:> Dialog/Close {:class "close-button small" :aria-label "Close"} diff --git a/src/renderer/document/db.cljs b/src/renderer/document/db.cljs index 0e840772..570b52df 100644 --- a/src/renderer/document/db.cljs +++ b/src/renderer/document/db.cljs @@ -24,7 +24,7 @@ [:temp-element {:optional true} map?] ; REVIEW [:pan {:default [0 0]} Vec2D] [:elements {:default {} :persist true} [:map-of uuid? Element]] - [:focused? {:optional true} boolean?]]) + [:focused {:optional true} boolean?]]) (def PersistedDocument (->> Document diff --git a/src/renderer/document/events.cljs b/src/renderer/document/events.cljs index 3238870e..1b4ca5f5 100644 --- a/src/renderer/document/events.cljs +++ b/src/renderer/document/events.cljs @@ -101,7 +101,7 @@ (-> db (h/set-active id) (dialog.h/create {:title "Do you want to save your changes?" - :close-button? true + :close-button true :content [dialog.v/save (get-in db [:documents id])] :attrs {:onOpenAutoFocus dom/prevent-default!}}))))) @@ -204,10 +204,10 @@ (finalize "Load document")] (fn [{:keys [db guid]} [_ document]] (let [migrated-document (compatibility/migrate-document document) - migrated? (not= document migrated-document) - document (assoc document :id guid)] + migrated (not= document migrated-document) + document (assoc migrated-document :id guid)] {:db (h/load db document) - :dispatch (when (not migrated?) [::saved document])}))) + :dispatch (when (not migrated) [::saved document])}))) (rf/reg-event-fx ::load-multiple diff --git a/src/renderer/document/handlers.cljs b/src/renderer/document/handlers.cljs index 89cbdebd..dbc86eb1 100644 --- a/src/renderer/document/handlers.cljs +++ b/src/renderer/document/handlers.cljs @@ -17,7 +17,7 @@ ([db, id :- uuid?] (let [document (-> (get-in db [:documents id]) (assoc :version (:version db)))] - (reduce #(update-in %1 [:elements %2] dissoc :selected?) + (reduce #(update-in %1 [:elements %2] dissoc :selected) (m/decode PersistedDocument document mt/strip-extra-keys-transformer) (keys (:elements document)))))) @@ -48,10 +48,10 @@ (cond-> db (and active-document (-> db :dom-rect) - (-> db :window :focused?) - (not (get-in db [:documents (:active-document db) :focused?]))) + (-> db :window :focused) + (not (get-in db [:documents (:active-document db) :focused]))) (-> (frame.h/focus-bounds :original) - (assoc-in [:documents active-document :focused?] true)))) + (assoc-in [:documents active-document :focused] true)))) (mx/defn set-active [db, id :- uuid?] diff --git a/src/renderer/document/subs.cljs b/src/renderer/document/subs.cljs index c381858d..6a47ce7b 100644 --- a/src/renderer/document/subs.cljs +++ b/src/renderer/document/subs.cljs @@ -12,12 +12,12 @@ (-> db :recent reverse))) (rf/reg-sub - ::documents? + ::some-documents :<- [::app.s/documents] seq) (rf/reg-sub - ::recent? + ::some-recent :<- [::recent] seq) @@ -75,10 +75,10 @@ :<- [::title] :<- [::path] :<- [::active] - :<- [::active-saved?] - (fn [[title path active saved?] _] + :<- [::active-saved] + (fn [[title path active saved] _] (let [title (or path title)] - (str (when (and active (not saved?)) "• ") + (str (when (and active (not saved)) "• ") (when title (str title " - ")) config/app-name)))) @@ -98,7 +98,7 @@ :-> :filter) (rf/reg-sub - ::filter-active? + ::filter-active :<- [::filter] (fn [active-filter [_ k]] (= active-filter k))) @@ -124,17 +124,17 @@ :-> :save) (rf/reg-sub - ::read-only? + ::read-only :<- [::timeline.s/time] pos?) (rf/reg-sub - ::saved? + ::saved (fn [db [_ id]] (h/saved? db id))) (rf/reg-sub - ::active-saved? + ::active-saved (fn [{:keys [active-document] :as db} [_]] (when active-document (h/saved? db active-document)))) diff --git a/src/renderer/document/views.cljs b/src/renderer/document/views.cljs index 291a19dd..e34bbe2d 100644 --- a/src/renderer/document/views.cljs +++ b/src/renderer/document/views.cljs @@ -17,8 +17,8 @@ (defn actions [] - (let [undos? @(rf/subscribe [::history.s/undos?]) - redos? @(rf/subscribe [::history.s/redos?])] + (let [some-undos @(rf/subscribe [::history.s/some-undos]) + some-redos @(rf/subscribe [::history.s/some-redos])] [:div.toolbar [ui/icon-button @@ -35,7 +35,7 @@ "save" {:title "Save" :on-click #(rf/dispatch [::document.e/save]) - :disabled @(rf/subscribe [::document.s/active-saved?])}] + :disabled @(rf/subscribe [::document.s/active-saved])}] [:span.v-divider] @@ -45,12 +45,12 @@ :width "auto" :display "flex"} :on-click #(rf/dispatch [::history.e/undo]) - :disabled (not undos?)} + :disabled (not some-undos)} [ui/icon "undo"] [history.v/select "Undo stack" @(rf/subscribe [::history.s/undos]) - (not undos?)]] + (not some-undos)]] [:button.icon-button.items-center.px-1.gap-1 {:title "Redo" @@ -58,15 +58,15 @@ :width "auto" :display "flex"} :on-click #(rf/dispatch [::history.e/redo]) - :disabled (not redos?)} + :disabled (not some-redos)} [ui/icon "redo"] [history.v/select "Redo stack" @(rf/subscribe [::history.s/redos]) - (not redos?)]]])) + (not some-redos)]]])) (mx/defn close-button - [id :- uuid?, saved? :- boolean?] + [id :- uuid?, saved :- boolean?] [:button.close.small {:key id :title "Close document" @@ -75,7 +75,7 @@ (.stopPropagation e) (rf/dispatch [::document.e/close id true]))} [ui/icon "times"] - (when-not saved? + (when-not saved [ui/icon "dot" {:class "dot"}])]) (mx/defn context-menu @@ -99,14 +99,14 @@ :disabled? (not (and path platform/electron?))}])))) (mx/defn tab - [id :- uuid?, title :- string?, active? :- boolean?] + [id :- uuid?, title :- string?, active :- boolean?] (ra/with-let [dragged-over? (ra/atom false)] - (let [saved? @(rf/subscribe [::document.s/saved? id])] + (let [saved @(rf/subscribe [::document.s/saved id])] [:> ContextMenu/Root [:> ContextMenu/Trigger [:div.tab - {:class [(when active? "active") - (when saved? "saved")] + {:class [(when active "active") + (when saved "saved")] :on-wheel #(rf/dispatch [::document.e/scroll (.-deltaY %)]) :on-pointer-down #(case (.-buttons %) 4 (rf/dispatch [::document.e/close id true]) @@ -126,7 +126,7 @@ uuid) id]))} [:span.truncate.pointer-events-none title] - [close-button id saved?]]] + [close-button id saved]]] [:> ContextMenu/Portal (into [:> ContextMenu/Content diff --git a/src/renderer/element/db.cljs b/src/renderer/element/db.cljs index fe52edf1..2e8c6d6d 100644 --- a/src/renderer/element/db.cljs +++ b/src/renderer/element/db.cljs @@ -38,9 +38,9 @@ [:label {:optional true} string?] [:parent {:optional true} uuid?] [:type {:optional true} [:= :element]] - [:visible? {:optional true} boolean?] - [:locked? {:optional true} boolean?] - [:selected? {:optional true} boolean?] + [:visible {:optional true} boolean?] + [:locked {:optional true} boolean?] + [:selected {:optional true} boolean?] [:children {:default [] :optional true} [:vector uuid?]] [:bounds {:optional true} Bounds] [:content {:optional true} string?] @@ -51,5 +51,5 @@ (def explain (m/explainer Element)) (def default (m/decode Element {:type :element - :visible? true + :visible true :children []} mt/default-value-transformer)) diff --git a/src/renderer/element/events.cljs b/src/renderer/element/events.cljs index 41565acb..24e33840 100644 --- a/src/renderer/element/events.cljs +++ b/src/renderer/element/events.cljs @@ -18,8 +18,8 @@ (rf/reg-event-db ::select [(finalize "Select element")] - (fn [db [_ id multi?]] - (h/select db id multi?))) + (fn [db [_ id multiple]] + (h/select db id multiple))) (rf/reg-event-db ::select-ids @@ -48,13 +48,13 @@ ::lock [(finalize "Lock selection")] (fn [db] - (h/assoc-prop db :locked? true))) + (h/assoc-prop db :locked true))) (rf/reg-event-db ::unlock [(finalize "Unlock selection")] (fn [db] - (h/assoc-prop db :locked? false))) + (h/assoc-prop db :locked false))) (rf/reg-event-db ::set-attr @@ -275,18 +275,18 @@ (fn [db [_ data _msg]] (-> db (h/import-svg data) - (assoc :loading? false)))) + (assoc :loading false)))) (rf/reg-event-fx ::import-svg (fn [{:keys [db]} [_ data]] - {:db (assoc db :loading? true) + {:db (assoc db :loading true) :dispatch ^:flush-dom [::import data "Import svg"]})) (rf/reg-event-fx ::import-traced-image (fn [{:keys [db]} [_ data]] - {:db (assoc db :loading? true) + {:db (assoc db :loading true) :dispatch ^:flush-dom [::import data "Trace image"]})) (rf/reg-event-db diff --git a/src/renderer/element/handlers.cljs b/src/renderer/element/handlers.cljs index ef1837f0..305f919f 100644 --- a/src/renderer/element/handlers.cljs +++ b/src/renderer/element/handlers.cljs @@ -43,11 +43,11 @@ (defn locked? [db id] - (:locked? (element db id))) + (:locked (element db id))) (defn selected [db] - (filter :selected? (vals (elements db)))) + (filter :selected (vals (elements db)))) (defn selected-ids [db] @@ -240,7 +240,7 @@ ([db] (reduce deselect db (keys (elements db)))) ([db id] - (assoc-prop db id :selected? false))) + (assoc-prop db id :selected false))) (defn expand [{:keys [active-document] :as db} id] @@ -255,17 +255,17 @@ ([db id] (-> db (expand-ancestors id) - (assoc-prop id :selected? true))) - ([db id multi?] + (assoc-prop id :selected true))) + ([db id multiple] (if (element db id) - (if multi? - (update-prop db id :selected? not) + (if multiple + (update-prop db id :selected not) (-> db deselect (select id))) (deselect db)))) (defn select-ids [db ids] - (reduce (partial-right assoc-prop :selected? true) (deselect db) ids)) + (reduce (partial-right assoc-prop :selected true) (deselect db) ids)) (defn select-all [db] @@ -310,7 +310,7 @@ (reduce (fn [db {:keys [id tag]}] (cond-> db (not (contains? #{:svg :canvas} tag)) - (update-prop id :selected? not))) + (update-prop id :selected not))) db (vals (elements db)))) @@ -540,7 +540,7 @@ (add db) (dissoc-temp))) ([db el] - (create (deselect db) (assoc el :selected? true)))) + (create (deselect db) (assoc el :selected true)))) (defn bool [path-a path-b operation] diff --git a/src/renderer/element/subs.cljs b/src/renderer/element/subs.cljs index 4fb1ea5f..3d636f7e 100644 --- a/src/renderer/element/subs.cljs +++ b/src/renderer/element/subs.cljs @@ -32,13 +32,13 @@ ::filter-visible :<- [::document.s/elements] (fn [elements [_ ks]] - (filter :visible? (mapv #(get elements %) ks)))) + (filter :visible (mapv #(get elements %) ks)))) (rf/reg-sub ::selected :<- [::document.s/elements] (fn [elements _] - (filter :selected? (vals elements)))) + (filter :selected (vals elements)))) (rf/reg-sub ::selected-descendant-ids @@ -50,9 +50,9 @@ :<- [::document.s/elements] :<- [::selected-descendant-ids] (fn [[elements selected-descendant-ids] _] - (filter #(and (not (:selected? %)) + (filter #(and (not (:selected %)) (not (contains? selected-descendant-ids (:id %))) - (:visible? %)) (vals elements)))) + (:visible %)) (vals elements)))) (rf/reg-sub ::hovered @@ -68,18 +68,18 @@ (reduce #(conj %1 (:tag %2)) #{} selected-elements))) (rf/reg-sub - ::selected? + ::some-selected :<- [::selected] seq) (rf/reg-sub - ::selected-locked? + ::selected-locked :<- [::selected] (fn [selected-elements _] - (not-any? #(not (:locked? %)) selected-elements))) + (not-any? #(not (:locked %)) selected-elements))) (rf/reg-sub - ::multiple-selected? + ::multiple-selected :<- [::selected] (fn [selected-elements _] (seq (rest selected-elements)))) @@ -87,14 +87,14 @@ (rf/reg-sub ::selected-attrs :<- [::selected] - :<- [::multiple-selected?] - (fn [[selected-elements multiple-selected?] _] + :<- [::multiple-selected] + (fn [[selected-elements multiple-selected] _] (when (seq selected-elements) (let [attrs (->> selected-elements (map utils.el/attributes) (apply utils.map/merge-common-with (fn [v1 v2] (if (= v1 v2) v1 nil)))) - attrs (if multiple-selected? + attrs (if multiple-selected (dissoc attrs :id) (sort-by (fn [[id _]] (-> (first selected-elements) @@ -140,7 +140,7 @@ (rf/reg-sub - ::top-level? + ::every-top-level :<- [::root] :<- [::ancestor-ids] (fn [[root ancestor-ids] _] diff --git a/src/renderer/frame/handlers.cljs b/src/renderer/frame/handlers.cljs index 16e52568..d94953fa 100644 --- a/src/renderer/frame/handlers.cljs +++ b/src/renderer/frame/handlers.cljs @@ -20,7 +20,7 @@ [{:keys [dom-rect] :as db}, updated-dom-rect :- DomRect] (let [offset (-> (merge-with - dom-rect updated-dom-rect) (select-keys [:width :height]))] - (if-not (-> db :window :focused?) + (if-not (-> db :window :focused) db (reduce #(pan-by %1 (mat/div [(:width offset) (:height offset)] 2) %2) db (:document-tabs db))))) diff --git a/src/renderer/history/handlers.cljs b/src/renderer/history/handlers.cljs index 16a1f26b..d78b24de 100644 --- a/src/renderer/history/handlers.cljs +++ b/src/renderer/history/handlers.cljs @@ -142,7 +142,7 @@ (defn cancel [db] (cond-> db - :always (-> (dissoc :drag? :pointer-offset :clicked-element) + :always (-> (dissoc :drag :pointer-offset :clicked-element) (tool.hierarchy/activate (:tool db)) (element.h/dissoc-temp) (swap)) diff --git a/src/renderer/history/subs.cljs b/src/renderer/history/subs.cljs index 1b1def66..6c48c2b6 100644 --- a/src/renderer/history/subs.cljs +++ b/src/renderer/history/subs.cljs @@ -9,12 +9,12 @@ h/history) (rf/reg-sub - ::undos? + ::some-undos :<- [::history] h/undos?) (rf/reg-sub - ::redos? + ::some-redos :<- [::history] h/redos?) diff --git a/src/renderer/menubar/views.cljs b/src/renderer/menubar/views.cljs index a91aa8de..680e6e32 100644 --- a/src/renderer/menubar/views.cljs +++ b/src/renderer/menubar/views.cljs @@ -13,6 +13,8 @@ [renderer.history.events :as-alias history.e] [renderer.history.subs :as-alias history.s] [renderer.menubar.filters :as filters] + [renderer.ruler.events :as-alias ruler.e] + [renderer.ruler.subs :as-alias ruler.s] [renderer.ui :as ui] [renderer.window.events :as-alias window.e] [renderer.window.subs :as-alias window.s])) @@ -51,7 +53,7 @@ {:id :recent :label "Recent" :type :sub-menu - :disabled? (not @(rf/subscribe [::document.s/recent?])) + :disabled (not @(rf/subscribe [::document.s/some-recent])) :items (recent-submenu)} {:id :divider-2 :type :separator} @@ -59,38 +61,38 @@ :label "Save" :icon "save" :action [::document.e/save] - :disabled? (or (not @(rf/subscribe [::document.s/documents?])) - @(rf/subscribe [::document.s/active-saved?]))} + :disabled (or (not @(rf/subscribe [::document.s/some-documents])) + @(rf/subscribe [::document.s/active-saved]))} {:id :save-as :label "Save as…" :icon "save-as" :action [::document.e/save-as] - :disabled? (not @(rf/subscribe [::document.s/documents?]))} + :disabled (not @(rf/subscribe [::document.s/some-documents]))} {:id :download :icon "download" :label "Download" - :disabled? (not @(rf/subscribe [::document.s/documents?])) + :disabled (not @(rf/subscribe [::document.s/some-documents])) :action [::document.e/download]} {:id :divider-3 :type :separator} {:id :export-svg :label "Export as SVG" :icon "export" - :disabled? (not @(rf/subscribe [::document.s/documents?])) + :disabled (not @(rf/subscribe [::document.s/some-documents])) :action [::element.e/export-svg]} {:id :divider-4 :type :separator} {:id :print :label "Print" :icon "printer" - :disabled? (not @(rf/subscribe [::document.s/documents?])) + :disabled (not @(rf/subscribe [::document.s/some-documents])) :action [::element.e/print]} {:id :divider-5 :type :separator} {:id :close :label "Close" :icon "window-close" - :disabled? (not @(rf/subscribe [::document.s/documents?])) + :disabled (not @(rf/subscribe [::document.s/some-documents])) :action [::document.e/close-active]} {:id :exit :label "Exit" @@ -102,28 +104,28 @@ {:id :edit :label "Edit" :type :root - :disabled? (not @(rf/subscribe [::document.s/documents?])) + :disabled (not @(rf/subscribe [::document.s/some-documents])) :items [{:id :undo :label "Undo" :icon "undo" - :disabled? (not @(rf/subscribe [::history.s/undos?])) + :disabled (not @(rf/subscribe [::history.s/some-undos])) :action [::history.e/undo]} {:id :redo :label "Redo" :icon "redo" - :disabled? (not @(rf/subscribe [::history.s/redos?])) + :disabled (not @(rf/subscribe [::history.s/some-redos])) :action [::history.e/redo]} {:id :divider-1 :type :separator} {:id :cut :label "Cut" :icon "cut" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/cut]} {:id :copy :icon "copy" :label "Copy" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/copy]} {:id :paste :label "Paste" @@ -142,7 +144,7 @@ {:id :duplicate :icon "copy" :label "Duplicate" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/duplicate-in-place]} {:id :divider-3 :type :separator} @@ -153,7 +155,7 @@ {:id :deselect-all :icon "deselect-all" :label "Deselect all" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/deselect-all]} {:id :invert-selection :label "Invert selection" @@ -162,14 +164,14 @@ {:id :select-same-tags :icon "select-same" :label "Select same tags" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/select-same-tags]} {:id :divider-4 :type :separator} {:id :delete :icon "delete" :label "Delete" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/delete]}]}) (defn align-submenu @@ -177,7 +179,7 @@ [{:id :align-left :label "Left" :icon "objects-align-left" - :disabled @(rf/subscribe [::element.s/top-level?]) + :disabled @(rf/subscribe [::element.s/every-top-level]) :action [::element.e/align :left]} {:id :align-center-horizontally :label "Center horizontally" @@ -271,79 +273,79 @@ {:id :object :label "Object" :type :root - :disabled? (not @(rf/subscribe [::document.s/documents?])) + :disabled (not @(rf/subscribe [::document.s/some-documents])) :items [{:id :to-path :label "Object to path" :icon "bezier-curve" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/->path]} {:id :stroke-to-path :label "Stroke to path" :icon "bezier-curve" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/stroke->path]} {:id :divider-1 :type :separator} {:id :group :label "Group" :icon "group" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/group]} {:id :ungroup :label "Ungroup" :icon "ungroup" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/ungroup]} {:id :divider-2 :type :separator} {:id :lock :label "Lock" :icon "lock" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/lock]} {:id :unlock :label "Unlock" :icon "unlock" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/unlock]} {:id :divider-3 :type :separator} {:id :path :label "Align" :type :sub-menu - :disabled? @(rf/subscribe [::element.s/top-level?]) + :disabled @(rf/subscribe [::element.s/every-top-level]) :items (align-submenu)} {:id :boolean :label "Animate" :type :sub-menu - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :items (animate-submenu)} {:id :boolean :label "Boolean operation" :type :sub-menu - :disabled? (not @(rf/subscribe [::element.s/multiple-selected?])) + :disabled (not @(rf/subscribe [::element.s/multiple-selected])) :items (boolean-submenu)} {:id :divider-4 :type :separator} {:id :raise :label "Raise" :icon "bring-forward" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/raise]} {:id :lower :label "Lower" :icon "send-backward" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/lower]} {:id :raise-to-top :label "Raise to top" :icon "bring-front" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/raise-to-top]} {:id :lower-to-bottom :label "Lower to bottom" :icon "send-back" - :disabled? (not @(rf/subscribe [::element.s/selected?])) + :disabled (not @(rf/subscribe [::element.s/some-selected])) :action [::element.e/lower-to-bottom]} {:id :divider-5 :type :separator} @@ -402,7 +404,7 @@ :label (name id) :type :checkbox :icon "a11y" - :checked? [::document.s/filter-active? id] + :checked @(rf/subscribe [::document.s/filter-active id]) :action [::document.e/toggle-filter id]}) filters/accessibility)) (defn panel-submenu @@ -411,37 +413,37 @@ :type :checkbox :icon "tree" :label "Element tree" - :checked? [::app.s/panel-visible? :tree] + :checked @(rf/subscribe [::app.s/panel-visible :tree]) :action [::app.e/toggle-panel :tree]} {:id :toggle-props :type :checkbox :icon "properties" :label "Properties" - :checked? [::app.s/panel-visible? :properties] + :checked @(rf/subscribe [::app.s/panel-visible :properties]) :action [::app.e/toggle-panel :properties]} {:id :toggle-xml :label "XML view" :type :checkbox :icon "code" - :checked? [::app.s/panel-visible? :xml] + :checked @(rf/subscribe [::app.s/panel-visible :xml]) :action [::app.e/toggle-panel :xml]} {:id :toggle-history :label "History tree" :icon "history" :type :checkbox - :checked? [::app.s/panel-visible? :history] + :checked @(rf/subscribe [::app.s/panel-visible :history]) :action [::app.e/toggle-panel :history]} {:id :toggle-command-history :type :checkbox :label "Shell history" :icon "shell" - :checked? [::app.s/panel-visible? :repl-history] + :checked @(rf/subscribe [::app.s/panel-visible :repl-history]) :action [::app.e/toggle-panel :repl-history]} {:id :toggle-timeline-panel :type :checkbox :label "Timeline editor" :icon "timeline" - :checked? [::app.s/panel-visible? :timeline] + :checked @(rf/subscribe [::app.s/panel-visible :timeline]) :action [::app.e/toggle-panel :timeline]} {:id :divider-2 :type :separator}]) @@ -451,7 +453,7 @@ {:id :view :label "View" :type :root - :disabled? (not @(rf/subscribe [::document.s/documents?])) + :disabled (not @(rf/subscribe [::document.s/some-documents])) :items [{:id :zoom :label "Zoom" :type :sub-menu @@ -466,19 +468,19 @@ :type :checkbox :label "Grid" :icon "grid" - :checked? [::app.s/grid-visible?] + :checked @(rf/subscribe [::app.s/grid]) :action [::app.e/toggle-grid]} - {:id :toggle-rulers + {:id :toggle-ruler :type :checkbox :label "Rulers" :icon "ruler-combined" - :checked? [::app.s/rulers-visible?] - :action [::app.e/toggle-rulers]} + :checked @(rf/subscribe [::ruler.s/visible]) + :action [::ruler.e/toggle-visible]} {:id :toggle-debug-info :type :checkbox :label "Debug info" :icon "bug" - :checked? [::app.s/debug-info?] + :checked @(rf/subscribe [::app.s/debug-info]) :action [::app.e/toggle-debug-info]} {:id :divider-2 :type :separator} @@ -492,7 +494,7 @@ :label "Fullscreen" :icon "arrow-minimize" :type :checkbox - :checked? [::window.s/fullscreen?] + :checked @(rf/subscribe [::window.s/fullscreen]) :action [::window.e/toggle-fullscreen]}]}) (defn help-menu @@ -547,11 +549,11 @@ [:> Menubar/Separator {:class "menu-separator"}]) (defmethod menu-item :checkbox - [{:keys [label action checked?]}] + [{:keys [label action checked]}] [:> Menubar/CheckboxItem {:class "menu-checkbox-item inset" - :onSelect #(rf/dispatch action) - :checked @(rf/subscribe checked?)} + :on-select #(rf/dispatch action) + :checked checked} [:> Menubar/ItemIndicator {:class "menu-item-indicator"} [ui/icon "checkmark"]] @@ -560,14 +562,15 @@ [ui/shortcuts action]]]) (defmethod menu-item :sub-menu - [{:keys [label items disabled?]}] + [{:keys [label items disabled]}] [:> Menubar/Sub [:> Menubar/SubTrigger {:class "sub-menu-item menu-item" - :disabled disabled?} + :disabled disabled} label [:div.right-slot.sub-menu-chevron - [ui/icon "chevron-right" {:class "small"}]]] + [ui/icon "chevron-right" + {:class "small"}]]] [:> Menubar/Portal (into [:> Menubar/SubContent {:class "menu-content" @@ -576,28 +579,28 @@ (map menu-item items))]]) (defmethod menu-item :root - [{:keys [label items id disabled?]}] + [{:keys [label items id disabled]}] [:> Menubar/Menu [:> Menubar/Trigger {:class "menubar-trigger" :id (name id) - :disabled disabled?} + :disabled disabled} label] [:> Menubar/Portal (into [:> Menubar/Content {:class (when items "menu-content") :align "start" - :sideOffset 3 + :side-offset 3 :loop true}] (map menu-item items))]]) (defmethod menu-item :default - [{:keys [label action disabled?]}] + [{:keys [label action disabled]}] [:> Menubar/Item {:class "menu-item" - :onSelect #(do (rf/dispatch action) - (rf/dispatch [::app.e/focus nil])) - :disabled disabled?} + :on-select #(do (rf/dispatch action) + (rf/dispatch [::app.e/focus nil])) + :disabled disabled} label [:div.right-slot [ui/shortcuts action]]]) @@ -615,5 +618,5 @@ (into [:> Menubar/Root {:class "menubar-root" :on-key-down #(.stopPropagation %) ; FIXME: Esc global action also triggered. - :onValueChange #(rf/dispatch [::app.e/set-backdrop (boolean (seq %))])}] + :on-value-change #(rf/dispatch [::app.e/set-backdrop (boolean (seq %))])}] (map menu-item (root-menu)))) diff --git a/src/renderer/reepl/codemirror.cljs b/src/renderer/reepl/codemirror.cljs index 95ec291f..94b705a9 100644 --- a/src/renderer/reepl/codemirror.cljs +++ b/src/renderer/reepl/codemirror.cljs @@ -100,15 +100,15 @@ (when-not (empty? words) {:words words :num (count words) - :active? (= (get (first words) 2) text) - :show-all? false + :active (= (get (first words) 2) text) + :show-all false :initial-text text :pos 0 :from (:start result) :to (:end result)}))) (defn cycle-pos - "Cycle through positions. Returns [active? new-pos]. + "Cycle through positions. Returns [active new-pos]. count total number of completions @@ -118,8 +118,8 @@ should we be going in reverse initial-active if false, then we return not-active when wrapping around" - [n current go-back? initial-active] - (if go-back? + [n current go-back initial-active] + (if go-back (if (>= 0 current) (if initial-active [true (dec n)] @@ -144,17 +144,17 @@ evt the triggering event. it will be `.preventDefault'd if there are completions to cycle through." - [{:keys [num pos active? from to words initial-text] :as state} + [{:keys [num pos active from to words initial-text] :as state} go-back? cm evt] (when (and state (or (< 1 (count words)) (and (< 0 (count words)) (not= initial-text (get (first words) 2))))) (.preventDefault evt) (let [initial-active (= initial-text (get (first words) 2)) - [active? pos] (if active? + [active pos] (if active (cycle-pos num pos go-back? initial-active) [true (if go-back? (dec num) pos)]) - text (if active? + text (if active (get (get words pos) 2) initial-text)] ;; TODO: don't replaceRange here, instead watch the state atom and react to @@ -162,7 +162,7 @@ (.replaceRange cm text from to) (assoc state :pos pos - :active? active? + :active active :to #js {:line (.-line from) :ch (+ (count text) (.-ch from))})))) @@ -246,7 +246,7 @@ (if (cancel-keys (.-keyCode evt)) (reset! complete-atom nil) (if (cmp-show (.-keyCode evt)) - (swap! complete-atom assoc :show-all? false) + (swap! complete-atom assoc :show-all false) (when-not (cmp-ignore (.-keyCode evt)) (reset! complete-atom (repl-hint complete-word inst nil))))))) @@ -255,7 +255,7 @@ (.stopPropagation evt) (case (.-keyCode evt) (17 18 91 93) - (swap! complete-atom assoc :show-all? true) + (swap! complete-atom assoc :show-all true) ;; tab ;; TODO: do I ever want to use TAB normally? ;; Maybe if there are no completions... diff --git a/src/renderer/reepl/views.cljs b/src/renderer/reepl/views.cljs index 249731c8..e70448be 100644 --- a/src/renderer/reepl/views.cljs +++ b/src/renderer/reepl/views.cljs @@ -23,9 +23,9 @@ (defn mode-button [mode] (let [repl-mode @(rf/subscribe [::app.s/repl-mode]) - active? (= repl-mode mode)] + active (= repl-mode mode)] [:button.button.rounded.px-1.leading-none.text-2xs.h-4 - {:class [(when active? "selected") + {:class [(when active "selected") "m-0.5"] :on-click #(rf/dispatch [::app.e/set-repl-mode mode])} mode])) @@ -40,7 +40,7 @@ :complete-word :on-change]))]} (let [{:keys [_pos _count _text]} @state - repl-history? @(rf/subscribe [::app.s/panel-visible? :repl-history])] + repl-history? @(rf/subscribe [::app.s/panel-visible :repl-history])] [:div.flex.p-0.5.items-center.m-1 [:div.flex.text-xs.self-start {:class "m-0.5"} (replumb.core/get-prompt)] ^{:key (str (hash (:js-cm-opts cm-opts)))} @@ -118,36 +118,36 @@ [repl-items items (assoc show-value-opts :set-text set-text)]]]) (defn completion-item - [_text _selected? _active? _set-active] + [_text _selected _active _set-active] (let [ref (react/createRef)] (ra/create-class {:component-did-update - (fn [this [_ _ old-selected?]] - (let [[_ _ selected?] (ra/argv this)] - (when (and (not old-selected?) - selected?) + (fn [this [_ _ old-selected]] + (let [[_ _ selected] (ra/argv this)] + (when (and (not old-selected) + selected) (dom/scroll-into-view! (.-current ref))))) :reagent-render - (fn [text selected? active? set-active] + (fn [text selected active set-active] [:div.p-1.bg-secondary.text-nowrap {:on-click set-active - :class (and selected? (if active? "bg-accent" "bg-primary")) + :class (and selected (if active "bg-accent" "bg-primary")) :ref ref} text])}))) (defn completion-list - [docs {:keys [pos words active? show-all?]} set-active] + [docs {:keys [pos words active show-all]} set-active] (let [items (map-indexed #(vector completion-item (get %2 2) (= %1 pos) - active? + active (partial set-active %1)) words)] [:div.absolute.bottom-full.left-0.w-full.text-xs.mb-px (when docs [:div.bg-primary.drop-shadow.p-4.absolute.bottom-full docs]) (into [:div.overflow-hidden.flex - {:class (when show-all? "flex-wrap")}] + {:class (when show-all "flex-wrap")}] items)])) (defn maybe-fn-docs @@ -208,7 +208,7 @@ (set-print! add-log) [:<> - (when @(rf/subscribe [::app.s/panel-visible? :repl-history]) + (when @(rf/subscribe [::app.s/panel-visible :repl-history]) [repl-items-panel @items show-value-opts set-text]) [:div.relative.whitespace-pre-wrap.font-mono @@ -217,7 +217,7 @@ @complete-atom ;; TODO: this should also replace the text.... identity - #_(swap! complete-atom assoc :pos % :active? true)] + #_(swap! complete-atom assoc :pos % :active true)] (let [_items @items] ; TODO: This needs to be removed [repl-input (s/current-text state) @@ -236,7 +236,7 @@ (defn root [] [repl - :execute #(replumb/run-repl (if (= @(rf/subscribe [::app.s/repl-mode]) :cljs) %1 (str "(js/eval \"" %1 "\")")) {:verbose @(rf/subscribe [::app.s/debug-info?])} %2) + :execute #(replumb/run-repl (if (= @(rf/subscribe [::app.s/repl-mode]) :cljs) %1 (str "(js/eval \"" %1 "\")")) {:verbose @(rf/subscribe [::app.s/debug-info])} %2) :complete-word (fn [text] (replumb/process-apropos @(rf/subscribe [::app.s/repl-mode]) text)) :get-docs replumb/process-doc :state state diff --git a/src/renderer/ruler/db.cljs b/src/renderer/ruler/db.cljs index 91845fa0..0c25d215 100644 --- a/src/renderer/ruler/db.cljs +++ b/src/renderer/ruler/db.cljs @@ -1,4 +1,10 @@ (ns renderer.ruler.db) +(def Ruler + [:map {:default {} :closed true} + [:visible {:default true} boolean?] + [:locked {:default false} boolean?] + [:size {:default 23} number?]]) + (def Direction [:enum :vertical :horizontal]) diff --git a/src/renderer/ruler/events.cljs b/src/renderer/ruler/events.cljs new file mode 100644 index 00000000..7b0e4b72 --- /dev/null +++ b/src/renderer/ruler/events.cljs @@ -0,0 +1,15 @@ +(ns renderer.ruler.events + (:require + [re-frame.core :as rf] + [renderer.app.effects :as fx :refer [persist]])) + + (rf/reg-event-db + ::toggle-visible + persist + (fn [db [_]] + (update-in db [:ruler :visible] not))) + + (rf/reg-event-db + ::toggle-locked + (fn [db [_]] + (update-in db [:ruler :locked] not))) diff --git a/src/renderer/ruler/subs.cljs b/src/renderer/ruler/subs.cljs index c7f2df7f..f977b896 100644 --- a/src/renderer/ruler/subs.cljs +++ b/src/renderer/ruler/subs.cljs @@ -6,6 +6,25 @@ [renderer.element.subs :as-alias element.s] [renderer.frame.subs :as-alias frame.s])) +(rf/reg-sub + ::ruler + :-> :ruler) + +(rf/reg-sub + ::locked + :<- [::ruler] + :-> :locked) + +(rf/reg-sub + ::visible + :<- [::ruler] + :-> :visible) + +(rf/reg-sub + ::size + :<- [::ruler] + :-> :size) + (rf/reg-sub ::step :<- [::document.s/zoom] @@ -46,7 +65,7 @@ :<- [::document.s/zoom] :<- [::document.s/pan] :<- [::element.s/bounds] - :<- [::app.s/ruler-size] + :<- [::size] (fn [[zoom pan bounds size] [_ orientation]] (let [[x1 y1 x2 y2] (map #(* % zoom) bounds)] (if (= orientation :vertical) diff --git a/src/renderer/ruler/views.cljs b/src/renderer/ruler/views.cljs index a4cdb7de..f1ae8947 100644 --- a/src/renderer/ruler/views.cljs +++ b/src/renderer/ruler/views.cljs @@ -18,7 +18,7 @@ (mx/defn pointer [orientation :- Direction] (let [[x y] @(rf/subscribe [::app.s/pointer-pos]) - ruler-size @(rf/subscribe [::app.s/ruler-size]) + ruler-size @(rf/subscribe [::ruler.s/size]) pointer-size (/ ruler-size 5) size-diff (- ruler-size pointer-size)] [:polygon {:points (str/join " " (if (= orientation :vertical) @@ -49,29 +49,28 @@ step :- number?, font-size :- number?, text :- string?] - (let [vertical? (= orientation :vertical)] - [:text {:x (if vertical? 19 (+ step 4)) - :y (if vertical? (- step 8) (+ font-size 1)) - :writing-mode (when vertical? "vertical-rl") + (let [vertical (= orientation :vertical)] + [:text {:x (if vertical 19 (+ step 4)) + :y (if vertical (- step 8) (+ font-size 1)) + :writing-mode (when vertical "vertical-rl") :fill "var(--font-color)" :font-size font-size - :rotate (when vertical? 180) + :rotate (when vertical 180) :font-family "var(--font-mono"} - (if vertical? (reverse text) text)])) + (if vertical (reverse text) text)])) (mx/defn base-lines [orientation :- Direction] (let [[x y] @(rf/subscribe [::frame.s/viewbox]) zoom @(rf/subscribe [::document.s/zoom]) steps-coll @(rf/subscribe [::ruler.s/steps-coll orientation]) - ruler-size @(rf/subscribe [::app.s/ruler-size])] + ruler-size @(rf/subscribe [::ruler.s/size])] (into [:g] (map-indexed (fn [i step] (let [adjusted-step (* zoom step) font-size 9 - vertical? (= orientation :vertical) - text (-> (+ step (if vertical? y x)) + text (-> (+ step (if (= orientation :vertical) y x)) Math/round str)] (cond @@ -98,9 +97,10 @@ (mx/defn ruler [orientation :- Direction] - (let [ruler-size @(rf/subscribe [::app.s/ruler-size])] - [:svg {:width (if (= orientation :vertical) ruler-size "100%") - :height (if (= orientation :vertical) "100%" ruler-size)} + (let [ruler-size @(rf/subscribe [::ruler.s/size]) + vertical (= orientation :vertical)] + [:svg {:width (if vertical ruler-size "100%") + :height (if vertical "100%" ruler-size)} [bounds-rect orientation] [base-lines orientation] [pointer orientation]])) @@ -111,7 +111,7 @@ [x y width height] @(rf/subscribe [::frame.s/viewbox]) [width height] (mat/add [width height] [x y]) steps-coll @(rf/subscribe [::ruler.s/steps-coll orientation]) - vertical? (= orientation :vertical)] + vertical (= orientation :vertical)] (into [:g] (map-indexed (fn [i step] @@ -119,10 +119,10 @@ step-y (+ step y) main? (zero? (rem i 10))] (when (or main? (< zoom 50)) - [:line {:x1 (if vertical? x step-x) - :y1 (if vertical? step-y y) - :x2 (if vertical? width step-x) - :y2 (if vertical? step-y height) + [:line {:x1 (if vertical x step-x) + :y1 (if vertical step-y y) + :x2 (if vertical width step-x) + :y2 (if vertical step-y height) :stroke-width (/ 1 zoom) :opacity (if main? ".3" ".1") :stroke "#777" diff --git a/src/renderer/snap/db.cljs b/src/renderer/snap/db.cljs index bdea1929..8c446787 100644 --- a/src/renderer/snap/db.cljs +++ b/src/renderer/snap/db.cljs @@ -6,7 +6,7 @@ (def Snap [:map {:default {} :closed true} - [:enabled? {:default true} boolean?] + [:active {:default true} boolean?] [:threshold {:default 15} number?] [:nearest-neighbor {:optional true} [:map [:point Vec2D] diff --git a/src/renderer/snap/events.cljs b/src/renderer/snap/events.cljs index b1f5a29f..45c770b0 100644 --- a/src/renderer/snap/events.cljs +++ b/src/renderer/snap/events.cljs @@ -8,7 +8,7 @@ ::toggle [persist] (fn [db [_]] - (update-in db [:snap :enabled?] not))) + (update-in db [:snap :active] not))) (rf/reg-event-db ::toggle-option diff --git a/src/renderer/snap/handlers.cljs b/src/renderer/snap/handlers.cljs index a5ef3d13..19522efb 100644 --- a/src/renderer/snap/handlers.cljs +++ b/src/renderer/snap/handlers.cljs @@ -23,9 +23,9 @@ clicked-element state] :as db}] (let [elements (element.h/elements db) - selected-visible (filter #(and (:visible? %) - (:selected? %)) (vals elements))] - (when (:enabled? snap) + selected-visible (filter #(and (:visible %) + (:selected %)) (vals elements))] + (when (:active snap) (cond (and (contains? #{:move :clone} state) (seq selected-visible)) (reduce (fn [points element] @@ -74,6 +74,6 @@ :always (update :snap dissoc :nearest-neighbor) - (and (:enabled? snap) nearest-neighbor) + (and (:active snap) nearest-neighbor) (-> (assoc-in [:snap :nearest-neighbor] nearest-neighbor) (snap-to-offset f (mat/sub point base-point) more))))) diff --git a/src/renderer/snap/subs.cljs b/src/renderer/snap/subs.cljs index 68d43ce5..c59176ff 100644 --- a/src/renderer/snap/subs.cljs +++ b/src/renderer/snap/subs.cljs @@ -11,9 +11,9 @@ :-> :snap) (rf/reg-sub - ::enabled? + ::active :<- [::snap] - :-> :enabled?) + :-> :active) (rf/reg-sub ::options @@ -28,10 +28,10 @@ (rf/reg-sub ::points :<- [::element.s/non-selected-visible] - :<- [::enabled?] + :<- [::active] :<- [::options] - (fn [[non-selected-visible-elements enabled? options] _] - (when enabled? + (fn [[non-selected-visible-elements active options] _] + (when active (reduce (fn [points element] (apply conj points (utils.el/snapping-points element options))) [] non-selected-visible-elements)))) diff --git a/src/renderer/snap/views.cljs b/src/renderer/snap/views.cljs index 63218442..dce27b06 100644 --- a/src/renderer/snap/views.cljs +++ b/src/renderer/snap/views.cljs @@ -44,7 +44,7 @@ [] [:button.icon-button.items-center.px-1.gap-1 {:title "Snap" - :class (when @(rf/subscribe [::snap.s/enabled?]) "selected") + :class (when @(rf/subscribe [::snap.s/active]) "selected") :style {:margin-right 0 :width "auto" :display "flex"} diff --git a/src/renderer/theme/db.cljs b/src/renderer/theme/db.cljs index 78306611..1765e5f0 100644 --- a/src/renderer/theme/db.cljs +++ b/src/renderer/theme/db.cljs @@ -3,4 +3,4 @@ (def Theme [:map {:default {} :closed true} [:mode {:default :dark} [:enum :dark :light :system]] - [:native {:optional true} [:enum :dark :light]]]) + [:native-mode {:optional true} [:enum :dark :light]]]) diff --git a/src/renderer/theme/effects.cljs b/src/renderer/theme/effects.cljs index 683a91f7..6751756d 100644 --- a/src/renderer/theme/effects.cljs +++ b/src/renderer/theme/effects.cljs @@ -2,9 +2,9 @@ (:require [re-frame.core :as rf])) -(def native-query (.matchMedia js/window "(prefers-color-scheme: dark)")) +(def native-query! (.matchMedia js/window "(prefers-color-scheme: dark)")) -(defn native +(defn native-mode! [query] (if (.-matches query) :dark :light)) @@ -16,4 +16,4 @@ (rf/reg-fx ::add-native-listener (fn [e] - (.addListener native-query #(rf/dispatch [e (native %)])))) + (.addListener native-query! #(rf/dispatch [e (native-mode! %)])))) diff --git a/src/renderer/theme/events.cljs b/src/renderer/theme/events.cljs index 4b31f904..6644a6df 100644 --- a/src/renderer/theme/events.cljs +++ b/src/renderer/theme/events.cljs @@ -13,14 +13,14 @@ ::set-document-attr (fn [{:keys [db]} _] (let [mode (-> db :theme :mode) - mode (if (= mode :system) (-> db :theme :native) mode)] + mode (if (= mode :system) (-> db :theme :native-mode) mode)] {::fx/set-document-attr (name mode)}))) (rf/reg-event-fx ::set-native-mode persist (fn [{:keys [db]} [_ mode]] - {:db (assoc-in db [:theme :native] mode) + {:db (assoc-in db [:theme :native-mode] mode) :dispatch [::set-document-attr]})) (rf/reg-event-fx diff --git a/src/renderer/timeline/subs.cljs b/src/renderer/timeline/subs.cljs index fe5aeb8f..6b4a1b24 100644 --- a/src/renderer/timeline/subs.cljs +++ b/src/renderer/timeline/subs.cljs @@ -17,16 +17,16 @@ (str "effect" (str (:id el)))) (defn animation->timeline-row - [{:keys [attrs] :as el}] + [{:keys [id attrs selected locked] :as el}] (let [start (or (:begin attrs) 0) _dur (or (:dur attrs) 0) end (or (:end attrs) nil)] - {:id (:id el) - :selected (:selected? el) - :actions [{:id (str (:id el)) - :selected (:selected? el) - :disable (:locked? el) - :movable (not (:locked? el)) + {:id id + :selected selected + :actions [{:id (str id) + :selected selected + :disable locked + :movable (not locked) :name (str/join " " [(name (:tag el)) (:attributeName attrs)]) :start start :end end diff --git a/src/renderer/timeline/views.cljs b/src/renderer/timeline/views.cljs index 01a6037c..98d0827b 100644 --- a/src/renderer/timeline/views.cljs +++ b/src/renderer/timeline/views.cljs @@ -150,7 +150,7 @@ [] (let [t @(rf/subscribe [::timeline.s/time]) end @(rf/subscribe [::timeline.s/end]) - timeline? @(rf/subscribe [::app.s/panel-visible? :timeline])] + timeline? @(rf/subscribe [::app.s/panel-visible :timeline])] [:div.h-px.block.absolute.bottom-0.left-0 {:style {:width (str (* (/ t end) 100) "%") :background (when-not (or (zero? t) (zero? end) timeline?) diff --git a/src/renderer/tool/container/canvas.cljs b/src/renderer/tool/container/canvas.cljs index 4953306e..5a90b969 100644 --- a/src/renderer/tool/container/canvas.cljs +++ b/src/renderer/tool/container/canvas.cljs @@ -34,20 +34,20 @@ bounds @(rf/subscribe [::element.s/bounds]) temp-element @(rf/subscribe [::document.s/temp-element]) elements-area @(rf/subscribe [::element.s/area]) - read-only? @(rf/subscribe [::document.s/read-only?]) + read-only @(rf/subscribe [::document.s/read-only]) cursor @(rf/subscribe [::app.s/cursor]) tool @(rf/subscribe [::app.s/tool]) primary-tool @(rf/subscribe [::app.s/primary-tool]) rotate @(rf/subscribe [::document.s/rotate]) - grid? @(rf/subscribe [::app.s/grid-visible?]) + grid @(rf/subscribe [::app.s/grid]) state @(rf/subscribe [::app.s/state]) pointer-handler #(pointer/event-handler! % element) pivot-point @(rf/subscribe [::app.s/pivot-point]) snapping-points @(rf/subscribe [::snap.s/points]) - snap? @(rf/subscribe [::snap.s/enabled?]) + snap-active @(rf/subscribe [::snap.s/active]) nearest-neighbor @(rf/subscribe [::snap.s/nearest-neighbor]) - debug? @(rf/subscribe [::app.s/debug-info?]) - select? (or (= tool :select) (= primary-tool :select))] + debug @(rf/subscribe [::app.s/debug-info]) + select-tool-active (or (= tool :select) (= primary-tool :select))] [:svg#canvas {:on-pointer-up pointer-handler :on-pointer-down pointer-handler :on-pointer-move pointer-handler @@ -71,9 +71,9 @@ [:filter {:id id :key id} [tag attrs]]) filters/accessibility)] - (when-not read-only? + (when-not read-only [:<> - (when (and select? (contains? #{:default :select :scale} state)) + (when (and select-tool-active (contains? #{:default :select :scale} state)) [:<> (for [el selected-elements] (when (:bounds el) @@ -94,7 +94,7 @@ (when (= state :scale) [overlay/size-label bounds]) [overlay/bounding-handles bounds]]) - (when (and select? pivot-point) + (when (and select-tool-active pivot-point) [overlay/times pivot-point])]) (when (or (= tool :edit) @@ -108,15 +108,15 @@ [tool.hierarchy/render temp-element]]) - (when debug? + (when debug [into [:g] (for [snapping-point snapping-points] [overlay/point-of-interest snapping-point])]) - (when (and snap? nearest-neighbor) + (when (and snap-active nearest-neighbor) [overlay/times (:point nearest-neighbor)]) - (when grid? [ruler.v/grid])])) + (when grid [ruler.v/grid])])) (defmethod tool.hierarchy/render-to-string :canvas [{:keys [attrs children]}] diff --git a/src/renderer/tool/container/svg.cljs b/src/renderer/tool/container/svg.cljs index 796df62c..4c62d4a6 100644 --- a/src/renderer/tool/container/svg.cljs +++ b/src/renderer/tool/container/svg.cljs @@ -27,13 +27,13 @@ [{:keys [adjusted-pointer-pos adjusted-pointer-offset] :as db} e] (let [[offset-x offset-y] adjusted-pointer-offset [pos-x pos-y] adjusted-pointer-pos - lock-ratio? (pointer/ctrl? e) + lock-ratio (pointer/ctrl? e) width (abs (- pos-x offset-x)) height (abs (- pos-y offset-y)) attrs {:x (min pos-x offset-x) :y (min pos-y offset-y) - :width (if lock-ratio? (min width height) width) - :height (if lock-ratio? (min width height) height)}] + :width (if lock-ratio (min width height) width) + :height (if lock-ratio (min width height) height)}] (element.h/assoc-temp db {:tag :svg :type :element :attrs attrs}))) diff --git a/src/renderer/tool/custom/blob.cljs b/src/renderer/tool/custom/blob.cljs index 4198f004..819480b9 100644 --- a/src/renderer/tool/custom/blob.cljs +++ b/src/renderer/tool/custom/blob.cljs @@ -79,7 +79,7 @@ {:icon "blob" :description "Vector based blob." :url "https://blobs.dev/" - :locked-ratio? true + :ratio-locked true :attrs [:x :y :seed diff --git a/src/renderer/tool/overlay.cljs b/src/renderer/tool/overlay.cljs index 3951a5e1..7d17e276 100644 --- a/src/renderer/tool/overlay.cljs +++ b/src/renderer/tool/overlay.cljs @@ -61,16 +61,16 @@ size (/ handle-size zoom) stroke-width (/ 1 zoom) pointer-handler #(pointer/event-handler! % el) - active? (and (= (:id clicked-element) id) - (= (:element clicked-element) element))] - [:rect {:fill (if active? accent accent-inverted) - :stroke (if active? accent "#777") + active (and (= (:id clicked-element) id) + (= (:element clicked-element) element))] + [:rect {:fill (if active accent accent-inverted) + :stroke (if active accent "#777") :stroke-width stroke-width :x (- x (/ size 2)) :y (- y (/ size 2)) :width size :height size - :cursor (if (or active? (not cursor)) "default" cursor) + :cursor (if (or active (not cursor)) "default" cursor) :on-pointer-up pointer-handler :on-pointer-down pointer-handler :on-pointer-move pointer-handler @@ -303,7 +303,7 @@ ["Pointer offset" (str @(rf/subscribe [::app.s/pointer-offset]))] ["Adjusted pointer offset" (str (mapv #(.toFixed % 2) @(rf/subscribe [::app.s/adjusted-pointer-offset])))] - ["Pointer drag?" (str @(rf/subscribe [::app.s/drag?]))] + ["Pointer drag?" (str @(rf/subscribe [::app.s/drag]))] ["Pan" (str (mapv #(.toFixed % 2) @(rf/subscribe [::document.s/pan])))] ["Active tool" @(rf/subscribe [::app.s/tool])] ["Primary tool" @(rf/subscribe [::app.s/primary-tool])] diff --git a/src/renderer/tool/renderable.cljs b/src/renderer/tool/renderable.cljs index 2a479e29..771ab5f3 100644 --- a/src/renderer/tool/renderable.cljs +++ b/src/renderer/tool/renderable.cljs @@ -23,7 +23,7 @@ [db] (-> db (assoc :cursor "crosshair") - (dissoc :drag? :pointer-offset :clicked-element) + (dissoc :drag :pointer-offset :clicked-element) (element.h/dissoc-temp))) (defmethod tool.hierarchy/drag-start ::tool.hierarchy/renderable diff --git a/src/renderer/tool/shape/circle.cljs b/src/renderer/tool/shape/circle.cljs index d5bc993e..93af4784 100644 --- a/src/renderer/tool/shape/circle.cljs +++ b/src/renderer/tool/shape/circle.cljs @@ -17,7 +17,7 @@ {:icon "circle-alt" :description "The SVG element is an SVG basic shape, used to draw circles based on a center point and a radius." - :locked-ratio? true + :ratio-locked true :attrs [:stroke-width :opacity :fill diff --git a/src/renderer/tool/shape/ellipse.cljs b/src/renderer/tool/shape/ellipse.cljs index b07a8f25..f77fece3 100644 --- a/src/renderer/tool/shape/ellipse.cljs +++ b/src/renderer/tool/shape/ellipse.cljs @@ -34,15 +34,15 @@ (let [{:keys [stroke fill]} (get-in db [:documents active-document]) [offset-x offset-y] adjusted-pointer-offset [pos-x pos-y] adjusted-pointer-pos - lock-ratio? (pointer/ctrl? e) + lock-ratio (pointer/ctrl? e) rx (abs (- pos-x offset-x)) ry (abs (- pos-y offset-y)) attrs {:cx offset-x :cy offset-y :fill fill :stroke stroke - :rx (if lock-ratio? (min rx ry) rx) - :ry (if lock-ratio? (min rx ry) ry)}] + :rx (if lock-ratio (min rx ry) rx) + :ry (if lock-ratio (min rx ry) ry)}] (element.h/assoc-temp db {:type :element :tag :ellipse :attrs attrs}))) diff --git a/src/renderer/tool/shape/rect.cljs b/src/renderer/tool/shape/rect.cljs index 7675abcf..411f76ea 100644 --- a/src/renderer/tool/shape/rect.cljs +++ b/src/renderer/tool/shape/rect.cljs @@ -32,13 +32,13 @@ (let [{:keys [stroke fill]} (get-in db [:documents active-document]) [offset-x offset-y] adjusted-pointer-offset [pos-x pos-y] adjusted-pointer-pos - lock-ratio? (pointer/ctrl? e) + lock-ratio (pointer/ctrl? e) width (abs (- pos-x offset-x)) height (abs (- pos-y offset-y)) attrs {:x (min pos-x offset-x) :y (min pos-y offset-y) - :width (if lock-ratio? (min width height) width) - :height (if lock-ratio? (min width height) height) + :width (if lock-ratio (min width height) width) + :height (if lock-ratio (min width height) height) :fill fill :stroke stroke}] (element.h/assoc-temp db {:type :element diff --git a/src/renderer/tool/text.cljs b/src/renderer/tool/text.cljs index 0fbcc393..c239a2bc 100644 --- a/src/renderer/tool/text.cljs +++ b/src/renderer/tool/text.cljs @@ -22,7 +22,7 @@ of text. It's possible to apply a gradient, pattern, clipping path, mask, or filter to , like any other SVG graphics element." - :locked-ratio? true + :ratio-locked true :attrs [:font-family :font-size :font-weight diff --git a/src/renderer/tool/transform/edit.cljs b/src/renderer/tool/transform/edit.cljs index af5f9a31..fe780aa4 100644 --- a/src/renderer/tool/transform/edit.cljs +++ b/src/renderer/tool/transform/edit.cljs @@ -37,7 +37,7 @@ (defmethod tool.hierarchy/pointer-up :edit [db {:keys [element] :as e}] (if-not (and (= (:button e) :right) - (:selected? element)) + (:selected element)) (-> db (element.h/clear-ignored) (dissoc :clicked-element) diff --git a/src/renderer/tool/transform/select.cljs b/src/renderer/tool/transform/select.cljs index 59279353..6d3424f9 100644 --- a/src/renderer/tool/transform/select.cljs +++ b/src/renderer/tool/transform/select.cljs @@ -68,7 +68,7 @@ (reduce (fn [db el] (cond-> db (hovered? db el intersecting?) - (f (:id el)))) db (filter :visible? (vals (element.h/elements db))))) + (f (:id el)))) db (filter :visible (vals (element.h/elements db))))) (defmethod tool.hierarchy/pointer-move :select [db {:keys [element] :as e}] @@ -117,7 +117,7 @@ (dissoc :clicked-element) (element.h/clear-ignored :bounding-box) (element.h/select (:id element) (pointer/shift? e)) - (app.h/explain (if (:selected? element) "Deselect element" "Select element")))) + (app.h/explain (if (:selected element) "Deselect element" "Select element")))) (defmethod tool.hierarchy/double-click :select [db {:keys [element]}] @@ -177,7 +177,7 @@ | y ↖ │ | | ↖ │ □----------□--------- ■ :bottom-right (active handle)" - [db, [x y] :- Vec2D, lock-ratio? :- boolean?, in-place? :- boolean?, recur? :- boolean?] + [db, [x y] :- Vec2D, ratio-locked :- boolean?, in-place :- boolean?, recursive :- boolean?] (let [handle (-> db :clicked-element :id) bounds (element.h/bounds db) dimensions (bounds/->dimensions bounds) @@ -192,24 +192,24 @@ :top-left [[(- x) (- y)] [x2 y2]] :bottom-right [[x y] [x1 y1]] :bottom-left [[(- x) y] [x2 y1]]) - pivot-point (if in-place? [cx cy] pivot-point) - offset (cond-> offset in-place? (mat/mul 2)) + pivot-point (if in-place [cx cy] pivot-point) + offset (cond-> offset in-place (mat/mul 2)) ratio (mat/div (mat/add dimensions offset) dimensions) - lock-ratio? (or lock-ratio? (every? #(-> % :tag tool.hierarchy/properties :locked-ratio?) (element.h/selected db))) - ratio (cond-> ratio lock-ratio? (lock-ratio handle)) + ratio-locked (or ratio-locked (every? #(-> % :tag tool.hierarchy/properties :ratio-locked) (element.h/selected db))) + ratio (cond-> ratio ratio-locked (lock-ratio handle)) ;; TODO: Handle negative/inverted ratio. ratio (mapv #(max 0 %) ratio)] (-> db (assoc :pivot-point pivot-point) - (element.h/scale ratio pivot-point recur?)))) + (element.h/scale ratio pivot-point recursive)))) (mx/defn select-element - [db, multi? :- boolean?] + [db, multiple :- boolean?] (cond-> db (and (:clicked-element db) - (not (-> db :clicked-element :selected?)) + (not (-> db :clicked-element :selected)) (not= (-> db :clicked-element :id) :bounding-box)) - (-> (element.h/select (-> db :clicked-element :id) multi?)))) + (-> (element.h/select (-> db :clicked-element :id) multiple)))) (defmethod tool.hierarchy/drag :select [{:keys [state adjusted-pointer-offset adjusted-pointer-pos] :as db} e] diff --git a/src/renderer/toolbar/object.cljs b/src/renderer/toolbar/object.cljs index 5aa6e990..be042045 100644 --- a/src/renderer/toolbar/object.cljs +++ b/src/renderer/toolbar/object.cljs @@ -6,128 +6,128 @@ [renderer.toolbar.views :as v])) (defn index-actions - [disabled?] + [disabled] [{:title "Bring to front" :icon "bring-front" :action [::element.e/raise-to-top] - :disabled? disabled?} + :disabled disabled} {:title "Send to back" :icon "send-back" :action [::element.e/lower-to-bottom] - :disabled? disabled?} + :disabled disabled} {:title "Bring forward" :icon "bring-forward" :action [::element.e/raise] - :disabled? disabled?} + :disabled disabled} {:title "Send backward" :icon "send-backward" :action [::element.e/lower] - :disabled? disabled?}]) + :disabled disabled}]) (defn group-actions - [disabled?] + [disabled] [{:title "Group" :icon "group" - :disabled? disabled? + :disabled disabled :action [::element.e/group]} {:title "Ungroup" :icon "ungroup" - :disabled? disabled? + :disabled disabled :action [::element.e/ungroup]}]) (defn alignment-actions - [disabled?] + [disabled] [{:title "Align left" :icon "objects-align-left" - :disabled? disabled? + :disabled disabled :action [::element.e/align :left]} {:title "Align center horizontally" - :disabled? disabled? + :disabled disabled :icon "objects-align-center-horizontal" :action [::element.e/align :center-horizontal]} {:title "Align rignt" :icon "objects-align-right" - :disabled? disabled? + :disabled disabled :action [::element.e/align :right]} {:type :divider} {:title "Align top" :icon "objects-align-top" - :disabled? disabled? + :disabled disabled :action [::element.e/align :top]} {:title "Align center vertically" :icon "objects-align-center-vertical" - :disabled? disabled? + :disabled disabled :action [::element.e/align :center-vertical]} {:title "Align bottom" :icon "objects-align-bottom" - :disabled? disabled? + :disabled disabled :action [::element.e/align :bottom]}]) (defn boolean-actions - [disabled?] + [disabled] [{:title "Unite" :icon "unite" - :disabled? disabled? + :disabled disabled :action [::element.e/bool-operation :unite]} {:title "Intersect" :icon "intersect" - :disabled? disabled? + :disabled disabled :action [::element.e/bool-operation :intersect]} {:title "Subtract" :icon "subtract" - :disabled? disabled? + :disabled disabled :action [::element.e/bool-operation :subtract]} {:title "Exclude" :icon "exclude" - :disabled? disabled? + :disabled disabled :action [::element.e/bool-operation :exclude]} {:title "Divide" :icon "divide" - :disabled? disabled? + :disabled disabled :action [::element.e/bool-operation :divide]}]) #_(defn distribute-actions [] [{:title "Distribute spacing horizontally" :icon "distribute-spacing-horizontal" - :disabled? true + :disabled true :action [::element.e/istribute-spacing :horizontal]} {:title "Distribute spacing vertically" :icon "distribute-spacing-vertical" - :disabled? true + :disabled true :action [::element.e/distribute-spacing :vertical]}]) #_(defn rotate-actions [] [{:title "Rotate 90° clockwise" :icon "rotate-clockwise" - :disabled? true + :disabled true :action [::element.e/rotate -90]} {:title "Rotate 90° counterclockwise" :icon "rotate-counterclockwise" - :disabled? true + :disabled true :action [::element.e/rotate 90]}]) #_(defn flip-actions [] [{:title "Flip horizontally" :icon "flip-horizontal" - :disabled? true + :disabled true :action [::element.e/flip :horizontal]} {:title "Flip vertically" :icon "flip-vertical" - :disabled? true + :disabled true :action [::element.e/flip :vertical]}]) (defn root [] - (let [selected-elements? @(rf/subscribe [::element.s/selected?]) - multiple-selected? @(rf/subscribe [::element.s/multiple-selected?]) - top-level? @(rf/subscribe [::element.s/top-level?]) - object-actions [(index-actions (not selected-elements?)) - (group-actions (not selected-elements?)) - (alignment-actions top-level?) - (boolean-actions (not multiple-selected?))]] + (let [some-selected @(rf/subscribe [::element.s/some-selected]) + multiple-selected @(rf/subscribe [::element.s/multiple-selected]) + every-top-level @(rf/subscribe [::element.s/every-top-level]) + object-actions [(index-actions (not some-selected)) + (group-actions (not some-selected)) + (alignment-actions every-top-level) + (boolean-actions (not multiple-selected))]] (->> object-actions (interpose [{:type :divider}]) (flatten) diff --git a/src/renderer/toolbar/status.cljs b/src/renderer/toolbar/status.cljs index 3b26071a..eee59413 100644 --- a/src/renderer/toolbar/status.cljs +++ b/src/renderer/toolbar/status.cljs @@ -8,6 +8,8 @@ [renderer.document.subs :as-alias document.s] [renderer.frame.events :as-alias frame.e] [renderer.frame.subs :as-alias frame.s] + [renderer.ruler.events :as-alias ruler.e] + [renderer.ruler.subs :as-alias ruler.s] [renderer.snap.views :as snap.v] [renderer.timeline.views :as timeline.v] [renderer.ui :as ui] @@ -64,28 +66,28 @@ (def view-radio-buttons [{:title "Timeline" - :active? [::app.s/panel-visible? :timeline] + :active [::app.s/panel-visible :timeline] :icon "animation" :class "hidden sm:inline-block shrink-0" :action [::app.e/toggle-panel :timeline]} {:title "Grid" - :active? [::app.s/grid-visible?] + :active [::app.s/grid] :icon "grid" :class "shrink-0" :action [::app.e/toggle-grid]} {:title "Rulers" - :active? [::app.s/rulers-visible?] + :active [::ruler.s/visible] :icon "ruler-combined" :class "shrink-0" - :action [::app.e/toggle-rulers]} + :action [::ruler.e/toggle-visible]} {:title "History" - :active? [::app.s/panel-visible? :history] + :active [::app.s/panel-visible :history] :icon "history" :class "hidden sm:inline-block shrink-0" :action [::app.e/toggle-panel :history]} {:title "XML" :class "hidden sm:inline-block shrink-0" - :active? [::app.s/panel-visible? :xml] + :active [::app.s/panel-visible :xml] :icon "code" :action [::app.e/toggle-panel :xml]}]) @@ -144,7 +146,7 @@ (defn root [] (let [help-message @(rf/subscribe [::app.s/help]) - loading? @(rf/subscribe [::worker.s/loading?]) + loading @(rf/subscribe [::worker.s/loading]) fill @(rf/subscribe [::document.s/fill]) stroke @(rf/subscribe [::document.s/stroke])] [:div.toolbar.bg-primary.mt-px.relative @@ -157,12 +159,12 @@ [:div.px-1.hidden.2xl:flex.gap-1.flex-wrap.leading-none.truncate {:style {:max-height "var(--button-size)"}} help-message]] - (when loading? + (when loading [:span.icon-button.relative [ui/icon "spinner" {:class "loading"}]]) (into [:<>] - (map (fn [{:keys [title active? icon action class]}] - [ui/radio-icon-button icon @(rf/subscribe active?) + (map (fn [{:keys [title active icon action class]}] + [ui/radio-icon-button icon @(rf/subscribe active) {:title title :class class :on-click #(rf/dispatch action)}]) diff --git a/src/renderer/toolbar/tools.cljs b/src/renderer/toolbar/tools.cljs index ac81b75d..4da85162 100644 --- a/src/renderer/toolbar/tools.cljs +++ b/src/renderer/toolbar/tools.cljs @@ -12,14 +12,14 @@ [tool] (let [active-tool @(rf/subscribe [::app.s/tool]) primary-tool @(rf/subscribe [::app.s/primary-tool]) - selected? (= active-tool tool) - primary? (= primary-tool tool)] + active (= active-tool tool) + primary (= primary-tool tool)] (when (:icon (tool.hierarchy/properties tool)) [:> Tooltip/Root [:> Tooltip/Trigger {:as-child true} [:span - [ui/radio-icon-button (:icon (tool.hierarchy/properties tool)) selected? - {:class (when primary? "outline-shadow") + [ui/radio-icon-button (:icon (tool.hierarchy/properties tool)) active + {:class (when primary "outline-shadow") :on-click #(rf/dispatch [::app.e/set-tool tool])}]]] [:> Tooltip/Portal [:> Tooltip/Content diff --git a/src/renderer/tree/views.cljs b/src/renderer/tree/views.cljs index 2949415f..f59457f1 100644 --- a/src/renderer/tree/views.cljs +++ b/src/renderer/tree/views.cljs @@ -16,35 +16,35 @@ [renderer.utils.keyboard :as keyb])) (defn lock-button - [id locked?] + [id locked] [ui/icon-button - (if locked? "lock" "unlock") - {:class (when-not locked? "list-item-action") - :title (if locked? "unlock" "lock") + (if locked "lock" "unlock") + {:class (when-not locked "list-item-action") + :title (if locked "unlock" "lock") :on-double-click dom/stop-propagation! :on-pointer-up dom/stop-propagation! :on-click (fn [e] (.stopPropagation e) - (rf/dispatch [::element.e/toggle-prop id :locked?]))}]) + (rf/dispatch [::element.e/toggle-prop id :locked]))}]) (defn visibility-button - [id visible?] + [id visible] [ui/icon-button - (if visible? "eye" "eye-closed") - {:class (when visible? "list-item-action") - :title (if visible? "hide" "show") + (if visible "eye" "eye-closed") + {:class (when visible "list-item-action") + :title (if visible "hide" "show") :on-double-click dom/stop-propagation! :on-pointer-up dom/stop-propagation! :on-click (fn [e] (.stopPropagation e) - (rf/dispatch [::element.e/toggle-prop id :visible?]))}]) + (rf/dispatch [::element.e/toggle-prop id :visible]))}]) (defn set-item-label! [e id] (rf/dispatch [::element.e/set-prop id :label (.. e -target -value)])) (defn item-label - [{:keys [id label visible? tag]}] + [{:keys [id label visible tag]}] (ra/with-let [edit-mode? (ra/atom false)] (if @edit-mode? [:input.list-item-input @@ -57,7 +57,7 @@ (set-item-label! e id))}] [:div.flex [:div.truncate - {:class [(when-not visible? "opacity-60") + {:class [(when-not visible "opacity-60") (when (= :svg tag) "font-bold")] :style {:cursor "text"} :on-double-click (fn [e] @@ -110,28 +110,28 @@ nil)) (defn toggle-collapsed-button - [id collapsed?] + [id collapsed] [ui/icon-button - (if collapsed? "chevron-right" "chevron-down") + (if collapsed "chevron-right" "chevron-down") {:class "small" - :title (if collapsed? "expand" "collapse") + :title (if collapsed "expand" "collapse") :on-pointer-up #(.stopPropagation %) - :on-click #(rf/dispatch (if collapsed? + :on-click #(rf/dispatch (if collapsed [::document.e/expand-el id] [::document.e/collapse-el id]))}]) (defn list-item-button - [{:keys [id selected? children locked? visible?] :as el} depth hovered? collapsed?] + [{:keys [id selected children locked visible] :as el} depth hovered collapsed] [:div.button.list-item-button - {:class [(when selected? "selected") - (when hovered? "hovered")] + {:class [(when selected "selected") + (when hovered "hovered")] :tab-index 0 :data-id (str id) :role "menuitem" :on-double-click #(rf/dispatch [::frame.e/pan-to-element id]) :on-pointer-enter #(rf/dispatch [::document.e/set-hovered-id id]) :ref (fn [this] - (when (and this selected? hovered?) + (when (and this selected hovered) (dom/scroll-into-view! this) (set-last-focused-id! (.getAttribute this "data-id")))) :draggable true @@ -152,18 +152,18 @@ :style {:padding-left (padding depth (seq children))}} [:div.flex.items-center.content-between.w-full (when (seq children) - [toggle-collapsed-button id collapsed?]) + [toggle-collapsed-button id collapsed]) [:div.flex-1.overflow-hidden [item-label el]] - [lock-button id locked?] - [visibility-button id visible?]]]) + [lock-button id locked] + [visibility-button id visible]]]) -(defn item [{:keys [selected? children id] :as el} depth elements hovered-ids collapsed-ids] +(defn item [{:keys [selected children id] :as el} depth elements hovered-ids collapsed-ids] (let [has-children? (seq children) - collapsed? (contains? collapsed-ids id) - hovered? (contains? hovered-ids id)] - [:li {:class (when selected? "overlay")} - [list-item-button el depth hovered? collapsed?] - (when (and has-children? (not collapsed?)) + collapsed (contains? collapsed-ids id) + hovered (contains? hovered-ids id)] + [:li {:class (when selected "overlay")} + [list-item-button el depth hovered collapsed] + (when (and has-children? (not collapsed)) [:ul (for [el (mapv (fn [k] (get elements k)) (reverse children))] ^{:key (:id el)} [item el (inc depth) elements hovered-ids collapsed-ids])])])) diff --git a/src/renderer/ui.cljs b/src/renderer/ui.cljs index c45b4c25..cbb9fa70 100644 --- a/src/renderer/ui.cljs +++ b/src/renderer/ui.cljs @@ -57,9 +57,9 @@ (into [:span.inline-flex.text-muted {:class "gap-1.5"}]))))) (mx/defn radio-icon-button - [icon-name :- string?, active? :- boolean?, & {:keys [class] :as props} :- Props] + [icon-name :- string?, active :- boolean?, & {:keys [class] :as props} :- Props] [:button.icon-button.radio-icon-button - (assoc props :class [class (when active? "selected")]) + (assoc props :class [class (when active "selected")]) [renderer.ui/icon icon-name]]) (defn context-menu-item diff --git a/src/renderer/utils/migrations.cljs b/src/renderer/utils/migrations.cljs index 2eca4791..d76c3b6f 100644 --- a/src/renderer/utils/migrations.cljs +++ b/src/renderer/utils/migrations.cljs @@ -3,8 +3,6 @@ [clojure.set :as set] [renderer.utils.map :as map])) -(def key->uuid (comp uuid name)) - (def migrations [[[0 3 0] (fn [document] (-> document @@ -16,21 +14,32 @@ (map/remove-nils)))))] [[0 4 0] (fn [document] - (cond-> document - (:id document) - (update :id key->uuid) - - (:save document) - (update :save key->uuid) - - :always - (-> (update :elements update-keys key->uuid) - (update :elements - update-vals - #(cond-> % - :always - (-> (update :id key->uuid) - (update :children (fn [ks] (mapv key->uuid ks)))) - - (:parent %) - (update :parent key->uuid))))))]]) + (let [key->uuid (comp uuid name)] + (cond-> document + (:id document) + (update :id key->uuid) + + (:save document) + (update :save key->uuid) + + :always + (-> (update :elements update-keys key->uuid) + (update :elements + update-vals + #(cond-> % + :always + (-> (update :id key->uuid) + (update :children (fn [ks] (mapv key->uuid ks)))) + + (:parent %) + (update :parent key->uuid)))))))] + + [[0 5 0] (fn [document] + (update document :elements update-vals (fn [el] + (update-keys el #(case % + :visible? :visible + :selected? :selected + :locked? :locked + %)))))]]) + + diff --git a/src/renderer/utils/pointer.cljs b/src/renderer/utils/pointer.cljs index b2c99eb8..b090fa0c 100644 --- a/src/renderer/utils/pointer.cljs +++ b/src/renderer/utils/pointer.cljs @@ -19,7 +19,7 @@ [:pressure [:maybe number?]] [:pointer-type [:enum "mouse" "pen" "touch"]] [:pointer-id number?] - [:primary? boolean?] + [:primary boolean?] [:button [:maybe PointerButton]] [:buttons [:maybe PointerButton]] [:modifiers [:set ModifierKey]]]) @@ -86,7 +86,7 @@ :pressure (.-pressure e) :pointer-type (.-pointerType e) :pointer-id (.-pointerId e) - :primary? (.-isPrimary e) + :primary (.-isPrimary e) :button (button->key (.-button e)) :buttons (button->key (.-buttons e)) :modifiers (modifiers e)}])) diff --git a/src/renderer/window/db.cljs b/src/renderer/window/db.cljs index 5ceac476..06f00f31 100644 --- a/src/renderer/window/db.cljs +++ b/src/renderer/window/db.cljs @@ -2,7 +2,7 @@ (def Window [:map {:default {}} - [:maximized? {:default true} boolean?] - [:minimized? {:default false} boolean?] - [:fullscreen? {:default false} boolean?] - [:focused? {:default false} boolean?]]) + [:maximized {:default true} boolean?] + [:minimized {:default false} boolean?] + [:fullscreen {:default false} boolean?] + [:focused {:default false} boolean?]]) diff --git a/src/renderer/window/events.cljs b/src/renderer/window/events.cljs index 0edbab34..1f40db1e 100644 --- a/src/renderer/window/events.cljs +++ b/src/renderer/window/events.cljs @@ -10,25 +10,25 @@ ::set-maximized (rf/path :window) (fn [db [_ state]] - (assoc db :maximized? state))) + (assoc db :maximized state))) (rf/reg-event-db ::set-fullscreen (rf/path :window) (fn [db [_ state]] - (assoc db :fullscreen? state))) + (assoc db :fullscreen state))) (rf/reg-event-db ::set-minimized (rf/path :window) (fn [db [_ state]] - (assoc db :minimized? state))) + (assoc db :minimized state))) (rf/reg-event-db ::set-focused (fn [db [_ state]] (cond-> db - :always (assoc-in [:window :focused?] state) + :always (assoc-in [:window :focused] state) state document.h/center))) (rf/reg-event-fx diff --git a/src/renderer/window/subs.cljs b/src/renderer/window/subs.cljs index a4e79843..2db17069 100644 --- a/src/renderer/window/subs.cljs +++ b/src/renderer/window/subs.cljs @@ -7,11 +7,11 @@ :-> :window) (rf/reg-sub - ::maximized? + ::maximized :<- [::window] - :-> :maximized?) + :-> :maximized) (rf/reg-sub - ::fullscreen? + ::fullscreen :<- [::window] - :-> :fullscreen?) + :-> :fullscreen) diff --git a/src/renderer/window/views.cljs b/src/renderer/window/views.cljs index ab0cc083..8af44290 100644 --- a/src/renderer/window/views.cljs +++ b/src/renderer/window/views.cljs @@ -20,13 +20,13 @@ [ui/icon icon]]) (mx/defn window-control-buttons - [maximized? :- boolean?] + [maximized :- boolean?] [{:action [::window.e/minimize] :title "Minimize" :icon "window-minimize"} {:action [::window.e/toggle-maximized] - :title (if maximized? "Restore" "Maximize") - :icon (if maximized? "window-restore" "window-maximize")} + :title (if maximized "Restore" "Maximize") + :icon (if maximized "window-restore" "window-maximize")} {:action [::window.e/close] :title "Close" :icon "window-close"}]) @@ -40,14 +40,14 @@ (defn app-header [] - (let [fullscreen? @(rf/subscribe [::window.s/fullscreen?]) - maximized? @(rf/subscribe [::window.s/maximized?]) + (let [fullscreen @(rf/subscribe [::window.s/fullscreen]) + maximized @(rf/subscribe [::window.s/maximized]) theme-mode (name @(rf/subscribe [::theme.s/mode]))] [:div.flex.items-center.relative - (when-not (or fullscreen? platform/mac?) + (when-not (or fullscreen platform/mac?) [app-icon]) [:div.flex.relative.bg-secondary - {:class (when (and platform/mac? (not fullscreen?)) "ml-16")} + {:class (when (and platform/mac? (not fullscreen)) "ml-16")} [menubar/root]] [:div.absolute.hidden.md:flex.justify-center.drag.grow.h-full.items-center.pointer-events-none {:class "left-1/2 -translate-x-1/2" @@ -58,9 +58,9 @@ :title (str "Theme mode - " theme-mode) :icon theme-mode :class "bg-primary"}] - (when (and platform/electron? (not fullscreen?) (not platform/mac?)) + (when (and platform/electron? (not fullscreen) (not platform/mac?)) (into [:div.text-right] - (map button (window-control-buttons maximized?)))) - (when fullscreen? + (map button (window-control-buttons maximized)))) + (when fullscreen [button {:action [::window.e/toggle-fullscreen] :icon "arrow-minimize"}])])) diff --git a/src/renderer/worker/subs.cljs b/src/renderer/worker/subs.cljs index 1ff68faf..8dd3cafc 100644 --- a/src/renderer/worker/subs.cljs +++ b/src/renderer/worker/subs.cljs @@ -12,6 +12,6 @@ :-> :tasks) (rf/reg-sub - ::loading? + ::loading :<- [::tasks] seq)