diff --git a/const.js b/const.js
index 19ab3979..8a0bc678 100644
--- a/const.js
+++ b/const.js
@@ -262,6 +262,8 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200,
NOTICE: "notice", DANGER: "danger",
TOIMAGE: "toimage",
+ CURSOR: "cursor", POINTER: "pointer", CROSSHAIR: "crosshair", MOVE: "move", RESIZE: "resize",
+
SIZE: "size", OPACITY: "opacity", VISIBLE: "visible",
CLASS: "class", DARK: "dark", LIGHT: "light", WHITE: "white", BLACK: "black",
FILTER: "filter", TOGGLE: "toggle", EXPAND: "expand", SPEED: "speed", HOVER: "hover", HOVER_SELECT: "hover,select",
diff --git a/frame.js b/frame.js
index 5e4fb17f..e6898b26 100644
--- a/frame.js
+++ b/frame.js
@@ -311,8 +311,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
},
select: function(can, select, item) { // can.user.trans(can, item.value||item.values[0])
return can.page.Append(can, select.parentNode, [{type: html.INPUT, data: {className: html.SELECT, type: html.BUTTON, name: item.name, value: item.value||item.values[0], title: item.name}, onclick: function(event) { var target = event.target
- var carte = can.user.carte(event, can, {}, item.values, function(event, button) { carte.close(); if (target.value == button) { return }
- target.value = button, select.value = button, select.onchange && select.onchange({target: select})
+ var carte = can.user.carte(event, can, {}, item.values, function(event, button) { carte.close()
+ if (target.value != button) { target.value = button, select.value = button, select.onchange && select.onchange({target: select}) }
+ return true
}); can.onappend.style(can, [html.SELECT, item.name], carte._target), can.page.style(can, carte._target, html.MIN_WIDTH, event.target.offsetWidth)
}, _init: function(target) { can.page.style(can, target, html.WIDTH, (select.offsetWidth||80)+10), can.onappend.style(can, html.HIDE, select) }}, {icon: mdb.SELECT}])
},
diff --git a/index.css b/index.css
index f256ba6d..cb1a6bd9 100644
--- a/index.css
+++ b/index.css
@@ -501,7 +501,7 @@ fieldset.draw>div.output>div.layout>div.layout>div.profile table { width:100%; }
fieldset.draw>form.option>div.item.pid>input { width:60px !important; }
fieldset.draw.trend div.output svg { background-color:#1b5b738c; }
fieldset.draw.trend div.output { overflow:hidden; }
-fieldset.draw.spide div.output { overflow-y:hidden; }
+/* fieldset.draw.spide div.output { overflow-y:hidden; } */
fieldset.draw.spide div.output svg text { cursor:pointer; }
fieldset.draw.spide div.output svg path { stroke-width:1; }
fieldset.draw>div.output>div.project { width:180px; flex:0 0 180px; }
diff --git a/lib/core.js b/lib/core.js
index f5c34553..b12379cb 100644
--- a/lib/core.js
+++ b/lib/core.js
@@ -110,7 +110,9 @@ Volcanos("core", {
},
ItemCB: function(meta, cb, can, item) { var list = []
for (var k in meta) { if (k.indexOf("on") == 0 && typeof meta[k] == code.FUNCTION) { (function(k) { list.push(k)
- if (typeof cb == code.FUNCTION) { cb(k, meta[k]) } else { cb[k] = function(event) { can.misc.Event(event, can, function(msg) {
+ if (typeof cb == code.FUNCTION) {
+ cb(k, meta[k])
+ } else { cb[k] = function(event) { can.misc.Event(event, can, function(msg) {
meta[k](event, can, item)
}) } }
})(k) } } return list
diff --git a/lib/user.js b/lib/user.js
index 720d1989..e6ac4d24 100644
--- a/lib/user.js
+++ b/lib/user.js
@@ -122,17 +122,14 @@ Volcanos("user", {
return can.user.toastSuccess(can, text, "copy success"), can.misc.Log(nfs.COPY, text), text
},
carte: function(event, can, meta, list, cb, parent, trans) { var msg = can.request(event)
- function remove_sub(carte) { carte._sub && can.page.Remove(can, carte._sub._target), delete(carte._sub) }
- parent? remove_sub(parent): can.onmotion.clearCarte(can)
- meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta)), trans = trans||meta._trans
- if (!list || list.length == 0) { return }
- var isinput = can.page.tagis(event.target, html.INPUT)
+ function remove_sub(carte) { carte._sub && can.page.Remove(can, carte._sub._target), delete(carte._sub) } parent? remove_sub(parent): can.onmotion.clearCarte(can)
+ meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta)), trans = trans||meta._trans; if (!list || list.length == 0) { return }
var _events = event._events||event
- function click(event, button) { can.misc.Event(event, can, function() {
- can.onkeymap.prevent(event), can.request(event, {action: button}), event._events = _events,
- (meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}):
- can.base.isFunc(cb)? cb(event, button, meta, carte): can.Update(event, [ctx.ACTION, button])) || can.onmotion.clearCarte(can)
+ function click(event, button) { can.misc.Event(event, can, function() { can.request(event, {action: button}), can.onkeymap.prevent(event), event._events = _events
+ if (can.base.isFunc(cb) && cb(event, button, meta, carte)) { return }
+ (meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}): can.Update(event, [ctx.ACTION, button])) || can.onmotion.clearCarte(can)
}) }
+ var isinput = can.page.tagis(event.target, html.INPUT)
var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE, meta._style||can.base.replaceAll(can.ConfIndex()||"", nfs.PT, lex.SP)||"", chat.FLOAT]], list: can.core.List(list, function(item, index) {
if (item === "") {
return {type: html.HR}
diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js
index 1d51f642..afbc2eb2 100644
--- a/plugin/local/wiki/draw.js
+++ b/plugin/local/wiki/draw.js
@@ -1,14 +1,15 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg) {
- can.isCmdMode() || can.onmotion.hidden(can, can._action)
- if (can.ConfIndex() == web.WIKI_DRAW) { can.ui = can.onappend.layout(can), can.onexport.title(can, can.Option(nfs.PATH))
- if (can.user.isMobile || !can.isCmdMode()) { can.onmotion.hidden(can, can.ui.project) }
- can.isCmdMode() && can.onmotion.toggle(can, can.ui.profile, true)
+ can.OptionPath = function(value) { return can.Option(nfs.PATH, value) }
+ can.OptionPid = function(value) { return can.Option(svg.PID, value) }
+ can.ActionGo = function(value) { return can.Action(svg.GO, value) }
+ can.ActionMode = function(value) { return can.Action(ice.MODE, value) }
+ can.ActionShape = function(value) { return can.Action(svg.SHAPE, value) }
+ if (can.ConfIndex() == web.WIKI_DRAW) { can.ui = can.onappend.layout(can), can.onexport.title(can, can.OptionPath())
+ if (can.isCmdMode() && !can.user.isMobile) { can.onmotion.toggle(can, can.ui.profile, true) } else { can.onmotion.hidden(can, can._action), can.onmotion.hidden(can, can.ui.project) }
} else { can.ui = {content: can._output} } can.page.Modify(can, can.ui.content, msg.Results()||can.onexport.content(can))
- can.svg = null, can.group = null, can.current = null, can.temp = null, can.points = [], can._display_heights = {}
- can.page.Select(can, can.ui.content, html.SVG, function(target) { can.svg = can.group = can.onimport._block(can, target), can.onimport._group(can, target)
- can.page.Select(can, target, "", function(target) { can.onimport._block(can, target), can.page.tagis(target, svg.G) && target.Value(html.CLASS) && can.onimport._group(can, target) })
- can.isCmdMode() && can.core.ItemCB(can.onaction, function(key, cb) { target[key] = function(event) { can.misc.Event(event, can, function(msg) { cb(event, can) }) } })
- }), can.ondetail._select(can, can.db.hash[1]||can.Option(svg.PID)||can.svg.Value(svg.PID))
+ can.page.Select(can, can.ui.content, html.SVG, function(target) { can.ui.svg = can.ui.group = can.onimport._block(can, target), can.onimport._project(can, target), can.ui.profile && can.core.ItemCB(can.onaction, target, can)
+ can.page.Select(can, target, "", function(target) { can.onimport._block(can, target), can.page.tagis(target, svg.G) && target.Value(html.CLASS) && can.onimport._project(can, target) })
+ }), can.ondetail._select(can, can.db.hash[1]||can.OptionPid()||can.ui.svg.Value(svg.PID)), can.ui.points = []
},
_block: function(can, target) {
target.Value = function(key, value) { if (can.base.isUndefined(key)) { return } if (can.base.isObject(key)) { return can.core.Item(key, target.Value), key }
@@ -19,26 +20,29 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) {
if (key == svg.SHIP) { return value != undefined && target.setAttribute(key, JSON.stringify(value)), can.base.Obj(target.getAttribute(key), []) }
try { return value != undefined && target.setAttribute(key, value), target.getAttribute(key) || can.core.Value(target[key], "baseVal.value") || can.core.Value(target[key], "baseVal") || undefined } catch(e) { }
}, target.Val = function(key, value) { return parseInt(target.Value(key, value == undefined? value: parseInt(value)||0))||0 }
- target.Group = function() { for (var node = target; node; node = node.parentNode) { if (can.page.tagis(node, svg.G, html.SVG)) { return node } } return can.svg }
- target.Groups = function() { if (target == can.svg) { return html.SVG } var list = []
+ target.Group = function() { for (var node = target; node; node = node.parentNode) { if (can.page.tagis(node, svg.G, html.SVG)) { return node } } return can.ui.svg }
+ target.Groups = function() { if (target == can.ui.svg) { return html.SVG } var list = []
for (var node = target; node && !can.page.tagis(node, html.SVG); node = node.parentNode) { can.page.tagis(node, svg.G) && node.Value(html.CLASS) && list.push(node.Value(html.CLASS)) }
return list.reverse().join(nfs.PT)
}; return target
},
- _group: function(can, target) { var name = target.Groups(); if (!name || !can.ui.project) { return }
- var item = can.onimport.item(can, {name: name}, function(event) { can.group = target, can.Status(svg.GROUP, name), can.onaction.show(event, can)
+ _project: function(can, target) { var groups = target.Groups(); if (!groups || !can.ui.project) { return }
+ var item = can.onimport.item(can, {name: groups}, function(event) { can.ui.group = target
+ can.misc.SearchHash(can, groups, can.OptionPid()), can.Status(svg.GROUP, groups), can.onaction.show(event, can)
can.core.List([svg.FONT_SIZE, svg.STROKE_WIDTH, svg.STROKE, svg.FILL], function(key) { can.Action(key, target.Value(key)||key) })
- }, function(event) { can.user.carteRight(event, can, can.onaction, can.onaction.menu_list) }, can.ui.project)
- name == can.db.hash[0] && can.onmotion.delay(can, function() { item.click() })
+ }, function(event) { return {meta: can.onaction, list: can.onaction.menu_list} }, can.ui.project); target._item = item
+ groups == can.db.hash[0] && can.onmotion.delay(can, function() { item.click() })
},
_profile: function(can, target) { if (!can.ui.profile) { return }
- can.misc.SearchHash(can, target.Groups()||"svg", can.Option(svg.PID, can.svg.Value(svg.PID, can.onexport._pid(can, target))))
+ can.misc.SearchHash(can, target.Groups()||html.SVG, can.OptionPid(can.onexport._pid(can, target)))
var figure = can.onfigure._get(can, target), ui = can.page.Appends(can, can.ui.profile, [html.OUTPUT, html.ACTION])
can.page.Appends(can, ui.output, [{view: [html.CONTENT, html.TABLE], list: [
{th: [mdb.KEY, mdb.VALUE]}, {td: [mdb.TYPE, target.tagName]}, {td: [svg.PID, target.Value(svg.PID)]}, {td: [mdb.TEXT, target.Value(mdb.TEXT)]},
].concat(can.core.List([].concat(can.core.Value(figure, "data.copy"), [svg.X, svg.Y, mdb.INDEX, ctx.ARGS]), function(key) {
return key = can.core.Value(figure.data, can.core.Keys(svg.TRANS, key))||key, {td: [key, target.Value(key)], ondblclick: function(event) {
- can.onmotion.modify(can, event.target, function(event, value) { target.Value(key, value), can.ondetail._move(can, target)
+ var _target = event.target
+ can.onmotion.modify(can, _target, function(event, value) {
+ target.Value(key, _target.innerHTML = value), can.ondetail._move(can, target)
if (key == ctx.INDEX || key == ctx.ARGS) { can.onimport._display(can, target) }
}, {name: key, action: "key"})
}}
@@ -47,123 +51,145 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) {
},
_display: function(can, target) { if (!can.ui.display) { return }
if (!target.Value(ctx.INDEX)) { return can.onmotion.hidden(can, can.ui.display) } can.onmotion.toggle(can, can.ui.display, true)
- if (can.onmotion.cache(can, function() { return target.Value(svg.PID) }, can.ui.display)) { return }
+ if (can.onmotion.cache(can, function() { return target.Value(svg.PID) }, can.ui.display)) { return can.onimport.layout(can) }
can.onappend.plugin(can, {index: target.Value(ctx.INDEX), args: target.Value(ctx.ARGS), height: can.ConfHeight()/2}, function(sub) {
sub.onexport.output = function() { can.onmotion.delay(can, function() { can.page.style(can, sub._output, html.MAX_HEIGHT, "")
- sub.onimport.size(sub, can._display_heights[target.Value(svg.PID)] = can.base.Max(sub._target.offsetHeight, can.ConfHeight()/2), can.ConfWidth()-can.ui.project.offsetWidth, true)
- can.onimport.layout(can)
+ sub.onimport.size(sub, can.base.Max(sub._target.offsetHeight, can.ConfHeight()/2), can.ConfWidth()-can.ui.project.offsetWidth, true), can.onimport.layout(can)
}) }
sub.onaction._close = function() { can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) }
}, can.ui.display)
},
- block: function(can, type, value, group) { group = group||can.group
+ block: function(can, type, value, group) { group = group||can.ui.group
var target = document.createElementNS("http://www.w3.org/2000/svg", type)
return group.appendChild(can.onimport._block(can, target)), target.Value(value), target
},
- group: function(can, name, value, group) { var target = can.onimport.block(can, svg.G, value, group||can.svg)
- return target.Value(html.CLASS, name), can.onimport._group(can, target), target
+ group: function(can, name, value, group) { var target = can.onimport.block(can, svg.G, value, group||can.ui.svg)
+ return target.Value(html.CLASS, name), can.onimport._project(can, target), target
},
- draw: function(can, value, group) { group = group||can.svg
- var figure = can.onfigure[value.shape], data = figure.draw({}, can, value.points, value.style||{}); can.core.Item(value.style, function(key, value) { data[key] = value })
- var target = can.onimport.block(can, figure.data.name||value.shape, data, group); can.core.ItemCB(value, function(key, cb) { target[key] = cb })
- return value._init && value._init(target), target
- },
- layout: function(can, height, width) {
- can.ui.layout && can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) { can.page.style(can, can.svg, html.MIN_HEIGHT, height, html.MIN_WIDTH, width) })
+ draw: function(can, meta, group) { group = group||can.ui.svg
+ var figure = can.onfigure[meta.shape], data = figure.draw({}, can, meta.points, meta.style||{}); can.core.Item(meta.style, function(key, value) { data[key] = value })
+ var target = can.onimport.block(can, figure.data.name||meta.shape, data, group); can.core.ItemCB(meta, target, can)
+ return meta._init && meta._init(target), target
},
+ layout: function(can) { can.ui.layout && can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) {
+ can.page.style(can, can.ui.svg, html.MIN_HEIGHT, height, html.MIN_WIDTH, width)
+ }) },
})
Volcanos(chat.ONACTION, {list: [
- [svg.GRID, svg.GRID, 1, 2, 3, 4, 5, 10, 20],
- [svg.FONT_SIZE, svg.FONT_SIZE, 12, 16, 18, 24, 32],
+ [svg.GO, ctx.RUN, ice.AUTO, "manual"], [ice.MODE, web.DRAW, html.MOVE, html.RESIZE],
+ [svg.SHAPE, svg.RECT, svg.LINE, svg.TEXT, svg.BLOCK, svg.CIRCLE, svg.ELLIPSE],
[svg.STROKE_WIDTH, svg.STROKE_WIDTH, 1, 2, 3, 4, 5],
[svg.STROKE, svg.STROKE, cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.BLACK, cli.WHITE],
[svg.FILL, svg.FILL, cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.BLACK, cli.WHITE],
- // [svg.GO, ice.AUTO, ctx.RUN, ice.AUTO, "manual"],
- [svg.GO, ctx.RUN, ice.AUTO, "manual"],
- [ice.MODE, web.DRAW, web.RESIZE],
- [svg.SHAPE, svg.RECT, svg.TEXT, svg.RECT, svg.LINE, svg.BLOCK, svg.CIRCLE, svg.ELLIPSE],
+ [svg.FONT_SIZE, svg.FONT_SIZE, 12, 16, 18, 24, 32], [svg.GRID, svg.GRID, 1, 2, 3, 4, 5, 10, 20],
], _change: function(can, key, value) {
value == "" && (value = key), can.Action(key, value)
- key == value && (value = ice.AUTO), can.group.Value(key, value)
+ key == value && (value = ice.AUTO), can.ui.group.Value(key, value)
+ can.user.toast(can, key+" "+value)
},
- "font-size": function(event, can, key, value) { can.onaction._change(can, key, value) },
"stroke-width": function(event, can, key, value) { can.onaction._change(can, key, value) },
stroke: function(event, can, key, value) { can.onaction._change(can, key, value) },
fill: function(event, can, key, value) { can.onaction._change(can, key, value) },
+ "font-size": function(event, can, key, value) { can.onaction._change(can, key, value) },
+ save: function(event, can, button) { can.runAction(can.request(event, {text: can.onexport.content(can, can.ui.svg)}), button, [can.OptionPath()]) },
- menu_list: [html.HIDE, html.SHOW, mdb.CREATE, web.CLEAR, mdb.REMOVE],
- hide: function(event, can) { can.onmotion.hide(can, {interval: 100, length: 10}, null, can.group) },
- show: function(event, can) { can.onmotion.show(can, {interval: 10, length: 1}, null, can.group) },
- create: function(event, can) { can.user.input(event, can, [svg.GROUP], function(list) { can.onimport.group(can, list[0]) }) },
- clear: function(event, can) { can.onmotion.clear(can, can.group), delete(can.temp), can.points = [] },
- remove: function(event, can) { can.group == can.svg || can.page.Remove(can, can.group) },
-
- save: function(event, can, button) { can.runAction(can.request(event, {text: can.onexport.content(can, can.svg)}), button, [can.Option(nfs.PATH)]) },
- edit: function(event, can) { can.Action(svg.GO, can.Action(svg.GO) == ctx.RUN? ice.AUTO: ctx.RUN) },
+ menu_list: [html.HIDE, html.SHOW, web.CLEAR, mdb.CREATE, mdb.REMOVE],
+ hide: function(event, can) { can.onmotion.hide(can, {interval: 50, length: 10}, null, can.ui.group) },
+ show: function(event, can) { can.onmotion.show(can, {interval: 50, length: 10}, null, can.ui.group) },
+ clear: function(event, can) { can.onmotion.clear(can, can.ui.group), delete(can.ui.temp), can.ui.points = [] },
+ create: function(event, can) { can.user.input(event, can, [svg.GROUP], function(list) { can.onimport.group(can, list[0], {}, can.ui.group) }) },
+ remove: function(event, can) {
+ if (can.ui.group == can.ui.svg) { return can.onmotion.clear(can, can.ui.svg) }
+ can.page.Remove(can, can.ui.group._item), can.page.Remove(can, can.ui.group)
+ },
_mode: {
- draw: function(event, can, points) { var shape = can.Action(svg.SHAPE), figure = can.onfigure[shape]
- figure.grid && figure.grid(event, can, points); if (figure.data.points && figure.data.points != points.length) { return }
- var data = figure.draw && figure.draw(event, can, points, {}), target = data && can.onimport.block(can, figure.data.name||shape, data, can.group)
- if (event.type == html.CLICK) { can.points = []; if (target) { var pid = can.onexport._pid(can, target)
- can.core.List(points, function(p, i) { p.target && p.target.Value(svg.SHIP, p.target.Value(svg.SHIP).concat([{pid: pid, which: i+1, anchor: p.anchor}])) })
- return
- } } return target
+ draw: function(event, can, points) { var shape = can.ActionShape(), figure = can.onfigure[shape]
+ figure.grid && figure.grid(event, can, points); if (figure.data.points && points.length < figure.data.points) { return }
+ var data = figure.draw && figure.draw(event, can, points, {}), target = data && can.onimport.block(can, figure.data.name||shape, data, can.ui.group)
+ if (event.type != html.CLICK) { return target } can.ui.points = []; if (!target) { return } var pid = can.onexport._pid(can, target)
+ can.core.List(points, function(p, i) { p.target && p.target.Value(svg.SHIP, p.target.Value(svg.SHIP).concat([{pid: pid, which: i+1, anchor: p.anchor}])) })
},
- resize: function(event, can, points) { var target = event.target
- if (event.type == html.CLICK) { if (points.length > 1) { return can.points = [], delete(can.current) }
- return can.current = {target: target, begin: can.core.List([target], function(target) { if (can.page.tagis(target, svg.G)) { return }
+ move: function(event, can, points) { var target = event.target
+ if (event.type == html.CLICK) { if (points.length > 1) { return can.ui.points = [], delete(can.ui.current) }
+ return can.ui.current = {target: target, begin: can.core.List([target], function(target) { if (can.page.tagis(target, svg.G)) { return }
return {target: target, height: target.Val(html.HEIGHT), width: target.Val(html.WIDTH), x: target.Val(svg.X), y: target.Val(svg.Y),
ship: can.core.List(target.Value(svg.SHIP), function(ship) { return ship.pid && (ship.target = can.ondetail._select(can, ship.pid)) && ship })
}
}), pos: can.onexport.cursor(event, can, target)}
}
- can.current && can.core.List(can.current.begin, function(item) { var figure = can.onfigure._get(can, item.target)
- can.onexport.resize(item.target, can.current.pos, points[0], points[1], item), can.ondetail._move(can, item.target, item.ship)
+ can.ui.current && can.core.List(can.ui.current.begin, function(item) { var figure = can.onfigure._get(can, item.target)
+ can.onexport.resize(item.target, 5, points[0], points[1], item), can.ondetail._move(can, item.target, item.ship)
+ can.ondetail._select(can, item.target.Value(mdb.TEXT), function(text) { text.Value(can.onexport._text(can, item.target, figure, {})) })
+ })
+ },
+ resize: function(event, can, points) { var target = event.target
+ if (event.type == html.CLICK) { if (points.length > 1) { return can.ui.points = [], delete(can.ui.current) }
+ return can.ui.current = {target: target, begin: can.core.List([target], function(target) { if (can.page.tagis(target, svg.G)) { return }
+ return {target: target, height: target.Val(html.HEIGHT), width: target.Val(html.WIDTH), x: target.Val(svg.X), y: target.Val(svg.Y),
+ ship: can.core.List(target.Value(svg.SHIP), function(ship) { return ship.pid && (ship.target = can.ondetail._select(can, ship.pid)) && ship })
+ }
+ }), pos: can.onexport.cursor(event, can, target)}
+ }
+ can.ui.current && can.core.List(can.ui.current.begin, function(item) { var figure = can.onfigure._get(can, item.target)
+ can.onexport.resize(item.target, can.ui.current.pos, points[0], points[1], item), can.ondetail._move(can, item.target, item.ship)
can.ondetail._select(can, item.target.Value(mdb.TEXT), function(text) { text.Value(can.onexport._text(can, item.target, figure, {})) })
})
},
},
- _auto: function(can, target) { if (can.points.length > 0 || can.page.tagis(target, html.TEXT)) { return }
- var pos = can.onexport.cursor(event, can, target); if (target == can.svg) { switch (pos) {
- case 5: can.Action(ice.MODE, web.DRAW), can.Action(svg.SHAPE, html.BLOCK), can.page.style(can, target, {cursor: "crosshair"}); break
- default: can.Action(ice.MODE, web.RESIZE)
+ _figure: function(event, can, points) {
+ can._undo && can._undo(), can._undo = function() { can.ui.temp && can.page.Remove(can, can.ui.temp) && delete(can.ui.temp), delete(can._undo) }
+ can.ui.temp = can.core.CallFunc([can.onaction._mode, can.ActionMode()], [event, can, points]), can.ui.points.length == 0 && can._undo && can._undo()
+ },
+ _group: function(can) {
+ can._undo && can._undo(), can._temp = can.onimport.block(can, svg.G, {}, can.ui.group)
+ can._undo = function() { can._temp && can.page.Remove(can, can._temp) && delete(can._temp), delete(can._undo) }
+ return can._temp
+ },
+ _auto: function(can, target) { if (can.ui.points.length > 0 || can.page.tagis(target, html.TEXT)) { return }
+ var pos = can.onexport.cursor(event, can, target); if (target == can.ui.svg) { switch (pos) {
+ case 5: can.ActionMode(web.DRAW), can.ActionShape(html.BLOCK), can.page.style(can, target, {cursor: html.CROSSHAIR}); break
+ default: can.ActionMode(html.RESIZE)
} } else { switch (pos) {
- case 5:
- case 9: can.Action(ice.MODE, web.RESIZE); break
- default: can.Action(ice.MODE, web.DRAW), can.Action(svg.SHAPE, svg.LINE)
+ case 5: can.ActionMode(html.MOVE); break
+ case 9: can.ActionMode(html.RESIZE); break
+ default: can.ActionMode(web.DRAW), can.ActionShape(svg.LINE)
} }
},
- _figure: function(event, can, points) {
- can._undo && can._undo(), can._undo = function() { can.temp && can.page.Remove(can, can.temp) && delete(can.temp), delete(can._undo) }
- can.temp = can.core.CallFunc([can.onaction._mode, can.Action(ice.MODE)], [event, can, points]), can.points.length == 0 && can._undo && can._undo()
- },
- onmouseover: function(event, can) {
- can.onexport._show(can, event.target)
- },
+ onmouseover: function(event, can) { can.onexport._show(can, event.target) },
onmousemove: function(event, can) {
- var point = can.onexport._point(event, can); can.onexport.cursor(event, can, event.target)
- if (can.Action(svg.GO) == ctx.RUN) { return can.page.style(can, can.svg, "cursor", "pointer") }
- if (can.Action(svg.GO) == ice.AUTO) { can.onaction._auto(can, event.target) }
- can.onaction._figure(event, can, can.points.concat(point))
- can.temp && can.onexport._show(can, can.temp||event.target)
+ if (can.ActionGo() == ctx.RUN) { return can.page.style(can, can.ui.svg, {cursor: html.POINTER}) }
+ if (can.ActionGo() == ice.AUTO) { can.onaction._auto(can, event.target) }
+ if (can.ActionGo() == "manual") { if (event.target == can.ui.svg) { can.onexport._cursor(can, "") }
+ if (can.ActionMode()== html.MOVE) {
+ if (event.target != can.ui.svg) { can.onexport._cursor(can, html.MOVE) }
+ } else if (can.ActionMode() == html.RESIZE) {
+ if (event.target != can.ui.svg) { can.onaction._auto(can, event.target), can.ActionMode(html.RESIZE) }
+ } else { var shape = can.ActionShape()
+ can.onaction._auto(can, event.target), can.ActionMode("draw"), can.ActionShape(shape)
+ }
+ }
+ can.onaction._figure(event, can, can.ui.points.concat(can.onexport._point(event, can)))
+ can.ui.temp && can.onexport._show(can, can.ui.temp||event.target)
},
- onclick: function(event, can) { var point = can.onexport._point(event, can)
- if (can.Action(svg.GO) == ctx.RUN) { return can.ondetail._select(can, event.target.Value(svg.PID)) }
- can.onaction._figure(event, can, can.points = can.points.concat(point))
+ onclick: function(event, can) {
+ if (can.ActionGo() == ctx.RUN) { return can.ondetail._select(can, event.target.Value(svg.PID)) }
+ can.onaction._figure(event, can, can.ui.points = can.ui.points.concat(can.onexport._point(event, can)))
},
- ondblclick: function(event, can) { can.ondetail.label(event, can) },
- oncontextmenu: function(event, can) { can.page.style(can, can.user.carte(event, can, can.ondetail, null, function(ev, button, meta) { meta[button](event, can, button) })._target, {left: event.clientX, top: event.clientY}) },
+ ondblclick: function(event, can) { can.page.style(can, can.ondetail.label(event, can)._target, {left: event.clientX, top: event.clientY}) },
+ oncontextmenu: function(event, can) { can.page.style(can, can.user.carte(event, can, can.ondetail)._target, {left: event.clientX, top: event.clientY}) },
})
-Volcanos(chat.ONDETAIL, {
- list: [cli.START, nfs.COPY, html.LABEL, html.TOIMAGE, mdb.REMOVE],
- _trans: {copy: "复制", label: "标签", toimage: "成图"},
- _select(can, name, cb) { if (!name) { return } var target = can.page.SelectOne(can, can.svg, nfs.PT+name, cb); if (!target) { return }
- can.onimport._profile(can, target), can.onimport._display(can, target), can.onimport.layout(can, can.ConfHeight(), can.ConfWidth())
- return target
+Volcanos(chat.ONDETAIL, {list: [cli.START, nfs.COPY, html.LABEL, mdb.REMOVE], _trans: {copy: "复制", label: "标签"},
+ _select(can, name, cb) { if (!name) { return } var target = can.page.SelectOne(can, can.ui.svg, nfs.PT+name, cb); if (!target) { return }
+ can.onimport._profile(can, target), can.onimport._display(can, target), can.onimport.layout(can); return target
},
- start: function(event, can) {
- event = event._events||event; var target = event.target; if (target == can.svg) { return }
+ _move: function(can, target, list) {
+ can.core.List(list||target.Value(svg.SHIP), function(ship) { var p = can.onexport.anchor(target, ship.anchor, {})
+ ship.target = can.page.SelectOne(can, can.ui.svg, nfs.PT+ship.pid)
+ if (ship.which == 1) { ship.target.Val(svg.X1, p.x), ship.target.Val(svg.Y1, p.y) } else if (ship.which == 2) { ship.target.Val(svg.X2, p.x), ship.target.Val(svg.Y2, p.y) }
+ })
+ },
+ start: function(event, can) { event = event._events||event; var target = event.target; if (target == can.ui.svg) { return }
var list = [target], dict = {}
for (var i = 0; i < list.length; i++) { var ship = list[i].Value(svg.SHIP)
for (var j = 0; j < ship.length; j++) { var pid = ship[j].pid
@@ -172,47 +198,37 @@ Volcanos(chat.ONDETAIL, {
})
}
}
- can.core.Next(list, function(target, next) { can.onmotion.delay(can, function() {
- can.onmotion.show(can, {interval: 300, length: 10}, null, target)
- can.user.toast(can, target.Value(ctx.INDEX))
- can.ondetail.run({target: target}, can), next()
- }) })
+ can.core.Next(list, function(target, next) {
+ can.onimport._display(can, target), can.user.toast(can, target.Value(ctx.INDEX))
+ can.onmotion.show(can, {interval: 500, length: 10}, null, target)
+ can.onmotion.delay(can, function() { next() }, 1000)
+ }, function() { can.user.toastSuccess(can) })
},
- copy: function(event, can) {
- event = event._events||event; var target = event.target; if (target == can.svg) { return }
+ copy: function(event, can) { event = event._events||event; var target = event.target; if (target == can.ui.svg) { return }
var figure = can.onfigure._get(can, target), trans = can.core.Value(figure, [svg.DATA, svg.TRANS])||{}, data = {}
data[trans.x||svg.X] = target.Val(trans.x||svg.X)+10, data[trans.y||svg.Y] = target.Val(trans.y||svg.Y)+10
can.core.List(figure.data.copy, function(key) { data[key] = target.Value(key) })
- return can.onimport.block(can, target.tagName, data, can.group)
+ return can.onimport.block(can, target.tagName, data, can.ui.group)
},
- label: function(event, can) {
- event = event._events||event; var target = event.target; if (target == can.svg) { return }
+ label: function(event, can) { event = event._events||event; var target = event.target; if (target == can.ui.svg) { return }
var _target, text = target.Value(mdb.TEXT); can.ondetail._select(can, text, function(target) { _target = target, text = target.Value(html.INNER) })
- can.user.input(event, can, [{name: html.LABEL, value: text}], function(list) {
+ return can.user.input(event, can, [{name: html.LABEL, value: text}], function(list) {
if (_target) { _target.Value(html.INNER, list[0]); return } if (can.page.tagis(target, html.TEXT)) { target.innerHTML = list[0]; return }
target.Value(mdb.TEXT, can.onexport._pid(can, can.onimport.block(can, html.TEXT, can.onexport._text(can, target, can.onfigure._get(can, target), {inner: list[0]}), target.Group()) ))
})
},
- toimage: function(event, can) {
- can.user.toimage(can, can.Option(nfs.PATH).split(nfs.PS).pop().split(nfs.PT)[0], can.svg) },
- remove: function(event, can) {
- event = event._events||event; var target = event.target; if (target == can.svg) { return }
+ remove: function(event, can) { event = event._events||event; var target = event.target; if (target == can.ui.svg) { return }
can.core.List(target.Value(svg.SHIP), function(item) { can.ondetail._select(can, item.pid, function(target) { can.page.Remove(can, target) }) })
can.ondetail._select(can, target.Value(mdb.TEXT), function(target) { can.page.Remove(can, target) }), can.page.Remove(can, target)
},
- _move: function(can, target, list) {
- can.core.List(list||target.Value(svg.SHIP), function(ship) { var p = can.onexport.anchor(target, ship.anchor, {}); ship.target = can.ondetail._select(can, ship.pid)
- if (ship.which == 1) { ship.target.Val(svg.X1, p.x), ship.target.Val(svg.Y1, p.y) } else if (ship.which == 2) { ship.target.Val(svg.X2, p.x), ship.target.Val(svg.Y2, p.y) }
- })
- },
})
Volcanos(chat.ONEXPORT, {list: [svg.GROUP, svg.FIGURE, ctx.INDEX, "pos"],
- _point: function(event, can) { var p = can.svg.getBoundingClientRect(), point = {x: event.clientX-p.x, y: event.clientY-p.y}
+ _point: function(event, can) { var p = can.ui.svg.getBoundingClientRect(), point = {x: event.clientX-p.x, y: event.clientY-p.y}
point.x = point.x - point.x % can.onexport.grid(can), point.y = point.y - point.y % can.onexport.grid(can)
return can.Status("pos", point.x+mdb.FS+point.y), point
},
_pid: function(can, target) { if (target.Value(svg.PID)) { return target.Value(svg.PID) }
- var pid = "p"+can.svg.Val(mdb.COUNT, can.svg.Val(mdb.COUNT)+1)
+ var pid = "p"+can.ui.svg.Val(mdb.COUNT, can.ui.svg.Val(mdb.COUNT)+1)
return target.Value(html.CLASS, [target.Value(html.CLASS), target.Value(svg.PID, pid)].join(lex.SP).trim()), pid
},
_text: function(can, target, figure, data) { var trans = can.core.Value(figure.data, svg.TRANS)||{}
@@ -228,18 +244,19 @@ Volcanos(chat.ONEXPORT, {list: [svg.GROUP, svg.FIGURE, ctx.INDEX, "pos"],
_show: function(can, target) { var figure = can.onfigure._get(can, target)
function show() { return can.onexport._position(can, target, figure)+lex.SP+can.onexport._size(can, target, figure) }
can.Status(svg.FIGURE, can.core.Keys(target.tagName, target.Value(svg.PID))+lex.SP+(figure? (figure.show||show)(can, target, figure): ""))
- can.Status(svg.GROUP, target.Groups()||can.group.Groups()||html.SVG)
+ can.Status(svg.GROUP, target.Groups()||can.ui.group.Groups()||html.SVG)
can.Status(ctx.INDEX, target.Value(ctx.INDEX)||"")
},
- grid: function(can) { var grid = can.Action(svg.GRID); return grid == svg.GRID || grid == ice.AUTO? 10: grid },
content: function(can, target) { return ['"]).join("")
},
+ grid: function(can) { var grid = can.Action(svg.GRID); return grid == svg.GRID || grid == ice.AUTO? 10: grid },
+ _cursor: function(can, cursor) { can.page.style(can, can.ui.svg, {cursor: cursor}) },
cursor: function(event, can, target) {
var p = target.getBoundingClientRect(), q = {x: event.clientX, y: event.clientY}, pos = 5, margin = 20
var y = (q.y-p.y)/p.height; if (y < 0.2 && q.y-p.y < margin) { pos -= 3 } else if (y > 0.8 && q.y-p.y-p.height > -margin) { pos += 3 }
var x = (q.x-p.x)/p.width; if (x < 0.2 && q.x-p.x < margin) { pos -= 1 } else if (x > 0.8 && q.x-p.x- p.width > -margin) { pos += 1 }
- return can.svg.style.cursor = ["nw-resize", "n-resize", "ne-resize", "w-resize", "move", "e-resize", "sw-resize", "s-resize", "se-resize"][pos-1], pos
+ return can.ui.svg.style.cursor = ["nw-resize", "n-resize", "ne-resize", "w-resize", html.MOVE, "e-resize", "sw-resize", "s-resize", "se-resize"][pos-1], pos
},
anchor: function(target, pos, point) {
switch (pos) {
@@ -287,20 +304,17 @@ Volcanos(chat.ONEXPORT, {list: [svg.GROUP, svg.FIGURE, ctx.INDEX, "pos"],
})
Volcanos(chat.ONFIGURE, {
_get: function(can, target, name) { return can.onfigure[name]||can.onfigure[target.getAttribute(mdb.NAME)]||can.onfigure[target.tagName] },
- svg: { //
- data: {copy: [html.HEIGHT, html.WIDTH]},
- show: function(can, target, figure) { return can.onexport._size(can, target, figure) }
- },
- rect: { //
+ svg: {show: function(can, target, figure) { return can.onexport._size(can, target, figure) }},
+ rect: { //
data: {points: 2, rx: 4, ry: 4, copy: [html.HEIGHT, html.WIDTH, svg.RX, svg.RY]},
draw: function(event, can, points, style) { var p0 = points[0], p1 = points[1]
- return {height: Math.abs(p0.y-p1.y), width: Math.abs(p0.x-p1.x), x: Math.min(p0.x, p1.x), y: Math.min(p0.y, p1.y), rx: style.rx == undefined? this.data.rx: style.rx, ry: style.ry == undefined? this.data.ry: style.ry}
+ return {x: Math.min(p0.x, p1.x), y: Math.min(p0.y, p1.y), height: Math.abs(p0.y-p1.y), width: Math.abs(p0.x-p1.x), rx: style.rx == undefined? this.data.rx: style.rx, ry: style.ry == undefined? this.data.ry: style.ry}
},
text: function(can, target, data) { return data.x = target.Val(svg.X)+target.Val(html.WIDTH)/2, data.y = target.Val(svg.Y)+target.Val(html.HEIGHT)/2, data },
},
- line: { // "10" y1="50" x2="110" y2="150"/>
+ line: { //
data: {points: 2, trans: {x: svg.X1, y: svg.Y1}, copy: [svg.X1, svg.Y1, svg.X2, svg.Y2]},
- grid: function(event, can, points) { var target = event.target; if (target == can.svg) { return }
+ grid: function(event, can, points) { var target = event.target; if (target == can.ui.svg) { return }
var p = points[points.length-1], pos = can.onexport.cursor(event, can, target); can.onexport.anchor(target, pos, p)
return p.target = target, p.anchor = pos, points
},
@@ -310,9 +324,8 @@ Volcanos(chat.ONFIGURE, {
return {x1: p0.x, y1: p0.y, x2: p1.x, y2: p1.y, ship: ship.length > 0? ship: undefined}
},
text: function(can, target, data) { return data.x = (target.Val(svg.X1)+target.Val(svg.X2))/2, data.y = (target.Val(svg.Y1)+target.Val(svg.Y2))/2, data },
- show: function(can, target, figure) { return "<("+(target.Val(svg.Y2)-target.Val(svg.Y1))+mdb.FS+(target.Val(svg.X2)-target.Val(svg.X1))+")"+can.onexport._position(can, target, figure) },
+ show: function(can, target, figure) { return can.onexport._position(can, target, figure)+" <("+(target.Val(svg.X2)-target.Val(svg.X1))+mdb.FS+(target.Val(svg.Y2)-target.Val(svg.Y1))+")" },
},
-
text: { // hi
data: {points: 1, copy: [html.INNER]},
draw: function(event, can, points, style) { if (event.type == "mousemove") { return }
@@ -320,41 +333,41 @@ Volcanos(chat.ONFIGURE, {
},
show: function(can, target, figure) { return can.onexport._position(can, target, figure) }
},
- block: { // "30" width="30" rx="10" ry="10" x="60" y="10"/>
+ block: { //
data: {points: 2, rx: 4, ry: 4, copy: [html.HEIGHT, html.WIDTH, svg.RX, svg.RY]},
- draw: function(event, can, points, style) {
- can._undo && can._undo(), can._temp = can.onimport.block(can, svg.G, {}, can.group)
- can._undo = function() { can._temp && can.page.Remove(can, can._temp) && delete(can._temp), delete(can._undo) }
- var target = can.onimport.block(can, svg.RECT, can.onfigure.rect.draw(event, can, points, style), can._temp)
+ draw: function(event, can, points, style) { var group = can.onaction._group(can)
+ var target = can.onimport.block(can, svg.RECT, can.onfigure.rect.draw(event, can, points, style), group)
if (event.type == html.CLICK) { can.onexport._pid(can, target), delete(can._temp) }
},
text: function(can, target, data) { can.onfigure.rect.text(can, data, target) },
},
- circle: { // "25" cy="75" r="20"/>
- data: {points: 2, trans: {height: svg.R, width: svg.R, x: svg.CX, y: svg.CY}, copy: [svg.R]},
+ circle: { //
+ data: {points: 2, trans: {x: svg.CX, y: svg.CY, height: svg.R, width: svg.R}, copy: [svg.R]},
draw: function(event, can, points) { var p0 = points[0], p1 = points[1]; return {cx: p0.x, cy: p0.y, r: parseInt(Math.sqrt(Math.pow(p0.x-p1.x, 2)+Math.pow(p0.y-p1.y, 2)))} },
},
- ellipse: { // "75" cy="75" rx="20" ry="5"/>
- data: {points: 2, trans: {height: svg.RY, width: svg.RX, x: svg.CX, y: svg.CY}, copy: [svg.RY, svg.RX]},
+ ellipse: { //
+ data: {points: 2, trans: {x: svg.CX, y: svg.CY, height: svg.RY, width: svg.RX}, copy: [svg.RY, svg.RX]},
draw: function(event, can, points) { var p0 = points[0], p1 = points[1]; return {cx: p0.x, cy: p0.y, ry: Math.abs(p0.y - p1.y), rx: Math.abs(p0.x - p1.x)} },
},
}, [])
Volcanos(chat.ONKEYMAP, {
_mode: {
- normal: {
- Escape: function(event, can) { can._undo && can._undo(), can.points = [] },
- gr: function(event, can) { can.Action(svg.GO, ctx.RUN) },
- ga: function(event, can) { can.Action(svg.GO, ice.AUTO) },
- gm: function(event, can) { can.Action(svg.GO, "manual") },
+ plugin: {
+ Escape: function(event, can) { can._undo && can._undo(), can.ui.points = [] },
+ gr: function(event, can) { can.ActionGo(ctx.RUN) },
+ ga: function(event, can) { can.ActionGo(ice.AUTO) },
+ gm: function(event, can) { can.ActionGo("manual") },
- ad: function(event, can) { can.Action(ice.MODE, web.DRAW) },
- ar: function(event, can) { can.Action(ice.MODE, web.RESIZE) },
+ ad: function(event, can) { can.ActionMode(web.DRAW) },
+ am: function(event, can) { can.ActionMode(html.MOVE) },
+ ar: function(event, can) { can.ActionMode(html.RESIZE) },
- st: function(event, can) { can.Action(svg.SHAPE, svg.TEXT) },
- sr: function(event, can) { can.Action(svg.SHAPE, svg.RECT) },
- sl: function(event, can) { can.Action(svg.SHAPE, svg.LINE) },
- sc: function(event, can) { can.Action(svg.SHAPE, svg.CIRCLE) },
- se: function(event, can) { can.Action(svg.SHAPE, svg.ELLIPSE) },
+ st: function(event, can) { can.ActionShape(svg.TEXT) },
+ sr: function(event, can) { can.ActionShape(svg.RECT) },
+ sl: function(event, can) { can.ActionShape(svg.LINE) },
+ ss: function(event, can) { can.ActionShape(svg.LINE) },
+ sc: function(event, can) { can.ActionShape(svg.CIRCLE) },
+ se: function(event, can) { can.ActionShape(svg.ELLIPSE) },
cr: function(event, can) { can.onaction._change(can, svg.STROKE, cli.RED) },
cb: function(event, can) { can.onaction._change(can, svg.STROKE, cli.BLUE) },
diff --git a/plugin/story/pie.js b/plugin/story/pie.js
index 21af511d..31d6fa8f 100644
--- a/plugin/story/pie.js
+++ b/plugin/story/pie.js
@@ -20,7 +20,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(ca
["M", x, y], ["L"].concat(pos(x, y, r, begin)), ["A", r, r, "0", span>180? "1": "0", "1"].concat(pos(x, y, r, begin+span)), ["Z"]
], lex.SP, mdb.FS),
), onmouseenter: function(event) { can.base.isFunc(cb) && cb(event) } }) }
- can.onmotion.clear(can, can.svg), can.svg.Value(mdb.COUNT, 0)
+ can.onmotion.clear(can, can.ui.svg), can.ui.svg.Value(mdb.COUNT, 0)
var begin = 0; can.core.List(can.list, function(item, index) { var p = index==which? pos(x, y, margin, begin+item.span/2): [x, y]
pie(p[0], p[1], r, begin, item.span, item.color, function(event) { can.onimport._draw(can, x, y, r, margin, index) }), begin += item.span
index == which && can.Status(item.value)
@@ -34,7 +34,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(ca
return parseInt(value)
},
layout: function(can) {
- var height = can.base.Max(can.ConfHeight(), can.ConfWidth()/2), margin = 20, r = height/2-margin; can.svg.Val(html.WIDTH, height), can.svg.Val(html.HEIGHT, height)
+ var height = can.base.Max(can.ConfHeight(), can.ConfWidth()/2), margin = 20, r = height/2-margin; can.ui.svg.Val(html.WIDTH, height), can.ui.svg.Val(html.HEIGHT, height)
can._draw = function(which) { can.onimport._draw(can, r+margin, r+margin, r, margin, which) }, can._draw(0)
},
})
diff --git a/plugin/story/spide.js b/plugin/story/spide.js
index 41add1de..7301b44a 100644
--- a/plugin/story/spide.js
+++ b/plugin/story/spide.js
@@ -16,19 +16,20 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(ca
return tree.width = can.onimport.draw(can, {shape: html.TEXT, points: [{x: 0, y: 0}], style: {inner: tree.name}}).Val(svg.TEXT_LENGTH)+can.margin
} can.core.List(tree.list, function(item) { tree.width += can.onimport._width(can, item) }); return tree.width },
_color: function(can, tree) { return tree.meta.color || (tree.list == 0? cli.PURPLE: cli.YELLOW) },
- layout: function(can) { can.page.ClassList.has(can, can._fields, html.FLOAT) || can.page.style(can, can._output, html.MAX_HEIGHT, "")
- can.svg && can.svg.Val(svg.FONT_SIZE, can.size = parseInt(can.Action(html.SIZE)||24)), can.margin = parseInt(can.Action(html.MARGIN)||10)
+ layout: function(can) {
+ // can.page.ClassList.has(can, can._fields, html.FLOAT) || can.page.style(can, can._output, html.MAX_HEIGHT, "")
+ can.ui.svg && can.ui.svg.Val(svg.FONT_SIZE, can.size = parseInt(can.Action(html.SIZE)||24)), can.margin = parseInt(can.Action(html.MARGIN)||10)
can._tree && can._tree[can.dir_root] && can.core.CallFunc(can.onaction[can.Action(html.VIEW)||"横向"], [event, can, can.Action(html.VIEW)])
},
})
Volcanos(chat.ONACTION, {list: [[html.VIEW, "横向", "纵向"], [html.SIZE, 24, 32, 48], [html.MARGIN, 10, 30, 50]],
size: function(event, can) { can.onimport.layout(can) }, margin: function(event, can) { can.onimport.layout(can) },
- "横向": function(event, can, button) { can.onimport._height(can, can._tree[can.dir_root]), can.onmotion.clear(can, can.svg)
- can.svg.Val(html.HEIGHT, can._tree[can.dir_root].height*(can.size+can.margin)+2*can.margin), can.svg.Value(svg.TEXT_ANCHOR, "start")
+ "横向": function(event, can, button) { can.onimport._height(can, can._tree[can.dir_root]), can.onmotion.clear(can, can.ui.svg)
+ can.ui.svg.Val(html.HEIGHT, can._tree[can.dir_root].height*(can.size+can.margin)+2*can.margin), can.ui.svg.Value(svg.TEXT_ANCHOR, "start")
can.onaction._draw_horizontal(can, can._tree[can.dir_root], can.margin, can.margin)
},
- "纵向": function(event, can, button) { can.onimport._width(can, can._tree[can.dir_root]), can.onmotion.clear(can, can.svg)
- can.svg.Val(html.WIDTH, can._tree[can.dir_root].width+2*can.margin), can.svg.Value(svg.TEXT_ANCHOR, "middle")
+ "纵向": function(event, can, button) { can.onimport._width(can, can._tree[can.dir_root]), can.onmotion.clear(can, can.ui.svg)
+ can.ui.svg.Val(html.WIDTH, can._tree[can.dir_root].width+2*can.margin), can.ui.svg.Value(svg.TEXT_ANCHOR, "middle")
can.onaction._draw_vertical(can, can._tree[can.dir_root], can.margin, can.margin+(can.size+can.margin)/2)
},
_draw: function(can, tree, x, y, style) { var color = can.onimport._color(can, tree)
@@ -37,7 +38,7 @@ Volcanos(chat.ONACTION, {list: [[html.VIEW, "横向", "纵向"], [html.SIZE, 24,
return can.core.ItemCB(can.ondetail, tree.view, can, tree), tree.view
},
_draw_vertical: function(can, tree, x, y) {
- tree.height = can.size+can.margin, can.onaction._draw(can, tree, tree.x = x+tree.width/2, tree.y = y); if (y+tree.height > can.svg.Val(html.HEIGHT)) { can.svg.Val(html.HEIGHT, y+tree.height) }
+ tree.height = can.size+can.margin, can.onaction._draw(can, tree, tree.x = x+tree.width/2, tree.y = y); if (y+tree.height > can.ui.svg.Val(html.HEIGHT)) { can.ui.svg.Val(html.HEIGHT, y+tree.height) }
var offset = 0; tree.hide || can.core.List(tree.list, function(item) {
can.onimport.draw(can, {shape: svg.PATH2V, points: [
{x: x+tree.width/2, y: y+tree.height/2-can.margin/2}, {x: x+offset+item.width/2, y: y+tree.height/2+8*can.margin-can.margin/2},
@@ -45,7 +46,7 @@ Volcanos(chat.ONACTION, {list: [[html.VIEW, "横向", "纵向"], [html.SIZE, 24,
})
},
_draw_horizontal: function(can, tree, x, y) { var height = can.size+can.margin
- tree.width = can.onaction._draw(can, tree, tree.x = x, tree.y = y+tree.height*(can.size+can.margin)/2).Val(svg.TEXT_LENGTH)||(tree.name.length*16); if (x+tree.width > can.svg.Val(html.WIDTH)) { can.svg.Val(html.WIDTH, x+tree.width) }
+ tree.width = can.onaction._draw(can, tree, tree.x = x, tree.y = y+tree.height*(can.size+can.margin)/2).Val(svg.TEXT_LENGTH)||(tree.name.length*16); if (x+tree.width > can.ui.svg.Val(html.WIDTH)) { can.ui.svg.Val(html.WIDTH, x+tree.width) }
var offset = 0; tree.hide || can.core.List(tree.list, function(item) {
can.onimport.draw(can, {shape: svg.PATH2H, points: [
{x: x+tree.width+can.margin/2, y: y+tree.height*height/2-can.size/4}, {x: x+tree.width+8*can.margin-can.margin/2, y: y+offset+item.height*height/2-can.size/4}
diff --git a/plugin/story/trend.js b/plugin/story/trend.js
index 2ebb4b30..abd0bc2c 100644
--- a/plugin/story/trend.js
+++ b/plugin/story/trend.js
@@ -18,7 +18,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) {
return can.db.list
},
_layout: function(can) { var height = can.onexport.height(can), width = parseInt(can.ConfWidth())
- can.onmotion.clear(can, can.svg), can.svg.Val(html.HEIGHT, height), can.svg.Val(html.WIDTH, width)
+ can.onmotion.clear(can, can.ui.svg), can.ui.svg.Val(html.HEIGHT, height), can.ui.svg.Val(html.WIDTH, width)
var margin = can.onexport.margin(can), step = parseFloat((width-2*margin) / can._msg.Length())
can.page.style(can, can._output, html.MAX_HEIGHT, "")
return {height: height, width: width, margin: margin, step: step}
@@ -59,7 +59,7 @@ Volcanos(chat.ONACTION, {list: [[html.VIEW, "趋势图", "柱状图", "折线图
var gray = can.onimport.group(can, cli.WHITE, kit.Dict(svg.STROKE, cli.GRAY, svg.FILL, cli.GRAY)); can.onimport.transform(can, gray)
var vline = can.onimport.draw(can, {shape: svg.LINE, points: [{x: 0, y: 0}, {x: 0, y: can.ConfHeight()}]}, gray)
var hline = can.onimport.draw(can, {shape: svg.LINE, points: [{x: 0, y: 0}, {x: can.ConfWidth(), y: 0}]}, gray)
- can.svg.onmousemove = function(event) { var p = can._output.getBoundingClientRect(); p = {x: event.clientX - p.x, y: event.clientY - p.y}
+ can.ui.svg.onmousemove = function(event) { var p = can._output.getBoundingClientRect(); p = {x: event.clientX - p.x, y: event.clientY - p.y}
vline.Val("x1", p.x), vline.Val("x2", p.x), hline.Val("y1", can.ConfHeight()-p.y), hline.Val("y2", can.ConfHeight()-p.y)
var item = can.db.data[parseInt((p.x - args.margin)/args.step)]
item && can.Status(item), can.Status("cursor", parseInt((can.ConfHeight()-p.y-args.margin)/(can.ConfHeight()-2*args.margin)*max))