|
1 | 1 | (ns twitterbuzz.showgraph
|
2 | 2 | (:require [twitterbuzz.core :as buzz]
|
3 |
| - [twitterbuzz.anneal :as ann] |
4 | 3 | [twitterbuzz.layout :as layout]
|
5 | 4 | [goog.dom :as dom]
|
6 | 5 | [goog.events :as events]
|
7 |
| - [goog.fx.Animation :as anim] |
| 6 | + [goog.style :as style] |
| 7 | + [goog.math.Coordinate :as Coordinate] |
| 8 | + [goog.ui.HoverCard :as HoverCard] |
8 | 9 | [goog.graphics.Font :as Font]
|
9 | 10 | [goog.graphics.Stroke :as Stroke]
|
10 | 11 | [goog.graphics.SolidFill :as SolidFill]
|
11 | 12 | [goog.graphics :as graphics]))
|
12 | 13 |
|
13 | 14 | ; Drawing configuration
|
14 | 15 | (def avatar-size 32) ; used for both x and y dimensions of avatars
|
15 |
| -(def anneal-skipping 10) |
16 |
| -(def cooling 1000) |
17 | 16 | ; fail whale
|
18 | 17 | ;(def default-avatar "http://farm3.static.flickr.com/2562/4140195522_e207b97280_s.jpg")
|
19 | 18 | ; google+ silhouette
|
|
39 | 38 | (defn log [& args]
|
40 | 39 | (js* "console.log(~{})" (apply pr-str args)))
|
41 | 40 |
|
| 41 | +(def avatar-hover |
| 42 | + (doto |
| 43 | + (goog.ui/HoverCard. (js-obj)) ; svg IMAGE tags don't work here |
| 44 | + (.setElement (dom/getElement "avatar-hover")))) |
| 45 | + |
| 46 | +(defn append-tweet [parent tweet] |
| 47 | + (let [child (buzz/dom-element :div {:class "tweet"}) |
| 48 | + user (buzz/dom-element :div {:class "user-name"}) |
| 49 | + text (buzz/dom-element :div {:class "tweet-text"}) |
| 50 | + pic (buzz/dom-element :img {:src (:profile_image_url tweet) :class "profile-pic"})] |
| 51 | + (do (dom/insertChildAt text (dom/htmlToDocumentFragment (:text tweet)) 0) ;;(dom/setTextContent text (:text tweet)) |
| 52 | + (dom/setTextContent user (:from_user tweet)) |
| 53 | + (dom/appendChild child pic) |
| 54 | + (dom/appendChild child user) |
| 55 | + (dom/appendChild child text) |
| 56 | + (dom/insertChildAt parent child 0)))) |
| 57 | + |
| 58 | +(defn hide-tooltip [event] |
| 59 | + (.setVisible avatar-hover false)) |
| 60 | + |
| 61 | +(defn attach-tooltip [img canvas-offset px py tweet] |
| 62 | + (events/listen img events/EventType.MOUSEOUT hide-tooltip) |
| 63 | + (events/listen |
| 64 | + img events/EventType.MOUSEOVER |
| 65 | + (fn [event] |
| 66 | + (hide-tooltip) |
| 67 | + (.setPosition avatar-hover |
| 68 | + (goog.ui/Tooltip.CursorTooltipPosition. |
| 69 | + (Coordinate/sum (goog.math/Coordinate. px py) |
| 70 | + canvas-offset))) |
| 71 | + (dom/removeChildren (dom/getElement "avatar-hover-body")) |
| 72 | + (append-tweet (dom/getElement "avatar-hover-body") tweet) |
| 73 | + (.triggerForElement avatar-hover img)))) |
| 74 | + |
42 | 75 | (defn draw-graph [{:keys [locs mentions]} text]
|
43 |
| - (let [canvas-size (. g (getPixelSize))] |
| 76 | + (let [canvas-size (. g (getPixelSize)) |
| 77 | + canvas-offset (style/getPageOffset (dom/getElement "network"))] |
44 | 78 | (. g (clear))
|
45 | 79 |
|
46 | 80 | ; Draw mention edges
|
|
58 | 92 | ; Draw avatar nodes
|
59 | 93 | (doseq [[username {:keys [x y] :as foo}] locs]
|
60 | 94 | ;(log (pr-str foo))
|
61 |
| - (.drawImage g |
62 |
| - (- (unit-to-pixel x (.width canvas-size)) (/ avatar-size 2)) |
63 |
| - (- (unit-to-pixel y (.height canvas-size)) (/ avatar-size 2)) |
64 |
| - avatar-size avatar-size |
65 |
| - (get (get mentions username) :image-url default-avatar))) |
| 95 | + (let [px (- (unit-to-pixel x (.width canvas-size)) (/ avatar-size 2)) |
| 96 | + py (- (unit-to-pixel y (.height canvas-size)) (/ avatar-size 2)) |
| 97 | + user (get mentions username) |
| 98 | + image-url (get user :image-url default-avatar) |
| 99 | + img (.drawImage g px py avatar-size avatar-size image-url)] |
| 100 | + (attach-tooltip img canvas-offset px py |
| 101 | + {:profile_image_url image-url |
| 102 | + :text (:last-tweet user) |
| 103 | + :from_user username}))) |
66 | 104 |
|
67 | 105 | (let [text (if (empty? locs)
|
68 | 106 | "No locations to graph"
|
|
71 | 109 | (.drawTextOnLine g text 5 20 (.width canvas-size) 20
|
72 | 110 | "left" font nil fill)))))
|
73 | 111 |
|
74 |
| -(buzz/register :graph-update #(draw-graph (layout/radial %) nil)) |
| 112 | +(def graph-data (atom nil)) |
75 | 113 |
|
76 |
| -(def animation (atom nil)) |
| 114 | +(buzz/register :graph-update |
| 115 | + (fn [data] |
| 116 | + (reset! graph-data data) |
| 117 | + (draw-graph (layout/radial data) nil))) |
77 | 118 |
|
78 |
| -;(events/listen (dom/getElement "network") events/EventType.CLICK start-anneal) |
| 119 | +(events/listen (dom/getElement "network") events/EventType.CLICK |
| 120 | + #(draw-graph (layout/radial @graph-data))) |
79 | 121 | (buzz/register :track-clicked #(. g (clear)))
|
0 commit comments