diff --git a/src/more_speech/nostr/protocol.clj b/src/more_speech/nostr/protocol.clj index 82534e8..5466468 100644 --- a/src/more_speech/nostr/protocol.clj +++ b/src/more_speech/nostr/protocol.clj @@ -98,7 +98,7 @@ (defn get-events [event-agent send-chan] (let [conn (connect-to-relay (get relays 0) event-agent) id "more-speech" - date (make-date "04/25/2022") + date (make-date "04/1/2022") ] (prn date (format-time date)) (unsubscribe conn id) diff --git a/src/more_speech/ui/swing/main_window.clj b/src/more_speech/ui/swing/main_window.clj index ddab143..7e9edef 100644 --- a/src/more_speech/ui/swing/main_window.clj +++ b/src/more_speech/ui/swing/main_window.clj @@ -4,50 +4,78 @@ [more-speech.ui.formatters :as formatters] [more-speech.nostr.events :as events] [clojure.string :as string]) - (:use [seesaw core font]) + (:use [seesaw core font tree]) (: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] (SwingUtilities/invokeLater #(display-jframe event-agent output-channel))) (defn display-jframe [event-agent output-channel] (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)] (listen frame :window-closing (fn [_] (.stop timer) (async/>!! output-channel [:closed]) (.dispose frame))) - (listen timer :action (fn [_] (draw-events text-area event-agent))) - (config! frame :content (scrollable text-area)) + (listen timer :action + (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) (.start timer))) -(declare format-events append-event format-event) +(declare has-children? get-children) -(defn draw-events [text-area event-agent] - (prn "tick") - (when (:update @event-agent) +(defn load-header-tree [event-state] + (simple-tree-model + (partial has-children? event-state) + (partial get-children event-state) + (map first (:chronological-text-events event-state)) + ) + ) + +(defn has-children? [event-state node] + (if (seqable? node) + true + (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 get-children [event-state node] + (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] :as event}] + (if (nil? event) + "nil" + (let [name (get nicknames pubkey (util/num->hex-string pubkey)) + name (formatters/abbreviate name 20) + time (formatters/format-time created-at) + content (string/replace content \newline \~) + content (formatters/abbreviate content 50)] + (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 - formatted-events (format-events event-state)] - (text! text-area formatted-events) - (send event-agent events/updated)))) - -(defn format-events [{:keys [chronological-text-events nicknames text-event-map]}] - (let [header-ids (map first chronological-text-events) - headers (map #(get text-event-map %) header-ids)] - (reduce #(append-event nicknames %1 %2) "" headers))) - -(defn append-event [nicknames formatted-events event] - (str formatted-events (format-event nicknames event))) - -(defn format-event [nicknames {:keys [pubkey created-at content]}] - (let [name (get nicknames pubkey (util/num->hex-string pubkey)) - name (formatters/abbreviate name 20) - time (formatters/format-time created-at) - content (string/replace content \newline \~) - content (formatters/abbreviate content 50)] - (format "%20s %s %s\n" name time content))) \ No newline at end of file + 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))) + )) \ No newline at end of file