Skip to content

Commit 1224166

Browse files
committed
add system theme option
1 parent ff2da81 commit 1224166

File tree

6 files changed

+42
-23
lines changed

6 files changed

+42
-23
lines changed

resources/public/icons/system.svg

Lines changed: 3 additions & 0 deletions
Loading

src/electron/main.cljs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,6 @@
6565
"windowToggleFullscreen"
6666
(.setFullScreen ^js @main-window (not (.isFullScreen ^js @main-window)))
6767

68-
"setThemeMode"
69-
(set! (.. nativeTheme -themeSource) (.-data args))
70-
7168
"openRemoteUrl"
7269
(open-external! (.-data args))
7370

src/renderer/core.cljs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,13 @@
9494
"fileLoaded" (rf/dispatch [::document.e/load (edn/read-string (.-data data))])
9595
"fileSaved" (rf/dispatch [::document.e/saved (edn/read-string (.-data data))])))))
9696

97+
(defn handle-system-theme!
98+
[]
99+
(let [query (.matchMedia js/window "(prefers-color-scheme: dark)")
100+
get-theme (fn [query] (if (.-matches query) :dark :light))]
101+
(rf/dispatch [:set-native-theme (get-theme query)])
102+
(.addListener query #(rf/dispatch [:set-native-theme (get-theme %)]))))
103+
97104

98105
(defn ^:export init []
99106
#_(if platform/electron?
@@ -111,7 +118,7 @@
111118

112119
(rf/dispatch-sync [:initialize-db])
113120
(rf/dispatch-sync [:load-local-db])
114-
(rf/dispatch-sync [:theme/init-mode])
121+
(rf/dispatch-sync [:init-theme-mode])
115122
(rf/dispatch-sync [::document.e/new])
116123
(rf/dispatch-sync [:set-tool :select])
117124
(rf/dispatch-sync [:set-mdn (js->clj mdn :keywordize-keys true)])
@@ -122,6 +129,8 @@
122129
(.addEventListener js/document "keydown" keyb/event-handler)
123130
(.addEventListener js/document "keyup" keyb/event-handler)
124131

132+
(handle-system-theme!)
133+
125134
(.setup paper) ; REVIEW
126135

127136
(if platform/electron?

src/renderer/db.cljs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
[:pen-mode? boolean?]
2323
[:panel [:map-of :key [:map [:visible? boolean?]]]]
2424
[:window renderer.window.db/window]
25-
[:theme [:mode [:enum :dark :light :system]]]
25+
[:theme [:mode [:enum :dark :light :system]
26+
:native [:enum :dark :light]]]
2627
[:timeline renderer.timeline.db/timeline]])
2728

2829
(def default

src/renderer/events.cljs

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -103,28 +103,40 @@
103103
(fn [db [_ key]]
104104
(update-in db [key :visible?] not)))
105105

106+
(rf/reg-fx
107+
:set-document-theme-attr
108+
(fn [[mode]]
109+
(.setAttribute js/window.document.documentElement "data-theme" mode)))
110+
106111
(rf/reg-event-fx
107-
:theme/init-mode
112+
:init-theme-mode
108113
(fn [{:keys [db]} _]
109-
(let [mode (-> db :theme :mode name)]
110-
{:set-attribute [js/window.document.documentElement "data-theme" mode]
111-
:send-to-main {:action "setThemeMode" :data mode}})))
114+
(let [mode (-> db :theme :mode)
115+
mode (if (= mode :system) (-> db :theme :native) mode)]
116+
{:set-document-theme-attr [(name mode)]})))
112117

113118
(rf/reg-event-fx
114-
:theme/set-mode
119+
:set-native-theme
120+
local-storage/persist
121+
(fn [{:keys [db]} [_ mode]]
122+
{:db (assoc-in db [:theme :native] mode)
123+
:dispatch [:init-theme-mode]}))
124+
125+
(rf/reg-event-fx
126+
:set-theme-mode
115127
local-storage/persist
116128
(fn [{:keys [db]} [_ mode]]
117129
{:db (assoc-in db [:theme :mode] mode)
118-
:dispatch [:theme/init-mode]}))
130+
:dispatch [:init-theme-mode]}))
119131

120132
(rf/reg-event-fx
121-
:theme/cycle-mode
133+
:cycle-theme-mode
122134
(fn [{:keys [db]} [_]]
123135
(let [mode (case (-> db :theme :mode)
124-
;; TODO: Support system mode.
125136
:dark :light
126-
:light :dark)]
127-
{:dispatch [:theme/set-mode mode]})))
137+
:light :system
138+
:system :dark)]
139+
{:dispatch [:set-theme-mode mode]})))
128140

129141
(rf/reg-event-fx
130142
:pointer-event
@@ -272,7 +284,3 @@
272284
(fn [_ [_ id]]
273285
{:focus id}))
274286

275-
(rf/reg-fx
276-
:set-attribute
277-
(fn [[el attr val]]
278-
(.setAttribute el attr val)))

src/renderer/window/views.cljs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
(defn app-header
3939
[]
4040
(let [fullscreen? @(rf/subscribe [::window.s/fullscreen?])
41-
maximized? @(rf/subscribe [::window.s/maximized?])]
41+
maximized? @(rf/subscribe [::window.s/maximized?])
42+
theme-mode (name @(rf/subscribe [:theme-mode]))]
4243
[:div.flex.items-center.relative
4344
(when-not (or fullscreen? platform/mac?)
4445
[app-icon])
@@ -50,9 +51,9 @@
5051
:style {:z-index -1}}
5152
@(rf/subscribe [::document.s/title-bar])]
5253
[:div.flex.h-full.flex-1.drag]
53-
[button {:action [:theme/cycle-mode]
54-
:title "Theme mode"
55-
:icon (name @(rf/subscribe [:theme-mode]))
54+
[button {:action [:cycle-theme-mode]
55+
:title (str "Theme mode - " theme-mode)
56+
:icon theme-mode
5657
:class "bg-primary"}]
5758
(when (and platform/electron? (not fullscreen?) (not platform/mac?))
5859
(into [:div.text-right]

0 commit comments

Comments
 (0)