Save selected indexes as hash + range, to not eat memory on very long lists

master
Vitaliy Filippov 2016-06-23 17:50:23 +03:00
parent 3cd3685448
commit 617d90757e
1 changed files with 11 additions and 10 deletions

21
mail.js
View File

@ -745,6 +745,11 @@ var ListWithSelection = {
selected: {}
};
},
isSelected: function(i)
{
return this.state.selected[i] || this.state.selected.begin !== undefined &&
this.state.selected.begin <= i && this.state.selected.end >= i;
},
onListKeyDown: function(ev)
{
if (!this.getTotalItems())
@ -812,19 +817,15 @@ var ListWithSelection = {
{
if (this.lastSel === undefined)
return this.selectOne(ns);
var sel = { ns: 1 };
var sel = {};
if (this.lastSel >= this.getTotalItems())
this.lastSel = this.getTotalItems()-1;
if (ns < this.lastSel)
{
for (var i = ns; i <= this.lastSel; i++)
sel[i] = true;
}
sel = { begin: ns, end: this.lastSel };
else if (ns > this.lastSel)
{
for (var i = this.lastSel; i <= ns; i++)
sel[i] = true;
}
sel = { begin: this.lastSel, end: ns };
else
sel[ns] = true;
this.setState({ selected: sel });
this.curSel = ns;
},
@ -923,7 +924,7 @@ var AttachList = React.createClass({
</div>
{this.state.attachments.map((a, i) =>
<div ref={'a'+i} title={a.name+' ('+formatBytes(a.size)+')'} key={'a'+i} data-i={i}
className={'attachment'+(this.state.selected[i] ? ' selected' : '')} onMouseDown={this.onListItemClick}>
className={'attachment'+(this.isSelected(i) ? ' selected' : '')} onMouseDown={this.onListItemClick}>
<div className="name">{a.name}</div>
<div className="size">{formatBytes(a.size)}</div>
</div>