mirror of
https://github.com/unclebob/more-speech.git
synced 2024-09-30 10:30:56 +00:00
Use tree for header window. Render tree elements, and thread the articles. Pretty easy.
This commit is contained in:
parent
855a2461ac
commit
36e2b00852
@ -98,7 +98,7 @@
|
|||||||
(defn get-events [event-agent send-chan]
|
(defn get-events [event-agent send-chan]
|
||||||
(let [conn (connect-to-relay (get relays 0) event-agent)
|
(let [conn (connect-to-relay (get relays 0) event-agent)
|
||||||
id "more-speech"
|
id "more-speech"
|
||||||
date (make-date "04/25/2022")
|
date (make-date "04/1/2022")
|
||||||
]
|
]
|
||||||
(prn date (format-time date))
|
(prn date (format-time date))
|
||||||
(unsubscribe conn id)
|
(unsubscribe conn id)
|
||||||
|
@ -4,50 +4,78 @@
|
|||||||
[more-speech.ui.formatters :as formatters]
|
[more-speech.ui.formatters :as formatters]
|
||||||
[more-speech.nostr.events :as events]
|
[more-speech.nostr.events :as events]
|
||||||
[clojure.string :as string])
|
[clojure.string :as string])
|
||||||
(:use [seesaw core font])
|
(:use [seesaw core font tree])
|
||||||
(:import (javax.swing SwingUtilities Timer)))
|
(:import (javax.swing SwingUtilities Timer)))
|
||||||
|
|
||||||
(declare display-jframe action-event draw-events)
|
(declare display-jframe action-event draw-events load-header-tree render-event)
|
||||||
|
|
||||||
(defn setup-jframe [event-agent output-channel]
|
(defn setup-jframe [event-agent output-channel]
|
||||||
(SwingUtilities/invokeLater #(display-jframe event-agent output-channel)))
|
(SwingUtilities/invokeLater #(display-jframe event-agent output-channel)))
|
||||||
|
|
||||||
(defn display-jframe [event-agent output-channel]
|
(defn display-jframe [event-agent output-channel]
|
||||||
(let [frame (frame :title "More Speech" :size [1000 :by 1000])
|
(let [frame (frame :title "More Speech" :size [1000 :by 1000])
|
||||||
text-area (text :multi-line? true :font "MONOSPACED-PLAIN-14")
|
header-tree (tree :renderer (partial render-event event-agent))
|
||||||
timer (Timer. 100 nil)]
|
timer (Timer. 100 nil)]
|
||||||
(listen frame :window-closing (fn [_]
|
(listen frame :window-closing (fn [_]
|
||||||
(.stop timer)
|
(.stop timer)
|
||||||
(async/>!! output-channel [:closed])
|
(async/>!! output-channel [:closed])
|
||||||
(.dispose frame)))
|
(.dispose frame)))
|
||||||
|
|
||||||
(listen timer :action (fn [_] (draw-events text-area event-agent)))
|
(listen timer :action
|
||||||
(config! frame :content (scrollable text-area))
|
(fn [_] (when (:update @event-agent)
|
||||||
|
(config! header-tree
|
||||||
|
:model (load-header-tree @event-agent))
|
||||||
|
(send event-agent events/updated))))
|
||||||
|
(config! frame :content (scrollable header-tree))
|
||||||
(show! frame)
|
(show! frame)
|
||||||
(.start timer)))
|
(.start timer)))
|
||||||
|
|
||||||
(declare format-events append-event format-event)
|
(declare has-children? get-children)
|
||||||
|
|
||||||
(defn draw-events [text-area event-agent]
|
(defn load-header-tree [event-state]
|
||||||
(prn "tick")
|
(simple-tree-model
|
||||||
(when (:update @event-agent)
|
(partial has-children? event-state)
|
||||||
(let [event-state @event-agent
|
(partial get-children event-state)
|
||||||
formatted-events (format-events event-state)]
|
(map first (:chronological-text-events event-state))
|
||||||
(text! text-area formatted-events)
|
)
|
||||||
(send event-agent events/updated))))
|
)
|
||||||
|
|
||||||
(defn format-events [{:keys [chronological-text-events nicknames text-event-map]}]
|
(defn has-children? [event-state node]
|
||||||
(let [header-ids (map first chronological-text-events)
|
(if (seqable? node)
|
||||||
headers (map #(get text-event-map %) header-ids)]
|
true
|
||||||
(reduce #(append-event nicknames %1 %2) "" headers)))
|
(let [event-id node
|
||||||
|
event (get (:text-event-map event-state) event-id)
|
||||||
|
references (:references event)
|
||||||
|
ref-count (count references)]
|
||||||
|
(pos-int? ref-count))))
|
||||||
|
|
||||||
(defn append-event [nicknames formatted-events event]
|
(defn get-children [event-state node]
|
||||||
(str formatted-events (format-event nicknames event)))
|
(if (seqable? node)
|
||||||
|
node
|
||||||
|
(let [event-id node
|
||||||
|
event-map (:text-event-map event-state)
|
||||||
|
event (get event-map event-id)
|
||||||
|
references (:references event)]
|
||||||
|
(sort-by #(:created-at (get event-map %)) references))))
|
||||||
|
|
||||||
(defn format-event [nicknames {:keys [pubkey created-at content]}]
|
(defn format-event [nicknames {:keys [pubkey created-at content] :as event}]
|
||||||
|
(if (nil? event)
|
||||||
|
"nil"
|
||||||
(let [name (get nicknames pubkey (util/num->hex-string pubkey))
|
(let [name (get nicknames pubkey (util/num->hex-string pubkey))
|
||||||
name (formatters/abbreviate name 20)
|
name (formatters/abbreviate name 20)
|
||||||
time (formatters/format-time created-at)
|
time (formatters/format-time created-at)
|
||||||
content (string/replace content \newline \~)
|
content (string/replace content \newline \~)
|
||||||
content (formatters/abbreviate content 50)]
|
content (formatters/abbreviate content 50)]
|
||||||
(format "%20s %s %s\n" name time content)))
|
(format "%20s %s %s\n" name time content))))
|
||||||
|
|
||||||
|
(defn render-event [event-agent widget info]
|
||||||
|
(config! widget :font "COURIER-PLAIN-14")
|
||||||
|
(if (seqable? (:value info))
|
||||||
|
(text! widget "Articles")
|
||||||
|
(let [event-state @event-agent
|
||||||
|
nicknames (:nicknames event-state)
|
||||||
|
event-map (:text-event-map event-state)
|
||||||
|
event-id (:value info)
|
||||||
|
event (get event-map event-id)]
|
||||||
|
(text! widget (format-event nicknames event)))
|
||||||
|
))
|
Loading…
Reference in New Issue
Block a user