Skip to content

Commit

Permalink
Refactoring a bit.
Browse files Browse the repository at this point in the history
  • Loading branch information
phronmophobic committed Sep 22, 2024
1 parent b133094 commit 7bda007
Show file tree
Hide file tree
Showing 5 changed files with 673 additions and 205 deletions.
51 changes: 51 additions & 0 deletions build.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
(ns build
(:require [clojure.tools.build.api :as b]
[clojure.data.json :as json]
[clojure.java.io :as io]
[clojure.string :as str]))

(def lib 'com.phronemophobic/grease)
(def version "0.1")
(def class-dir "target/classes")
(def basis (b/create-basis {:project "deps.edn"
:aliases [:native-image
:membrane]}))
(def jar-file (format "target/%s-%s.jar" (name lib) version))
(def uber-file (format "target/%s-uber.jar" (name lib)))
(def src-pom "./pom-template.xml")

(defn clean [_]
(b/delete {:path "target"}))

(defn compile-native-image [_]
(b/compile-clj {:class-dir class-dir
:basis basis
:java-opts ["-Dtech.v3.datatype.graal-native=true"
"-Dclojure.compiler.direct-linking=true"
"-Dclojure.spec.skip-macros=true"]
:ns-compile '[com.phronemophobic.grease.ios]}))

(defn uberjar-native-image [opts]
#_(clean nil)
(b/copy-dir {:src-dirs ["src" "resources"]
:target-dir class-dir})
(compile-native-image opts)
(b/uber {:class-dir class-dir
:uber-file uber-file
:basis basis
:main 'com.phronemophobic.grease.ios})
)

(defn fix-reflect-config [f]
(let [config (with-open [rdr (io/reader f)]
(json/read rdr))
new-config (->> config
(remove (fn [{:strs [name]}]
(str/ends-with? name "__init"))))]
(with-open [w (io/writer f)]
(json/write new-config w))))

(defn fix-config [_]
(fix-reflect-config (io/file "native-image" "config" "reflect-config.json")))


120 changes: 81 additions & 39 deletions examples/app/app.clj
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@
[tech.v3.datatype.ffi :as dt-ffi ]
[membrane.ui :as ui]
[clojure.data.xml :as xml]
[com.phronemophobic.grease.objc :as grease]
[clojure.string :as str]
babashka.nrepl.server
[com.phronemophobic.grease.ios :as ios]
[com.phronemophobic.grease.component :as gui]
[com.phronemophobic.objcjure :refer [objc describe]
:as objc]))


(defn documents-dir []
;; fileSystemRepresentation
(io/file
Expand Down Expand Up @@ -97,25 +98,58 @@
:$body nil
:body (code-editor/text-editor {:buf buf})}))))

(defui dir-viewer [{:keys [dir]}]
(gui/scrollview
{:scroll-bounds [250 500]
:$body nil
:body(let [files (fs/list-dir dir)]
(apply
ui/vertical-layout
(when-not (fs/same-file? dir scripts-dir)
(ui/on
:mouse-down
(fn [_]
[[::select-file {:file (fs/parent dir)}]])
(ui/bordered
20
(ui/label ".."))))
(for [f files]
(file-row f))))}))

(defui file-viewer [{:keys [dir selected-file buffers]}]
(defui dir-viewer [{:keys [dir nrepl-server]}]
(ui/vertical-layout
(if nrepl-server
(ui/horizontal-layout
(basic/button {:text "stop nrepl"
:on-click
(fn []
[[::stop-nrepl-server]])})
(ui/label (str (-> nrepl-server
:socket
.getInetAddress
.getHostAddress)
":"
(-> nrepl-server
:socket
.getLocalPort))))
(basic/button {:text "start nrepl"
:on-click
(fn []
[[::start-nrepl-server]])}))
(let [relative-path (str/join
" / "
(cons
"."
(reverse
(eduction
(take-while some?)
(take-while #(not (fs/same-file? %
scripts-dir)))
(map fs/file-name)

(iterate fs/parent dir)))))]
(ui/label (str "dir: " relative-path)))
(gui/scrollview
{:scroll-bounds [250 500]
:extra (get extra [::scroll dir])
:$body nil
:body(let [files (fs/list-dir dir)]
(apply
ui/vertical-layout
(when-not (fs/same-file? dir scripts-dir)
(ui/on
:mouse-down
(fn [_]
[[::select-file {:file (fs/parent dir)}]])
(ui/bordered
20
(ui/label ".."))))
(for [f files]
(file-row f))))})))

(defui file-viewer [{:keys [dir selected-file buffers nrepl-server]}]
(ui/translate
30 50
(ui/on
Expand All @@ -130,7 +164,8 @@
(if selected-file
(file-editor {:file selected-file
:buf (get buffers selected-file)})
(dir-viewer {:dir dir}))))))
(dir-viewer {:dir dir
:nrepl-server nrepl-server}))))))

(defn initial-state []
{:dir scripts-dir})
Expand All @@ -142,7 +177,7 @@
(def app (membrane.component/make-app #'file-viewer app-state))

(defn repaint! []
(reset! main-view (app)))
(reset! ios/main-view (app)))

(defonce __initial_paint
(repaint!))
Expand All @@ -151,20 +186,6 @@
(fn [k ref old updated]
(repaint!)))

(defn show-keyboard []
(objc ^void
[~(grease/clj_main_view) :performSelectorOnMainThread:withObject:waitUntilDone
~(objc/sel_registerName (dt-ffi/string->c "becomeFirstResponder"))
nil
~(byte 0)]))

(defn hide-keyboard []
(objc ^void
[~(grease/clj_main_view) :performSelectorOnMainThread:withObject:waitUntilDone
~(objc/sel_registerName (dt-ffi/string->c "resignFirstResponder"))
nil
~(byte 0)]))

(add-watch app-state ::handle-keyboard
(fn [k ref old new]
(let [focus-path [:membrane.component/context :focus]
Expand All @@ -173,8 +194,29 @@
(when (not= old-focus new-focus)
(future
(if new-focus
(show-keyboard)
(hide-keyboard)))))))
(ios/show-keyboard)
(ios/hide-keyboard)))))))

(defeffect ::stop-nrepl-server []
(let [[{:keys [nrepl-server]} _] (swap-vals! app-state dissoc :nrepl-server)]
(when nrepl-server
(babashka.nrepl.server/stop-server! nrepl-server)))
nil)

(defeffect ::start-nrepl-server []
(dispatch! ::stop-nrepl-server)
(let [host (.getHostAddress (ios/get-local-address))
port 22345
sci-ctx (ios/new-sci-ctx)
server (babashka.nrepl.server/start-server!
sci-ctx
{:host host :port port
:xform ios/server-xform})]
(swap! app-state assoc :nrepl-server server))

nil)





Expand Down
59 changes: 29 additions & 30 deletions examples/app/pod.clj
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@
[membrane.ui :as ui]
[tech.v3.datatype.struct :as dt-struct]
[tech.v3.datatype.native-buffer :as native-buffer]
[com.phronemophobic.grease.objc :as grease]
[com.phronemophobic.grease.ios :as ios]
[com.phronemophobic.objcjure :refer [objc describe]
:as objc]
[com.phronemophobic.grease.objc :as grease]
[com.phronemophobic.grease.component :as gui]
[clojure.core.async :as async ]
[clojure.data.json :as json]
Expand All @@ -24,6 +23,12 @@
[next.jdbc :as jdbc]
))

;; Declare UI state

(defonce pod-state (atom {}))
(defonce handler (membrane.component/default-handler pod-state))
(declare repaint!)

;; Generic config and helpers

(dt-struct/define-datatype!
Expand Down Expand Up @@ -60,19 +65,6 @@
(objc [nsdict :setObject:forKey @v @k]))
nsdict)

(defn show-keyboard []
(objc ^void
[~(grease/clj_main_view) :performSelectorOnMainThread:withObject:waitUntilDone
~(objc/sel_registerName (dt-ffi/string->c "becomeFirstResponder"))
nil
~(byte 0)]))

(defn hide-keyboard []
(objc ^void
[~(grease/clj_main_view) :performSelectorOnMainThread:withObject:waitUntilDone
~(objc/sel_registerName (dt-ffi/string->c "resignFirstResponder"))
nil
~(byte 0)]))

(honey.sql/register-clause!
:merge-into
Expand Down Expand Up @@ -384,8 +376,14 @@
(throw e)))))))

(defn latest-episodes []
(with-open [conn (jdbc/get-connection db)]
(jdbc/execute! conn ["select episode.*, queue.TIMESTAMP from episode left join queue on (queue.TRACKID=episode.TRACKID and queue.COLLECTIONID = episode.COLLECTIONID) order by RELEASEDATE desc limit 50"])))
(let [search-text (:search-text @pod-state)]
(if (seq search-text)
(with-open [conn (jdbc/get-connection db)]
(jdbc/execute! conn ["select episode.*, queue.TIMESTAMP from episode left join queue on (queue.TRACKID=episode.TRACKID and queue.COLLECTIONID = episode.COLLECTIONID) where lower(episode.TRACKNAME) like ? order by RELEASEDATE desc limit 50"
(str "%" (str/lower-case search-text) "%")]))
;; else
(with-open [conn (jdbc/get-connection db)]
(jdbc/execute! conn ["select episode.*, queue.TIMESTAMP from episode left join queue on (queue.TRACKID=episode.TRACKID and queue.COLLECTIONID = episode.COLLECTIONID) order by RELEASEDATE desc limit 50"])))))

(comment
(def podcasts (search-podcasts "defn"))
Expand Down Expand Up @@ -435,12 +433,6 @@
,)


;; Declare UI state

(defonce pod-state (atom {}))
(defonce handler (membrane.component/default-handler pod-state))
(declare repaint!)

;; Operations for working with AVPlayer

(defn get-player []
Expand Down Expand Up @@ -701,7 +693,7 @@
:player player)
(configure-controls player))

(handler ::refresh-episodes {:$episodes '(keypath :episodes)})
(handler ::refresh-episodes {})
(repaint!)
,)

Expand All @@ -720,9 +712,9 @@
(defeffect ::skip-backward []
(skip-backward 5))

(defeffect ::refresh-episodes [{:keys [$episodes]}]
(defeffect ::refresh-episodes [{}]
(future
(dispatch! :set $episodes (latest-episodes))))
(swap! pod-state assoc :episodes (latest-episodes))))

(defn button [text on-click]
(ui/on
Expand All @@ -734,11 +726,16 @@
[20 20]
(ui/label text (ui/font nil 33)))))

(defui episode-viewer [{:keys [page episodes]}]
(defui episode-viewer [{:keys [page episodes search-text]}]
(ui/vertical-layout
(button "refresh"
(fn []
[[::refresh-episodes {:$episodes $episodes}]]))
[[::refresh-episodes {}]]))
(let [search-text (or search-text "")]
(ui/padding 5
(ui/horizontal-layout
(ui/label "search: ")
(basic/textarea {:text search-text}))))
(gui/scrollview
{:scroll-bounds [300 500]
:extra (get extra ::scrollveiw)
Expand Down Expand Up @@ -824,6 +821,7 @@
[[::clear-podcasts {}]])))

(defui pod-ui [{:keys [playing? episodes selected-episode
search-text
view]}]
(ui/translate
10 50
Expand All @@ -848,12 +846,13 @@
::select-episode
(fn [{:keys [episode]}]
[[:set $selected-episode episode]])
(episode-viewer {:episodes episodes})))))))
(episode-viewer {:episodes episodes
:search-text search-text})))))))

(def app (membrane.component/make-app #'pod-ui pod-state handler))

(defn repaint! []
(reset! main-view (app)))
(reset! ios/main-view (app)))

(defonce __initialize
(init))
Expand Down
Loading

0 comments on commit 7bda007

Please sign in to comment.