YL.render = function (data) {
//监听消息
$(window).on("message", function (e) {
var winVerify = function (from) {
var id = from[0];
var secrete = from[1];
var win = YL.vue.wins[id];
if (win) {
if (win.secrete === secrete) {
return true;
} else {
YL.vue.winClose(id);
YL.msg(YL.lang('SecurityRisk'), YL.lang('SecurityRiskDetail'))
}
}
return false;
};
var data = e.originalEvent.data;
if ($.inArray(data.type, ["ylui-pong", "ylui-eval", "ylui-emit"]) < 0) { return; }
var from = data.from;
var id = from[0];
var wins = YL.vue.wins;
var win = wins[id];
if (!winVerify(from)) return;
switch (data.type) {
case "ylui-pong":
win.pong = Date.now();
break;
case "ylui-eval":
var rel = YL.child[data.eval.method].call(YL.child, data.eval.data, id);
!window.frames[id] || window.frames[id].postMessage({
"type": "ylui-eval",
result: rel,
session: data.session,
}, '*');
break;
case "ylui-emit":
var target = data.emit.target;
var sendList = [];
if (typeof target === 'string') {
sendList.push(target)
} else if (Yuri2.isArray(target)) {
sendList = target;
} else if (target === true) {
//all
for (var i in wins) {
sendList.push(i);
}
}
var parsedFrom = Yuri2.parseURL(win.urlOrigin);
sendList.forEach(function (t) {
var parsedTo = Yuri2.parseURL(wins[t].urlOrigin);
!window.frames[t] || window.frames[t].postMessage({
"type": "ylui-event",
event: data.emit.event,
target: sendList,
data: data.emit.data,
session: data.session,
from: id,
sameOrigin: parsedFrom.protocol === parsedTo.protocol && parsedFrom.host === parsedTo.host && parsedFrom.port === parsedTo.port,
}, '*');
});
break;
}
});
//离开前警告
document.body.onbeforeunload = function (event) {
if (!YL.static.beforeOnloadEnable) {
return;
}
var rel = YL.lang("BeforeUnload");
if (!window.event) {
event.returnValue = rel;
} else {
window.event.returnValue = rel;
}
};
//vue实例
YL.vue = new Vue({
el: '#yl',
data: data,
components: {
GridLayout: VueGridLayout.GridLayout,
GridItem: VueGridLayout.GridItem,
},
created: function () {
this.initRuntime(true);
console.log('%c' + YL.static.welcome, "color:red;font-weight:bold;");//welcome
},
methods: {
contextMenuAddTo: function (objCopy) {
var objDeepCopy = Yuri2.jsonDeepCopy(objCopy);
var funcMsg = function () {
YL.util.simpleMsg(YL.lang("Added"));
};
var menuAddToTile = [];
this.tiles.forEach(function (group, n) {
menuAddToTile.push([
YL.util.getStrFa('square') + group.title,
function () {
YL.addTile(objDeepCopy, n);
funcMsg();
}, !YL.static.changeable
])
});
return [
YL.util.getStrFa('copy') + YL.lang("AddTo"),
[
[YL.util.getStrFa('desktop') + YL.lang("DesktopIcons"), function () {
YL.addShortcut(objDeepCopy);
funcMsg()
}, !YL.static.changeable],
[YL.util.getStrFa('list-ul') + YL.lang("MainMenu"), function () {
YL.addMenuItem(objDeepCopy);
funcMsg()
}, !YL.static.changeable],
[YL.util.getStrFa('sliders') + YL.lang("Sidebar"), function () {
YL.addSidebarBtn(objDeepCopy);
funcMsg()
}, !YL.static.changeable],
'|',
"" + YL.util.getStrFa('square') + YL.lang("Tiles") + "",
].concat(menuAddToTile)
];
},
contextMenuUninstall: function (appId) {
var that = this;
return [
YL.util.getStrFa('trash') + YL.lang("Uninstall"),
function (v) {
YL.util.simpleConfirm(Yuri2.template(YL.lang("UninstallConfirm"), that.apps[appId].title), function () {
if (YL.uninstall(appId)) {
YL.util.simpleMsg(YL.lang("UninstallCompleted"));
}
})
}, !YL.static.changeable
]
},
contextMenuOpen: function (obj) {
var that = this;
return [YL.util.getStrFa('play-circle') + YL.lang("Open"), [
[
YL.util.getStrFa('window-restore') + YL.lang("Normal"),
function (v) {
that.appOpen(obj.app, Yuri2.jsonMerge(obj, { openMode: 'normal' }), obj);
}],
[
YL.util.getStrFa('window-maximize') + YL.lang("Maximize"),
function (v) {
that.appOpen(obj.app, Yuri2.jsonMerge(obj, { openMode: 'max' }), obj);
}],
[
YL.util.getStrFa('window-minimize') + YL.lang("Minimize"),
function (v) {
that.appOpen(obj.app, Yuri2.jsonMerge(obj, { openMode: 'min' }), obj);
}],
[
YL.util.getStrFa('paper-plane') + YL.lang("Outer"),
function (v) {
that.appOpen(obj.app, Yuri2.jsonMerge(obj, { openMode: 'outer' }), obj);
}],
]]
},
onResize: function () {
var that = this;
//屏幕尺寸
var clientSize = Yuri2.getClientSize();
that.runtime.clientSize.width = clientSize.width;
that.runtime.clientSize.height = clientSize.height;
that.runtime.desktopSize.width = clientSize.width;
that.runtime.desktopSize.height = clientSize.height - 40;
that.runtime.isSmallScreen = clientSize.width <= 768;
that.runtime.isHorizontalScreen = clientSize.width > clientSize.height;
that.runtime.startMenu.width = clientSize.width > that.startMenu.width && !that.runtime.isSmallScreen
? that.startMenu.width : clientSize.width;
that.runtime.startMenu.height = that.runtime.desktopSize.height > that.startMenu.height && !that.runtime.isSmallScreen
? that.startMenu.height : that.runtime.desktopSize.height;
//计算磁贴尺寸
var widthFixed = that.runtime.startMenu.width - (that.runtime.isSmallScreen ? 80 : 328);
var groupNum = 1;//多少列
if (widthFixed <= 460) {
groupNum = 1;
} else if (widthFixed <= 769) {
groupNum = 2;
} else if (widthFixed <= 1024) {
groupNum = 3;
} else {
groupNum = 4;
}
that.runtime.tilesGroupNum = groupNum;
for (var size = 0; size < 1000; size++) {
var width = (size + 4) * 6;
if (width > (widthFixed - 12 * groupNum) / groupNum) {
size--;
break;
}
}
that.runtime.tileSize = size;
that.runtime.tilesWidth = (size + 4) * 6;
//计算桌面网格尺寸
that.runtime.shortcutWidth = that.runtime.isSmallScreen ? 56 : 68;
that.runtime.shortcutHeight = that.runtime.isSmallScreen ? 70 : 90;
that.runtime.shortcutsGrid.x = parseInt(that.runtime.desktopSize.width / that.runtime.shortcutWidth);
that.runtime.shortcutsGrid.y = parseInt(that.runtime.desktopSize.height / that.runtime.shortcutHeight);
//给窗体发送resize事件
that.emitWinEvent(0, 'resize',{
width:that.runtime.desktopSize.width,
height:that.runtime.desktopSize.height,
});
},
initRuntime: function (first) {
var that = this;
//窗体尺寸变更监听
var fnResize = that.onResize;
fnResize();
if (first)
$(window).resize(fnResize);
//时钟
if (first) {
setInterval(function () {
var myDate = new Date();
var year = myDate.getFullYear();
var month = myDate.getMonth() + 1;
var date = myDate.getDate();
var hours = myDate.getHours();
var mins = myDate.getMinutes();
if (mins < 10) {
mins = '0' + mins
}
that.runtime.time = (hours + ':' + mins);
that.runtime.date = myDate;
}, 1000);
}
//即将渲染
if (first) {
this.$nextTick(function () {
//jq插件 滚动条
var box = [
'#yl .tiles-box',
'#yl .startMenu .menu',
'#yl .center .msgs',
];
for (var i = 0; i < box.length; i++) {
var e = box[i];
$(e).niceScroll({
cursorcolor: "#ffffff30",
cursorwidth: "4px", // 滚动条的宽度,单位:便素
cursorborder: "none", // CSS方式定义滚动条边框
grabcursorenabled: false,
});
}
setInterval(function () {
for (var i = 0; i < box.length; i++) {
var e = box[i];
try {
$(e).getNiceScroll().resize();
} catch (e) {
}
}
}, 500);
$("#yl").css({ 'opacity': 1, display: "block" }); //显示
});
}
//壁纸幻灯片服务
if (first) {
setInterval(function () {
//wallpaperSlided:Date.now(), //记录最近一次切换壁纸的时刻
if (!that.configs.wallpaperSlide) return; //没开启则返回
var itv = that.configs.wallpaperSlideItv * 60 * 1000; //间隔(毫秒)
var last = that.configs.wallpaperSlideTime;//记录最近一次切换壁纸的时刻
var indexLast = that.configs.wallpaperSlideIndex;//记录最近一次切换壁纸的index
var now = Date.now();
if (now > (itv + last)) {
that.configs.wallpaperSlideTime = now; //记录当前时间
var wallpapers = that.configs.wallpapers;
var len = wallpapers.length;
var index = 0;
if (that.configs.wallpaperSlideRandom) {
index = YL.util.randInt(0, len - 1);//随机取下标
} else {
//顺序取下标
index = indexLast + 1;
if (index >= len) {
index = 0;
}
}
if (wallpapers[index]) {
that.configs.wallpaper = wallpapers[index].image;//切换
that.configs.wallpaperSlideIndex = index;
}
}
}, 1000);
}
//记录IE
if (Yuri2.isIE()) {
that.runtime.isIE = true;
if (YL.static.WarningPerformanceInIE) {
setTimeout(function () {
YL.msg(YL.lang("WarningPerformanceInIETitle"), YL.lang("WarningPerformanceInIEContent"))
}, 2000);
}
}
//初始化壁纸
var img = new Image();
var urlBg = this.configs.wallpaper;
img.src = urlBg;
img.onload = function () {
that.runtime.wallpaper = urlBg;
if (that.configs.autoThemeColor) {
that.backgroundToThemeColor()
}
};
//壁纸比例修正
that.backgroundUpdateScale();
//自动保存服务
if (first) {
var lastExport = '';
setInterval(function () {
try {
var exportJson = JSON.stringify(YL.export());
if (exportJson !== lastExport) {
lastExport = exportJson;
localStorage.setItem(YL.static.localStorageName, exportJson);
that.emitWinEvent(0, 'dataChanged');
}
} catch (e) {
YL.debug(e);
}
}, 1000);
}
//F5刷新激活子页
if (first) {
var f5_check = function (e) {
e = e || window.event;
if (e.ctrlKey && ((e.which || e.keyCode) === 116)) {
// 强制刷新,清除缓存
YL.static.beforeOnloadEnable = false;
return;
}
if ((e.which || e.keyCode) === 116) {
if (e.preventDefault) {
e.preventDefault();
} else {
e.keyCode = 0;
e.returnValue = false;
}
if (that.runtime.winActive) {
that.winRefresh(that.runtime.winActive);
}
else {
that.flash();
}
}
};
if (document.addEventListener) {
document.addEventListener("keydown", f5_check, false);
} else {
document.attachEvent("onkeydown", f5_check);
}
}
//刷新子页的childSupport状态
if (first) {
setInterval(function () {
var now = Date.now();
for (var i in that.wins) {
var win = that.wins[i];
win.childSupport = (win.pong && (now - win.pong < 500))
}
}, 300);
}
//自启动
var autoRun = function () {
var arrAutoRun = [];
for (var i in that.apps) {
if (that.apps[i].autoRun > 0) {
arrAutoRun.push(i);
}
}
arrAutoRun.sort(function (a, b) {
return that.apps[b].autoRun - that.apps[a].autoRun;
});
arrAutoRun.forEach(function (t) {
//此处判断手机用户隐藏插件
var winId = that.appOpen(t, {});
if (that.apps[t].plugin && that.runtime.isSmallScreen) {
that.$nextTick(function () {
that.winMinimize(winId);
});
}
});
};
if (first) YL.onReady(autoRun); else {
autoRun()
}
//社区版提示检测
if (first && !YL.static.serialNumber) {
YL.onReady(function () {
setTimeout(function () {
YL.msg("Luckey's Windows", 'Hello,你好,欢迎来到 Windows 小分站!
个人主页:' + ' www.luckyzmj.cn
本网站 UI 由 ' + ' YLUI 强力驱动
欢迎使用支付宝扫描二维码对作者进行捐赠~

');
}, 1500)
});
}
this.ready = true;
},
setWithID: function (obj, val, prefix, ran) {
//设置对象属性,返回合法id
do {
var id = ran === true ? prefix + Yuri2.randInt(100000000, 999999999) : prefix + YL.util.getID();
} while (obj[id] !== undefined);
this.$set(obj, id, val);
return id;
},
emitWinEvent: function (id, event, data) {
//给所有子窗口发消息,id:消息源,event:事件名
var senList = [];
var wins = this.wins;
for (var idWin in wins) {
senList.push(idWin);
}
this.$nextTick(function () {
senList.forEach(function (idWindow) {
!window.frames[idWindow].postMessage || window.frames[idWindow].postMessage({
"type": "ylui-event",
event: event,
target: senList,
data: data,
session: null,
from: id,
sameOrigin: false,
}, '*');
});
});
},
flash: function () {
var that = this;
//图标闪烁。假的,是头发的特技
that.runtime.shortcutsShow = false;
setTimeout(function () {
that.runtime.shortcutsShow = true;
}, 200);
//刷新customTileRandomToken
that.runtime.customTileRandomToken = YL.util.randInt(1000, 9999);
},
appOpen: function (id, options, source) {
//id也可以是json(动态app)
var that = this;
if (!options) {
options = {};
} //容错
//打开app
var app = (typeof id === 'string') ? this.apps[id] : id;
var appMerge = Yuri2.jsonMerge(app, options);
this.hideOpens();
//单例检测
if (appMerge.single) {
for (var i in this.wins) {
var w = this.wins[i];
if (w.single && w.app === id) {
that.winSetActive(i);
that.winShow(i);
return;
}
}
}
if (!appMerge.url) {
return;
}//空url返回
if (this.runtime.winOpened >= this.configs.openMax) {
YL.util.simpleMsg(Yuri2.template(YL.lang("MaxWinsReached"), this.configs.openMax));
return;
}
//隐藏菜单和操作中心
// appMerge.plugin || this.runtime.winOpened++;//计数
this.runtime.winOpenCounter++;//计数
var dx = parseInt(this.runtime.winOpenCounter % 10) * this.runtime.clientSize.height * 0.01;//坐标偏移量
//该函数支持字符串转数字,其中x和y将被替换为屏幕的宽和高
var evalNum = function (str) {
var rel = 0;
if (isNaN(str)) {
try {
if (!/^[\dxy+\-*\/()\s.]*$/.test(str)) {
//防xss的过滤
str = '600'
}
var query = 'var x=YL.vue.runtime.clientSize.width;var y=YL.vue.runtime.clientSize.height-40;' + str;
rel = eval(query);
} catch (e) {
YL.debug(e)
}
} else {
rel = str;
}
return parseInt(rel);
};
var win = {
app: id,
state: 'normal',
min: false,
addressBar: true,
style: {
//样式继承自app
position: {
x: evalNum(app.position.x) + (app.position.autoOffset ? dx : 0),
y: evalNum(app.position.y) + (app.position.autoOffset ? dx + 80 : 0),
left: app.position.left,
top: app.position.top,
},
size: {
width: evalNum(app.size.width),
height: evalNum(app.size.height),
},
},
drag: {
mDownPosition: false,
mDownSize: false,
x: 0,
y: 0,
},
oldStyle: { //用于记录最大化还原
position: {
left: 0,
top: 0,
},
size: {
width: 0,
height: 0,
},
},
source: source,
resizable: true,
history: {
pos: -1,
urls: [],
}, //url历史
data: {},//data域,使用YLApp时传递给子页面
pong: null, //最后pong的时间
childSupport: false,//子页支持可用
init: true,//init状态,用于显示封面
};
win = Yuri2.jsonMerge(win, appMerge);
win.style = Yuri2.jsonDeepCopy(win.style);//深拷贝对象
win.style.index = YL.util.getBiggerWinZIndex();
win.url = YL.util.urlParams(win.url, win.params, win.hash);
if (win.urlRandomToken) win.url = YL.util.updateUrlRandomToken(win.url);
if (win.openMode === 'outer') {
//外部打开
window.open(win.url);
return;
}
win.urlOrigin = win.url; //保存原始地址
win.urlBar = win.url; //地址栏地址
var winID = this.setWithID(this.wins, win, 'win-', true);
var secrete = Math.random();
win.idIframe = winID + "iframe-";
win.secrete = secrete; //身份密钥
this.emitWinEvent(winID, 'open', null);
switch (win.openMode) {
case 'max':
this.winMaximize(winID);
break;
case 'min':
this.winMinimize(winID);
break;
}
//记录激活的id
if (!win.min) this.runtime.winActive = winID;
that.$nextTick(function () {
//发送post消息,通知被分配的窗口id
var itvPing = setInterval(function () {
if ($("#" + winID).length <= 0) {
clearInterval(itvPing);
return;
}
!window.frames[winID].postMessage || window.frames[winID].postMessage({
"type": "ylui-ping",
id: winID,
secrete: secrete,
itv: itvPing,
data: win.data,
}, '*');
}, 500);
//监听iframe点击事件
var ifr = $("#" + win.idIframe)[0];
YL.util.iframeOnClick.track(ifr, function () {
if (Object.getOwnPropertyNames(YL.util._iframe_click_lock_children).length === 0) {
that.winSetActive(winID);//激活窗口
ContextMenu._removeContextMenu();//关闭右键菜单
}
}, winID);
//激活刚打开的iframe
if (!win.min) {
ifr.focus();
}
// 加载完毕关闭封面
var created = new Date().getTime();
var closeInit = function () {
var now = new Date().getTime();
var delay = now - created > 1000 ? 0 : 1000;
setTimeout(function () {
win.init = false;
}, delay);
};
if (ifr.attachEvent) {
// IE
ifr.attachEvent("onload", closeInit);
} else {
// NOT IE
ifr.onload = closeInit;
}
});
//如果是手机屏幕,最大化
if (that.runtime.isSmallScreen && !win.plugin && win.resizable) {
that.winMaximize(winID);
}
// 超时关闭封面
setTimeout(function () {
win.init = false;
}, 10000);
return winID;
},
tileStyle: function (tile) {
var that = this;
var sizePerBlock = that.runtime.tileSize;
var sizeRel = function (size) {
return size * (sizePerBlock + 4) - 4;
};
var w = tile.w;
var h = tile.h;
var min = Math.min(w, h) / 1.5;
var size = sizeRel(min);
return {
width: size + 'px',
height: size + 'px',
top: (sizeRel(h) - size) / 2 + 'px',
left: (sizeRel(w) - size) / 2 + 'px',
'line-height': size + 'px',
'font-size': size / 2 + 'px',
// 'background-color':that.apps[tile.app].icon.bg,
}
},
winIsMin: function (id) {
var win = this.wins[id];
return win.min;
},
winShow: function (id) {
var win = this.wins[id];
win.min = false;
},
winShowToggle: function (id) {
var win = this.wins[id];
win.min = !win.min;
},
winClose: function (id) {
var win = this.wins[id];
if (!win) {
return
}
this.$delete(this.wins, id);
this.emitWinEvent(id, 'close', null);
this.findNewActive();
},
winMaximize: function (id) {
//最大化
var win = this.wins[id];
if (!win.resizable) {
YL.util.simpleMsg(YL.lang('AttentionNoResize'));
return;
}
win.state = 'max';
win.oldStyle.position.y = win.style.position.y;
win.style.position.y = win.addressBar ? 80 : 40;
win.oldStyle.position.x = win.style.position.x;
win.style.position.x = 0;
win.oldStyle.size.width = win.style.size.width;
win.style.size.width = this.runtime.desktopSize.width;
win.oldStyle.size.height = win.style.size.height;
win.style.size.height = this.runtime.desktopSize.height - (win.addressBar ? 80 : 40);
},
winRestore: function (id) {
var win = this.wins[id];
win.state = 'normal';
win.style.position.y = win.oldStyle.position.y;
win.style.position.x = win.oldStyle.position.x;
win.style.size.width = win.oldStyle.size.width;
win.style.size.height = win.oldStyle.size.height;
},
winMinimize: function (id) {
var win = this.wins[id];
win.min = true;
this.findNewActive();
},
winSetCenter: function (id) {
var that = this;
var win = that.wins[id];
that.winShow(id);
if (!win.resizable) {
YL.util.simpleMsg(YL.lang('AttentionNoResize'));
return;
}
win.state = "normal";
var w = that.runtime.desktopSize.width;
var h = that.runtime.desktopSize.height;
win.style.size.width = w * 0.8;
win.style.size.height = h * 0.8 - 80;
win.style.position.y = h * 0.1 + 80;
win.style.position.x = w * 0.1;
},
winTitleMouseDown: function (id, e) {
//忽略右键
if (e.which === 3) return;
var isMouse = !e.changedTouches;//是否是鼠标事件,false为触屏;
// var downTime=Date.now();
var fnGetPagePointFromEvent = function (event) {
var p = {
x: 0,
y: 0,
};
if (!e.changedTouches) {
//是鼠标
p.x = event.pageX;
p.y = event.pageY;
} else {
//是触屏
var touches = event.changedTouches ? event.changedTouches : event.originalEvent.changedTouches;
p.x = touches[0].pageX;
p.y = touches[0].pageY;
}
return p;
}; //该函数从触屏或鼠标点击获取pageX,pageY
var point = fnGetPagePointFromEvent(e);
//拖动逻辑
var that = this;
var win = this.wins[id];
win.drag.x = point.x;
win.drag.y = point.y;
win.drag.mDownPosition = true;
var fnMouseUp = function (e) {
if (!win.drag.mDownPosition) return;
win.drag.mDownPosition = false;
that.runtime.drag = false;
//事件解绑
if (isMouse) {
$(document).unbind('mousemove', fnMouseMove);
$(document).unbind('mouseup', fnMouseUp);
} else {
$(document).unbind('touchmove', fnMouseMove);
$(document).unbind('touchend', fnMouseUp);
}
};
var fnMouseMove = function (e) {
if (!win.drag.mDownPosition) return;
that.runtime.drag = true;
var p = fnGetPagePointFromEvent(e);
var x = p.x;
var y = p.y;
if (win.state === 'max' && (y - win.drag.y > 2)) that.winRestore(id);//在全屏状态拖动,自动还原
win.style.position.x += win.style.position.left ? (x - win.drag.x) : (win.drag.x - x);
win.style.position.y += win.style.position.top ? (y - win.drag.y) : (win.drag.y - y);
win.drag.x = x;
win.drag.y = y;
};
if (isMouse) {
$(document).mouseup(fnMouseUp);
$(document).mousemove(fnMouseMove);
} else {
$(document).on('touchend', fnMouseUp);
$(document).on('touchmove', fnMouseMove);
}
},
winTitleDblclick: function (id) {
//双击最大化
var w = this.wins[id];
if (w.plugin) {
return;
}
if (w.state === 'max') {
this.winRestore(id);
} else {
this.winMaximize(id);
}
},
winResizeMouseDown: function (id, e) {
//拖动逻辑
var that = this;
var win = this.wins[id];
win.drag.x = e.pageX;
win.drag.y = e.pageY;
win.drag.mDownSize = true;
var fnMouseUp = function (e) {
if (!win.drag.mDownSize) return;
win.drag.mDownSize = false;
that.runtime.drag = false;
$(document).unbind('mouseup', fnMouseUp);
$(document).unbind('mousemove', fnMouseMove);
};
var fnMouseMove = function (e) {
if (!win.drag.mDownSize) return;
var minWidth = 200;
var minHeight = 84;
that.runtime.drag = true;
var x = e.pageX;
var y = e.pageY;
win.style.size.width += (x - win.drag.x);
(win.style.size.width) > minWidth || (win.style.size.width = minWidth);
win.style.size.height += (y - win.drag.y);
(win.style.size.height) > minHeight || (win.style.size.height = minHeight);
win.drag.x = x;
win.drag.y = y;
};
$(document).mouseup(fnMouseUp);
$(document).mousemove(fnMouseMove);
},
winSetActive: function (id) {
var now = Date.now();
if (now - this.runtime.winActiveTime < 200) {
return;
}
this.runtime.winActiveTime = now;
var win = this.wins[id];
win.style.index = YL.util.getBiggerWinZIndex();
this.runtime.winActive = id;
this.startMenu.open = false;
this.drawer = null;
this.center.open = false;
},
winStyle: function (id) {
var win = this.wins[id];
return {
width: win.style.size.width + 'px',
height: win.style.size.height + 'px',
top: win.style.position.top ? win.style.position.y + 'px' : 'auto',
left: win.style.position.left ? win.style.position.x + 'px' : 'auto',
bottom: !win.style.position.top ? win.style.position.y + 'px' : 'auto',
right: !win.style.position.left ? win.style.position.x + 'px' : 'auto',
'z-index': win.style.index + (win.background ? -500 : 0),
}
},
winInitIconStyle: function (id) {
var win = this.wins[id];
var size = Math.min(win.style.size.width, win.style.size.height) / 4;
return {
'font-size': size + 'px',
'line-height': size + 'px',
'width': size * 1.5 + 'px',
};
},
winClass: function (id) {
var w = this.wins[id];
return {
active: id === this.runtime.winActive && !this.winIsMin(id),
plugin: w.plugin,
"addressBar-hidden": !w.addressBar,
}
},
winTaskClick: function (id) {
var win = this.wins[id];
if (this.winIsMin(id) || this.startMenu.open || this.drawer) {
this.winShow(id);
this.winSetActive(id);
} else {
if (this.runtime.winActive === id) {
this.winMinimize(id);
this.findNewActive();
} else {
this.winSetActive(id);
}
}
},
winRefresh: function (id) {
var win = this.wins[id];
var target = win.urlBar;
this.winJump(id, win.urlRandomToken ? YL.util.updateUrlRandomToken(target) : target);
},
winHome: function (id) {
var win = this.wins[id];
var target = win.urlOrigin;
this.winJump(id, win.urlRandomToken ? YL.util.updateUrlRandomToken(target) : target);
},
winJump: function (id, url) {
var win = this.wins[id];
win.url = win.urlBar = 'about:blank';
setTimeout(function () {
win.url = win.urlBar = url;
}, 200);
},
winContextMenu: function (id, e) {
var that = this;
var win = this.wins[id];
var menu = [
[YL.util.getStrFa("refresh") + YL.lang("Refresh"), function () {
that.winRefresh(id);
}],
];
if (!win.addressBar) {
menu.push([YL.util.getStrFa("location-arrow") + YL.lang("DisplayAddressBar"), function () {
win.addressBar = true;
}]);
} else {
menu.push([YL.util.getStrFa("location-arrow") + YL.lang("HideAddressBar"), function () {
win.addressBar = false;
}]);
}
menu.push([YL.util.getStrFa("magic") + YL.lang("CollectAsApplication"), function () {
layer.prompt({
title: YL.lang("AttentionEnterAppName"),
formType: 0,
value: Yuri2.parseURL(win.url).host,
maxlength: 32,
skin: 'yl',
zIndex: 19930012,
}, function (input, index) {
layer.close(index);
var app = YL.util.getAppDataTemplate();
app.url = YL.util.removeUrlRandomToken(win.url);
app.title = input;
app.icon.type = 'str';
app.icon.content = input;
var appId = 'app-' + YL.util.getID();
YL.addApp(appId, app);
YL.addShortcut(appId);//自动添加到桌面
YL.addMenuItem(appId);//自动添加到菜单
YL.util.simpleMsg(YL.lang("Added"));
});
}, !YL.static.changeable]);
menu.push('|');
var menuWin = [];
menuWin.push(YL.util.getStrFa("arrows") + Yuri2.template('${0}px * ${1}px', parseInt(win.style.size.width), parseInt(win.style.size.height)));
menuWin.push([YL.util.getStrFa("window-restore") + YL.lang("CentreAdjustment"), function () {
that.winSetCenter(id);
that.winSetActive(id);
}]);
if (that.winIsMin(id)) {
menuWin.push([YL.util.getStrFa("clone") + YL.lang("DisplayWindow"), function () {
that.winShow(id);
}]);
} else {
menuWin.push([YL.util.getStrFa("window-minimize") + YL.lang("Minimize"), function () {
that.winMinimize(id);
}]);
}
if (!win.plugin && win.state === 'normal' && win.resizable) {
menuWin.push([
YL.util.getStrFa("window-maximize") + YL.lang("Maximize"), function () {
that.winShow(id);
that.winMaximize(id);
}
])
}
if (!win.plugin && win.state === 'max') {
menuWin.push([
YL.util.getStrFa("window-restore") + YL.lang("Restore"), function () {
that.winRestore(id)
}
])
}
menuWin.push('|');
if (win.style.position.left) {
menuWin.push([YL.util.getStrFa("angle-double-right") + YL.lang("AlignRight") + Yuri2.template(' (${0}px)', parseInt(win.style.position.x)), function () {
win.style.position.left = !win.style.position.left;
}]);
} else {
menuWin.push([YL.util.getStrFa("angle-double-left") + YL.lang("AlignLeft") + Yuri2.template(' (${0}px)', parseInt(win.style.position.x)), function () {
win.style.position.left = !win.style.position.left;
}]);
}
if (win.style.position.top) {
menuWin.push([YL.util.getStrFa("angle-double-down") + YL.lang("AlignBottom") + Yuri2.template(' (${0}px)', parseInt(win.style.position.y)), function () {
win.style.position.top = !win.style.position.top;
}]);
} else {
menuWin.push([YL.util.getStrFa("angle-double-up") + YL.lang("AlignTop") + Yuri2.template(' (${0}px)', parseInt(win.style.position.y)), function () {
win.style.position.top = !win.style.position.top;
}]);
}
menu.push([YL.util.getStrFa("windows") + YL.lang("WindowPosition"), menuWin]);
menu.push([YL.util.getStrFa("paper-plane") + YL.lang("OpenOuter"), function () {
window.open(win.url);
}]);
//记住位置大小
if (win.source) {
menu.push([YL.util.getStrFa("crop") + YL.lang('RememberSizeAndPosition'), function () {
win.source.style = {};
win.source.style.position = {};
win.source.style.size = {};
win.source.style.position.x = win.style.position.x;
win.source.style.position.y = win.style.position.y;
win.source.style.position.left = win.style.position.left;
win.source.style.position.top = win.style.position.top;
win.source.style.position.autoOffset = false;
win.source.style.size.height = win.style.size.height;
win.source.style.size.width = win.style.size.width;
YL.util.simpleMsg(YL.lang("Recorded"));
}, !YL.static.changeable]);
if (win.source.style) {
menu.push([YL.util.getStrFa("crop") + YL.lang("ResetSizeAndPosition"), function () {
delete win.source.style;
}, !YL.static.changeable]);
}
}
if (win.plugin) {
//可以置底作为背景
menu.push('|');
if (win.background) {
menu.push([YL.util.getStrFa("sort-up") + YL.lang("PutForeground"), function () {
win.background = false;
}]);
} else {
menu.push([YL.util.getStrFa("sort-down") + YL.lang("PutBackground"), function () {
win.background = true;
}]);
}
}
menu.push('|');
menu.push([
YL.util.getStrFa("close") + YL.lang("Close"), function () {
that.winClose(id)
}
]);
ContextMenu.render(e, menu, this, "light");
},
findNewActive: function () {
var id = null;
var maxIndex = 0;
for (var i in this.wins) {
var win = this.wins[i];
if (!win.min && win.style.index > maxIndex) {
maxIndex = win.style.index;
id = i;
}
}
this.runtime.winActive = id;
},
winHideAll: function () {
for (var i in this.wins) {
var win = this.wins[i];
if (win.plugin) {
continue;
}
win.min = true;
}
},
winShowAll: function () {
for (var i in this.wins) {
var win = this.wins[i];
if (win.plugin) {
continue;
}
win.min = false;
}
},
winCloseAll: function () {
for (var i in this.wins) {
var win = this.wins[i];
if (win.plugin) {
continue;
}
this.$delete(this.wins, i);
}
// this.runtime.winOpened=0; //计数
},
menuItemClose: function (father) {
var menu = father ? father : this.startMenu.menu;
for (var i in menu) {
var item = menu[i];
if (item.children) {
item.open = false;
this.menuItemClose(item);
}
}
},
menuClose: function () {
this.startMenu.open = false;
this.menuItemClose();
},
showDesktop: function () {
this.winHideAll();
this.hideOpens();
},
badgeText: function (content) {
//处理badge的提示内容
if (isNaN(content)) {
return content;
} else {
return content > 99 ? '99+' : parseInt(content);
}
},
drawerStyle: function () {
var top = 0, left = 0;
return {
'top': top + 'px',
'left': left + 'px',
}
},
hideOpens: function () {
//批量关闭一些菜单,div
this.drawer = null;
this.menuClose();
this.center.open = false;
this.runtime.pluginIconsOpen = false;
this.runtime.CalendarOpen = false;
},
desktopMouseDown: function (e) {
this.hideOpens();
!e||this.emitWinEvent(0, 'desktopMouseDown',{
x:e.x,
y:e.y,
});
},
desktopMouseUp: function (e) {
this.hideOpens();
!e||this.emitWinEvent(0, 'desktopMouseUp',{
x:e.x,
y:e.y,
});
},
desktopClick: function (e) {
this.hideOpens();
!e||this.emitWinEvent(0, 'desktopClick',{
x:e.x,
y:e.y,
});
},
desktopContextMenu: function (e) {
var that = this;
that.hideOpens();
var menu = [
[YL.util.getStrFa("refresh") + YL.lang("Refresh"), function () {
that.flash()
}],
'|',
[YL.util.getStrFa('desktop') + YL.lang("DisplayDesktop"), function () {
that.showDesktop()
}],
[YL.util.getStrFa('credit-card') + YL.lang("Personalization"),
[
[YL.util.getStrFa('paint-brush') + YL.lang("ThemeColor"), function () {
YL.open('yl-system', { data: { nav: 'colors' } })
}, !YL.static.changeable],
[YL.util.getStrFa('picture-o') + YL.lang("Wallpaper"), function () {
YL.open('yl-system', { data: { nav: 'wallpaper' } })
}, !YL.static.changeable],
]
],
[YL.util.getStrFa('cog') + YL.lang("SystemOptions"), function () {
YL.open('yl-system')
}, !YL.static.changeable],
'|',
[YL.util.getStrFa('object-group') + YL.lang("FullScreen"), function () {
YL.util.enableFullScreen();
}],
[YL.util.getStrFa('object-ungroup') + YL.lang("NormalScreen"), function () {
YL.util.disableFullScreen();
}],
[YL.util.getStrFa('circle-o-notch') + YL.lang("Reload"), function () {
YL.f5();
}],
'|',
[YL.util.getStrFa('info-circle') + YL.lang("AboutUs"), function () {
YL.aboutUs()
}],
];
ContextMenu.render(e, menu, this, "light");
},
desktopMouseMove: function (e) {
this.emitWinEvent(0, 'desktopMouseMove',{
x:e.x,
y:e.y,
});
},
shortcutOpen: function (s, id) {
var now = Date.now();
if (!s || s.drag.moved > 20 || now - this.runtime.shortcutOpenedAt < 500) {
//忽略拖动产生的click和touch+click导致的短时间多次打开
return;
}
if (s.children) {
//打开抽屉
this.drawer = id;
} else {
//普通图标
this.appOpen(s.app, s, s);
}
this.runtime.shortcutOpenedAt = Date.now();
YL.debug(YL.lang("OpenIcons") + ':' + s.title)
},
shortcutGrid: function (id) {
var x = parseInt(id / this.runtime.shortcutsGrid.y);
var y = parseInt(id % this.runtime.shortcutsGrid.y);
return { x: x, y: y }
},
shortcutPosition: function (id, pid) {
var g = this.shortcutGrid(id);
var s = pid === null ? this.shortcuts[id] : this.shortcuts[pid].children[id];
return {
x: g.x * this.runtime.shortcutWidth + s.drag.left,
y: g.y * this.runtime.shortcutHeight + s.drag.top
}
},
shortcutStyle: function (id, pid) {
var p = this.shortcutPosition(id, pid);
return {
left: p.x + 'px',
top: p.y + 'px',
}
},
shortcutClass: function (id, s, fromDrawer) {
return {
move: s.drag.mDown,
insert: this.runtime.shortcutInsert === id && !fromDrawer,
over: this.runtime.shortcutOver === id && !fromDrawer,
cut: this.shortcutCutOutFromDrawer(s),
};
},
shortcutMouseDown: function (id, pid, e) {
if (e.which && e.which !== 1) return; //只响应左键
var isMouse = !e.changedTouches;//是否是鼠标事件,false为触屏;
var downTime = Date.now();
var fnGetPagePointFromEvent = function (event) {
var p = {
x: 0,
y: 0,
};
if (!e.changedTouches) {
//是鼠标
p.x = event.pageX;
p.y = event.pageY;
} else {
//是触屏
var touches = event.changedTouches ? event.changedTouches : event.originalEvent.changedTouches;
p.x = touches[0].pageX;
p.y = touches[0].pageY;
}
return p;
}; //该函数从触屏或鼠标点击获取pageX,pageY
var point = fnGetPagePointFromEvent(e);
var that = this;
var isFromDrawer = pid !== null;
var s = !isFromDrawer ? that.shortcuts[id] : that.shortcuts[pid].children[id];
s.drag.mDown = true;
s.drag.x = point.x;
s.drag.y = point.y;
s.drag.moved = 0;
var fnDragOn = function (index) {
var p = that.shortcutPosition(index, null);//得到图标目前的位置p
var tid, tby, ton = false, tinsert = false, tover = false;
that.shortcuts.forEach(function (t, i) {
if (i === index) return;//忽略遍历自身
var pt = that.shortcutPosition(i, null);
var bx = pt.x - p.x;
var by = pt.y - p.y;
if (Math.abs(bx) < that.runtime.shortcutWidth / 4
&& Math.abs(by) < that.runtime.shortcutHeight / 2
) {
tid = i;
tby = by;
ton = true;
tinsert = by < -that.runtime.shortcutHeight * 0.3;
tover = Math.abs(by) < that.runtime.shortcutHeight * 0.3;
}
});
return {
on: ton,
id: tid,
by: tby,
insert: tinsert,
over: tover,
};
};
var fnMouseUp = function (e) {
if (!s.drag.mDown) return;
s.drag.mDown = false;
if (!isFromDrawer) {
//处理拖动位置网格吸附
var dragTo = fnDragOn(id);
if (dragTo.insert) {
//拖动插入
if (dragTo.id > id) {
for (var i = dragTo.id - id; i > 0; i--) {
Yuri2.arrDownRecord(that.shortcuts, dragTo.id - i)
}
} else {
for (var i = id - dragTo.id; i > 1; i--) {
Yuri2.arrUpRecord(that.shortcuts, dragTo.id + i)
}
}
}
if (dragTo.over) {
//拖动覆盖
var sOn = that.shortcuts[dragTo.id];
if (!s.children && !sOn.children) {
//1.图标vs图标 合并并生成组
that.$set(that.shortcuts, dragTo.id, {
title: YL.lang("IconGroup") + YL.util.getID(),
drag: {
mDown: false,
left: 0,
top: 0,
x: 0,
y: 0,
},
children: [
sOn, s
],
});
that.shortcuts.splice(id, 1)
} else if (!s.children && sOn.children) {
//2.图标vs组 进组
sOn.children.push(s);
that.shortcuts.splice(id, 1)
} else if (s.children && !sOn.children) {
//2.组vs图标 进组
s.children.push(sOn);
that.shortcuts[dragTo.id] = s;
that.shortcuts.splice(id, 1)
} else if (s.children && sOn.children) {
//4.组vs组 合并组
s.children.forEach(function (t) {
sOn.children.push(t);
});
that.shortcuts.splice(id, 1)
}
}
} else {
//抽屉内拖动(移动一定的距离就算是拖出去)
if (that.shortcutCutOutFromDrawer(s)) {
that.shortcuts.push(s);
that.shortcuts[pid].children.splice(id, 1);
}
}
if (s.drag.moved < 20 && Date.now() - downTime < 300) {
that.shortcutOpen(s, id); //TODO 此处是否需要加延时操作
}
s.drag.moved = 0;
s.drag.left = s.drag.top = 0;
that.runtime.shortcutInsert = that.runtime.shortcutOver = null;
//事件解绑
if (isMouse) {
$(document).unbind('mousemove', fnMouseMove);
$(document).unbind('mouseup', fnMouseUp);
} else {
$(document).unbind('touchmove', fnMouseMove);
$(document).unbind('touchend', fnMouseUp);
}
};
var fnMouseMove = function (e) {
if (!s.drag.mDown) return;
var p = fnGetPagePointFromEvent(e);
var x = p.x;
var y = p.y;
var dx = x - s.drag.x;
var dy = y - s.drag.y;
s.drag.left += dx;
s.drag.top += dy;
s.drag.x = x;
s.drag.y = y;
s.drag.moved += (Math.abs(dx) + Math.abs(dy));
var dragTo = fnDragOn(id);
if (dragTo.insert)//拖动插入的视觉提示
that.runtime.shortcutInsert = dragTo.id;
else
that.runtime.shortcutInsert = null;
if (dragTo.over) //拖动覆盖的视觉提示
that.runtime.shortcutOver = dragTo.id;
else
that.runtime.shortcutOver = null;
};
if (isMouse) {
$(document).mouseup(fnMouseUp);
$(document).mousemove(fnMouseMove);
} else {
$(document).on('touchend', fnMouseUp);
$(document).on('touchmove', fnMouseMove);
}
},
shortcutCutOutFromDrawer: function (s) {
return Math.abs(s.drag.left) + Math.abs(s.drag.top) > 1.5 * this.runtime.shortcutWidth;
},
shortcutContextMenu: function (id, pid, e, isDrawer) {
var that = this;
var s = pid === null ? that.shortcuts[id] : that.shortcuts[pid].children[id];
var menu = [];
if (s.children) {
menu.push([
YL.util.getStrFa('play-circle') + YL.lang("Open"),
function (v) {
that.shortcutOpen(s, id);
}]);
} else {
menu.push(that.contextMenuOpen(s));
}
menu.push('|');
if (s.children) {
menu.push([
YL.util.getStrFa('tags') + YL.lang("Rename"),
function () {
that.shortSetting = s;
}, !YL.static.changeable
]);
menu.push([
YL.util.getStrFa('sitemap') + YL.lang("UnGroup"),
function (v) {
s.children.forEach(function (t) {
that.shortcuts.splice(id + 1, 0, t);
});
that.shortcuts.splice(id, 1);
}
, !YL.static.changeable]);
} else {
var objCopy = Yuri2.jsonDeepCopy({
title: s.title,
hash: s.hash,
params: s.params,
app: s.app,
style: s.style,
});
menu.push(that.contextMenuAddTo(objCopy));
menu.push([
YL.util.getStrFa('tags') + YL.lang("Rename") + "/" + YL.lang("Options"),
function (v) {
that.shortSetting = s;
}
, !YL.static.changeable]);
}
if (s.app && that.apps[s.app].badge) {
menu.push([YL.util.getStrFa('map-pin') + YL.lang("ClearSuperscript"), function () {
that.apps[s.app].badge = 0
}, !YL.static.changeable])
}
menu.push('|');
menu.push([
YL.util.getStrFa('remove') + YL.lang("Delete"),
function (v) {
YL.util.simpleConfirm(Yuri2.template(YL.lang("DeleteIconConfirm"), s.title), function () {
if (isDrawer) {
that.shortcuts[pid].children.splice(id, 1);
} else {
that.shortcuts.splice(id, 1);
}
})
}
, !YL.static.changeable]);
if (s.app) {
menu.push(that.contextMenuUninstall(s.app));
}
ContextMenu.render(e, menu, this, "light");
},
shortcutGetDrawerBadge: function (id) {
var g = this.shortcuts[id];
var d = g.children;
var count = 0;
for (var i in d) {
var s = d[i];
var badge = parseInt(this.apps[s.app].badge);
if (isNaN(badge)) {
badge = 1;
}
count += badge;
}
return count;
},
menuItemClick: function (item) {
this.appOpen(item.app, item, item)
},
msgClose: function (id) {
var that = this;
this.center.msg[id].hide = true;
that.$delete(that.center.msg, id);
that.center.msgNum--;
},
btnCenterClick: function () {
if (this.center.open) {
this.hideOpens();
} else {
this.hideOpens();
this.center.open = true;
this.center.unread = 0;
}
},
btnCenterClear: function () {
var that = this;
for (var i in that.center.msg) {
var m = that.center.msg[i];
m.hide = true;
}
that.$set(that.center, 'msg', {});
setTimeout(function () {
that.center.unread = 0;
that.center.msgNum = 0;
}, 500);
setTimeout(function () {
that.center.open = false;
}, 1500);
},
barContextMenu: function (e) {
var that = this;
var menu = [
[YL.util.getStrFa('window-minimize') + YL.lang("HideAll"), function () {
that.winHideAll()
}],
[YL.util.getStrFa('clone') + YL.lang("DisplayAll"), function () {
that.winShowAll()
}],
[YL.util.getStrFa('window-close') + YL.lang("CloseAll"), function () {
that.winCloseAll()
}],
"|"
];
if (that.configs.topTaskBar) {
menu.push([
YL.util.getStrFa('arrow-down') + YL.lang("BottomTaskBar"),
function () {
that.configs.topTaskBar = false;
}
], !YL.static.changeable)
} else {
menu.push([
YL.util.getStrFa('arrow-up') + YL.lang("TopTaskBar"),
function () {
that.configs.topTaskBar = true;
}
])
}
ContextMenu.render(e, menu, this);
},
tileContextMenu: function (groupIndex, tileIndex, e) {
var that = this;
var tile = that.tiles[groupIndex].data[tileIndex];
var objCopy = Yuri2.jsonDeepCopy({
title: tile.title,
hash: tile.hash,
params: tile.params,
app: tile.app,
style: tile.style,
});
var menu = [
that.contextMenuOpen(tile),
that.contextMenuAddTo(objCopy),
[
YL.util.getStrFa('tags') + YL.lang("Rename") + "/" + YL.lang("Options"),
function (v) {
that.shortSetting = tile;
}, !YL.static.changeable
],
"|",
[YL.util.getStrFa('braille') + YL.lang("Small") + YL.lang("Size"), function () {
tile.w = 1;
tile.h = 1;
}, !YL.static.changeable],
[YL.util.getStrFa('braille') + YL.lang("Middle") + YL.lang("Size"), function () {
tile.w = 2;
tile.h = 2;
}, !YL.static.changeable],
[YL.util.getStrFa('braille') + YL.lang("Big") + YL.lang("Size"), function () {
tile.w = 4;
tile.h = 4;
}, !YL.static.changeable],
];
//处理磁贴转移到其他组的逻辑
if (that.tiles.length > 1) {
var moveMenu = [];
that.tiles.forEach(function (t, n) {
if (n === groupIndex) return;
moveMenu.push([that.tiles[n].title, function () {
that.tiles[groupIndex].data.splice(tileIndex, 1);
var movedTile = Yuri2.jsonDeepCopy(tile);
movedTile.y = 999;
movedTile.x = 0;
that.tiles[n].data.push(movedTile);
}, !YL.static.changeable])
});
menu.push([YL.util.getStrFa('cut') + YL.lang("MoveTo"), moveMenu])
}
menu.push("|");
menu.push([YL.util.getStrFa('remove') + YL.lang("Delete"), function () {
YL.util.simpleConfirm(Yuri2.template(YL.lang("DeleteTileConfirm"), tile.title), function () {
that.tiles[groupIndex].data.splice(tileIndex, 1);
});
}, !YL.static.changeable]);
menu.push(that.contextMenuUninstall(tile.app));
ContextMenu.render(e, menu, this);
},
tileSrcCustom: function (app) {
return app.urlRandomToken ? YL.util.updateUrlRandomToken(app.customTile, '', this.runtime.customTileRandomToken) : app.customTile;
},
menuContextMenu: function (data) {
var that = this;
var item = data.item;
var objCopy = Yuri2.jsonDeepCopy({
title: item.title,
hash: item.hash,
params: item.params,
app: item.app,
style: item.style,
});
var itemId = data.id;
var menu = [];
if (item.app && !item.children) {
menu = [
that.contextMenuOpen(item),
that.contextMenuAddTo(objCopy),
[
YL.util.getStrFa('tags') + YL.lang("Rename") + "/" + YL.lang("Options"),
function (v) {
that.shortSetting = item;
}
, !YL.static.changeable],
];
} else {
menu.push([
YL.util.getStrFa('object-group') + YL.lang("NewSubgroup"),
function () {
var itemNew = {
title: YL.lang("Group"),
children: {},
open: true,
};
that.setWithID(item.children, itemNew, 'itemPushed-');
}
, !YL.static.changeable]);
menu.push([
YL.util.getStrFa('tags') + YL.lang("Rename"),
function () {
that.shortSetting = item;
}
, !YL.static.changeable]);
}
menu.push('|');
menu.push([
YL.util.getStrFa('cut') + YL.lang("CutAndExchange"),
function () {
that.runtime.menuItemCut = itemId;
YL.util.simpleMsg(item.title + " " + YL.lang("Recorded"));
}
, !YL.static.changeable]);
if (that.runtime.menuItemCut) {
menu.push([
YL.util.getStrFa('paste') + YL.lang("Paste"),
function () {
var cut = that.runtime.menuItemCut;
that.menuItemAction(cut, function (child, father) {
if (father.children)
that.$delete(father.children, cut);
else
that.$delete(father, cut);
that.$set(item.children, cut, child)
});
that.runtime.menuItemCut = null;
}
, !YL.static.changeable]);
menu.push([
YL.util.getStrFa('exchange') + YL.lang("Exchange"), function () {
var idA = itemId, childA, fatherA;
var idB = that.runtime.menuItemCut, childB, fatherB;
that.menuItemAction(idA, function (child, father) {
childA = child;
fatherA = father;
});
that.menuItemAction(idB, function (child, father) {
childB = child;
fatherB = father;
});
that.runtime.menuItemCut = null;
try {
fatherA[idA] = childB;
fatherB[idB] = childA;
} catch (e) {
}
}
, !YL.static.changeable]);
}
menu.push("|");
menu.push([
YL.util.getStrFa('remove') + YL.lang("Delete"),
function () {
//递归删除依赖菜单
YL.util.simpleConfirm(Yuri2.template(YL.lang("DeleteMenuConfirm"), item.title), function () {
that.menuItemAction(itemId, function (child, father) {
if (father.children)
that.$delete(father.children, itemId);
else
that.$delete(father, itemId);
});
});
}
, !YL.static.changeable]);
if (item.app) {
menu.push(that.contextMenuUninstall(item.app));
}
ContextMenu.render(data.event, menu, this);
},
menuMainContextMenu: function (e) {
var that = this;
var menu = [
[
YL.util.getStrFa('object-group') + YL.lang("NewSubgroup"),
function () {
var item = {
title: YL.lang("Group"),
children: {},
open: true,
};
that.setWithID(that.startMenu.menu, item, 'itemPushed-');
}, !YL.static.changeable],
[
YL.util.getStrFa('paste') + YL.lang("Paste"),
function () {
var cut = that.runtime.menuItemCut;
that.menuItemAction(cut, function (child, father) {
if (father.children)
that.$delete(father.children, cut);
else
that.$delete(father, cut);
that.$set(that.startMenu.menu, cut, child)
});
that.runtime.menuItemCut = null;
}, !YL.static.changeable],
];
ContextMenu.render(e, menu, this);
},
menuItemAction: function (id, cb, father) {
//递归寻找,callback(child,father)
var that = this;
var menu = father ? father.children : that.startMenu.menu;
for (var i in menu) {
var item = menu[i];
if (i === id) {
cb(item, menu);
} else if (item.children) {
that.menuItemAction(id, cb, item);
}
}
},
tilesBoxContextMenu: function (e) {
var that = this;
var menu = [
[YL.util.getStrFa('object-group') + YL.lang("NewSubgroup"), function () {
YL.addTileGroup();
}], !YL.static.changeable];
ContextMenu.render(e, menu, this);
},
backgroundToThemeColor: function () {
var that = this;
YL.util.imgUrlToThemeColor(this.runtime.wallpaper, function (color) {
that.configs.themeColor = color;
}, 0.6)
},
backgroundUpdateScale: function () {
var that = this;
var url = this.configs.wallpaper;
YL.util.imgUrlToSize(url, function (size) {
var width = size.width || 1;
var height = size.height || 1;
that.runtime.wallpaperScale = width / height;
})
},
sidebarBtnContextMenu: function (i, e) {
var that = this;
var btn = that.startMenu.sidebar.btns[i];
var objCopy = Yuri2.jsonDeepCopy({
title: btn.title,
hash: btn.hash,
params: btn.params,
app: btn.app,
style: btn.style,
});
var menu = [
that.contextMenuOpen(btn),
that.contextMenuAddTo(objCopy),
[YL.util.getStrFa('tags') + YL.lang("Rename") + "/" + YL.lang("Options"),
function (v) {
that.shortSetting = btn;
}, !YL.static.changeable],
"|",
[
YL.util.getStrFa('arrow-up') + YL.lang("ShiftUp"),
function () {
Yuri2.arrUpRecord(that.startMenu.sidebar.btns, i);
}, !YL.static.changeable
],
[
YL.util.getStrFa('arrow-down') + YL.lang("ShiftDown"),
function () {
Yuri2.arrDownRecord(that.startMenu.sidebar.btns, i);
}, !YL.static.changeable
],
'|',
[
YL.util.getStrFa('remove') + YL.lang("Delete"),
function () {
YL.util.simpleConfirm(Yuri2.template(YL.lang("DeleteBtnConfirm"), btn.title), function () {
that.startMenu.sidebar.btns.splice(i, 1);
});
}, !YL.static.changeable
],
that.contextMenuUninstall(btn.app),
];
ContextMenu.render(e, menu, this);
},
tilesTitleContextMenu: function (groupIndex, e) {
var that = this;
var group = that.tiles[groupIndex];
var menu = [
[YL.util.getStrFa('tags') + YL.lang("Rename"), function () {
that.shortSetting = group;
}, !YL.static.changeable],
[YL.util.getStrFa('arrow-up') + YL.lang("ShiftUp"), function () {
Yuri2.arrUpRecord(that.tiles, groupIndex)
}, !YL.static.changeable],
[YL.util.getStrFa('arrow-down') + YL.lang("ShiftDown"), function () {
Yuri2.arrDownRecord(that.tiles, groupIndex)
}, !YL.static.changeable],
[YL.util.getStrFa('remove') + YL.lang("Delete"), function () {
YL.util.simpleConfirm(Yuri2.template(YL.lang("DeleteGroupConfirm"), group.title), function () {
that.tiles.splice(groupIndex, 1);
})
}, !YL.static.changeable],
];
ContextMenu.render(e, menu, this);
},
tileMoved: function () {
this.runtime.tileMoved = true;
},
tileMouseDown: function (e1) {
var that = this;
var x1 = e1.pageX;
var y1 = e1.pageY;
var fnMouseUp = function (e2) {
var x2 = e2.pageX;
var y2 = e2.pageY;
if (Math.abs(x2 - x1) + Math.abs(y2 - y1) > 5) {
that.runtime.tileMoved = true;
}
$(document).unbind('mouseup', fnMouseUp);
};
$(document).on("mouseup", fnMouseUp);
},
tileClick: function (tile) {
if (!this.runtime.tileMoved) {
//打开
this.appOpen(tile.app, tile, tile)
}
this.runtime.tileMoved = false;
},
btnShortSettingAdvanceClick: function (appId) {
//设置-高级按钮
this.shortSetting = null;
YL.open('yl-system', { data: { appSetting: appId } })
},
shortSettingParamsAdd: function () {
//新增图标param属性 按钮点击
if (this.runtime.shortcutNewParamName && this.runtime.shortcutNewParamValue) {
if (!this.shortSetting.params) {
this.$set(this.shortSetting, 'params', {})
}
this.$set(this.shortSetting.params, this.runtime.shortcutNewParamName, this.runtime.shortcutNewParamValue);
this.runtime.shortcutNewParamName = '';
this.runtime.shortcutNewParamValue = '';
}
},
shortSettingParamsDelete: function (name) {
this.$delete(this.shortSetting.params, name);
},
startMenuResizeMouseDown: function (e) {
//拖动逻辑
var that = this;
var startMenu = that.runtime.startMenu;
startMenu.drag.x = e.pageX;
startMenu.drag.y = e.pageY;
startMenu.drag.mDown = true;
var fnMouseUp = function (e) {
if (!startMenu.drag.mDown) return;
startMenu.drag.mDown = false;
$(document).unbind('mouseup', fnMouseUp);
$(document).unbind('mousemove', fnMouseMove);
};
var fnMouseMove = function (e) {
if (!startMenu.drag.mDown) return;
var minWidth = 320;
var minHeight = 160;
var x = e.pageX;
var y = e.pageY;
that.startMenu.width += (x - startMenu.drag.x);
(that.startMenu.width) > minWidth || (that.startMenu.width = minWidth);
that.startMenu.height -= (that.configs.topTaskBar?-1:1)*(y - startMenu.drag.y);
(that.startMenu.height) > minHeight || (that.startMenu.height = minHeight);
startMenu.drag.x = x;
startMenu.drag.y = y;
that.onResize();
};
$(document).mouseup(fnMouseUp);
$(document).mousemove(fnMouseMove);
},
},
watch: {
"shortSetting": {
handler: function (val, oldVal) {
if (val) {
this.drawer = null;
}
}
},
"configs.wallpaper": {
handler: function (val, oldVal) {
var that = this;
var img = new Image();
img.src = val;
img.onload = function () {
that.runtime.wallpaper = val;
if (that.configs.autoThemeColor) {
that.backgroundToThemeColor()
}
};
that.backgroundUpdateScale()
}
},
'wins': {
handler: function (val, oldVal) {
var count = 0;
for (var i in this.wins) {
var win = this.wins[i];
if (!win.plugin) {
count++;
}
}
this.runtime.winOpened = count;
}
},
"startMenu.open": {
handler: function (val, oldVal) {
//修复磁贴在全屏切换时布局混乱的bug,人为发出一个resize事件
if (val) {
this.$nextTick(YL.util.artificiallyResize);
}
}
},
"startMenu.menu": {
// deep: true,
handler: function (val, oldVal) {
this.$nextTick(YL.util.artificiallyResize);
}
}
},
computed: {
smallScreenAndMenuOpend: function () {
return this.runtime.isSmallScreen && this.startMenu.open
},
tilesBoxStyle: function () {
var width = this.runtime.clientSize.width;
if (this.runtime.isSmallScreen) {
var left;
left = 48 + (this.runtime.menuOnLeft ? width : 0);
}
return {
left: this.runtime.isSmallScreen ? left + "px" : '312px',
}
},
menuStyle: function () {
var width = this.runtime.clientSize.width;
if (this.runtime.isSmallScreen) {
return {
left: (48 + (this.runtime.menuOnLeft ? 0 : -width))+'px',
}
}
else return {};
},
barStyle: function () {
if (this.configs.topTaskBar) {
return {
top: 0,
bottom: "none",
}
}
},
centerStyle: function () {
if (this.configs.topTaskBar) {
return {
top: 40 + "px",
}
} else {
return {
bottom: 40 + "px",
}
}
},
backgroundCross: function () {
var r = this.runtime;
return r.wallpaperScale < r.clientSize.width / r.clientSize.height;
}
},
});
};