blob: 209b3b7f6fd6e73bc604ca92ea14e7dd9c15df40 [file] [log] [blame]
<!-- The <op-sk> custom element declaration.
Attributes:
op - A deserialized JSON object that describes the operation.
Presumes ops are structured as below, where the "details" will
change based on the name of the opertion.
{
details: {
visible: true,
command: "line",
...,
}
_zoom: "1:4",
_index: 1,
_depth: 1,
}
selected - True if this op has been selected.
index - The index of this command.
prefix - An array of icons and their color to display
before the command name. The look like:
{
icon: "icons:image",
color: "green",
count: 2,
}
The count is the run-length encoding, ie. the number
of repetitions of that operation that appear.
Events:
op-toggled - This event is sent when a paper-checkbox is toggled.
The checked status and index of the op are returned in e.detail.
{
checked: false,
index: 102,
}
op-zoom - This event is sent when the zoom button is clicked.
The range to zoom to is returned in the detail as a filter
string.
"2:7"
Methods:
None.
-->
<link rel=import href="/res/imp/bower_components/paper-checkbox/paper-checkbox.html">
<link rel=import href="/res/imp/bower_components/iron-icon/iron-icon.html">
<link rel=import href="/res/imp/bower_components/iron-icons/image-icons.html">
<link rel=import href="/res/imp/bower_components/iron-icons/iron-icons.html">
<link rel=import href="/res/common/imp/details-summary.html">
<dom-module id="op-sk">
<style type="text/css" media="screen">
details-sk {
display: block;
}
.zoom {
display: none;
font-size: 12px;
padding: 0;
margin: 0 1em;
}
:host:hover .zoom {
display: inline-block;
}
:host:hover details-sk {
background-color: #eeffee;
}
details-sk[selected] {
background: #eee;
}
pre {
margin-left: 3em;
}
iron-icon {
opacity: 0.7;
margin-left: -8px;
}
details-sk div {
margin-left: 2em;
}
summary-sk {
display: block;
margin-left: 2.5em;
margin-top: -2.5em;
}
.gpuOpID {
float: right;
background: #1B9E77;
color: white;
border-radius: 5px;
padding: 0.2em 0.4em;
margin-right: 0.5em;
margin-top: -0.05em;
}
.count {
margin-left: -0.7em;
font-weight: bold;
top: 0.5em;
position: relative;
}
</style>
<template>
<details-sk selected$="{{ selected }}">
<summary-sk id=summary><paper-checkbox id=toggle checked$="{{ op.details.visible }}" on-tap="_check"></paper-checkbox>
<template is="dom-repeat" items="{{ prefix }}">
<iron-icon icon="{{ item.icon }}" style$="color: {{ item.color }};"> </iron-icon>
<template is="dom-if" if="{{ _gt1(item.count) }}">
<span class=count>{{ item.count }}</span>
</template>
</template>
<span>{{ op.details.command }}</span>
<template is="dom-if" if="{{ op._zoom }}">
<button class=zoom on-tap=_zoom>Zoom</button>
</template>
<code>{{op.details.shortDesc }}</code>
<template is="dom-repeat" items="{{ _fixList(op.details.auditTrail.Ops) }}" as=gpuOp>
<span class=gpuOpID style$="background: {{ _bgColor(gpuOp.OpListID) }}">{{ _smartNumber(gpuOp.OpListID) }}</span>
</template>
</summary-sk>
<div>
<strong>Index: </strong> <span id=index>{{ index }}</span>
</div>
<pre>
{{ _display(op) }}
</pre>
</details-sk>
</template>
</dom-module>
<script>
(function () {
var colors = [
"#1B9E77",
"#D95F02",
"#7570B3",
"#E7298A",
"#66A61E",
"#E6AB02",
"#A6761D",
"#666666"
];
Polymer({
is: "op-sk",
properties: {
op: {
type: Object,
value: function() { return {}; },
reflectToAttribute: false,
},
selected: {
type: Boolean,
value: false,
reflectToAttribute: false,
},
index: {
type: Number,
value: 0,
reflectToAttribute: true,
},
prefix: {
type: Array,
value: function() { return []; },
reflectToAttribute: false,
},
},
_display: function(op) {
return JSON.stringify(op.details, null, 2);
},
_check: function(e) {
var detail = {
checked: this.$.toggle.checked,
index: this.index,
};
this.dispatchEvent(new CustomEvent('op-toggled', { detail: detail, bubbles: true }));
e.stopPropagation();
},
_smartNumber: function(index) {
if (index == -1) {
return "...";
} else {
return index;
}
},
_bgColor: function(index) {
if (index == -1) {
return "black";
} else {
return colors[index % colors.length];
}
},
_fixList: function(list) {
if (!list) {
return
}
var ret = list.slice();
ret.reverse();
if (ret.length > 4) {
ret = [ret[0], ret[1], { OpListID: -1 }, ret[ret.length-2], ret[ret.length-1]];
}
return ret;
},
_gt1: function(n) {
return n > 1;
},
_zoom: function(e) {
this.dispatchEvent(new CustomEvent('op-zoom', { detail: this.op._zoom, bubbles: true }));
e.stopPropagation();
},
});
})();
</script>