Settings with MDL

* Save/load conf from localStorage
* Propagate conf to r2
This commit is contained in:
Gautier Colajanni authored and radare committed 2016-08-23 19:23:05 +02:00
1 parent 6541840adc
commit 5d18b1bf99
7 files changed
+403 -272

No files matched your search

+1
View File
@@ -44,6 +44,7 @@ material (responsive) interface
* [dialog-polyfill](https://github.com/GoogleChrome/dialog-polyfill) (BSD)
* [DataTables](https://datatables.net/) (MIT)
* [FileSaver](https://github.com/eligrey/FileSaver.js) (MIT)
* [mdl-selectfield](https://github.com/mebibou/mdl-selectfield) (MIT)
panels (desktop) interface
-----------
+2 -1
View File
@@ -22,6 +22,7 @@
"dialog-polyfill": "^0.4.3",
"datatables.net": "^1.10.12",
"datatables.net-dt": "^1.10.12",
"file-saver": "^1.3.2"
"file-saver": "^1.3.2",
"mdl-selectfield": "^1.0.2"
}
}
+2
View File
@@ -26,6 +26,7 @@ gulp.task('dependencies', ['bower'], function() {
'./vendors/material-design-lite/material.min.js',
'./vendors/dialog-polyfill/dialog-polyfill.js',
'./vendors/datatables.net/js/jquery.dataTables.min.js',
'./vendors/mdl-selectfield/dist/mdl-selectfield.min.js',
'./vendors/file-saver/FileSaver.min.js'])
.pipe(gulp.dest(DEST + 'vendors/'));
});
@@ -50,6 +51,7 @@ gulp.task('js', ['jscs'], function() {
gulp.task('cssdeps', ['bower'], function() {
gulp.src([
'./vendors/dialog-polyfill/dialog-polyfill.css',
'./vendors/mdl-selectfield/dist/mdl-selectfield.min.css',
'./vendors/material-design-lite/material.min.css'])
.pipe(gulp.dest(DEST + 'vendors/'));
+2
View File
@@ -42,6 +42,7 @@
<link rel="stylesheet" href="./vendors/material.min.css">
<link rel="stylesheet" href="./vendors/jquery.dataTables.min.css">
<link rel="stylesheet" href="./vendors/material-design-icons.css">
<link rel="stylesheet" href="./vendors/mdl-selectfield.min.css">
<link rel="stylesheet" href="./vendors/dialog-polyfill.css">
<link rel="stylesheet" href="./vendors/fonts/fonts.css">
@@ -239,6 +240,7 @@
<script type="application/javascript" src="./vendors/jquery.min.js"></script>
<script type="application/javascript" src="./vendors/jquery.dataTables.min.js"></script>
<script type="application/javascript" src="./vendors/material.min.js"></script>
<script type="application/javascript" src="./vendors/mdl-selectfield.min.js"></script>
<script type="application/javascript" src="./vendors/FileSaver.min.js"></script>
<script type="application/javascript" src="./index.js"></script>
</body>
+3 -271
View File
@@ -2,16 +2,6 @@ var update = function() {/* nop */};
var inColor = true;
var lastView = panelDisasm;
function uiButton(href, label, type) {
var classes = 'mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect ';
classes += 'mdl-color--accent mdl-color-text--accent-contrast';
if (type == 'active') {
var st = 'style="background-color:#f04040 !important"';
return '&nbsp;<a href="' + href.replace(/"/g, '\'') + '" class="' + classes + '" ' + st + '>' + label + '</a>';
}
return '&nbsp;<a href="' + href.replace(/"/g, '\'') + '" class="' + classes + '">' + label + '</a>';
}
function write() {
var str = prompt('hexpairs, quoted string or :assembly');
if (str != '') {
@@ -94,15 +84,6 @@ function analyze() {
panelDisasm();
});
}
function uiCheckList(grp, id, label) {
var output = '<li>';
ouput += '<label for="' + grp + '" class="mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect">';
ouput += '<input type="checkbox" id="' + id + '" class="mdl-checkbox__input" />';
ouput += '<span class="mdl-checkbox__label">' + label + '</span>';
ouput += '</label></li>';
return output;
}
function notes() {
var widget = widgetContainer.getWidget('Notes');
@@ -235,256 +216,12 @@ function analyzeNames() {
});
}
function smallDisasm() {
r2.cmd('e asm.bytes=false');
r2.cmd('e asm.lines=false');
r2.cmd('e asm.cmtright=false');
}
function mediumDisasm() {
r2.cmd('e asm.bytes=false');
r2.cmd('e asm.lines=true');
r2.cmd('e asm.lineswidth=8');
r2.cmd('e asm.cmtright=false');
}
function largeDisasm() {
r2.cmd('e asm.bytes=true');
r2.cmd('e asm.lines=true');
r2.cmd('e asm.lineswidth=12');
r2.cmd('e asm.cmtright=true');
}
function configPseudo() {
r2.cmd('e asm.pseudo=1');
r2.cmd('e asm.syntax=intel');
}
function configOpcodes() {
r2.cmd('e asm.pseudo=0');
r2.cmd('e asm.syntax=intel');
}
function configATT() {
r2.cmd('e asm.pseudo=0');
r2.cmd('e asm.syntax=att');
}
function panelAbout() {
r2.cmd('?V', function(version) {
alert('radare2 material webui by --pancake @ 2015-2016\n\n' + version.trim());
});
}
function configColorDefault() {
r2.cmd('ecd', function() {
update();
});
}
function configColorRandom() {
r2.cmd('ecr', function() {
update();
});
}
function configColorTheme(theme) {
r2.cmd('eco ' + theme, function() {
update();
});
}
function configPA() {
r2.cmd('e io.va=false');
}
function configVA() {
r2.cmd('e io.va=true');
}
function configDebug() {
r2.cmd('e io.va=true');
r2.cmd('e io.debug=true');
}
function configArch(name) { r2.cmd('e asm.arch=' + name); }
function configBits8() { r2.cmd('e asm.bits=8'); }
function configBits16() { r2.cmd('e asm.bits=16'); }
function configBits32() { r2.cmd('e asm.bits=32'); }
function configBits64() { r2.cmd('e asm.bits=64'); }
function configColorTrue() { inColor = true; }
function configColorFalse() { inColor = false; }
var comboId = 0;
function uiCombo(d) {
var funName = 'combo' + (++comboId);
var fun = funName + ' = function(e) {';
fun += ' var sel = document.getElementById("opt_' + funName + '");';
fun += ' var opt = sel.options[sel.selectedIndex].value;';
fun += ' switch (opt) {';
for (var a in d) {
fun += 'case "' + d[a].name + '": ' + d[a].js + '(' + d[a].name + ');break;';
}
fun += '}}';
// CSP violation here
eval(fun);
var out = '<select id="opt_' + funName + '" onchange="' + funName + '()">';
for (var a in d) {
var def = (d[a].default) ? ' default' : '';
out += '<option' + def + '>' + d[a].name + '</option>';
}
out += '</select>';
return out;
}
function uiSwitch(d) {
// TODO: not yet done
var out = d;
out += '<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="switch-1">';
out += '<input type="checkbox" id="switch-1" class="mdl-switch__input" checked />';
out += '<span class="mdl-switch__label"></span>';
out += '</label>';
return out;
}
function uiBlock(d) {
var classes = 'mdl-card__supporting-text mdl-shadow--2dp mdl-color-text--blue-grey-50 mdl-cell';
var styles = 'display:inline-block;margin:5px;color:black !important;background-color:white !important';
var out = '<div class="' + classes + '" style="' + styles + '">';
out += '<h3 style="color:black">' + d.name + '</h3>';
for (var i in d.blocks) {
var D = d.blocks[i];
out += '<br />' + D.name + ': ';
out += uiCombo(D.buttons);
}
out += '</div>';
return out;
}
function panelSettings() {
var out = '';
var widget = widgetContainer.getWidget('Settings');
var c = widgetContainer.getWidgetDOMWrapper(widget);
updates.registerMethod(widget.getOffset(), panelSettings);
c.style.backgroundColor = '#f0f0f0';
out += '<div style=\'margin:10px\'>';
out += uiBlock({ name: 'Platform', blocks: [
{ name: 'Arch', buttons: [
{ name: 'x86', js: 'configArch', default: true },
{ name: 'arm', js: 'configArch' },
{ name: 'mips', js: 'configArch' },
{ name: 'java', js: 'configArch' },
{ name: 'dalvik', js: 'configArch' },
{ name: '6502', js: 'configArch' },
{ name: '8051', js: 'configArch' },
{ name: 'h8300', js: 'configArch' },
{ name: 'hppa', js: 'configArch' },
{ name: 'i4004', js: 'configArch' },
{ name: 'i8008', js: 'configArch' },
{ name: 'lh5801', js: 'configArch' },
{ name: 'lm32', js: 'configArch' },
{ name: 'm68k', js: 'configArch' },
{ name: 'malbolge', js: 'configArch' },
{ name: 'mcs96', js: 'configArch' },
{ name: 'msp430', js: 'configArch' },
{ name: 'nios2', js: 'configArch' },
{ name: 'ppc', js: 'configArch' },
{ name: 'rar', js: 'configArch' },
{ name: 'sh', js: 'configArch' },
{ name: 'snes', js: 'configArch' },
{ name: 'sparc', js: 'configArch' },
{ name: 'spc700', js: 'configArch' },
{ name: 'sysz', js: 'configArch' },
{ name: 'tms320', js: 'configArch' },
{ name: 'v810', js: 'configArch' },
{ name: 'v850', js: 'configArch' },
{ name: 'ws', js: 'configArch' },
{ name: 'xcore', js: 'configArch' },
{ name: 'prospeller', js: 'configArch' },
{ name: 'gb', js: 'configArch' },
{ name: 'z80', js: 'configArch' },
{ name: 'arc', js: 'configArch' },
{ name: 'avr', js: 'configArch' },
{ name: 'bf', js: 'configArch' },
{ name: 'cr16', js: 'configArch' },
{ name: 'cris', js: 'configArch' },
{ name: 'csr', js: 'configArch' },
{ name: 'dcpu16', js: 'configArch' },
{ name: 'ebc', js: 'configArch' }
]},
{ name: 'Bits', buttons: [
{ name: '64', js: 'configBits64' },
{ name: '32', js: 'configBits32', default: true },
{ name: '16', js: 'configBits16' },
{ name: '8', js: 'configBits8' }
]},
{ name: 'OS', buttons: [
{ name: 'Linux', js: 'configOS_LIN', default: true },
{ name: 'Windows', js: 'configOS_W32' },
{ name: 'OSX', js: 'configOS_OSX' }
]}
]
});
out += uiBlock({ name: 'Disassembly', blocks: [
{ name: 'Size', buttons: [
{ name: 'S', js: 'smallDisasm' },
{ name: 'M', js: 'mediumDisasm' },
{ name: 'L', js: 'largeDisasm' }
]},
{ name: 'Decoding', buttons: [
{ name: 'Pseudo', js: 'configPseudo' },
{ name: 'Opcodes', js: 'configOpcodes' },
{ name: 'ATT', js: 'configATT' }
]},
{ name: 'Colors', buttons: [
{ name: 'Yes', js: 'configColorTrue', default: true },
{ name: 'No', js: 'configColorFalse' }
]},
{ name: 'Theme', buttons: [
{ name: 'Default', js: 'configColorDefault' },
{ name: 'Random', js: 'configColorRandom' },
{ name: 'Solarized', js: 'configColorTheme("solarized")' },
{ name: 'Ogray', js: 'configColorTheme("ogray")' },
{ name: 'Twilight', js: 'configColorTheme("twilight")' },
{ name: 'Rasta', js: 'configColorTheme("rasta")' },
{ name: 'Tango', js: 'configColorTheme("tango")' },
{ name: 'White', js: 'configColorTheme("white")' }
]}
]});
out += uiBlock({ name: 'Core/IO', blocks: [
{
name: 'Mode', buttons: [
{ name: 'PA', js: 'configPA' },
{ name: 'VA', js: 'configVA' },
{ name: 'Debug', js: 'configDebug' }
]
}
]});
out += uiBlock({ name: 'Analysis', blocks: [
{
name: 'HasNext', buttons: [
{ name: 'Yes', js: 'configAnalHasnextTrue', default: true },
{ name: 'No', js: 'configAnalHasnextFalse' }
]
}, {
name: 'Skip Nops', buttons: [
{ name: 'Yes', js: 'configAnalNopskipTrue', default: true },
{ name: 'No', js: 'configAnalNopskipFalse' }
]
}, {
name: 'NonCode', buttons: [
{ name: 'Yes', js: 'configAnalNoncodeTrue' },
{ name: 'No', js: 'configAnalNoncodeFalse', default: true }
]
}
]});
out += '</div>';
c.innerHTML = out;
}
function panelFunctions() {
var widget = widgetContainer.getWidget('Functions');
widget.setDark();
@@ -741,14 +478,6 @@ function down() {
update();
}
function uiRoundButton(a, b, c) {
var out = '';
out += '<button onclick=' + a + ' class="mdl-button mdl-js-button mdl-button--fab mdl-js-ripple-effect" ' + c + '>';
out += '<i class="material-icons" style="opacity:1">' + b + '</i>';
out += '</button>';
return out;
}
var nativeDebugger = false;
function srpc() {
@@ -1018,6 +747,9 @@ function ready() {
}
twice = true;
// Loading configuration from localStorage (see panelSettings)
applyConf();
updates = new UpdateManager();
lastViews = new UpdateManager();
+149
View File
@@ -0,0 +1,149 @@
function uiButton(href, label, type) {
var classes = 'mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect ';
classes += 'mdl-color--accent mdl-color-text--accent-contrast';
if (type == 'active') {
var st = 'style="background-color:#f04040 !important"';
return '&nbsp;<a href="' + href.replace(/"/g, '\'') + '" class="' + classes + '" ' + st + '>' + label + '</a>';
}
return '&nbsp;<a href="' + href.replace(/"/g, '\'') + '" class="' + classes + '">' + label + '</a>';
}
function uiCheckList(grp, id, label) {
var output = '<li>';
ouput += '<label for="' + grp + '" class="mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect">';
ouput += '<input type="checkbox" id="' + id + '" class="mdl-checkbox__input" />';
ouput += '<span class="mdl-checkbox__label">' + label + '</span>';
ouput += '</label></li>';
return output;
}
var comboId = 0;
function uiCombo(d) {
var funName = 'combo' + (++comboId);
var fun = funName + ' = function(e) {';
fun += ' var sel = document.getElementById("opt_' + funName + '");';
fun += ' var opt = sel.options[sel.selectedIndex].value;';
fun += ' switch (opt) {';
for (var a in d) {
fun += 'case "' + d[a].name + '": ' + d[a].js + '(' + d[a].name + ');break;';
}
fun += '}}';
// CSP violation here
eval(fun);
var out = '<select id="opt_' + funName + '" onchange="' + funName + '()">';
for (var a in d) {
var def = (d[a].default) ? ' default' : '';
out += '<option' + def + '>' + d[a].name + '</option>';
}
out += '</select>';
return out;
}
/**
* Add a switch, with a name "label", define default state by isChecked
* callbacks are bound when un-checked.
*/
var idSwitch = 0;
function uiSwitch(dom, name, isChecked, onChange) {
var id = 'switch-' + (++idSwitch);
var label = document.createElement('label');
label.className = 'mdl-switch mdl-js-switch mdl-js-ripple-effect';
label.for = id;
dom.appendChild(label);
var input = document.createElement('input');
input.type = 'checkbox';
input.className = 'mdl-switch__input';
input.checked = isChecked;
input.id = id;
label.appendChild(input);
input.addEventListener('change', function(evt) {
onChange(name, evt.target.checked);
});
var span = document.createElement('span');
span.className = 'mdl-switch__label';
span.innerHTML = name;
label.appendChild(span);
}
function uiActionButton(dom, action, label) {
var button = document.createElement('a');
button.href = '#';
button.innerHTML = label;
button.addEventListener('click', action);
dom.appendChild(button);
var classes = 'mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect ';
classes += 'mdl-color--accent mdl-color-text--accent-contrast';
button.className = classes;
button.style.margin = '3px';
}
var selectId = 0;
function uiSelect(dom, name, list, defaultOffset, onChange) {
var id = 'select-' + (++selectId);
var div = document.createElement('div');
div.className = 'mdl-selectfield mdl-js-selectfield mdl-selectfield--floating-label';
dom.appendChild(div);
var select = document.createElement('select');
select.className = 'mdl-selectfield__select';
select.id = id;
select.name = id;
div.appendChild(select);
for (var i = 0 ; i < list.length ; i++) {
var option = document.createElement('option');
option.innerHTML = list[i];
option.value = list[i];
select.appendChild(option);
if (i === defaultOffset) {
option.selected = true;
}
}
select.addEventListener('change', function(evt) {
onChange(evt.target.value);
});
var label = document.createElement('label');
label.className = 'mdl-selectfield__label';
label.for = id;
label.innerHTML = name;
div.appendChild(label);
}
// function uiSwitch(d) {
// // TODO: not yet done
// var out = d;
// out += '<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="switch-1">';
// out += '<input type="checkbox" id="switch-1" class="mdl-switch__input" checked />';
// out += '<span class="mdl-switch__label"></span>';
// out += '</label>';
// return out;
// }
function uiBlock(d) {
var classes = 'mdl-card__supporting-text mdl-shadow--2dp mdl-color-text--blue-grey-50 mdl-cell';
var styles = 'display:inline-block;margin:5px;color:black !important;background-color:white !important';
var out = '';
for (var i in d.blocks) {
var D = d.blocks[i];
out += '<br />' + D.name + ': ';
out += uiCombo(D.buttons);
}
return out;
}
function uiRoundButton(a, b, c) {
var out = '';
out += '<button onclick=' + a + ' class="mdl-button mdl-js-button mdl-button--fab mdl-js-ripple-effect" ' + c + '>';
out += '<i class="material-icons" style="opacity:1">' + b + '</i>';
out += '</button>';
return out;
}
+244
View File
@@ -0,0 +1,244 @@
function getConf(confKey) {
var local = localStorage.getItem(confKey.name);
if (local !== null) {
if (local === 'false') {
local = false;
} else if (local === 'true') {
local = true;
}
return local;
} else {
return confKey.defVal;
}
}
function saveConf(confKey, val) {
localStorage.setItem(confKey.name, val);
confKey.apply(val);
}
function applyConf(force) {
force = (typeof force === 'undefined') ? false : force;
for (var item in R2Conf) {
var cnf = R2Conf[item];
if ((!force && getConf(cnf) !== cnf.defVal) || force) {
cnf.apply(getConf(cnf));
}
}
}
function resetConf() {
for (var item in R2Conf) {
var cnf = R2Conf[item];
localStorage.removeItem(cnf.name);
}
applyConf(true);
}
var R2Conf = {
platform: { name: 'platform', defVal: 'x86', apply: function(p) { r2.cmd('e asm.arch=' + p); } },
bits: { name: 'bits', defVal: '32', apply: function(p) { r2.cmd('e asm.bits=' + p); } },
os: { name: 'os', defVal: 'Linux', apply: function(p) { console.log('OS is now: ' + p); } }, // missing
size: { name: 'size', defVal: 'S', apply: function(p) {
switch (p) {
case 'S':
r2.cmd('e asm.bytes=false');
r2.cmd('e asm.lines=false');
r2.cmd('e asm.cmtright=false');
break;
case 'M':
r2.cmd('e asm.bytes=false');
r2.cmd('e asm.lines=true');
r2.cmd('e asm.lineswidth=8');
r2.cmd('e asm.cmtright=false');
break;
case 'L':
r2.cmd('e asm.bytes=true');
r2.cmd('e asm.lines=true');
r2.cmd('e asm.lineswidth=12');
r2.cmd('e asm.cmtright=true');
break;
};
}
},
decoding: { name: 'decoding', defVal: 'Pseudo', apply: function(p) {
switch (p) {
case 'Pseudo':
r2.cmd('e asm.pseudo=1');
r2.cmd('e asm.syntax=intel');
break;
case 'Opcodes':
r2.cmd('e asm.pseudo=0');
r2.cmd('e asm.syntax=intel');
break;
case 'ATT':
r2.cmd('e asm.pseudo=0');
r2.cmd('e asm.syntax=att');
break;
};
}
},
mode: { name: 'mode', defVal: 'PA', apply: function(p) {
switch (p) {
case 'PA':
r2.cmd('e io.va=false');
break;
case 'VA':
r2.cmd('e io.va=true');
break;
case 'Debug':
r2.cmd('e io.va=true');
r2.cmd('e io.debug=true');
break;
};
}
},
analHasNext: { name: 'analHasNext', defVal: true, apply: function(p) { console.log('analHasNext is ' + p); } },
analSkipNops: { name: 'analSkipNops', defVal: true, apply: function(p) { console.log('analSkipNops is ' + p); } },
analNonCode: { name: 'analNonCode', defVal: false, apply: function(p) { console.log('analNonCode is ' + p); } },
colors: { name: 'colors', defVal: true, apply: function(p) { inColor = p; } },
theme: { name: 'theme', defVal: 'none', apply: function(p) { r2.cmd('eco ' + p); } } // TODO
};
function panelSettings() {
var widget = widgetContainer.getWidget('Settings');
var c = widgetContainer.getWidgetDOMWrapper(widget);
c.innerHTML = '';
updates.registerMethod(widget.getOffset(), panelSettings);
var grid = document.createElement('div');
grid.className = 'mdl-grid';
c.appendChild(grid);
var platform = createGrid(grid, 'Platform');
drawPlatform(platform);
var disassembly = createGrid(grid, 'Disassembly');
drawDisassembly(disassembly);
var coreio = createGrid(grid, 'Core/IO');
drawCoreIO(coreio);
var analysis = createGrid(grid, 'Analysis');
drawAnalysis(analysis);
var colors = createGrid(grid, 'Colors');
drawColors(colors);
var reset = createGrid(grid, 'Reset configuration');
uiActionButton(reset, function() {
resetConf();
update();
}, 'RESET');
componentHandler.upgradeDom();
}
function savedFromList(list, name, defaultOffset) {
var value = defaultOffset;
var saved = localStorage.getItem(name);
if (saved !== null) {
value = list.indexOf(saved);
}
return value;
}
function drawPlatform(dom) {
var archs = ['x86', 'arm', 'mips', 'java', 'dalvik', '6502', '8051', 'h8300', 'hppa', 'i4004', 'i8008', 'lh5801',
'lm32', 'm68k', 'malbolge', 'mcs96', 'msp430', 'nios2', 'ppc', 'rar', 'sh', 'snes', 'sparc', 'spc700', 'sysz',
'tms320', 'v810', 'v850', 'ws', 'xcore', 'prospeller', 'gb', 'z80', 'arc', 'avr', 'bf', 'cr16', 'cris', 'csr',
'dcpu16', 'ebc'];
uiSelect(dom, 'Platform', archs, archs.indexOf(getConf(R2Conf.platform)), function(item) {
saveConf(R2Conf.platform, item);
});
var bits = ['64', '32', '16', '8'];
uiSelect(dom, 'Bits', bits, bits.indexOf(getConf(R2Conf.bits)), function(item) {
saveConf(R2Conf.bits, item);
});
var os = ['Linux', 'Windows', 'OSX'];
uiSelect(dom, 'OS', os, os.indexOf(getConf(R2Conf.os)), function(item) {
saveConf(R2Conf.os, item);
});
}
function drawDisassembly(dom) {
var sizes = ['S', 'M', 'L'];
uiSelect(dom, 'Size', sizes, sizes.indexOf(getConf(R2Conf.size)), function(item) {
saveConf(R2Conf.size, item);
});
var decoding = ['Pseudo', 'Opcodes', 'ATT'];
uiSelect(dom, 'Decoding', decoding, decoding.indexOf(getConf(R2Conf.decoding)), function(item) {
saveConf(R2Conf.decoding, item);
});
}
function drawCoreIO(dom) {
var mode = ['PA', 'VA', 'Debug'];
uiSelect(dom, 'Mode', mode, mode.indexOf(getConf(R2Conf.mode)), function(item) {
saveConf(R2Conf.mode, item);
});
}
function drawAnalysis(dom) {
var configAnal = function(param, state, conf) {
saveConf(conf, state);
};
uiSwitch(dom, 'HasNext', getConf(R2Conf.analHasNext), function(param, state) {
return configAnal(param, state, R2Conf.analHasNext);
});
uiSwitch(dom, 'Skip Nops', getConf(R2Conf.analSkipNops), function(param, state) {
return configAnal(param, state, R2Conf.analSkipNops);
});
uiSwitch(dom, 'NonCode', getConf(R2Conf.analNonCode), function(param, state) {
return configAnal(param, state, R2Conf.analNonCode);
});
}
function drawColors(dom) {
var colors;
r2.cmdj('ecoj', function(data) {
colors = data;
});
uiSwitch(dom, 'Colors', getConf(R2Conf.colors), function(param, state) {
saveConf(R2Conf.colors, state);
});
// Randomize
uiActionButton(dom, function() {
r2.cmd('ecr', function() {
update();
});
}, 'Randomize');
// Set default
uiActionButton(dom, function() {
r2.cmd('ecd', function() {
update();
});
}, 'Reset colors');
uiSelect(dom, 'Theme', colors, colors.indexOf(getConf(R2Conf.theme)), function(theme) {
saveConf(R2Conf.theme, theme);
});
}
function createGrid(dom, name) {
var div = document.createElement('div');
div.className = 'mdl-cell mdl-color--white mdl-shadow--2dp mdl-cell--4-col';
div.style.padding = '10px';
dom.appendChild(div);
var title = document.createElement('span');
title.className = 'mdl-layout-title';
title.innerHTML = name;
div.appendChild(title);
var content = document.createElement('div');
div.appendChild(content);
return content;
}