Skip to content

Commit e4ad8ed

Browse files
committed
Add last-tweet tooltips to graph. clojure#48
1 parent 6d3cbf4 commit e4ad8ed

File tree

3 files changed

+76
-19
lines changed

3 files changed

+76
-19
lines changed

samples/twitterbuzz/index.html

+5-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ <h2>Leaderboard</h2>
5151
</div>
5252
</section>
5353

54-
<section id="timeline">
54+
<section id="timeline" class="tweetbox">
5555
<h2>Timeline</h2>
5656
<div id="timeline-content">
5757
</div>
@@ -63,6 +63,10 @@ <h2>Timeline</h2>
6363
<div class="clear"></div>
6464
</section>
6565

66+
<section id="avatar-hover" style="display: none">
67+
<div id="avatar-hover-body" class="tweetbox"></div>
68+
</section>
69+
6670
<!-- In unoptimized mode, additional script tags are required -->
6771
<script type="text/javascript" src="out/goog/base.js"></script>
6872
<script type="text/javascript" src="twitterbuzz.js"></script>

samples/twitterbuzz/src/twitterbuzz/showgraph.cljs

+55-13
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
(ns twitterbuzz.showgraph
22
(:require [twitterbuzz.core :as buzz]
3-
[twitterbuzz.anneal :as ann]
43
[twitterbuzz.layout :as layout]
54
[goog.dom :as dom]
65
[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]
89
[goog.graphics.Font :as Font]
910
[goog.graphics.Stroke :as Stroke]
1011
[goog.graphics.SolidFill :as SolidFill]
1112
[goog.graphics :as graphics]))
1213

1314
; Drawing configuration
1415
(def avatar-size 32) ; used for both x and y dimensions of avatars
15-
(def anneal-skipping 10)
16-
(def cooling 1000)
1716
; fail whale
1817
;(def default-avatar "http://farm3.static.flickr.com/2562/4140195522_e207b97280_s.jpg")
1918
; google+ silhouette
@@ -39,8 +38,43 @@
3938
(defn log [& args]
4039
(js* "console.log(~{})" (apply pr-str args)))
4140

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+
4275
(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"))]
4478
(. g (clear))
4579

4680
; Draw mention edges
@@ -58,11 +92,15 @@
5892
; Draw avatar nodes
5993
(doseq [[username {:keys [x y] :as foo}] locs]
6094
;(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})))
66104

67105
(let [text (if (empty? locs)
68106
"No locations to graph"
@@ -71,9 +109,13 @@
71109
(.drawTextOnLine g text 5 20 (.width canvas-size) 20
72110
"left" font nil fill)))))
73111

74-
(buzz/register :graph-update #(draw-graph (layout/radial %) nil))
112+
(def graph-data (atom nil))
75113

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)))
77118

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)))
79121
(buzz/register :track-clicked #(. g (clear)))

samples/twitterbuzz/style.css

+16-5
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,17 @@ header {
8585
position: absolute;
8686
}
8787

88+
#avatar-hover {
89+
position: absolute;
90+
width: 280px;
91+
background: #fff;
92+
border: 1px solid #ccc;
93+
background-color: #fff;
94+
-moz-border-radius: 3px;
95+
-webkit-border-radius: 3px;
96+
border-radius: 3px;
97+
}
98+
8899
#leaderboard {
89100
width: 280px;
90101
height: 100px;
@@ -159,15 +170,15 @@ header {
159170
padding-left: 10px;
160171
}
161172

162-
#timeline .tweet {
173+
.tweetbox .tweet {
163174
clear: both;
164175
padding: 10px;
165176
border-bottom: 1px solid #b3b3b3;
166177
overflow: auto;
167178
font-size: 12px;
168179
}
169180

170-
#timeline .profile-pic {
181+
.tweetbox .profile-pic {
171182
width: 48px;
172183
height: 48px;
173184
float: left;
@@ -176,12 +187,12 @@ header {
176187
-webkit-border-radius: 3px;
177188
border-radius: 3px;
178189
}
179-
#timeline .user-name {
190+
.tweetbox .user-name {
180191
font-weight: bold;
181192
}
182-
#timeline .tweet-text {
193+
.tweetbox .tweet-text {
183194
}
184-
#timeline .user-name, #timeline .tweet-text {
195+
.tweetbox .user-name, .tweetbox .tweet-text {
185196
margin-left: 58px;
186197
}
187198

0 commit comments

Comments
 (0)