1fd811979400bd228a058ee65d07679a5e6625a7
[profile/ivi/qtdeclarative.git] / examples / declarative / canvas / twitterfriends / TwitterUser.qml
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: http://www.qt-project.org/
6 **
7 ** This file is part of the examples of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:BSD$
10 ** You may use this file under the terms of the BSD license as follows:
11 **
12 ** "Redistribution and use in source and binary forms, with or without
13 ** modification, are permitted provided that the following conditions are
14 ** met:
15 **   * Redistributions of source code must retain the above copyright
16 **     notice, this list of conditions and the following disclaimer.
17 **   * Redistributions in binary form must reproduce the above copyright
18 **     notice, this list of conditions and the following disclaimer in
19 **     the documentation and/or other materials provided with the
20 **     distribution.
21 **   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
22 **     the names of its contributors may be used to endorse or promote
23 **     products derived from this software without specific prior written
24 **     permission.
25 **
26 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40
41 import QtQuick 2.0
42
43 Item {
44     id:twitterUser
45     property variant friends : [];
46     property string name : "";
47     property string twitterId : "";
48     property string image : "";
49     property string url : "";
50     property string desc : "";
51     width : 0;
52     height : 0;
53     property int posX:0;
54     property int posY:0;
55     property bool hasFocus : false;
56     property variant canvas;
57     property variant manager;
58     property variant linkColor;
59     property bool selected : false;
60
61     Rectangle {
62         id:twitterStatus
63         x:twitterUser.width
64         y:twitterUser.height
65         width:250
66         height:60
67         opacity: 0
68         border.color:"steelblue"
69         border.width:3
70         Column {
71             spacing:2
72             Text {color:"steelblue"; font.pointSize:15; width:250; height:30; text:twitterUser.name; wrapMode: Text.WrapAnywhere}
73             Text {color:"steelblue"; font.pointSize:8; width:250; height:30;  text:twitterUser.url; wrapMode: Text.WrapAnywhere}
74         }
75     }
76
77     function moved() {
78         twitterUser.posX = twitterUser.x;
79         twitterUser.posY = twitterUser.y;
80         twitterUser.canvas.requestPaint();
81     }
82
83     onXChanged: moved();
84     onYChanged: moved();
85
86     MouseArea {
87         anchors.fill:parent
88         drag.target : twitterUser
89         drag.axis : Drag.XandYAxis
90
91         onClicked: {
92             if (!twitterUser.selected) {
93                 twitterUser.selected = true;
94                 twitterStatus.opacity = 1;
95                 twitterStatus.visible = true;
96             } else {
97                 twitterUser.selected = false;
98                 twitterStatus.opacity = 0;
99             }
100         }
101
102         onDoubleClicked : {
103             twitterStatus.opacity = 0;
104             twitterUser.selected = false;
105             twitterUser.hasFocus = true;
106             twitterUser.canvas.twitterName = twitterUser.name;
107             twitterUser.canvas.twitterId = twitterUser.twitterId;
108             twitterUser.canvas.loading = true;
109             twitterUser.createFriends();
110         }
111     }
112
113     function show(ctx, layoutChanged) {
114       var w = canvas.width;
115       var h = canvas.height;
116       if (twitterUser.hasFocus) {
117           twitterUser.width = 60
118           twitterUser.height = 60
119           twitterUser.posX = w/2;
120           twitterUser.posY = h/2;
121        } else {
122           twitterUser.width = 40
123           twitterUser.height = 40
124       }
125
126
127       if (twitterUser.hasFocus) {
128           if (layoutChanged)
129               twitterUser.layoutFriends();
130           twitterUser.linkFriends(ctx);
131           twitterUser.showFriends(ctx);
132           ctx.shadowOffsetX = 5;
133           ctx.shadowOffsetY = 5;
134           ctx.shadowBlur = 7;
135           ctx.shadowColor = "blue";
136           ctx.globalAlpha = 1;
137       }  else {
138           ctx.shadowOffsetX = 5;
139           ctx.shadowOffsetY = 5;
140           ctx.shadowBlur = 7;
141           ctx.shadowColor = twitterUser.linkColor;
142           ctx.globalAlpha = 0.6;
143       }
144
145       if (twitterUser.canvas.isImageLoaded(twitterUser.image)) {
146         ctx.drawImage(twitterUser.image, twitterUser.posX, twitterUser.posY, twitterUser.width, twitterUser.height);
147       }
148 //      ctx.font = "15px";
149 //      var nameSize = ctx.measureText(twitterUser.name).width;
150 //      ctx.fillText(twitterUser.name, twitterUser.posX + nameSize/2 - twitterUser.width/2, twitterUser.posY + twitterUser.height/2 + 10);
151     }
152     function dump() {
153         console.log("name:" + twitterUser.name
154                   + " x:" + twitterUser.posX
155                   + " y:" + twitterUser.posY
156                   + " width:" + twitterUser.width
157                   + " height:" + twitterUser.height
158                   + " id:" + twitterUser.twitterId
159                   + " image:" + twitterUser.image
160                   + " url:" + twitterUser.url + "\n" + twitterUser.desc);
161     }
162
163     function layoutFriends() {
164         var w = canvas.width;
165         var h = canvas.height;
166         for (var i=0; i < twitterUser.friends.length; i++) {
167             var friend = manager.getById(twitterUser.friends[i]);
168             if (friend) {
169                 friend.x = Math.random() *w;
170                 friend.y = Math.random() *h;
171             }
172         }
173     }
174
175     function showFriends(ctx) {
176         var w = canvas.width;
177         var h = canvas.height;
178         for (var i=0; i < twitterUser.friends.length && i < 15; i++) {
179             var friend = manager.getById(twitterUser.friends[i]);
180             if (friend && twitterUser.canvas.isImageLoaded(friend.image)) {
181                 friend.hasFocus = false;
182                 friend.show(ctx, false);
183             }
184         }
185     }
186
187     function linkFriends(ctx) {
188         var w = canvas.width;
189         var h = canvas.height;
190         for (var i=0; i < twitterUser.friends.length && i < 15; i++) {
191             var friend = manager.getById(twitterUser.friends[i]);
192             if (friend && twitterUser.canvas.isImageLoaded(friend.image)) {
193                 if (!friend.linkColor)
194                      friend.linkColor = Qt.rgba( ((Math.random() * 200) +55)/255
195                                                , ((Math.random() * 200) +55)/255
196                                                , ((Math.random() * 200) +55)/255, 0.8);
197                 ctx.strokeStyle  = friend.linkColor;
198                 ctx.lineWidth = 8;
199                 ctx.beginPath();
200                 ctx.moveTo(twitterUser.posX + twitterUser.width/2, twitterUser.posY + twitterUser.height/2);
201                 ctx.lineTo(friend.x + friend.width/2, friend.y + friend.height/2);
202                 ctx.stroke();
203             }
204         }
205     }
206
207
208     function create(url) {
209         var x = new XMLHttpRequest;
210         x.open("GET", url);
211
212         x.onreadystatechange = function() {
213             if (x.readyState == XMLHttpRequest.DONE) {
214                 var user = eval('(' + x.responseText +')')[0];
215                 twitterUser.name = user.name;
216                 twitterUser.twitterId = user.id;
217                 twitterUser.image = user.profile_image_url;
218                 twitterUser.canvas.loadImage(twitterUser.image);
219                 twitterUser.url = user.url;
220                 twitterUser.desc = user.description;
221                 twitterUser.createFriends();
222            }
223         }
224         x.send();
225     }
226
227     function createByName(name) {
228       if (twitterUser.name === "" && twitterUser.twitterId === "") {
229          twitterUser.name = name;
230          var userUrl = "http://api.twitter.com/1/users/lookup.json?stringify_ids=true&screen_name=" + name;
231          twitterUser.create(userUrl);
232       }
233     }
234
235     function createById(id) {
236       if (twitterUser.name === "" && twitterUser.twitterId === "") {
237          twitterUser.twitterId = id;
238          var userUrl = "http://api.twitter.com/1/users/lookup.json?stringify_ids=true&user_id=" + id;
239          twitterUser.create(userUrl);
240       }
241     }
242
243     function createFriends() {
244       if (twitterUser.friends.length === 0) {
245           var x = new XMLHttpRequest;
246           var friendsUrl = "https://api.twitter.com/1/friends/ids.json?cursor=-1&stringify_ids=true&user_id=" + twitterUser.twitterId;
247           x.open("GET", friendsUrl);
248
249           x.onreadystatechange = function() {
250               if (x.readyState == XMLHttpRequest.DONE) {
251                  twitterUser.friends = eval('(' + x.responseText +')').ids;
252                  var doRequest = false;
253                   var userUrl = "http://api.twitter.com/1/users/lookup.json?stringify_ids=true&user_id=";
254
255                  for (var i=0; i<twitterUser.friends.length && i < 100; i++) {
256                     var friend = manager.getById(twitterUser.friends[i]);
257                     if (!friend) {
258                        userUrl += "," + twitterUser.friends[i];
259                        doRequest = true;
260                     }
261                  }
262
263                  if (!doRequest) return;
264
265                  var xx = new XMLHttpRequest;
266                  xx.open("GET", userUrl);
267                  xx.onreadystatechange = function() {
268                     if (xx.readyState == XMLHttpRequest.DONE) {
269                        var friendUsers = eval('(' + xx.responseText +')');
270                        for(var i=0; i<friendUsers.length; i++) {
271                            var friend = manager.createTwitterUser(twitterUser.canvas);
272                           friend.name = friendUsers[i].name;
273                           friend.twitterId = friendUsers[i].id;
274                           friend.image = friendUsers[i].profile_image_url ? friendUsers[i].profile_image_url : "";
275                           friend.url = friendUsers[i].url ? friendUsers[i].url : "";
276                           friend.desc = friendUsers[i].description ? friendUsers[i].description : "";
277                           friend.manager = twitterUser.manager;
278                           twitterUser.canvas.loadImage(friend.image);
279                        }
280
281                        if (twitterUser.hasFocus && twitterUser.canvas) {
282                            twitterUser.canvas.layoutChanged = true;
283                            twitterUser.canvas.loading = false;
284                            twitterUser.canvas.requestPaint();
285                        }
286                     }
287                  }
288                  xx.send();
289               }
290           }
291           x.send();
292       }
293     }
294 }