feat: toggle force simulation

pull/10935/head
Tienson Qin 2024-02-05 12:55:29 +08:00
parent 80bf4a9cb4
commit 51b90a635b
2 changed files with 70 additions and 45 deletions

View File

@ -41,7 +41,8 @@
[medley.core :as medley]
[promesa.core :as p]
[reitit.frontend.easy :as rfe]
[rum.core :as rum]))
[rum.core :as rum]
[frontend.extensions.graph.pixi :as pixi]))
(defn- get-page-name
[state]
@ -552,6 +553,21 @@
(defonce *charge-strength (atom -600))
(defonce *charge-range (atom 600))
(rum/defcs simulation-switch < rum/reactive
[state]
(let [*simulation-paused? pixi/*simulation-paused?]
[:div.flex.flex-col.mb-2
[:p {:title "Pause simulation"}
"Pause simulation"]
(ui/toggle
(rum/react *simulation-paused?)
(fn []
(let [paused? @*simulation-paused?]
(if paused?
(pixi/resume-simulation!)
(pixi/stop-simulation!))))
true)]))
(rum/defc ^:large-vars/cleanup-todo graph-filters < rum/reactive
[graph settings forcesettings n-hops]
(let [{:keys [journal? orphan-pages? builtin-pages? excluded-pages?]
@ -575,8 +591,8 @@
(let [new-settings (assoc settings key value)]
(config-handler/set-config! :graph/settings new-settings)))
set-forcesetting! (fn [key value]
(let [new-forcesettings (assoc forcesettings key value)]
(config-handler/set-config! :graph/forcesettings new-forcesettings)))
(let [new-forcesettings (assoc forcesettings key value)]
(config-handler/set-config! :graph/forcesettings new-forcesettings)))
search-graph-filters (state/sub :search/graph-filters)
focus-nodes (rum/react *focus-nodes)]
[:div.absolute.top-4.right-4.graph-filters
@ -691,49 +707,42 @@
open?
[:div
[:p.text-sm.opacity-70.px-4
(let [;; c1 (count (:nodes graph))
;; s1 (if (> c1 1) "s" "")
c2 (count (:links graph))
s2 (if (> c2 1) "s" "")
]
;; (util/format "%d page%s, %d link%s" c1 s1 c2 s2)
(let [c2 (count (:links graph))
s2 (if (> c2 1) "s" "")]
(util/format "%d link%s" c2 s2))]
[:div.p-6
[:div.flex.flex-col.mb-2
[:p {:title "Link Distance"}
"Link Distance"]
(ui/tippy {:html [:div.pr-3 link-dist]}
(ui/slider (/ link-dist 10)
{:min 1 ;; 10
:max 18 ;; 180
;; :on-change #(reset! *link-dist (int %))}))]
:on-change #(let [value (int %)]
(reset! *link-dist (* value 10))
(set-forcesetting! :link-dist (* value 10)))}))]
;; :on-change #(let [value (util/evalue %)]
;; (reset! *link-dist value)
;; (set-forcesetting! :link-dist value))}))]
[:div.flex.flex-col.mb-2
[:p {:title "Charge Strength"}
"Charge Strength"]
(ui/tippy {:html [:div.pr-3 charge-strength]}
(ui/slider (/ charge-strength 100)
{:min -10 ;;-1000
:max 10 ;;1000
:on-change #(let [value (int %)]
(reset! *charge-strength (* value 100))
(set-forcesetting! :charge-strength (* value 100)))}))]
[:div.flex.flex-col.mb-2
[:p {:title "Charge Range"}
"Charge Range"]
(ui/tippy {:html [:div.pr-3 charge-range]}
(ui/slider (/ charge-range 100)
{:min 5 ;;500
:max 40 ;;4000
:on-change #(let [value (int %)]
(reset! *charge-range (* value 100))
(set-forcesetting! :charge-range (* value 100)))}))]
(simulation-switch)
[:div.flex.flex-col.mb-2
[:p {:title "Link Distance"}
"Link Distance"]
(ui/tippy {:html [:div.pr-3 link-dist]}
(ui/slider (/ link-dist 10)
{:min 1 ;; 10
:max 18 ;; 180
:on-change #(let [value (int %)]
(reset! *link-dist (* value 10))
(set-forcesetting! :link-dist (* value 10)))}))]
[:div.flex.flex-col.mb-2
[:p {:title "Charge Strength"}
"Charge Strength"]
(ui/tippy {:html [:div.pr-3 charge-strength]}
(ui/slider (/ charge-strength 100)
{:min -10 ;;-1000
:max 10 ;;1000
:on-change #(let [value (int %)]
(reset! *charge-strength (* value 100))
(set-forcesetting! :charge-strength (* value 100)))}))]
[:div.flex.flex-col.mb-2
[:p {:title "Charge Range"}
"Charge Range"]
(ui/tippy {:html [:div.pr-3 charge-range]}
(ui/slider (/ charge-range 100)
{:min 5 ;;500
:max 40 ;;4000
:on-change #(let [value (int %)]
(reset! *charge-range (* value 100))
(set-forcesetting! :charge-range (* value 100)))}))]
[:a.opacity-70.opacity-100 {:on-click (fn []
(swap! *graph-forcereset? not)

View File

@ -10,6 +10,8 @@
(defonce *graph-instance (atom nil))
(defonce *simulation (atom nil))
(defonce *simulation-paused?
(atom false))
(def Graph (gobj/get graphology "Graph"))
@ -113,7 +115,20 @@
(when-let [instance (:pixi @*graph-instance)]
(.destroy instance)
(reset! *graph-instance nil)
(reset! *simulation nil)))
(reset! *simulation nil))
(reset! *simulation-paused? false))
(defn stop-simulation!
[]
(when-let [^js simulation @*simulation]
(.stop simulation)
(reset! *simulation-paused? true)))
(defn resume-simulation!
[]
(when-let [^js simulation @*simulation]
(.restart simulation))
(reset! *simulation-paused? false))
(defn- update-position!
[node obj]
@ -161,7 +176,8 @@
#_:clj-kondo/ignore
(when-let [node (.get nodes node-key)]
(when-let [s @*simulation]
(when-not (.-active event)
(when-not (or (.-active event)
@*simulation-paused?)
(-> (.alphaTarget s 0.3)
(.restart))
(js/setTimeout #(.alphaTarget s 0) 2000))