From adc9bf62f2b3329f79d6c7b075de08df1afa87b6 Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Sat, 21 Jun 2025 18:36:39 +0300 Subject: [PATCH 01/13] initial commit --- deps.edn | 3 +- package-lock.json | 28 ++++++++++ package.json | 1 + src/config.cljs | 2 - src/electron/main.cljs | 42 +++++++------- src/renderer/app/db.cljs | 1 + src/renderer/app/effects.cljs | 27 ++++++--- src/renderer/app/events.cljs | 63 ++++++++++++--------- src/renderer/app/subs.cljs | 4 ++ src/renderer/app/views.cljs | 63 +++++++++++---------- src/renderer/core.cljs | 12 +--- src/renderer/document/events.cljs | 32 ++--------- src/renderer/document/handlers.cljs | 21 +++++-- src/renderer/event/handlers.cljs | 4 +- src/renderer/theme/events.cljs | 5 -- src/renderer/tool/events.cljs | 4 +- test/app_test.cljs | 9 +-- test/benchmark.cljs | 2 - test/document_test.cljs | 15 +++-- test/element_test.cljs | 86 ++++++++++++++++++----------- test/frame_test.cljs | 11 +++- test/history_test.cljs | 11 +++- test/tool_test.cljs | 11 +++- 23 files changed, 270 insertions(+), 187 deletions(-) diff --git a/deps.edn b/deps.edn index f82bd338..07b1244f 100644 --- a/deps.edn +++ b/deps.edn @@ -1,6 +1,5 @@ {:paths ["src"] - :deps {akiroz.re-frame/storage {:mvn/version "0.1.4"} - binaryage/devtools {:mvn/version "1.0.7"} + :deps {binaryage/devtools {:mvn/version "1.0.7"} camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.3"} clj-kdtree/clj-kdtree {:git/url "https://github.com/abscondment/clj-kdtree.git" :sha "5ec321c5e8006db00fa8b45a8ed9eb0b8f3dd56d" diff --git a/package-lock.json b/package-lock.json index 8a56cdad..8c4218bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,6 +52,7 @@ "karma-cljs-test": "0.1.0", "karma-electron": "7.3.0", "karma-junit-reporter": "2.0.1", + "localforage": "^1.10.0", "mdn-data": "2.21.0", "npm-run-all": "4.1.5", "opentype.js": "1.3.4", @@ -7163,6 +7164,13 @@ "dev": true, "license": "Unlicense" }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -8339,6 +8347,16 @@ "dev": true, "license": "MIT" }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lightningcss": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", @@ -8625,6 +8643,16 @@ "node": ">=4" } }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", diff --git a/package.json b/package.json index d175a91e..d770b83a 100644 --- a/package.json +++ b/package.json @@ -103,6 +103,7 @@ "karma-cljs-test": "0.1.0", "karma-electron": "7.3.0", "karma-junit-reporter": "2.0.1", + "localforage": "1.10.0", "mdn-data": "2.21.0", "npm-run-all": "4.1.5", "opentype.js": "1.3.4", diff --git a/src/config.cljs b/src/config.cljs index 12db2637..86dba8e7 100644 --- a/src/config.cljs +++ b/src/config.cljs @@ -6,8 +6,6 @@ (def ext "rps") -(def app-key :repath-studio) - (def app-name "Repath Studio") (def mime-type "application/x-repath-studio") diff --git a/src/electron/main.cljs b/src/electron/main.cljs index 5bf9f9d3..602e2bfa 100644 --- a/src/electron/main.cljs +++ b/src/electron/main.cljs @@ -44,11 +44,11 @@ (when (and (secure-url? url-parsed) (allowed-url? url-parsed)) (.openExternal shell url-parsed.href)))) -(defn register-ipc-on-events! - [] +(defn register-ipc-on-events! [] (doseq [[e f] - [["relaunch" #(do (.relaunch app) (.exit app))] + [["db-loaded" #(doto ^js @loading-window (.hide) (.close))] + ["relaunch" #(doto app (.relaunch) (.exit))] ["open-remote-url" open-external!] ["open-directory" #(.showItemInFolder shell %)] ["window-minimize" #(.minimize ^js @main-window)] @@ -59,8 +59,7 @@ (.maximize ^js @main-window))]]] (.on ipcMain e #(f %2)))) -(defn register-ipc-handle-events! - [] +(defn register-ipc-handle-events! [] (doseq [[e f] [["open-documents" file/open!] @@ -70,8 +69,7 @@ ["print" file/print!]]] (.handle ipcMain e #(f %2)))) -(defn register-window-events! - [] +(defn register-window-events! [] (doseq [[window-event f] [["maximize" #(send-to-renderer! "window-maximized")] @@ -87,15 +85,15 @@ "window-unmaximized"))]]] (.on ^js @main-window window-event f))) -(defn register-web-contents-events! - [] - (doseq - [[web-contents-event f] - [["will-frame-navigate" #(.preventDefault %)] - ["closed" #(reset! main-window nil)]]] - (.on (.-webContents ^js @main-window) web-contents-event f))) +(defn register-web-contents-events! [] + (let [web-contents (.-webContents ^js @main-window)] + (doseq + [[web-contents-event f] + [["will-frame-navigate" #(.preventDefault %)] + ["closed" #(reset! main-window nil)]]] + (.on web-contents web-contents-event f)))) -(defn handle-on-ready-to-show! +(defn on-ready-to-show! [^js window] (doseq [action @@ -110,8 +108,7 @@ (url/format #js {:pathname (.join path js/__dirname s) :protocol "file"})) -(defn init-main-window! - [] +(defn init-main-window! [] (let [win-state (window-state-keeper #js {:defaultWidth 1920 :defaultHeight 1080})] (reset! main-window @@ -120,12 +117,12 @@ :y (.-y win-state) :width (.-width win-state) :height (.-height win-state) - :backgroundColor "#313131" :titleBarStyle (when (= (.platform os) "darwin") "hidden") :trafficLightPosition #js {:x 8 :y 10} :icon (.join path js/__dirname "/public/img/icon.png") :frame false :show false + :transparent true :webPreferences #js {:sandbox false :preload (.join path js/__dirname "preload.js")}})) @@ -134,11 +131,9 @@ "ready-to-show" (fn [] (.show ^js @main-window) - (.manage win-state ^js @main-window) - (.hide ^js @loading-window) - (.close ^js @loading-window))) + (.manage win-state ^js @main-window))) - (.on ^js @main-window "ready-to-show" #(handle-on-ready-to-show! @main-window)) + (.on ^js @main-window "ready-to-show" #(on-ready-to-show! @main-window)) (.loadURL ^js @main-window (if config/debug? @@ -156,9 +151,10 @@ (BrowserWindow. #js {:width 720 :height 576 - :backgroundColor "#313131" :icon (.join path js/__dirname "/public/img/icon.png") :show false + :alwaysOnTop true + :transparent true :frame false})) (.once ^js @loading-window "show" init-main-window!) (.loadURL ^js @loading-window (resource-path "/public/loading.html")) diff --git a/src/renderer/app/db.cljs b/src/renderer/app/db.cljs index 89524639..ed991dd1 100644 --- a/src/renderer/app/db.cljs +++ b/src/renderer/app/db.cljs @@ -65,6 +65,7 @@ [:notifications {:default []} [:* Notification]] [:debug-info {:default false} boolean?] [:help-bar {:default true} boolean?] + [:loading {:default true} boolean?] [:pen-mode {:default false} boolean?] [:backdrop {:default false} boolean?] [:lang {:optional true :persist true} Lang] diff --git a/src/renderer/app/effects.cljs b/src/renderer/app/effects.cljs index 74317e29..68b68728 100644 --- a/src/renderer/app/effects.cljs +++ b/src/renderer/app/effects.cljs @@ -1,14 +1,13 @@ (ns renderer.app.effects (:require - [akiroz.re-frame.storage :as rf.storage] + ["localforage" :as localforage] + [cognitect.transit :as transit] [config :as config] [re-frame.core :as rf] [re-frame.db :as rf.db] [renderer.app.db :as app.db] [renderer.history.handlers :as history.handlers])) -(rf.storage/reg-co-fx! config/app-key {:cofx :store}) - (rf/reg-cofx ::platform (fn [coeffects _] @@ -45,11 +44,22 @@ (fn [{:keys [on-success on-error formatter]}] (when-not (undefined? js/window.queryLocalFonts) (-> (.queryLocalFonts js/window) - (.then #(when on-success (rf/dispatch (conj on-success - (cond-> % - formatter formatter))))) + (.then #(when on-success (rf/dispatch (conj on-success (cond-> % + formatter formatter))))) (.catch #(when on-error (rf/dispatch (conj on-error %)))))))) +(defn json->clj + [json] + (transit/read (transit/reader :json) json)) + +(rf/reg-fx + ::get-local-db + (fn [{:keys [on-success on-error on-finally]}] + (-> (localforage/getItem config/app-name) + (.then #(when on-success (rf/dispatch (conj on-success (json->clj %))))) + (.catch #(when on-error (rf/dispatch (conj on-error %)))) + (.finally #(when on-finally (rf/dispatch on-finally)))))) + (rf/reg-fx ::persist (fn [] @@ -58,7 +68,8 @@ (:active-document db) history.handlers/drop-rest)] (->> (select-keys db app.db/persisted-keys) - (rf.storage/->store config/app-key))))) + (transit/write (transit/writer :json)) + (localforage/setItem config/app-name))))) (rf/reg-fx ::validate @@ -70,4 +81,4 @@ (rf/reg-fx ::clear-local-storage (fn [] - (rf.storage/->store config/app-key {}))) + (localforage/clear))) diff --git a/src/renderer/app/events.cljs b/src/renderer/app/events.cljs index ff816515..d145ceb4 100644 --- a/src/renderer/app/events.cljs +++ b/src/renderer/app/events.cljs @@ -1,15 +1,19 @@ (ns renderer.app.events (:require - [malli.error :as malli.error] [re-frame.core :as rf] [renderer.app.db :as app.db] [renderer.app.effects :as-alias app.effects] + [renderer.document.events :as-alias document.events] + [renderer.document.handlers :as document.handlers] [renderer.effects :as-alias effects] [renderer.event.events :as-alias event.events] [renderer.event.impl.keyboard :as event.impl.keyboard] + [renderer.events :as-alias events] + [renderer.history.handlers :as history.handlers] [renderer.notification.events :as-alias notification.events] - [renderer.notification.handlers :as notification.handlers] - [renderer.notification.views :as notification.views] + [renderer.snap.handlers :as snap.handlers] + [renderer.theme.effects :as-alias theme.effects] + [renderer.theme.events :as-alias theme.events] [renderer.utils.i18n :as utils.i18n] [renderer.window.events :as-alias window.events])) @@ -36,22 +40,42 @@ :versions (js->clj versions) :env (js->clj env) :user-agent user-agent - :system-lang system-language)})) + :system-lang system-language) + ::app.effects/get-local-db {:on-success [::load-local-db] + :on-error [::app.effects/clear-local-storage] + :on-finally [::db-loaded]}})) (rf/reg-event-fx ::load-local-db - [(rf/inject-cofx :store)] - (fn [{:keys [db store]} _] - (let [app-db (merge db store)] + (fn [{:keys [db]} [_ local-stored-db]] + (let [app-db (merge db local-stored-db)] (if (app.db/valid? app-db) {:db app-db} - {::app.effects/clear-local-storage nil - :db (notification.handlers/add db (notification.views/spec-failed - "Invalid local configuration" - (-> app-db - app.db/explain - malli.error/humanize - str)))})))) + {::app.effects/clear-local-storage nil})))) + +(rf/reg-event-fx + ::db-loaded + [(rf/inject-cofx ::effects/guid)] + (fn [{:keys [db guid]} _] + {:db (cond-> db + (not (:lang db)) + (assoc :lang (if (utils.i18n/supported-lang? (:system-lang db)) + (:system-lang db) + "en-US")) + + (not (:active-document db)) + (-> (document.handlers/create guid) + (history.handlers/finalize "Create document")) + + :always + (-> (snap.handlers/rebuild-tree) + (assoc :loading false))) + :fx [[::theme.effects/add-native-listener [::set-document-attr]] + [:dispatch [::theme.events/set-document-attr]] + [:dispatch [::set-document-lang]] + [:dispatch ^:flush-dom [::effects/focus nil]] + [:dispatch ^:flush-dom [::document.events/center]] + [::effects/ipc-send ["db-loaded"]]]})) (rf/reg-event-db ::set-system-fonts @@ -72,17 +96,6 @@ (assoc :lang lang)) :dispatch [::set-document-lang]})) -(rf/reg-event-fx - ::init-lang - [persist] - (fn [{:keys [db]} _] - {:db (cond-> db - (not (:lang db)) - (assoc :lang (if (utils.i18n/supported-lang? (:system-lang db)) - (:system-lang db) - "en-US"))) - :dispatch [::set-document-lang]})) - (rf/reg-event-db ::set-repl-mode (fn [db [_ mode]] diff --git a/src/renderer/app/subs.cljs b/src/renderer/app/subs.cljs index b1dc64c5..c304aacc 100644 --- a/src/renderer/app/subs.cljs +++ b/src/renderer/app/subs.cljs @@ -95,6 +95,10 @@ ::grid :-> :grid) +(rf/reg-sub + ::loading? + :-> :loading) + (rf/reg-sub ::panel-visible? (fn [db [_ k]] diff --git a/src/renderer/app/views.cljs b/src/renderer/app/views.cljs index 42874304..16f86b93 100644 --- a/src/renderer/app/views.cljs +++ b/src/renderer/app/views.cljs @@ -324,36 +324,39 @@ [] (let [documents (rf/subscribe [::document.subs/entities]) tree-visible (rf/subscribe [::app.subs/panel-visible? :tree]) + loading (rf/subscribe [::app.subs/loading?]) properties-visible (rf/subscribe [::app.subs/panel-visible? :properties]) active-tool (rf/subscribe [::tool.subs/active]) recent-docs (rf/subscribe [::document.subs/recent])] - [:> Tooltip/Provider - [:div.flex.flex-col.flex-1.h-dvh.overflow-hidden.justify-between - [window.views/app-header] - (if (seq @documents) - [:div.flex.h-full.flex-1.overflow-hidden.gap-px - (when @tree-visible - [:div.flex-col.hidden.overflow-hidden - {:class "md:flex" - :style {:width "227px"}} - [document.views/actions] - [tree.views/root]]) - [:div.flex.flex-col.flex-1.overflow-hidden.h-full - [document.views/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-visible - [:div.hidden - {:class "md:flex"} - [:div.flex.flex-col.h-full.w-80 - [views/scroll-area - (tool.hierarchy/right-panel @active-tool)] - [:div.bg-primary.grow.flex.mr-px]]]) - [:div.bg-primary.flex - [views/scroll-area [toolbar.object/root]]]]]]] - [home @recent-docs]) - [:div]] - [dialog.views/root] - [notification.views/main]])) + (if @loading + [:div.loader] + [:> Tooltip/Provider + [:div.flex.flex-col.flex-1.h-dvh.overflow-hidden.justify-between + [window.views/app-header] + (if (seq @documents) + [:div.flex.h-full.flex-1.overflow-hidden.gap-px + (when @tree-visible + [:div.flex-col.hidden.overflow-hidden + {:class "md:flex" + :style {:width "227px"}} + [document.views/actions] + [tree.views/root]]) + [:div.flex.flex-col.flex-1.overflow-hidden.h-full + [document.views/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-visible + [:div.hidden + {:class "md:flex"} + [:div.flex.flex-col.h-full.w-80 + [views/scroll-area + (tool.hierarchy/right-panel @active-tool)] + [:div.bg-primary.grow.flex.mr-px]]]) + [:div.bg-primary.flex + [views/scroll-area [toolbar.object/root]]]]]]] + [home @recent-docs]) + [:div]] + [dialog.views/root] + [notification.views/main]]))) diff --git a/src/renderer/core.cljs b/src/renderer/core.cljs index 3f8cac42..aa416c99 100644 --- a/src/renderer/core.cljs +++ b/src/renderer/core.cljs @@ -12,7 +12,7 @@ [renderer.attribute.impl.core] [renderer.dialog.events] [renderer.dialog.subs] - [renderer.document.events :as document.events] + [renderer.document.events] [renderer.document.subs] [renderer.element.effects] [renderer.element.events] @@ -33,7 +33,7 @@ [renderer.snap.events] [renderer.snap.subs] [renderer.theme.effects] - [renderer.theme.events :as theme.events] + [renderer.theme.events] [renderer.theme.subs] [renderer.timeline.events] [renderer.timeline.subs] @@ -75,8 +75,7 @@ (reset! root-el (ra.dom.client/create-root container)) (ra.dom.client/render @root-el [utils.error/boundary [app.views/root]]))) -(defn bootstrap-cb! - [] +(defn bootstrap-cb! [] (replumb/run-repl "(in-ns 'user)" identity) (print "Welcome to your REPL!") (print "") @@ -91,11 +90,6 @@ :load-on-init '[user]} bootstrap-cb!) (rf/dispatch-sync [::app.events/initialize-db]) - (rf/dispatch-sync [::app.events/load-local-db]) - (rf/dispatch-sync [::app.events/init-lang]) - (rf/dispatch-sync [::theme.events/set-document-attr]) - (rf/dispatch-sync [::document.events/init]) - (rf/dispatch-sync [::theme.events/add-native-listener]) (rf/dispatch-sync [::re-pressed/add-keyboard-event-listener "keydown"]) (rf/dispatch-sync [::re-pressed/set-keydown-rules event.impl.keyboard/keydown-rules]) (rf/dispatch-sync [::app.events/register-listeners]) diff --git a/src/renderer/document/events.cljs b/src/renderer/document/events.cljs index ac096498..84ffade4 100644 --- a/src/renderer/document/events.cljs +++ b/src/renderer/document/events.cljs @@ -2,13 +2,10 @@ (:require [cljs.reader :as cljs.reader] [config :as config] - [malli.core :as m] [re-frame.core :as rf] - [renderer.app.db :refer [App]] [renderer.app.events :refer [persist]] [renderer.dialog.handlers :as dialog.handlers] [renderer.dialog.views :as dialog.views] - [renderer.document.db :as document.db] [renderer.document.handlers :as document.handlers] [renderer.effects :as-alias effects] [renderer.element.handlers :as element.handlers] @@ -16,10 +13,8 @@ [renderer.notification.events :as-alias notification.events] [renderer.notification.handlers :as notification.handlers] [renderer.notification.views :as notification.views] - [renderer.snap.handlers :as snap.handlers] [renderer.utils.compatibility :as utils.compatibility] [renderer.utils.element :as utils.element] - [renderer.utils.math :refer [Vec2]] [renderer.utils.vec :as utils.vec] [shared :as shared])) @@ -139,39 +134,24 @@ (= swapped-i -1))) (assoc :document-tabs (utils.vec/swap document-tabs dragged-i swapped-i)))))) -(m/=> create [:function - [:-> map? uuid? App] - [:-> map? uuid? [:maybe Vec2] App]]) -(defn create - ([db guid] - (create db guid [595 842])) - ([db guid size] - (-> (document.handlers/create-tab db (assoc document.db/default :id guid)) - (element.handlers/create-default-canvas size) - (document.handlers/center)))) - (rf/reg-event-fx ::new [(rf/inject-cofx ::effects/guid)] (fn [{:keys [db guid]} [_]] - {:db (-> (create db guid) + {:db (-> (document.handlers/create db guid) (history.handlers/finalize "Create document")) ::effects/focus nil})) -(rf/reg-event-fx - ::init - [(rf/inject-cofx ::effects/guid)] - (fn [{:keys [db guid]} [_]] - {:db (if (:active-document db) - (snap.handlers/rebuild-tree db) - (-> (create db guid) - (history.handlers/finalize "Init document")))})) +(rf/reg-event-db + ::center + (fn [db [_]] + (document.handlers/center db))) (rf/reg-event-fx ::new-from-template [(rf/inject-cofx ::effects/guid)] (fn [{:keys [db guid]} [_ size]] - {:db (-> (create db guid size) + {:db (-> (document.handlers/create db guid size) (history.handlers/finalize "Create document from template"))})) (rf/reg-event-fx diff --git a/src/renderer/document/handlers.cljs b/src/renderer/document/handlers.cljs index 13ca66d6..d1ad6672 100644 --- a/src/renderer/document/handlers.cljs +++ b/src/renderer/document/handlers.cljs @@ -4,11 +4,13 @@ [malli.error :as m.error] [malli.transform :as m.transform] [renderer.app.db :refer [App]] - [renderer.document.db :as db :refer [Document PersistedDocument]] + [renderer.document.db :as document.db :refer [Document PersistedDocument]] + [renderer.element.handlers :as element.handlers] [renderer.frame.handlers :as frame.handlers] [renderer.notification.handlers :as notification.handlers] [renderer.notification.views :as notification.views] [renderer.snap.handlers :as snap.handlers] + [renderer.utils.math :refer [Vec2]] [renderer.utils.vec :as utils.vec])) (m/=> path [:function @@ -121,6 +123,17 @@ (set-active id) (update :document-tabs #(utils.vec/add % (inc active-index) id))))) +(m/=> create [:function + [:-> map? uuid? App] + [:-> map? uuid? [:maybe Vec2] App]]) +(defn create + ([db guid] + (create db guid [595 842])) + ([db guid size] + (-> (create-tab db (assoc document.db/default :id guid)) + (element.handlers/create-default-canvas size) + (center)))) + (m/=> set-hovered-ids [:-> App [:set uuid?] App]) (defn set-hovered-ids [db ids] @@ -150,11 +163,11 @@ (defn load [db document] (let [open-document-id (search-by-path db (:path document)) - document (merge db/default document) + document (merge document.db/default document) document (cond-> document open-document-id (assoc :id open-document-id))] - (if (db/valid? document) + (if (document.db/valid? document) (cond-> db (not open-document-id) (-> (create-tab document) @@ -166,7 +179,7 @@ :always (set-active (:id document))) - (let [explanation (-> document db/explain m.error/humanize str)] + (let [explanation (-> document document.db/explain m.error/humanize str)] (->> (notification.views/spec-failed "Load document" explanation) (notification.handlers/add db)))))) diff --git a/src/renderer/event/handlers.cljs b/src/renderer/event/handlers.cljs index ad573800..544232a1 100644 --- a/src/renderer/event/handlers.cljs +++ b/src/renderer/event/handlers.cljs @@ -4,7 +4,6 @@ [malli.core :as m] [renderer.app.db :refer [App]] [renderer.app.effects :as-alias app.effects] - [renderer.effects :as-alias effects] [renderer.event.db :refer [PointerEvent KeyboardEvent WheelEvent DragEvent]] [renderer.event.effects :as-alias event.effects] [renderer.frame.handlers :as frame.handlers] @@ -61,8 +60,7 @@ :nearest-neighbor-offset (:point nearest-neighbor)) :always - (-> (tool.hierarchy/on-pointer-down e) - (tool.handlers/add-fx [::effects/focus nil]))) + (tool.hierarchy/on-pointer-down e)) "pointerup" (cond-> (if drag diff --git a/src/renderer/theme/events.cljs b/src/renderer/theme/events.cljs index 46af8368..a8621a1d 100644 --- a/src/renderer/theme/events.cljs +++ b/src/renderer/theme/events.cljs @@ -7,11 +7,6 @@ [renderer.theme.effects :as-alias theme.effects] [renderer.theme.handlers :as theme.handlers])) -(rf/reg-event-fx - ::add-native-listener - (fn [_ _] - {::theme.effects/add-native-listener [::set-document-attr]})) - (rf/reg-event-fx ::set-document-attr [(rf/inject-cofx ::theme.effects/native-mode)] diff --git a/src/renderer/tool/events.cljs b/src/renderer/tool/events.cljs index 038d426c..d8806069 100644 --- a/src/renderer/tool/events.cljs +++ b/src/renderer/tool/events.cljs @@ -8,7 +8,9 @@ (rf/reg-event-fx ::activate (fn [{:keys [db]} [_ tool]] - {:db (tool.handlers/activate db tool) + {:db (cond-> db + (:active-document db) + (tool.handlers/activate tool)) ::effects/focus nil})) (rf/reg-event-db diff --git a/test/app_test.cljs b/test/app_test.cljs index 9737ccd3..d792dd1a 100644 --- a/test/app_test.cljs +++ b/test/app_test.cljs @@ -9,6 +9,11 @@ (defn test-fixtures [] + (rf/reg-fx + ::app.effects/get-local-db + (fn [{:keys [on-finally]}] + (rf/dispatch on-finally))) + (rf/reg-cofx ::app.effects/system-language (fn [coeffects _] @@ -39,10 +44,6 @@ (testing "language" (let [lang (rf/subscribe [::app.subs/lang])] (testing "default" - (is (not @lang))) - - (testing "initialization" - (rf/dispatch [::app.events/init-lang]) (is (= "en-US" @lang))) (testing "set valid language" diff --git a/test/benchmark.cljs b/test/benchmark.cljs index fd11c3d3..e3bc7929 100644 --- a/test/benchmark.cljs +++ b/test/benchmark.cljs @@ -6,7 +6,6 @@ [malli.instrument :as m.instrument] [re-frame.core :as rf] [renderer.app.events :as app.events] - [renderer.document.events :as-alias document.events] [renderer.element.events :as-alias element.events])) (defn bench @@ -22,7 +21,6 @@ (deftest polygons (rf.test/run-test-sync (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) ;; Istrumentation and db validation affects performance, so we disable it. (m.instrument/unstrument!) diff --git a/test/document_test.cljs b/test/document_test.cljs index bfe63697..d44e1b39 100644 --- a/test/document_test.cljs +++ b/test/document_test.cljs @@ -3,14 +3,24 @@ [cljs.test :refer-macros [deftest is testing]] [day8.re-frame.test :as rf.test] [re-frame.core :as rf] + [renderer.app.effects :as-alias app.effects] [renderer.app.events :as-alias app.events] [renderer.document.db :as document.db] [renderer.document.events :as-alias document.events] [renderer.document.subs :as-alias document.subs])) +(defn test-fixtures + [] + (rf/reg-fx + ::app.effects/get-local-db + (fn [{:keys [on-finally]}] + (rf/dispatch on-finally)))) + (deftest document (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/db-loaded]) (let [document-entities? (rf/subscribe [::document.subs/entities?]) active-document (rf/subscribe [::document.subs/active]) @@ -18,11 +28,6 @@ title-bar (rf/subscribe [::document.subs/title-bar]) active-id (rf/subscribe [::document.subs/active-id])] (testing "defaults" - (is (not @document-entities?)) - (is (not @active-document))) - - (testing "initialization" - (rf/dispatch [::document.events/init]) (is @document-entities?) (is (document.db/valid? @active-document)) (is (= "• Untitled-1 - Repath Studio" @title-bar))) diff --git a/test/element_test.cljs b/test/element_test.cljs index 352ad67f..ce3d666f 100644 --- a/test/element_test.cljs +++ b/test/element_test.cljs @@ -4,6 +4,7 @@ [cljs.test :refer-macros [deftest are is testing]] [day8.re-frame.test :as rf.test] [re-frame.core :as rf] + [renderer.app.effects :as-alias app.effects] [renderer.app.events :as-alias app.events] [renderer.document.events :as-alias document.events] [renderer.element.db :as element.db] @@ -12,10 +13,17 @@ (.setup paper) +(defn test-fixtures + [] + (rf/reg-fx + ::app.effects/get-local-db + (fn [{:keys [on-finally]}] + (rf/dispatch on-finally)))) + (deftest init (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) (let [root (rf/subscribe [::element.subs/root]) root-children (rf/subscribe [::element.subs/root-children])] @@ -27,8 +35,8 @@ (deftest select (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) (let [selected (rf/subscribe [::element.subs/selected])] (testing "default state" @@ -56,6 +64,7 @@ (deftest index (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) (rf/dispatch [::document.events/new-from-template nil]) @@ -99,6 +108,7 @@ (deftest align (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) (rf/dispatch [::document.events/new-from-template [800 600]]) @@ -153,8 +163,8 @@ (deftest visibility (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -173,8 +183,8 @@ (deftest label (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -193,8 +203,8 @@ (deftest lock (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -213,8 +223,8 @@ (deftest attribute (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -237,8 +247,8 @@ (deftest delete (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -254,8 +264,9 @@ (deftest scale (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) + (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect :attrs {:width "100" @@ -266,8 +277,9 @@ (deftest translate (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) + (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect :attrs {:x "100" @@ -280,8 +292,9 @@ (deftest place (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) + (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect :attrs {:x "100" @@ -294,8 +307,9 @@ (deftest ->path (rf.test/run-test-async + (test-fixtures) (rf/dispatch-sync [::app.events/initialize-db]) - (rf/dispatch-sync [::document.events/init]) + (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect :attrs {:x "100" @@ -314,29 +328,33 @@ (deftest stroke->path (rf.test/run-test-async + (test-fixtures) (rf/dispatch-sync [::app.events/initialize-db]) - (rf/dispatch-sync [::document.events/init]) - (let [selected (rf/subscribe [::element.subs/selected])] - (rf/dispatch [::element.events/add {:tag :rect - :attrs {:x "100" - :y "100" - :width "100" - :height "100" - :fill "red" - :stroke "black"}}]) - (rf/dispatch [::element.events/stroke->path]) - (rf.test/wait-for - [::element.events/finalize-stroke->path] - - (is (= (-> @selected first :tag) :path)) - (is (= (-> @selected first :attrs :fill) "black")) - (not (-> @selected first :attrs :stroke)))))) + (rf.test/wait-for + [::app.events/db-loaded] + (let [selected (rf/subscribe [::element.subs/selected])] + (rf/dispatch [::element.events/add {:tag :rect + :attrs {:x "100" + :y "100" + :width "100" + :height "100" + :fill "red" + :stroke "black"}}]) + (rf/dispatch [::element.events/stroke->path]) + + (rf.test/wait-for + [::element.events/finalize-stroke->path] + + (is (= (-> @selected first :tag) :path)) + (is (= (-> @selected first :attrs :fill) "black")) + (not (-> @selected first :attrs :stroke))))))) (deftest boolean-operation (rf.test/run-test-async + (test-fixtures) (rf/dispatch-sync [::app.events/initialize-db]) - (rf/dispatch-sync [::document.events/init]) + (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect :attrs {:x "100" @@ -361,8 +379,9 @@ (deftest import-svg (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) + (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/import-svg {:svg "" @@ -375,8 +394,9 @@ (deftest animate (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) + (rf/dispatch [::element.events/add {:tag :rect :attrs {:x "100" :y "100" @@ -390,8 +410,9 @@ (deftest set-parent (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) + (rf/dispatch [::element.events/add {:tag :rect :attrs {:x "100" :y "100" @@ -407,8 +428,9 @@ (deftest group (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) + (rf/dispatch [::element.events/add {:tag :rect :attrs {:x "100" :y "100" diff --git a/test/frame_test.cljs b/test/frame_test.cljs index 791f35b4..75b83695 100644 --- a/test/frame_test.cljs +++ b/test/frame_test.cljs @@ -3,16 +3,23 @@ [cljs.test :refer-macros [deftest is testing]] [day8.re-frame.test :as rf.test] [re-frame.core :as rf] + [renderer.app.effects :as-alias app.effects] [renderer.app.events :as-alias app.events] - [renderer.document.events :as-alias document.events] [renderer.document.subs :as-alias document.subs] [renderer.frame.events :as-alias frame.events] [renderer.frame.subs :as-alias frame.subs])) +(defn test-fixtures + [] + (rf/reg-fx + ::app.effects/get-local-db + (fn [{:keys [on-finally]}] + (rf/dispatch on-finally)))) + (deftest frame (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) (let [viewbox (rf/subscribe [::frame.subs/viewbox]) zoom (rf/subscribe [::document.subs/zoom]) diff --git a/test/history_test.cljs b/test/history_test.cljs index 4631efe6..4a45568f 100644 --- a/test/history_test.cljs +++ b/test/history_test.cljs @@ -3,17 +3,24 @@ [cljs.test :refer-macros [deftest is testing]] [day8.re-frame.test :as rf.test] [re-frame.core :as rf] + [renderer.app.effects :as-alias app.effects] [renderer.app.events :as-alias app.events] - [renderer.document.events :as-alias document.events] [renderer.element.events :as-alias element.events] [renderer.element.subs :as-alias element.subs] [renderer.history.events :as-alias history.events] [renderer.history.subs :as history.subs])) +(defn test-fixtures + [] + (rf/reg-fx + ::app.effects/get-local-db + (fn [{:keys [on-finally]}] + (rf/dispatch on-finally)))) + (deftest history (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) (let [undos? (rf/subscribe [::history.subs/undos?]) redos? (rf/subscribe [::history.subs/redos?]) diff --git a/test/tool_test.cljs b/test/tool_test.cljs index cfb3ad40..2cac11fb 100644 --- a/test/tool_test.cljs +++ b/test/tool_test.cljs @@ -3,17 +3,24 @@ [cljs.test :refer-macros [deftest is testing]] [day8.re-frame.test :as rf.test] [re-frame.core :as rf] + [renderer.app.effects :as-alias app.effects] [renderer.app.events :as-alias app.events] - [renderer.document.events :as-alias document.events] [renderer.element.events :as-alias element.events] [renderer.tool.events :as-alias tool.events] [renderer.tool.hierarchy :as tool.hierarchy] [renderer.tool.subs :as-alias tool.subs])) +(defn test-fixtures + [] + (rf/reg-fx + ::app.effects/get-local-db + (fn [{:keys [on-finally]}] + (rf/dispatch on-finally)))) + (deftest tool (rf.test/run-test-sync + (test-fixtures) (rf/dispatch [::app.events/initialize-db]) - (rf/dispatch [::document.events/init]) (let [active-tool (rf/subscribe [::tool.subs/active])] From 99a3e6daf25b6c5711f0a62e59a3dd36456a2419 Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Sat, 21 Jun 2025 20:31:35 +0300 Subject: [PATCH 02/13] remove system language from db --- src/renderer/app/db.cljs | 1 - src/renderer/app/events.cljs | 18 ++++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/renderer/app/db.cljs b/src/renderer/app/db.cljs index ed991dd1..6d1b5591 100644 --- a/src/renderer/app/db.cljs +++ b/src/renderer/app/db.cljs @@ -69,7 +69,6 @@ [:pen-mode {:default false} boolean?] [:backdrop {:default false} boolean?] [:lang {:optional true :persist true} Lang] - [:system-lang {:optional true} string?] [:platform {:optional true} Platform] [:versions {:optional true} [:maybe map?]] [:env {:optional true} [:maybe map?]] diff --git a/src/renderer/app/events.cljs b/src/renderer/app/events.cljs index d145ceb4..51fdb66d 100644 --- a/src/renderer/app/events.cljs +++ b/src/renderer/app/events.cljs @@ -8,7 +8,6 @@ [renderer.effects :as-alias effects] [renderer.event.events :as-alias event.events] [renderer.event.impl.keyboard :as event.impl.keyboard] - [renderer.events :as-alias events] [renderer.history.handlers :as history.handlers] [renderer.notification.events :as-alias notification.events] [renderer.snap.handlers :as snap.handlers] @@ -32,15 +31,13 @@ [(rf/inject-cofx ::app.effects/user-agent) (rf/inject-cofx ::app.effects/platform) (rf/inject-cofx ::app.effects/versions) - (rf/inject-cofx ::app.effects/env) - (rf/inject-cofx ::app.effects/system-language)] - (fn [{:keys [user-agent platform versions env system-language]} _] + (rf/inject-cofx ::app.effects/env)] + (fn [{:keys [user-agent platform versions env]} _] {:db (assoc app.db/default :platform platform :versions (js->clj versions) :env (js->clj env) - :user-agent user-agent - :system-lang system-language) + :user-agent user-agent) ::app.effects/get-local-db {:on-success [::load-local-db] :on-error [::app.effects/clear-local-storage] :on-finally [::db-loaded]}})) @@ -55,12 +52,13 @@ (rf/reg-event-fx ::db-loaded - [(rf/inject-cofx ::effects/guid)] - (fn [{:keys [db guid]} _] + [(rf/inject-cofx ::effects/guid) + (rf/inject-cofx ::app.effects/system-language)] + (fn [{:keys [db guid system-language]} _] {:db (cond-> db (not (:lang db)) - (assoc :lang (if (utils.i18n/supported-lang? (:system-lang db)) - (:system-lang db) + (assoc :lang (if (utils.i18n/supported-lang? system-language) + system-language "en-US")) (not (:active-document db)) From 6a2f933a578266cefb70c1dbdb4f96dd84217034 Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Sat, 21 Jun 2025 20:44:40 +0300 Subject: [PATCH 03/13] fix native theme effect --- src/renderer/app/events.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/app/events.cljs b/src/renderer/app/events.cljs index 51fdb66d..46f6932d 100644 --- a/src/renderer/app/events.cljs +++ b/src/renderer/app/events.cljs @@ -68,7 +68,7 @@ :always (-> (snap.handlers/rebuild-tree) (assoc :loading false))) - :fx [[::theme.effects/add-native-listener [::set-document-attr]] + :fx [[::theme.effects/add-native-listener [::theme.events/set-document-attr]] [:dispatch [::theme.events/set-document-attr]] [:dispatch [::set-document-lang]] [:dispatch ^:flush-dom [::effects/focus nil]] From 1d2108c1bd22e7e59bb1914707976e78d8ef387c Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Sun, 22 Jun 2025 11:31:58 +0300 Subject: [PATCH 04/13] reintroduce fcus on pointer down --- src/renderer/event/handlers.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/renderer/event/handlers.cljs b/src/renderer/event/handlers.cljs index 544232a1..ad573800 100644 --- a/src/renderer/event/handlers.cljs +++ b/src/renderer/event/handlers.cljs @@ -4,6 +4,7 @@ [malli.core :as m] [renderer.app.db :refer [App]] [renderer.app.effects :as-alias app.effects] + [renderer.effects :as-alias effects] [renderer.event.db :refer [PointerEvent KeyboardEvent WheelEvent DragEvent]] [renderer.event.effects :as-alias event.effects] [renderer.frame.handlers :as frame.handlers] @@ -60,7 +61,8 @@ :nearest-neighbor-offset (:point nearest-neighbor)) :always - (tool.hierarchy/on-pointer-down e)) + (-> (tool.hierarchy/on-pointer-down e) + (tool.handlers/add-fx [::effects/focus nil]))) "pointerup" (cond-> (if drag From efcb0539ea2b48f7e3a9f9ab31baf79fe01c974c Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Sun, 22 Jun 2025 11:43:05 +0300 Subject: [PATCH 05/13] enhance error handling --- src/renderer/app/effects.cljs | 10 ++++++---- src/renderer/app/events.cljs | 6 ++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/renderer/app/effects.cljs b/src/renderer/app/effects.cljs index 68b68728..54e396f4 100644 --- a/src/renderer/app/effects.cljs +++ b/src/renderer/app/effects.cljs @@ -6,7 +6,8 @@ [re-frame.core :as rf] [re-frame.db :as rf.db] [renderer.app.db :as app.db] - [renderer.history.handlers :as history.handlers])) + [renderer.history.handlers :as history.handlers] + [renderer.notification.events :as-alias notification.events])) (rf/reg-cofx ::platform @@ -67,9 +68,10 @@ db (cond-> db (:active-document db) history.handlers/drop-rest)] - (->> (select-keys db app.db/persisted-keys) - (transit/write (transit/writer :json)) - (localforage/setItem config/app-name))))) + (.catch (->> (select-keys db app.db/persisted-keys) + (transit/write (transit/writer :json)) + (localforage/setItem config/app-name)) + #(rf/dispatch [::notification.events/show-exception %]))))) (rf/reg-fx ::validate diff --git a/src/renderer/app/events.cljs b/src/renderer/app/events.cljs index 46f6932d..fb599140 100644 --- a/src/renderer/app/events.cljs +++ b/src/renderer/app/events.cljs @@ -8,6 +8,7 @@ [renderer.effects :as-alias effects] [renderer.event.events :as-alias event.events] [renderer.event.impl.keyboard :as event.impl.keyboard] + [renderer.events :as-alias events] [renderer.history.handlers :as history.handlers] [renderer.notification.events :as-alias notification.events] [renderer.snap.handlers :as snap.handlers] @@ -39,7 +40,7 @@ :env (js->clj env) :user-agent user-agent) ::app.effects/get-local-db {:on-success [::load-local-db] - :on-error [::app.effects/clear-local-storage] + :on-error [::notification.events/show-exception] :on-finally [::db-loaded]}})) (rf/reg-event-fx @@ -71,7 +72,8 @@ :fx [[::theme.effects/add-native-listener [::theme.events/set-document-attr]] [:dispatch [::theme.events/set-document-attr]] [:dispatch [::set-document-lang]] - [:dispatch ^:flush-dom [::effects/focus nil]] + ;; WE need to render the canvas to properly center and focus on the document. + [:dispatch ^:flush-dom [::events/focus nil]] [:dispatch ^:flush-dom [::document.events/center]] [::effects/ipc-send ["db-loaded"]]]})) From 7fede96e41aaf8a55c52a7d62a9ff9c2d17a7568 Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Sun, 22 Jun 2025 16:46:42 +0300 Subject: [PATCH 06/13] various fixes --- src/electron/main.cljs | 5 +-- src/renderer/app/effects.cljs | 4 +- src/renderer/app/events.cljs | 61 +++++++++++++------------------ src/renderer/document/events.cljs | 5 --- test/app_test.cljs | 4 +- 5 files changed, 31 insertions(+), 48 deletions(-) diff --git a/src/electron/main.cljs b/src/electron/main.cljs index 602e2bfa..153c07f8 100644 --- a/src/electron/main.cljs +++ b/src/electron/main.cljs @@ -47,7 +47,7 @@ (defn register-ipc-on-events! [] (doseq [[e f] - [["db-loaded" #(doto ^js @loading-window (.hide) (.close))] + [["db-loaded" #(.close ^js @loading-window)] ["relaunch" #(doto app (.relaunch) (.exit))] ["open-remote-url" open-external!] ["open-directory" #(.showItemInFolder shell %)] @@ -99,8 +99,7 @@ [action [(if (.isMaximized window) "window-maximized" "window-unmaximized") (if (.isFullScreen window) "window-entered-fullscreen" "window-leaved-fullscreen") - (if (.isFocused window) "window-focused" "window-blurred") - "window-loaded"]] + (if (.isFocused window) "window-focused" "window-blurred")]] (send-to-renderer! action))) (defn resource-path diff --git a/src/renderer/app/effects.cljs b/src/renderer/app/effects.cljs index 54e396f4..0f6ce067 100644 --- a/src/renderer/app/effects.cljs +++ b/src/renderer/app/effects.cljs @@ -36,9 +36,9 @@ (assoc coeffects :user-agent (.-userAgent js/navigator)))) (rf/reg-cofx - ::system-language + ::language (fn [coeffects _] - (assoc coeffects :system-language (.-language js/navigator)))) + (assoc coeffects :language (.-language js/navigator)))) (rf/reg-fx ::query-local-fonts diff --git a/src/renderer/app/events.cljs b/src/renderer/app/events.cljs index fb599140..0f61b74e 100644 --- a/src/renderer/app/events.cljs +++ b/src/renderer/app/events.cljs @@ -3,12 +3,10 @@ [re-frame.core :as rf] [renderer.app.db :as app.db] [renderer.app.effects :as-alias app.effects] - [renderer.document.events :as-alias document.events] [renderer.document.handlers :as document.handlers] [renderer.effects :as-alias effects] [renderer.event.events :as-alias event.events] [renderer.event.impl.keyboard :as event.impl.keyboard] - [renderer.events :as-alias events] [renderer.history.handlers :as history.handlers] [renderer.notification.events :as-alias notification.events] [renderer.snap.handlers :as snap.handlers] @@ -54,12 +52,12 @@ (rf/reg-event-fx ::db-loaded [(rf/inject-cofx ::effects/guid) - (rf/inject-cofx ::app.effects/system-language)] - (fn [{:keys [db guid system-language]} _] + (rf/inject-cofx ::app.effects/language)] + (fn [{:keys [db guid language]} _] {:db (cond-> db (not (:lang db)) - (assoc :lang (if (utils.i18n/supported-lang? system-language) - system-language + (assoc :lang (if (utils.i18n/supported-lang? language) + language "en-US")) (not (:active-document db)) @@ -69,13 +67,18 @@ :always (-> (snap.handlers/rebuild-tree) (assoc :loading false))) - :fx [[::theme.effects/add-native-listener [::theme.events/set-document-attr]] - [:dispatch [::theme.events/set-document-attr]] - [:dispatch [::set-document-lang]] - ;; WE need to render the canvas to properly center and focus on the document. - [:dispatch ^:flush-dom [::events/focus nil]] - [:dispatch ^:flush-dom [::document.events/center]] - [::effects/ipc-send ["db-loaded"]]]})) + :fx (into + [[:dispatch [::theme.events/set-document-attr]] + [:dispatch ^:flush-dom [::set-document-lang]] + [:dispatch ^:flush-dom [::window.events/update-focused]] + [::effects/ipc-send ["db-loaded"]] + [::theme.effects/add-native-listener [::theme.events/set-document-attr]]] + (map #(vector ::effects/add-listener %) + [[js/document "keydown" [::event.events/keyboard] event.impl.keyboard/->clj] + [js/document "keyup" [::event.events/keyboard] event.impl.keyboard/->clj] + [js/document "fullscreenchange" [::window.events/update-fullscreen]] + [js/window "focus" [::window.events/update-focused]] + [js/window "blur" [::window.events/update-focused]]]))})) (rf/reg-event-db ::set-system-fonts @@ -156,28 +159,14 @@ (conj (or fx []) [::app.effects/validate [db event]]))))))) -(rf/reg-event-fx - ::add-listeners - (fn [_ _] - {:fx (->> [[js/document "keydown" [::event.events/keyboard] event.impl.keyboard/->clj] - [js/document "keyup" [::event.events/keyboard] event.impl.keyboard/->clj] - [js/document "fullscreenchange" [::window.events/update-fullscreen]] - [js/window "load" [::window.events/update-focused]] - [js/window "focus" [::window.events/update-focused]] - [js/window "blur" [::window.events/update-focused]]] - (mapv #(vector ::effects/add-listener %)))})) - (rf/reg-event-fx ::register-listeners - (fn [{:keys [db]} _] - (if (= (:platform db) "web") - {:dispatch [::add-listeners]} - {:fx (->> [["window-maximized" [::window.events/set-maximized true]] - ["window-unmaximized" [::window.events/set-maximized false]] - ["window-focused" [::window.events/set-focused true]] - ["window-blurred" [::window.events/set-focused false]] - ["window-entered-fullscreen" [::window.events/set-fullscreen true]] - ["window-leaved-fullscreen" [::window.events/set-fullscreen false]] - ["window-minimized" [::window.events/set-minimized true]] - ["window-loaded" [::add-listeners]]] - (mapv #(vector ::effects/ipc-on %)))}))) + (fn [_ _] + {:fx (mapv #(vector ::effects/ipc-on %) + [["window-maximized" [::window.events/set-maximized true]] + ["window-unmaximized" [::window.events/set-maximized false]] + ["window-focused" [::window.events/set-focused true]] + ["window-blurred" [::window.events/set-focused false]] + ["window-entered-fullscreen" [::window.events/set-fullscreen true]] + ["window-leaved-fullscreen" [::window.events/set-fullscreen false]] + ["window-minimized" [::window.events/set-minimized true]]])})) diff --git a/src/renderer/document/events.cljs b/src/renderer/document/events.cljs index 84ffade4..704b3847 100644 --- a/src/renderer/document/events.cljs +++ b/src/renderer/document/events.cljs @@ -142,11 +142,6 @@ (history.handlers/finalize "Create document")) ::effects/focus nil})) -(rf/reg-event-db - ::center - (fn [db [_]] - (document.handlers/center db))) - (rf/reg-event-fx ::new-from-template [(rf/inject-cofx ::effects/guid)] diff --git a/test/app_test.cljs b/test/app_test.cljs index d792dd1a..1afe8fd1 100644 --- a/test/app_test.cljs +++ b/test/app_test.cljs @@ -15,9 +15,9 @@ (rf/dispatch on-finally))) (rf/reg-cofx - ::app.effects/system-language + ::app.effects/language (fn [coeffects _] - (assoc coeffects :system-language "en-US"))) + (assoc coeffects :language "en-US"))) (rf/reg-fx ::app.effects/query-local-fonts From edc1605b79959798f3ac031c8845cf0e19856b84 Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Sun, 22 Jun 2025 22:58:54 +0300 Subject: [PATCH 07/13] refactor --- src/electron/main.cljs | 2 +- src/renderer/app/events.cljs | 55 +++++++++++++++++++----------------- src/renderer/core.cljs | 3 +- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/src/electron/main.cljs b/src/electron/main.cljs index 153c07f8..2014ff64 100644 --- a/src/electron/main.cljs +++ b/src/electron/main.cljs @@ -47,7 +47,7 @@ (defn register-ipc-on-events! [] (doseq [[e f] - [["db-loaded" #(.close ^js @loading-window)] + [["initialized" #(.close ^js @loading-window)] ["relaunch" #(doto app (.relaunch) (.exit))] ["open-remote-url" open-external!] ["open-directory" #(.showItemInFolder shell %)] diff --git a/src/renderer/app/events.cljs b/src/renderer/app/events.cljs index 0f61b74e..8dae2de5 100644 --- a/src/renderer/app/events.cljs +++ b/src/renderer/app/events.cljs @@ -25,8 +25,24 @@ db (rf/assoc-effect :fx (conj (or fx []) [::app.effects/persist]))))))) +(defonce document-listeners + [[js/document "keydown" [::event.events/keyboard] event.impl.keyboard/->clj] + [js/document "keyup" [::event.events/keyboard] event.impl.keyboard/->clj] + [js/document "fullscreenchange" [::window.events/update-fullscreen]] + [js/window "focus" [::window.events/update-focused]] + [js/window "blur" [::window.events/update-focused]]]) + +(defonce ipc-listeners + [["window-maximized" [::window.events/set-maximized true]] + ["window-unmaximized" [::window.events/set-maximized false]] + ["window-focused" [::window.events/set-focused true]] + ["window-blurred" [::window.events/set-focused false]] + ["window-entered-fullscreen" [::window.events/set-fullscreen true]] + ["window-leaved-fullscreen" [::window.events/set-fullscreen false]] + ["window-minimized" [::window.events/set-minimized true]]]) + (rf/reg-event-fx - ::initialize-db + ::initialize [(rf/inject-cofx ::app.effects/user-agent) (rf/inject-cofx ::app.effects/platform) (rf/inject-cofx ::app.effects/versions) @@ -37,9 +53,11 @@ :versions (js->clj versions) :env (js->clj env) :user-agent user-agent) - ::app.effects/get-local-db {:on-success [::load-local-db] - :on-error [::notification.events/show-exception] - :on-finally [::db-loaded]}})) + :fx (into + [[::app.effects/get-local-db {:on-success [::load-local-db] + :on-error [::notification.events/show-exception] + :on-finally [::db-loaded]}]] + (map (partial vector ::effects/ipc-on) ipc-listeners))})) (rf/reg-event-fx ::load-local-db @@ -64,21 +82,18 @@ (-> (document.handlers/create guid) (history.handlers/finalize "Create document")) + (:active-document db) + (snap.handlers/rebuild-tree) + :always - (-> (snap.handlers/rebuild-tree) - (assoc :loading false))) + (assoc :loading false)) :fx (into [[:dispatch [::theme.events/set-document-attr]] [:dispatch ^:flush-dom [::set-document-lang]] [:dispatch ^:flush-dom [::window.events/update-focused]] - [::effects/ipc-send ["db-loaded"]] - [::theme.effects/add-native-listener [::theme.events/set-document-attr]]] - (map #(vector ::effects/add-listener %) - [[js/document "keydown" [::event.events/keyboard] event.impl.keyboard/->clj] - [js/document "keyup" [::event.events/keyboard] event.impl.keyboard/->clj] - [js/document "fullscreenchange" [::window.events/update-fullscreen]] - [js/window "focus" [::window.events/update-focused]] - [js/window "blur" [::window.events/update-focused]]]))})) + [::theme.effects/add-native-listener [::theme.events/set-document-attr]] + [::effects/ipc-send ["initialized"]]] + (map (partial vector ::effects/add-listener) document-listeners))})) (rf/reg-event-db ::set-system-fonts @@ -158,15 +173,3 @@ (rf/assoc-effect :fx (conj (or fx []) [::app.effects/validate [db event]]))))))) - -(rf/reg-event-fx - ::register-listeners - (fn [_ _] - {:fx (mapv #(vector ::effects/ipc-on %) - [["window-maximized" [::window.events/set-maximized true]] - ["window-unmaximized" [::window.events/set-maximized false]] - ["window-focused" [::window.events/set-focused true]] - ["window-blurred" [::window.events/set-focused false]] - ["window-entered-fullscreen" [::window.events/set-fullscreen true]] - ["window-leaved-fullscreen" [::window.events/set-fullscreen false]] - ["window-minimized" [::window.events/set-minimized true]]])})) diff --git a/src/renderer/core.cljs b/src/renderer/core.cljs index aa416c99..55257ab5 100644 --- a/src/renderer/core.cljs +++ b/src/renderer/core.cljs @@ -89,10 +89,9 @@ (bootstrap/init replumb.repl/st {:path "js/bootstrap" :load-on-init '[user]} bootstrap-cb!) - (rf/dispatch-sync [::app.events/initialize-db]) + (rf/dispatch-sync [::app.events/initialize]) (rf/dispatch-sync [::re-pressed/add-keyboard-event-listener "keydown"]) (rf/dispatch-sync [::re-pressed/set-keydown-rules event.impl.keyboard/keydown-rules]) - (rf/dispatch-sync [::app.events/register-listeners]) (.setup paper) From d33b7d652bebddbac21d251a734103eff6be45cb Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Sun, 29 Jun 2025 11:14:26 +0300 Subject: [PATCH 08/13] enhance performance --- src/renderer/utils/element.cljs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/renderer/utils/element.cljs b/src/renderer/utils/element.cljs index 861df7f3..8b43d2b6 100644 --- a/src/renderer/utils/element.cljs +++ b/src/renderer/utils/element.cljs @@ -55,9 +55,7 @@ [el] (let [el-bbox (:bbox el) local-bbox (element.hierarchy/bbox el)] - (->> (matrix/sub el-bbox local-bbox) - (take 2) - (vec)))) + (into [] (take 2) (matrix/sub el-bbox local-bbox)))) (m/=> snapping-points [:-> Element SnapOptions [:* Vec2]]) (defn snapping-points From 80c253347e6fb8591ad189ed5cb38d222fe19bc8 Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Wed, 2 Jul 2025 19:31:13 +0300 Subject: [PATCH 09/13] fix tests --- test/app_test.cljs | 4 ++-- test/benchmark.cljs | 2 +- test/document_test.cljs | 2 +- test/element_test.cljs | 38 ++++++++++++++++++------------------- test/frame_test.cljs | 2 +- test/history_test.cljs | 2 +- test/notification_test.cljs | 2 +- test/theme_test.cljs | 2 +- test/tool_test.cljs | 2 +- test/window_test.cljs | 2 +- 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/test/app_test.cljs b/test/app_test.cljs index 1afe8fd1..acb22980 100644 --- a/test/app_test.cljs +++ b/test/app_test.cljs @@ -39,7 +39,7 @@ (deftest app (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (testing "language" (let [lang (rf/subscribe [::app.subs/lang])] @@ -71,7 +71,7 @@ (deftest fonts (rf.test/run-test-async (test-fixtures) - (rf/dispatch-sync [::app.events/initialize-db]) + (rf/dispatch-sync [::app.events/initialize]) (testing "loading system fonts" (let [system-fonts (rf/subscribe [::app.subs/system-fonts]) diff --git a/test/benchmark.cljs b/test/benchmark.cljs index e3bc7929..c9bcfe51 100644 --- a/test/benchmark.cljs +++ b/test/benchmark.cljs @@ -20,7 +20,7 @@ (deftest polygons (rf.test/run-test-sync - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) ;; Istrumentation and db validation affects performance, so we disable it. (m.instrument/unstrument!) diff --git a/test/document_test.cljs b/test/document_test.cljs index d44e1b39..2003fb8c 100644 --- a/test/document_test.cljs +++ b/test/document_test.cljs @@ -19,7 +19,7 @@ (deftest document (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (rf/dispatch [::app.events/db-loaded]) (let [document-entities? (rf/subscribe [::document.subs/entities?]) diff --git a/test/element_test.cljs b/test/element_test.cljs index ce3d666f..63c37d30 100644 --- a/test/element_test.cljs +++ b/test/element_test.cljs @@ -23,7 +23,7 @@ (deftest init (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [root (rf/subscribe [::element.subs/root]) root-children (rf/subscribe [::element.subs/root-children])] @@ -36,7 +36,7 @@ (deftest select (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (testing "default state" @@ -65,7 +65,7 @@ (deftest index (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (rf/dispatch [::document.events/new-from-template nil]) (rf/dispatch [::element.events/add {:tag :rect @@ -109,7 +109,7 @@ (deftest align (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (rf/dispatch [::document.events/new-from-template [800 600]]) (rf/dispatch [::element.events/add {:tag :rect @@ -164,7 +164,7 @@ (deftest visibility (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -184,7 +184,7 @@ (deftest label (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -204,7 +204,7 @@ (deftest lock (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -224,7 +224,7 @@ (deftest attribute (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -248,7 +248,7 @@ (deftest delete (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -265,7 +265,7 @@ (deftest scale (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -278,7 +278,7 @@ (deftest translate (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -293,7 +293,7 @@ (deftest place (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -308,7 +308,7 @@ (deftest ->path (rf.test/run-test-async (test-fixtures) - (rf/dispatch-sync [::app.events/initialize-db]) + (rf/dispatch-sync [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -329,7 +329,7 @@ (deftest stroke->path (rf.test/run-test-async (test-fixtures) - (rf/dispatch-sync [::app.events/initialize-db]) + (rf/dispatch-sync [::app.events/initialize]) (rf.test/wait-for [::app.events/db-loaded] @@ -353,7 +353,7 @@ (deftest boolean-operation (rf.test/run-test-async (test-fixtures) - (rf/dispatch-sync [::app.events/initialize-db]) + (rf/dispatch-sync [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/add {:tag :rect @@ -380,7 +380,7 @@ (deftest import-svg (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [selected (rf/subscribe [::element.subs/selected])] (rf/dispatch [::element.events/import-svg @@ -395,7 +395,7 @@ (deftest animate (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (rf/dispatch [::element.events/add {:tag :rect :attrs {:x "100" @@ -411,7 +411,7 @@ (deftest set-parent (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (rf/dispatch [::element.events/add {:tag :rect :attrs {:x "100" @@ -429,7 +429,7 @@ (deftest group (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (rf/dispatch [::element.events/add {:tag :rect :attrs {:x "100" diff --git a/test/frame_test.cljs b/test/frame_test.cljs index 75b83695..abd76798 100644 --- a/test/frame_test.cljs +++ b/test/frame_test.cljs @@ -19,7 +19,7 @@ (deftest frame (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [viewbox (rf/subscribe [::frame.subs/viewbox]) zoom (rf/subscribe [::document.subs/zoom]) diff --git a/test/history_test.cljs b/test/history_test.cljs index 4a45568f..6d07dcad 100644 --- a/test/history_test.cljs +++ b/test/history_test.cljs @@ -20,7 +20,7 @@ (deftest history (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [undos? (rf/subscribe [::history.subs/undos?]) redos? (rf/subscribe [::history.subs/redos?]) diff --git a/test/notification_test.cljs b/test/notification_test.cljs index cfd445cc..7be3abc8 100644 --- a/test/notification_test.cljs +++ b/test/notification_test.cljs @@ -9,7 +9,7 @@ (deftest notification (rf.test/run-test-sync - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [notifications (rf/subscribe [::notification.subs/entities])] diff --git a/test/theme_test.cljs b/test/theme_test.cljs index c0c5f0ad..8a229149 100644 --- a/test/theme_test.cljs +++ b/test/theme_test.cljs @@ -18,7 +18,7 @@ (deftest mode (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (rf/dispatch [::theme.events/set-document-attr]) (let [theme-mode (rf/subscribe [::theme.subs/mode])] diff --git a/test/tool_test.cljs b/test/tool_test.cljs index 2cac11fb..e322e89c 100644 --- a/test/tool_test.cljs +++ b/test/tool_test.cljs @@ -20,7 +20,7 @@ (deftest tool (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [active-tool (rf/subscribe [::tool.subs/active])] diff --git a/test/window_test.cljs b/test/window_test.cljs index 525362ce..dac4c580 100644 --- a/test/window_test.cljs +++ b/test/window_test.cljs @@ -23,7 +23,7 @@ (deftest window (rf.test/run-test-sync (test-fixtures) - (rf/dispatch [::app.events/initialize-db]) + (rf/dispatch [::app.events/initialize]) (let [maximized (rf/subscribe [::window.subs/maximized?]) fullscreen (rf/subscribe [::window.subs/fullscreen?]) From 748d777ded7605c9b47015d973f3494a32f16d0f Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Wed, 2 Jul 2025 19:31:32 +0300 Subject: [PATCH 10/13] add to-fixed tests --- test/utils/length_test.cljs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/utils/length_test.cljs b/test/utils/length_test.cljs index f1d976c4..bcb61781 100644 --- a/test/utils/length_test.cljs +++ b/test/utils/length_test.cljs @@ -11,3 +11,14 @@ true (utils.length/valid-unit? "rem") false (utils.length/valid-unit? "foo") false (utils.length/valid-unit? "")))) + +(deftest test-to-fixed + (testing "round to precision" + (are [x y] (= x y) + 1.111 (utils.length/->fixed 1.111111 3) + 1.11 (utils.length/->fixed 1.111 2) + 1.11 (utils.length/->fixed 1.114 2) + 1.12 (utils.length/->fixed 1.116 2) + 1.11 (utils.length/->fixed 1.11100 2) + 1 (utils.length/->fixed 1 0) + 0 (utils.length/->fixed 0 2)))) From c648b7dc0e8ea9a4cbfee439061183606b5e360f Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Thu, 3 Jul 2025 12:22:10 +0300 Subject: [PATCH 11/13] fix translations --- src/lang/ar-EG.edn | 4 +++- src/lang/el-GR.edn | 4 +++- src/lang/en-US.edn | 4 +++- src/renderer/app/events.cljs | 4 ++-- src/renderer/document/events.cljs | 2 +- src/renderer/utils/bounds.cljs | 4 ++-- 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/lang/ar-EG.edn b/src/lang/ar-EG.edn index 48e5ec65..6b6cd340 100644 --- a/src/lang/ar-EG.edn +++ b/src/lang/ar-EG.edn @@ -14,6 +14,9 @@ :source-code "الكود المصدري" :changelog "سجل التغييرات"} + :renderer.app.events + {:create-doc "إنشاء مستند"} + :renderer.dialog.views {:search-command "البحث عن أمر" :no-results "لا توجد نتائج." @@ -502,7 +505,6 @@ :renderer.document.events {:save-changes "هل تريد حفظ التغييرات؟" :create-doc "إنشاء مستند" - :init-doc "تهيئة مستند" :create-doc-from-template "إنشاء مستند من قالب" :load-doc "تحميل مستند" :error-loading "خطأ أثناء تحميل %1" diff --git a/src/lang/el-GR.edn b/src/lang/el-GR.edn index c03c4baa..195cc982 100644 --- a/src/lang/el-GR.edn +++ b/src/lang/el-GR.edn @@ -14,6 +14,9 @@ :source-code "Πηγαίος κώδικας" :changelog "Αρχείο αλλαγών"} + :renderer.app.events + {:create-doc "Δημιουργία εγγράφου"} + :renderer.dialog.views {:search-command "Αναζήτηση εντολής" :no-results "Δεν βρέθηκαν αποτελέσματα." @@ -546,7 +549,6 @@ :renderer.document.events {:save-changes "Θέλετε να αποθηκεύσετε τις αλλαγές σας;" :create-doc "Δημιουργία εγγράφου" - :init-doc "Αρχικοποίηση εγγράφου" :create-doc-from-template "Δημιουργία εγγράφου από πρότυπο" :load-doc "Φόρτωση εγγράφου" :error-loading "Σφάλμα κατα τη φόρτωση %1" diff --git a/src/lang/en-US.edn b/src/lang/en-US.edn index 1b25989c..c0842112 100644 --- a/src/lang/en-US.edn +++ b/src/lang/en-US.edn @@ -14,6 +14,9 @@ :source-code "Source Code" :changelog "Changelog"} + :renderer.app.events + {:create-doc "Create document"} + :renderer.dialog.views {:search-command "Search for a command" :no-results "No results found." @@ -518,7 +521,6 @@ :renderer.document.events {:save-changes "Do you want to save your changes?" :create-doc "Create document" - :init-doc "Init document" :create-doc-from-template "Create document from template" :load-doc "Load document" :error-loading "Error while loading %1" diff --git a/src/renderer/app/events.cljs b/src/renderer/app/events.cljs index b3872fe9..167e866c 100644 --- a/src/renderer/app/events.cljs +++ b/src/renderer/app/events.cljs @@ -12,7 +12,7 @@ [renderer.snap.handlers :as snap.handlers] [renderer.theme.effects :as-alias theme.effects] [renderer.theme.events :as-alias theme.events] - [renderer.utils.i18n :as utils.i18n] + [renderer.utils.i18n :as utils.i18n :refer [t]] [renderer.window.events :as-alias window.events])) (def persist @@ -80,7 +80,7 @@ (not (:active-document db)) (-> (document.handlers/create guid) - (history.handlers/finalize "Create document")) + (history.handlers/finalize #(t [:create-doc "Create document"]))) (:active-document db) (snap.handlers/rebuild-tree) diff --git a/src/renderer/document/events.cljs b/src/renderer/document/events.cljs index 4f4f7bc8..7d77d82a 100644 --- a/src/renderer/document/events.cljs +++ b/src/renderer/document/events.cljs @@ -140,7 +140,7 @@ [(rf/inject-cofx ::effects/guid)] (fn [{:keys [db guid]} [_]] {:db (-> (document.handlers/create db guid) - (history.handlers/finalize #(t [::init-doc "Init document"]))) + (history.handlers/finalize #(t [:create-doc "Create document"]))) ::effects/focus nil})) (rf/reg-event-fx diff --git a/src/renderer/utils/bounds.cljs b/src/renderer/utils/bounds.cljs index 6233b6fd..37dbcfcd 100644 --- a/src/renderer/utils/bounds.cljs +++ b/src/renderer/utils/bounds.cljs @@ -83,8 +83,8 @@ [bbox options] (let [[min-x min-y max-x max-y] bbox [cx cy] (center bbox) - bounds-corner-txt (t [::bounds-corner "bounds corner"]) - bounds-center-txt (t [::bounds-center "bounds center"]) + bounds-corner-txt (t [::bounds-corner "bounds corner"]) + bounds-center-txt (t [::bounds-center "bounds center"]) bounds-midpoints-txt (t [::bounds-midpoint "bounds midpoint"])] (cond-> [] (:corners options) From 458e2d984a67e16c82822e3e6833d03d0ebfbf5c Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Thu, 3 Jul 2025 12:45:34 +0300 Subject: [PATCH 12/13] fix naming and remove lang dir from db --- src/renderer/app/events.cljs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/renderer/app/events.cljs b/src/renderer/app/events.cljs index 167e866c..1ed66cbf 100644 --- a/src/renderer/app/events.cljs +++ b/src/renderer/app/events.cljs @@ -89,7 +89,7 @@ (assoc :loading false)) :fx (into [[:dispatch [::theme.events/set-document-attr]] - [:dispatch ^:flush-dom [::set-document-attrs]] + [:dispatch ^:flush-dom [::set-lang-attrs]] [:dispatch ^:flush-dom [::window.events/update-focused]] [::theme.effects/add-native-listener [::theme.events/set-document-attr]] [::effects/ipc-send ["initialized"]]] @@ -101,7 +101,7 @@ (assoc db :system-fonts fonts))) (rf/reg-event-fx - ::set-document-attrs + ::set-lang-attrs (fn [{:keys [db]} _] {:fx [[::effects/set-document-attr ["lang" (:lang db)]] [::effects/set-document-attr ["dir" (:dir db)]]]})) @@ -112,9 +112,8 @@ (fn [{:keys [db]} [_ lang]] {:db (cond-> db (utils.i18n/supported-lang? lang) - (assoc :lang lang - :dir (get-in utils.i18n/languages [lang :dir]))) - :dispatch [::set-document-attrs]})) + (assoc :lang lang)) + :dispatch [::set-lang-attrs]})) (rf/reg-event-db ::set-repl-mode From af085f79bccb81ff4ca8d3e39806224cd2bf7f83 Mon Sep 17 00:00:00 2001 From: Konstantinos Kaloutas Date: Thu, 3 Jul 2025 12:52:52 +0300 Subject: [PATCH 13/13] fix dir --- src/renderer/app/events.cljs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/renderer/app/events.cljs b/src/renderer/app/events.cljs index 1ed66cbf..5430c387 100644 --- a/src/renderer/app/events.cljs +++ b/src/renderer/app/events.cljs @@ -103,8 +103,10 @@ (rf/reg-event-fx ::set-lang-attrs (fn [{:keys [db]} _] - {:fx [[::effects/set-document-attr ["lang" (:lang db)]] - [::effects/set-document-attr ["dir" (:dir db)]]]})) + (let [lang (:lang db) + dir (get-in utils.i18n/languages [lang :dir])] + {:fx [[::effects/set-document-attr ["lang" lang]] + [::effects/set-document-attr ["dir" dir]]]}))) (rf/reg-event-fx ::set-lang pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy