|
|
|
|
// Local cache of icon coordonate
|
|
var networkItemsCache = [];
|
|
var wifiItemsCache = [];
|
|
var lastWifiUpdate = 0;
|
|
|
|
// Neighborhood view
|
|
enyo.kind({
|
|
name: "Sugar.NeighborhoodView",
|
|
kind: enyo.Control,
|
|
components: [
|
|
{name: "owner", kind: "Sugar.Icon", size: constant.sizeNeighbor, colorized: true, classes: "owner-icon", showing: false},
|
|
{name: "server", kind: "Sugar.Icon", size: constant.sizeNeighbor, colorized: true, classes: "server-icon", showing: false},
|
|
{name: "network", showing: true, onresize: "draw", components: []},
|
|
{name: "otherview", showing: true, components: []},
|
|
{name: "networkPopup", kind: "Sugar.Popup", showing: false},
|
|
{name: "empty", classes: "cloud-empty", showing: false},
|
|
{name: "message", classes: "cloud-message", showing: false},
|
|
{name: "settings", classes: "cloud-line", showing: false, components:[
|
|
{name: "gotosettings", kind: "Sugar.IconButton", icon: {directory: "icons", icon: "preferences-system.svg"}, classes: "listview-button cloud-gotosettings", ontap: "doSettings"}
|
|
]},
|
|
{name: "refresh", classes: "cloud-line", showing: false, components:[
|
|
{name: "refreshstate", kind: "Sugar.IconButton", icon: {directory: "icons", icon: "system-restart.svg"}, classes: "listview-button cloud-gotosettings", ontap: "doRefresh"}
|
|
]}
|
|
],
|
|
// Constructor: init list
|
|
create: function() {
|
|
this.inherited(arguments);
|
|
this.$.owner.setIcon({directory: "icons", icon: "owner-icon.svg"});
|
|
this.$.owner.setPopupShow(enyo.bind(this, "showBuddyPopup"));
|
|
this.$.owner.setPopupHide(enyo.bind(this, "hideBuddyPopup"));
|
|
|
|
if (window.sugarizerOS) {
|
|
this.$.server.setIcon({directory: "icons", icon:"cloud-one.svg"});
|
|
} else {
|
|
this.$.server.setIcon({directory: "icons", icon: "network-wireless-connected-100.svg"});
|
|
}
|
|
this.$.server.setPopupShow(enyo.bind(this, "showServerPopup"));
|
|
this.$.server.setPopupHide(enyo.bind(this, "hideServerPopup"));
|
|
var cacheData = this.findInCache({icon: this.$.server});
|
|
var serverColor = Math.floor(Math.random()*xoPalette.colors.length);
|
|
this.$.server.setColorizedColor(cacheData ? cacheData.colorvalue : xoPalette.colors[serverColor]);
|
|
this.users = [];
|
|
this.activities = [];
|
|
this.eeMode = false;
|
|
this.timer = window.setInterval(enyo.bind(this, "updateNetworkState"), constant.timerUpdateNetwork);
|
|
if (presence.isConnected() || window.sugarizerOS) {
|
|
this.updateNetworkState();
|
|
}
|
|
if (l10n.language.direction == "rtl") {
|
|
this.$.message.addClass("rtl-10");
|
|
}
|
|
this.draw();
|
|
},
|
|
|
|
// Get linked toolbar
|
|
getToolbar: function() {
|
|
if (this.toolbar == null)
|
|
this.toolbar = new Sugar.NeighborhoodToolbar();
|
|
return this.toolbar;
|
|
},
|
|
|
|
// Get linked popup
|
|
getPopup: function() {
|
|
return this.$.networkPopup;
|
|
},
|
|
createWifiIcons: function (items) {
|
|
// If SugarizerOS, adding Wireless networks icons
|
|
if (window.sugarizerOS) {
|
|
var networkIcons = [];
|
|
var networks = sugarizerOS.networks;
|
|
var wifiInTutorial = false;
|
|
for (var i = 0; i < networks.length; i++) {
|
|
var currentNetwork = networks[i];
|
|
var encryptionString = sugarizerOS.getEncryptionString(currentNetwork.capabilities);
|
|
var connectedString = "";
|
|
var securedString = "";
|
|
var pwr = (-1 * currentNetwork.RSSI) % 10;
|
|
if (currentNetwork.isConnected) {
|
|
connectedString = "-connected";
|
|
} else if (encryptionString != "OPEN") {
|
|
securedString = "-locked";
|
|
}
|
|
if (pwr > 0) {
|
|
if (pwr % 2 != 0) {
|
|
pwr += 1;
|
|
}
|
|
pwr = pwr * 10;
|
|
cacheIcon = sugarizerOS.getNetworkIconFromCache(currentNetwork.BSSID);
|
|
if (!cacheIcon) {
|
|
currentNetwork.networkId = currentNetwork.BSSID;
|
|
currentNetwork.shared = false;
|
|
currentNetwork.shared.id = currentNetwork.BSSID;
|
|
currentNetwork.color = xoPalette.colors[Math.floor(Math.random() * xoPalette.colors.length)];
|
|
} else {
|
|
currentNetwork = cacheIcon;
|
|
}
|
|
|
|
iconString = "network-wireless"+connectedString+securedString+"-0"+pwr+".svg";
|
|
if (pwr == 100) {
|
|
iconString = "network-wireless"+connectedString+securedString+"-"+pwr+".svg";
|
|
}
|
|
var icon = this.$.network.createComponent({
|
|
kind: "Sugar.Icon",
|
|
icon: {directory: "icons", icon: iconString},
|
|
size: constant.sizeNeighbor,
|
|
colorized: true,
|
|
colorizedColor: currentNetwork.color,
|
|
popupShow: enyo.bind(this, "showWifiPopup"),
|
|
popupHide: enyo.bind(this, "hideWifiPopup"),
|
|
data: currentNetwork
|
|
},
|
|
{owner: this}
|
|
);
|
|
icon.render();
|
|
if (!wifiInTutorial) {
|
|
tutorial.setElement("wifi", icon.getAttribute("id"));
|
|
wifiInTutorial = true;
|
|
}
|
|
networkIcons.push(icon);
|
|
sugarizerOS.addNetworkIconToCache(currentNetwork);
|
|
var item = {icon: icon, size: icon.getSize(), locked: false, child: []};
|
|
items.push(item);
|
|
}}
|
|
}
|
|
},
|
|
|
|
// Update
|
|
updateNetworkState: function() {
|
|
var currentcolor = preferences.getColor();
|
|
if (presence.isConnected() && currentcolor.stroke == "#005FE4" && currentcolor.fill == "#FF2B34" && this.toolbar && this.toolbar.getSearchText() == "Sugarizer contributors") {
|
|
if (!this.eeMode) {
|
|
var list = new Sugar.EE({mode: 3}).contributors();
|
|
for (var i = 0 ; i < list.length ; i++) {
|
|
this.users.push(list[i]);
|
|
}
|
|
this.eeMode = true;
|
|
this.draw();
|
|
this.filterNetwork();
|
|
}
|
|
} else if (presence.isConnected()) {
|
|
this.$.owner.setShowing(true);
|
|
this.$.server.setShowing(true);
|
|
this.$.empty.setShowing(false);
|
|
this.$.message.setShowing(false);
|
|
this.$.settings.setShowing(false);
|
|
this.$.refresh.setShowing(false);
|
|
if (app.toolbar && app.toolbar.showServerWarning) {
|
|
app.toolbar.showServerWarning(false);
|
|
}
|
|
presence.listUsers(enyo.bind(this, "userListReceived"));
|
|
presence.listSharedActivities(enyo.bind(this, "sharedListReceived"));
|
|
this.eeMode = false;
|
|
}
|
|
else if (window.sugarizerOS) {
|
|
now = new Date().getTime();
|
|
this.$.owner.setShowing(true);
|
|
if (presence.isConnected())
|
|
this.$.server.setShowing(true);
|
|
this.$.empty.setShowing(false);
|
|
this.$.message.setShowing(false);
|
|
this.$.settings.setShowing(false);
|
|
this.$.refresh.setShowing(false);
|
|
sugarizerOS.isWifiEnabled(function(value){
|
|
if (value != 0) {
|
|
sugarizerOS.scanWifi();
|
|
} else {
|
|
sugarizerOS.networks = [];
|
|
}
|
|
});
|
|
if (wifiItemsCache != sugarizerOS.networks && (now - lastWifiUpdate) > constant.wifiUpdateTime) {
|
|
this.draw();
|
|
wifiItemsCache = sugarizerOS.networks;
|
|
lastWifiUpdate = now;
|
|
}
|
|
presence.listUsers(enyo.bind(this, "userListReceived"));
|
|
presence.listSharedActivities(enyo.bind(this, "sharedListReceived"));
|
|
this.eeMode = false;
|
|
}
|
|
else {
|
|
this.$.owner.setShowing(false);
|
|
this.$.server.setShowing(false);
|
|
this.$.empty.setShowing(true);
|
|
this.$.message.setShowing(true);
|
|
if (app.toolbar && app.toolbar.showServerWarning) {
|
|
app.toolbar.showServerWarning(true);
|
|
}
|
|
if (preferences.isConnected()) {
|
|
this.$.message.setContent(l10n.get("UnableToConnect"));
|
|
this.$.refresh.setShowing(true);
|
|
} else {
|
|
this.$.message.setContent(l10n.get("ServerNotSet"));
|
|
this.$.settings.setShowing(true);
|
|
}
|
|
this.eeMode = false;
|
|
}
|
|
},
|
|
|
|
// Popup menu for buddy handling
|
|
showBuddyPopup: function(icon) {
|
|
// Create popup
|
|
this.getPopup().setHeader({
|
|
icon: icon.icon,
|
|
colorized: true,
|
|
colorizedColor: null,
|
|
name: preferences.getName(),
|
|
title: null,
|
|
action: null
|
|
});
|
|
this.getPopup().setItems(null);
|
|
var items = [];
|
|
items.push({
|
|
icon: {directory: "icons", icon: "system-shutdown.svg"},
|
|
colorized: false,
|
|
name: l10n.get("Logoff"),
|
|
action: enyo.bind(this, "doLogoff"),
|
|
data: null
|
|
});
|
|
items.push({
|
|
icon: {directory: "icons", icon: "system-restart.svg"},
|
|
colorized: false,
|
|
name: l10n.get("Restart"),
|
|
action: enyo.bind(this, "doRestart"),
|
|
data: null
|
|
});
|
|
items.push({
|
|
icon: {directory: "icons", icon: "preferences-system.svg"},
|
|
colorized: false,
|
|
name: l10n.get("MySettings"),
|
|
action: enyo.bind(this, "doSettings"),
|
|
data: null
|
|
});
|
|
this.getPopup().setFooter(items);
|
|
|
|
// Show popup
|
|
this.getPopup().showPopup();
|
|
},
|
|
hideBuddyPopup: function(icon) {
|
|
if (!this || !this.getPopup || !icon || !this.getPopup() || this.getPopup().cursorIsInside() || icon.cursorIsInside()) {
|
|
return false;
|
|
}
|
|
this.getPopup().hidePopup();
|
|
return true;
|
|
},
|
|
doLogoff: function() {
|
|
stats.trace(constant.viewNames[app.getView()], 'click', 'logoff');
|
|
this.getPopup().hidePopup();
|
|
if (!preferences.isConnected() || (preferences.isConnected() && !preferences.getOptions("sync"))) {
|
|
this.otherview = this.$.otherview.createComponent({kind: "Sugar.DialogWarningMessage"}, {owner:this});
|
|
this.otherview.show();
|
|
} else {
|
|
preferences.addUserInHistory();
|
|
util.cleanDatastore(null, function() {
|
|
util.restartApp();
|
|
});
|
|
}
|
|
},
|
|
doRestart: function() {
|
|
stats.trace(constant.viewNames[app.getView()], 'click', 'restart');
|
|
util.restartApp();
|
|
},
|
|
doSettings: function() {
|
|
stats.trace(constant.viewNames[app.getView()], 'click', 'my_settings');
|
|
this.getPopup().hidePopup();
|
|
this.otherview = this.$.otherview.createComponent({kind: "Sugar.DialogServer"}, {owner:this});
|
|
this.otherview.show();
|
|
},
|
|
doRefresh: function() {
|
|
if (!presence.isConnected()) {
|
|
var that = this;
|
|
presence.joinNetwork(function(error, user) {
|
|
if (error) {
|
|
console.log("WARNING: Can't connect to presence server");
|
|
} else {
|
|
that.updateNetworkState();
|
|
}
|
|
});
|
|
} else {
|
|
this.updateNetworkState();
|
|
}
|
|
|
|
},
|
|
|
|
// Popup menu for server handling
|
|
showServerPopup: function(icon) {
|
|
// Create popup
|
|
var name = myserver.getServer();
|
|
var info = preferences.getServer();
|
|
if (info && info.name) {
|
|
name = info.name;
|
|
}
|
|
this.getPopup().setHeader({
|
|
icon: icon.icon,
|
|
colorized: true,
|
|
colorizedColor: icon.colorizedColor,
|
|
name: name,
|
|
title: l10n.get("Connected"),
|
|
action: null
|
|
});
|
|
this.getPopup().setItems(null);
|
|
this.getPopup().setFooter(null);
|
|
|
|
// Show popup
|
|
this.getPopup().showPopup();
|
|
},
|
|
hideServerPopup: function(icon) {
|
|
if (!this || !this.getPopup || !icon || !this.getPopup() || this.getPopup().cursorIsInside() || icon.cursorIsInside()) {
|
|
return false;
|
|
}
|
|
this.getPopup().hidePopup();
|
|
return true;
|
|
},
|
|
|
|
disconnect: function() {
|
|
sugarizerOS.disconnectWifi();
|
|
this.getPopup().hidePopup();
|
|
},
|
|
|
|
forgetPassword: function(network) {
|
|
sugarizerOS.forgetNetwork(network.SSID);
|
|
this.getPopup().hidePopup();
|
|
},
|
|
|
|
joinNetwork: function(network) {
|
|
var t = this;
|
|
|
|
sugarizerOS.isKnownNetwork(network.SSID, function (result) {
|
|
if (result == 0) {
|
|
sugarizerOS.setKey(network.SSID, "", true);
|
|
} else {
|
|
sugarizerOS.joinNetwork(network.SSID);
|
|
}
|
|
t.getPopup().hidePopup();
|
|
});
|
|
},
|
|
|
|
enterKey: function (network) {
|
|
this.getPopup().hidePopup();
|
|
var t = this;
|
|
sugarizerOS.isKnownNetwork(network.SSID, function (result) {
|
|
if (result == 0) {
|
|
sugarizerOS.NetworkBuffer = network;
|
|
t.otherview = t.$.otherview.createComponent({
|
|
kind: "Sugar.DialogNetworkKey"
|
|
});
|
|
t.otherview.show();
|
|
} else {
|
|
sugarizerOS.joinNetwork(network.SSID)
|
|
}
|
|
})
|
|
|
|
},
|
|
//Popup menu for Wireless Network handling
|
|
showWifiPopup: function(icon) {
|
|
// Create popup
|
|
var data = icon.getData();
|
|
var iconName = data.SSID + " (" + data.RSSI + ")" + "[" + sugarizerOS.getEncryptionString(data.capabilities) + "]";
|
|
var power = (-1 * data.RSSI) % 5;
|
|
this.getPopup().setHeader({
|
|
icon: icon.icon,
|
|
colorized: true,
|
|
colorizedColor: icon.colorizedColor,
|
|
name: iconName,
|
|
title: data.BSSID,
|
|
action: null
|
|
});
|
|
var items = [];
|
|
|
|
var t = this;
|
|
sugarizerOS.getWifiSSID(function (ssid) {
|
|
if (ssid == null || ssid !== data.SSID) {
|
|
item = {
|
|
icon: {
|
|
directory: "icons", icon: "activity-start.svg"
|
|
},
|
|
colorized: false,
|
|
name: l10n.get("JoinNetwork"),
|
|
action: enyo.bind(t, "joinNetwork"),
|
|
data: [icon.getData(), null]
|
|
};
|
|
if (sugarizerOS.getEncryptionString(data.capabilities) != "OPEN") {
|
|
item.action = enyo.bind(t, "enterKey");
|
|
}
|
|
} else {
|
|
item = {
|
|
icon: {
|
|
directory: "icons",
|
|
icon: "activity-start.svg"
|
|
},
|
|
colorized: false,
|
|
name: l10n.get("Disconnect"),
|
|
action: enyo.bind(t, "disconnect"),
|
|
data: [icon.getData(), null]
|
|
};
|
|
}
|
|
items.push(item);
|
|
|
|
|
|
sugarizerOS.isKnownNetwork(data.SSID, function (result) {
|
|
if (result == 1) {
|
|
item = {
|
|
icon: {
|
|
directory: "icons",
|
|
icon: "activity-start.svg"
|
|
},
|
|
colorized: false,
|
|
name: l10n.get("ForgetPassword"),
|
|
action: enyo.bind(t, "forgetPassword"),
|
|
data: [icon.getData(), null]
|
|
};
|
|
if (sugarizerOS.getEncryptionString(data.capabilities) != "OPEN") {
|
|
items.push(item);
|
|
}
|
|
}
|
|
|
|
t.getPopup().setItems(items);
|
|
t.getPopup().setFooter(null);
|
|
// Show popup
|
|
t.getPopup().showPopup();
|
|
})
|
|
})
|
|
},
|
|
hideWifiPopup: function (icon) {
|
|
if ((!this || !this.getPopup || !icon || !this.getPopup() || this.getPopup() && this.getPopup().cursorIsInside()) || icon.cursorIsInside()) {
|
|
return false;
|
|
}
|
|
this.getPopup().hidePopup();
|
|
return true;
|
|
},
|
|
|
|
// Popup menu for user handling
|
|
showUserPopup: function(icon) {
|
|
// Create popup
|
|
this.getPopup().setHeader({
|
|
icon: icon.icon,
|
|
colorized: true,
|
|
colorizedColor: icon.colorizedColor,
|
|
name: icon.getData().name,
|
|
title: null,
|
|
action: null
|
|
});
|
|
this.getPopup().setItems(null);
|
|
this.getPopup().setFooter(null);
|
|
|
|
// Show popup
|
|
this.getPopup().showPopup();
|
|
},
|
|
hideUserPopup: function(icon) {
|
|
if (!this || !this.getPopup || !icon || !this.getPopup() || this.getPopup().cursorIsInside() || icon.cursorIsInside()) {
|
|
return false;
|
|
}
|
|
this.getPopup().hidePopup();
|
|
return true;
|
|
},
|
|
|
|
// Popup menu for shared activities handling
|
|
showActivityPopup: function(icon) {
|
|
// Create popup
|
|
this.getPopup().setHeader({
|
|
icon: icon.icon,
|
|
colorized: true,
|
|
colorizedColor: icon.colorizedColor,
|
|
name: icon.getData().activity.name,
|
|
title: null,
|
|
action: null
|
|
});
|
|
var items = [];
|
|
items.push({
|
|
icon: {directory: "icons", icon: "activity-start.svg"},
|
|
colorized: false,
|
|
name: l10n.get("JoinActivity"),
|
|
action: enyo.bind(this, "joinActivity"),
|
|
data: [icon.getData(), null]
|
|
});
|
|
this.getPopup().setItems(items);
|
|
this.getPopup().setFooter(null);
|
|
|
|
// Show popup
|
|
this.getPopup().showPopup();
|
|
},
|
|
hideActivityPopup: function(icon) {
|
|
if (!this || !this.getPopup || !icon || !this.getPopup() || this.getPopup().cursorIsInside() || icon.cursorIsInside()) {
|
|
return false;
|
|
}
|
|
this.getPopup().hidePopup();
|
|
return true;
|
|
},
|
|
|
|
// Join a shared activity
|
|
joinActivity: function(data) {
|
|
preferences.runActivity(
|
|
data.activity,
|
|
null,
|
|
data.activity.name,
|
|
data.shared.id);
|
|
},
|
|
|
|
// User list received
|
|
userListReceived: function(users) {
|
|
// Ensure that an update is need
|
|
if (this.users.length == users.length) {
|
|
var len = this.users.length;
|
|
var found = 0;
|
|
for(var i = 0 ; i < len ; i++) {
|
|
for(var j = 0 ; j < len ; j++) {
|
|
if (users[i].networkId == this.users[j].networkId) {
|
|
found++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (found == len) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Retrieve users
|
|
this.users = users;
|
|
|
|
// Add dummy users for testing
|
|
var dummy = 0;
|
|
for (var i = 0 ; i < dummy ; i++) {
|
|
this.users.push({networkId: "nxx"+i, name: "dummy "+i, colorvalue: xoPalette.colors[Math.floor(Math.random()*xoPalette.colors.length)]});
|
|
}
|
|
|
|
// Redraw
|
|
this.draw();
|
|
},
|
|
|
|
// Shared activities list received
|
|
sharedListReceived: function(activities) {
|
|
// Ensure that an update is need
|
|
if (this.activities.length == activities.length) {
|
|
var len = this.activities.length;
|
|
var found = 0;
|
|
for(var i = 0 ; i < len ; i++) {
|
|
for(var j = 0 ; j < len ; j++) {
|
|
if (activities[i].activityId == this.activities[j].activityId && activities[i].users.length == this.activities[j].users.length) {
|
|
found++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (found == len) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Retrieve activities
|
|
this.activities = activities;
|
|
|
|
// Redraw
|
|
this.draw();
|
|
},
|
|
|
|
// Draw screen
|
|
draw: function() {
|
|
// Resize content and set Journal empty in the middle
|
|
var canvas_center = util.getCanvasCenter();
|
|
this.$.empty.applyStyle("margin-left", (canvas_center.x-constant.sizeEmpty/4-10)+"px");
|
|
var margintop = (canvas_center.y-constant.sizeEmpty/4-80);
|
|
this.$.empty.applyStyle("margin-top", margintop+"px");
|
|
this.$.message.applyStyle("margin-top", (margintop+70)+"px");;
|
|
this.$.gotosettings.applyStyle("margin-top", (margintop+90)+"px");
|
|
this.$.gotosettings.setText(l10n.get("MySettings"));
|
|
this.$.refreshstate.applyStyle("margin-top", (margintop+90)+"px");
|
|
this.$.refreshstate.setText(l10n.get("Refresh"));
|
|
tutorial.setElement("owner", this.$.owner.getAttribute("id"));
|
|
tutorial.setElement("server", this.$.server.getAttribute("id"));
|
|
|
|
// Clean network icons
|
|
var items = [];
|
|
enyo.forEach(this.$.network.getControls(), function(item) { items.push(item); });
|
|
for (var i = 0 ; i < items.length ; i++) { items[i].destroy(); };
|
|
|
|
// List items to draw
|
|
var canvas_center = util.getCanvasCenter();
|
|
items = [];
|
|
items.push({icon: this.$.owner, x:(canvas_center.x-constant.sizeNeighbor/2), y: (canvas_center.y-constant.sizeNeighbor/2), size: this.$.owner.getSize(), locked: true, child: []});
|
|
if (this.$.server.getShowing())
|
|
items.push({icon: this.$.server, size: this.$.server.getSize(), locked: false, child: []});
|
|
|
|
// Create network icons for items
|
|
this.createNetworkIcons(items);
|
|
this.createWifiIcons(items);
|
|
|
|
// Compute icons position
|
|
var len = items.length;
|
|
for(var i = 0 ; i < len ; i++) {
|
|
// Set icon position
|
|
var current = items[i];
|
|
if (current.locked)
|
|
continue;
|
|
var hasChild = (current.child.length > 0) ? 1 : 0;
|
|
var cacheData = this.findInCache(current);
|
|
var maxx = canvas_center.dx-current.size-2*hasChild*current.size;
|
|
current.x = (cacheData && cacheData.x < maxx) ? cacheData.x : current.size*hasChild + Math.floor(Math.random()*maxx);
|
|
var maxy = canvas_center.dy-current.size-2*hasChild*current.size;
|
|
current.y = (cacheData && cacheData.y < maxy) ? cacheData.y : current.size*hasChild + Math.floor(Math.random()*maxy);
|
|
if (!cacheData) this.addToCache(current);
|
|
|
|
// Set child position
|
|
var childLen = current.child.length;
|
|
for (var j = 0 ; j < childLen ; j++) {
|
|
var child = current.child[j];
|
|
var angle = (2.0*Math.PI)/childLen * j;
|
|
child.x = current.x + current.size * Math.sin(angle);
|
|
child.y = current.y - current.size * Math.cos(angle);
|
|
}
|
|
}
|
|
var collisions = this.detectCollisions(items);
|
|
if (collisions.length > 0) {
|
|
this.solveCollisions(collisions, items);
|
|
}
|
|
|
|
// Draw all icons
|
|
for (var i = 0 ; i < len ; i++) {
|
|
var current = items[i];
|
|
current.icon.applyStyle("margin-left", current.x+"px");
|
|
current.icon.applyStyle("margin-top", current.y+"px");
|
|
var childLen = current.child.length;
|
|
for (var j = 0 ; j < childLen ; j++) {
|
|
var child = current.child[j];
|
|
child.applyStyle("margin-left", child.x+"px");
|
|
child.applyStyle("margin-top", child.y+"px");
|
|
}
|
|
}
|
|
|
|
// Filter
|
|
this.filterNetwork();
|
|
},
|
|
|
|
// Create network icons fro items
|
|
createNetworkIcons: function(items) {
|
|
// Add user icons
|
|
var len = this.users.length;
|
|
var userIcons = [];
|
|
var otherInTutorial = false;
|
|
for (var i = 0 ; i < len ; i++) {
|
|
var currentUser = this.users[i];
|
|
if (currentUser.networkId != preferences.getNetworkId()) {
|
|
var icon = this.$.network.createComponent({
|
|
kind: "Sugar.Icon",
|
|
icon: {directory: "icons", icon: "owner-icon.svg"},
|
|
size: constant.sizeNeighbor,
|
|
colorized: true,
|
|
colorizedColor: currentUser.colorvalue,
|
|
popupShow: enyo.bind(this, "showUserPopup"),
|
|
popupHide: enyo.bind(this, "hideUserPopup"),
|
|
data: currentUser
|
|
},
|
|
{owner: this}
|
|
);
|
|
icon.render();
|
|
if (!otherInTutorial) {
|
|
tutorial.setElement("other", icon.getAttribute("id"));
|
|
otherInTutorial = true;
|
|
}
|
|
userIcons.push(icon);
|
|
}
|
|
}
|
|
|
|
// Add activities icons
|
|
len = this.activities.length;
|
|
var userIconsInActivities = [];
|
|
var activityInTutorial = false;
|
|
for (var i = 0 ; i < len ; i++) {
|
|
// Unknown activity, ignoe
|
|
var currentActivity = this.activities[i];
|
|
var activityInfo = preferences.getActivity(currentActivity.activityId);
|
|
if (activityInfo == preferences.genericActivity) {
|
|
continue;
|
|
}
|
|
|
|
// Add activity icon
|
|
var icon = this.$.network.createComponent({
|
|
kind: "Sugar.Icon",
|
|
icon: {directory: activityInfo.directory, icon: activityInfo.icon},
|
|
size: constant.sizeNeighbor,
|
|
colorized: true,
|
|
colorizedColor: currentActivity.colorvalue,
|
|
popupShow: enyo.bind(this, "showActivityPopup"),
|
|
popupHide: enyo.bind(this, "hideActivityPopup"),
|
|
data: {shared: currentActivity, activity: activityInfo}
|
|
},
|
|
{owner: this}
|
|
);
|
|
icon.render();
|
|
if (!activityInTutorial) {
|
|
tutorial.setElement("activity", icon.getAttribute("id"));
|
|
activityInTutorial = true;
|
|
}
|
|
|
|
// Add childs
|
|
var childIcons = [];
|
|
var childLen = currentActivity.users.length;
|
|
for (var j = 0 ; j < childLen ; j++) {
|
|
var userIconsLength = userIcons.length;
|
|
for (var k = 0 ; k < userIconsLength ; k++) {
|
|
var iconToTest = userIcons[k];
|
|
if (currentActivity.users[j] == iconToTest.getData().networkId) {
|
|
childIcons.push(iconToTest);
|
|
userIconsInActivities.push(iconToTest);
|
|
}
|
|
}
|
|
}
|
|
items.push({icon: icon, size: icon.getSize(), locked: false, child: childIcons});
|
|
}
|
|
|
|
// Add icons alone
|
|
var userIconsLength = userIcons.length;
|
|
var childLen = userIconsInActivities.length;
|
|
for (var i = 0 ; i < userIconsLength ; i++) {
|
|
var found = false;
|
|
var icon = userIcons[i];
|
|
for (var j = 0 ; j < childLen && !found ; j++) {
|
|
if (icon.getData().networkId == userIconsInActivities[j].getData().networkId) {
|
|
found = true;
|
|
}
|
|
}
|
|
if (!found) {
|
|
items.push({icon: icon, size: icon.getSize(), locked: false, child: []});
|
|
}
|
|
}
|
|
},
|
|
|
|
// Detect collisions on drawing
|
|
detectCollisions: function(items) {
|
|
var collisions = [];
|
|
var len = items.length;
|
|
for (var i = 0 ; i < len ; i++) {
|
|
for (var j = i+1 ; j < len ; j++) {
|
|
var item0 = items[i];
|
|
var item1 = items[j];
|
|
var size0 = item0.size;
|
|
var size1 = item1.size;
|
|
var min0x = item0.x, max0x = item0.x+size0;
|
|
var min0y = item0.y, max0y = item0.y+size0;
|
|
var min1x = item1.x, max1x = item1.x+size1;
|
|
var min1y = item1.y, max1y = item1.y+size1;
|
|
if (item0.child.length > 0) {
|
|
min0x -= size0;
|
|
max0x += size0;
|
|
min0y -= size0;
|
|
max0y += size0;
|
|
}
|
|
if (item1.child.length > 0) {
|
|
min1x -= size1;
|
|
max1x += size1;
|
|
min1y -= size1;
|
|
max1y += size1;
|
|
}
|
|
if (!(max0x < min1x || min0x > max1x || min0y > max1y || max0y < min1y)) {
|
|
if (item0.locked) {
|
|
collisions.push(item1);
|
|
} else {
|
|
collisions.push(item0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return collisions;
|
|
},
|
|
|
|
// Move items to avoid collisions
|
|
solveCollisions: function(collisions, items) {
|
|
var stillCollide = true;
|
|
var canvas_center = util.getCanvasCenter();
|
|
for(var i = 0 ; stillCollide && i < constant.maxCollisionTry ; i++) {
|
|
// Move all item with collision
|
|
for(var j = 0 ; j < collisions.length ; j++) {
|
|
// Move item
|
|
var current = collisions[j];
|
|
var hasChild = (current.child.length > 0) ? 1 : 0;
|
|
current.x = current.size*hasChild + Math.floor(Math.random()*(canvas_center.dx-current.size-2*hasChild*current.size));
|
|
current.y = current.size*hasChild + Math.floor(Math.random()*(canvas_center.dy-current.size-2*hasChild*current.size));
|
|
|
|
// Move childs
|
|
var childLen = current.child.length;
|
|
for (var k = 0 ; k < childLen ; k++) {
|
|
var child = current.child[k];
|
|
var angle = (2.0*Math.PI)/childLen * k;
|
|
child.x = current.x + current.size * Math.sin(angle);
|
|
child.y = current.y - current.size * Math.cos(angle);
|
|
}
|
|
}
|
|
|
|
// Detect again
|
|
collisions = this.detectCollisions(items);
|
|
stillCollide = (collisions.length > 0);
|
|
}
|
|
},
|
|
|
|
// Filter network items
|
|
filterNetwork: function() {
|
|
var filter = (this.toolbar && !this.eeMode) ? this.toolbar.getSearchText().toLowerCase() : '';
|
|
enyo.forEach(this.$.network.getControls(), function(item) {
|
|
item.setDisabled(filter.length != 0 && item.data && item.data.name && item.data.name.toLowerCase().indexOf(filter) == -1);
|
|
});
|
|
this.$.server.setDisabled(filter.length != 0 && myserver.getServer().toLowerCase().indexOf(filter) == -1);
|
|
},
|
|
|
|
// Cache handling
|
|
addToCache: function(item) {
|
|
// Get name
|
|
var data = item.icon.getData();
|
|
var name;
|
|
if (!data) {
|
|
name = "server";
|
|
} else if (data.networkId) {
|
|
name = data.networkId;
|
|
} else if (data.shared && data.shared.id) {
|
|
name = data.shared.id;
|
|
}
|
|
|
|
// Add to cache
|
|
var len = networkItemsCache;
|
|
var found = false;
|
|
for(var i = 0 ; i < len ; i++) {
|
|
var networkItem = networkItemsCache[i];
|
|
if (networkItem.name == name) {
|
|
networkItem.x = x;
|
|
networkItem.y = y;
|
|
found = true;
|
|
}
|
|
}
|
|
if (!found) {
|
|
networkItemsCache.push({name: name, x: item.x, y: item.y, colorvalue: item.icon.getColorizedColor()});
|
|
}
|
|
},
|
|
|
|
findInCache: function(item) {
|
|
// Get name
|
|
var data = item.icon.getData();
|
|
var name;
|
|
if (!data) {
|
|
name = "server";
|
|
} else if (data.networkId) {
|
|
name = data.networkId;
|
|
} else if (data.shared && data.shared.id) {
|
|
name = data.shared.id;
|
|
}
|
|
|
|
// Return to cache
|
|
var len = networkItemsCache.length;
|
|
var found = false;
|
|
for(var i = 0 ; i < len ; i++) {
|
|
var networkItem = networkItemsCache[i];
|
|
if (networkItem.name == name) {
|
|
return networkItem;
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
destroy: function() {
|
|
this.inherited(arguments);
|
|
clearTimeout(this.timer);
|
|
}
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// Class for neighborhood toolbar
|
|
enyo.kind({
|
|
name: "Sugar.NeighborhoodToolbar",
|
|
kind: enyo.Control,
|
|
components: [
|
|
{name: "neighborsearch", kind: "Sugar.SearchField", onTextChanged: "filterNetwork", classes: "neighbor-filter-text"},
|
|
{name: "helpbutton", kind: "Button", classes: "toolbutton help-button", title:"Help", ontap: "startTutorial"},
|
|
{name: "radialbutton", kind: "Button", classes: "toolbutton view-desktop-button", title:"Home", title:"Home", ontap: "gotoDesktop"}
|
|
],
|
|
|
|
// Constructor
|
|
create: function() {
|
|
this.inherited(arguments);
|
|
this.localize();
|
|
},
|
|
|
|
rendered: function() {
|
|
this.inherited(arguments);
|
|
this.localize();
|
|
},
|
|
|
|
localize: function() {
|
|
// Localize items
|
|
this.$.neighborsearch.setPlaceholder(l10n.get("SearchNeighbor"));
|
|
this.$.radialbutton.setNodeProperty("title", l10n.get("Home"));
|
|
this.$.helpbutton.setNodeProperty("title", l10n.get("Tutorial"));
|
|
},
|
|
|
|
// Handle search text content
|
|
getSearchText: function() {
|
|
return this.$.neighborsearch.getText();
|
|
},
|
|
|
|
// Event handling
|
|
gotoDesktop: function() {
|
|
window.clearInterval(app.otherview.timer);
|
|
util.vibrate();
|
|
app.showView(constant.radialView);
|
|
},
|
|
|
|
filterNetwork: function() {
|
|
app.otherview.filterNetwork();
|
|
},
|
|
|
|
startTutorial: function() {
|
|
tutorial.setElement("radialbutton", this.$.radialbutton.getAttribute("id"));
|
|
tutorial.setElement("neighborsearch", this.$.neighborsearch.getAttribute("id"));
|
|
stats.trace(constant.viewNames[app.getView()], 'tutorial', 'start', null);
|
|
tutorial.start();
|
|
}
|
|
});
|