From 8a62f5e633dd77f6e2d23b007bf13823e48b3088 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Mon, 6 Apr 2015 19:25:46 -0700 Subject: [PATCH] add "shadow" option to elements. see widget-shadow.js. --- README.md | 4 +- lib/widget.js | 65 +++++++++++++++++++++++++++++++- test/widget-shadow.js | 87 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 test/widget-shadow.js diff --git a/README.md b/README.md index 158cc08..135b4a7 100644 --- a/README.md +++ b/README.md @@ -426,9 +426,7 @@ The base element. - __scrollable__ - whether the element is scrollable or not. - __ch__ - background character (default is whitespace ` `). - __draggable__ - allow the element to be dragged with the mouse. -- __dockBorders__ - automatically "dock" borders with other elements instead of - overlapping, depending on position (__experimental__). see Screen - documentation of `dockBorders` option. +- __shadow__ - draw a translucent offset shadow behind the element. ##### Properties: diff --git a/lib/widget.js b/lib/widget.js index e864ed0..9f995c3 100644 --- a/lib/widget.js +++ b/lib/widget.js @@ -2036,8 +2036,8 @@ function Element(options) { this.position = options.position; this.noOverflow = options.noOverflow; - this.dockBorders = options.dockBorders; + this.shadow = options.shadow; this.style = options.style; @@ -4107,6 +4107,30 @@ Element.prototype.render = function() { } } + if (this.shadow) { + // right + y = yi + this.itop + 1; + for (; y < yl + 1; y++) { + if (!lines[y]) continue; + x = xl; + for (; x < xl + 2; x++) { + if (!lines[y][x]) continue; + lines[y][x][0] = darken(lines[y][x][0]); + lines[y].dirty = true; + } + } + // bottom + y = yl; + for (; y < yl + 1; y++) { + if (!lines[y]) continue; + for (x = xi + this.ileft + 1; x < xl; x++) { + if (!lines[y][x]) continue; + lines[y][x][0] = darken(lines[y][x][0]); + lines[y].dirty = true; + } + } + } + this.children.forEach(function(el) { if (el.screen._ci !== -1) { el.index = el.screen._ci++; @@ -8732,6 +8756,45 @@ function getAngle(x, y, lines) { return angleTable[angle] || ch; } +function darken(attr) { + var bg = attr & 0x1ff; + if (bg < 8) { + bg += 8; + } else if (bg >= 8 && bg <= 15) { + bg -= 8; + } else { + var name = colors.ncolors[bg]; + for (var i = 0; i < colors.ncolors.length; i++) { + if (name === colors.ncolors[i] && bg !== i) { + bg = i; + break; + } + } + } + attr &= ~0x1ff; + attr |= bg; + + var fg = (attr >> 9) & 0x1ff; + if (fg < 8) { + fg += 8; + } else if (fg >= 8 && fg <= 15) { + fg -= 8; + } else { + var name = colors.ncolors[fg]; + for (var i = 0; i < colors.ncolors.length; i++) { + if (name === colors.ncolors[i] && fg !== i) { + fg = i; + break; + } + } + } + + attr &= ~(0x1ff << 9); + attr |= fg << 9; + + return attr; +} + /** * Helpers */ diff --git a/test/widget-shadow.js b/test/widget-shadow.js new file mode 100644 index 0000000..9e76bcd --- /dev/null +++ b/test/widget-shadow.js @@ -0,0 +1,87 @@ +var blessed = require('../') + , screen; + +screen = blessed.screen({ + dump: __dirname + '/logs/shadow.log', + smartCSR: true, + dockBorders: true +}); + +var bg = blessed.box({ + parent: screen, + shadow: true, + left: 0, + top: 0, + right: 0, + bottom: 0, + style: { + bg: 'lightblue' + }, + content: 'Foo' +}); + +var over = blessed.box({ + parent: screen, + shadow: true, + left: 'center', + top: 'center', + width: '50%', + height: '50%', + style: { + bg: 'red' + }, + content: 'Foo' +}); + +screen.key('q', function() { + return process.exit(0); +}); + +var lorem = 'Non eram nescius Brute cum quae summis ingeniis exquisitaque' ++ ' doctrina philosophi Graeco sermone tractavissent ea Latinis litteris mandaremus' ++ ' fore ut hic noster labor in varias reprehensiones incurreret nam quibusdam et' ++ ' iis quidem non admodum indoctis totum hoc displicet philosophari quidam autem' ++ ' non tam id reprehendunt si remissius agatur sed tantum studium tamque multam' ++ ' operam ponendam in eo non arbitrantur erunt etiam et ii quidem eruditi Graecis' ++ ' litteris contemnentes Latinas qui se dicant in Graecis legendis operam malle' ++ ' consumere postremo aliquos futuros suspicor qui me ad alias litteras vocent' ++ ' genus hoc scribendi etsi sit elegans personae tamen et dignitatis esse negent' ++ ' Contra quos omnis dicendum breviter existimo Quamquam philosophiae quidem' ++ ' vituperatoribus satis responsum est eo libro quo a nobis philosophia defensa et' ++ ' collaudata est cum esset accusata et vituperata ab Hortensio qui liber cum et' ++ ' tibi probatus videretur et iis quos ego posse iudicare arbitrarer plura suscepi' ++ ' veritus ne movere hominum studia viderer retinere non posse Qui autem si maxime' ++ ' hoc placeat moderatius tamen id volunt fieri difficilem quandam temperantiam' ++ ' postulant in eo quod semel admissum coerceri reprimique non potest ut' ++ ' propemodum iustioribus utamur illis qui omnino avocent a philosophia quam his' ++ ' qui rebus infinitis modum constituant in reque eo meliore quo maior sit' ++ ' mediocritatem desiderent Sive enim ad sapientiam perveniri potest non paranda' ++ ' nobis solum ea sed fruenda etiam sapientia est sive hoc difficile est tamen nec' ++ ' modus est ullus investigandi veri nisi inveneris et quaerendi defatigatio' ++ ' turpis est cum id quod quaeritur sit pulcherrimum etenim si delectamur cum' ++ ' scribimus quis est tam invidus qui ab eo nos abducat sin laboramus quis est qui' ++ ' alienae modum statuat industriae nam ut Terentianus Chremes non inhumanus qui' ++ ' novum vicinum non vult fodere aut arare aut aliquid ferre denique non enim' ++ ' illum ab industria sed ab inliberali labore deterret sic isti curiosi quos' ++ ' offendit noster minime nobis iniucundus labor Iis igitur est difficilius satis' ++ ' facere qui se Latina scripta dicunt contemnere in quibus hoc primum est in quo' ++ ' admirer cur in gravissimis rebus non delectet eos sermo patrius cum idem' ++ ' fabellas Latinas ad verbum e Graecis expressas non inviti legant quis enim tam' ++ ' inimicus paene nomini Romano est qui Ennii Medeam aut Antiopam Pacuvii spernat' ++ ' aut reiciat quod se isdem Euripidis fabulis delectari dicat Latinas litteras' ++ ' oderit Quid si nos non interpretum fungimur munere sed tuemur ea quae dicta' ++ ' sunt ab iis quos probamus eisque nostrum iudicium et nostrum scribendi ordinem' ++ ' adiungimus quid habent cur Graeca anteponant iis quae et splendide dicta sint' ++ ' neque sint conversa de Graecis nam si dicent ab illis has res esse tractatas ne' ++ ' ipsos quidem Graecos est cur tam multos legant quam legendi sunt quid enim est' ++ ' a Chrysippo praetermissum in Stoicis legimus tamen Diogenem Antipatrum' ++ ' Mnesarchum Panaetium multos alios in primisque familiarem nostrum Posidonium' ++ ' quid Theophrastus mediocriterne delectat cum tractat locos ab Aristotele ante' ++ ' tractatos quid Epicurei num desistunt de isdem de quibus et ab Epicuro scriptum' ++ ' est et ab antiquis ad arbitrium suum scribere quodsi Graeci leguntur a Graecis' ++ ' isdem de rebus alia ratione compositis quid est cur nostri a nostris non' ++ ' legantur'; + +bg.setContent(lorem); + +screen.render();