CtrlLib: ArrayCtrl: ConvertBy

git-svn-id: svn://ultimatepp.org/upp/trunk@10968 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2017-03-23 20:25:23 +00:00
parent 0d002b4419
commit f642ab5892
2 changed files with 18 additions and 4 deletions

View file

@ -46,6 +46,15 @@ ArrayCtrl::Column& ArrayCtrl::Column::SetConvert(const Convert& c) {
return *this;
}
Column& ArrayCtrl::Column::ConvertBy(Function<Value(const Value&)> cv)
{
convertby = cv;
ClearCache();
arrayctrl->Refresh();
arrayctrl->SyncInfo();
return *this;
}
ArrayCtrl::Column& ArrayCtrl::Column::SetFormat(const char *fmt)
{
FormatConvert::SetFormat(fmt);
@ -515,7 +524,7 @@ Value ArrayCtrl::GetConvertedColumn(int i, int col) const {
LTIMING("GetConvertedColumn");
const Column& m = column[col];
Value v = GetColumn(i, col);
if(!m.convert) return v;
if(!m.convert && !m.convertby) return v;
if(m.cache.Is< Vector<String> >() && i < m.cache.Get< Vector<String> >().GetCount()) {
const String& s = m.cache.Get< Vector<String> >()[i];
if(!s.IsVoid()) return s;
@ -524,16 +533,19 @@ Value ArrayCtrl::GetConvertedColumn(int i, int col) const {
const Value& v = m.cache.Get< Vector<Value> >()[i];
if(!v.IsVoid()) return v;
}
Value r = m.convert->Format(v);
if(m.convertby)
v = m.convertby(v);
if(m.convert)
v = m.convert->Format(v);
if(m.cached) {
if(m.cache.IsEmpty())
m.cache.Create< Vector<String> >();
if(IsString(r) && m.cache.Is< Vector<String> >())
m.cache.Get< Vector<String> >().At(i, String::GetVoid()) = r;
m.cache.Get< Vector<String> >().At(i, String::GetVoid()) = v;
if(!IsString(r) && m.cache.Is< Vector<String> >())
m.cache.Create< Vector<Value> >();
if(m.cache.Is< Vector<Value> >())
m.cache.Get< Vector<Value> >().At(i) = r;
m.cache.Get< Vector<Value> >().At(i) = v;
ASSERT(m.pos.GetCount() || m.cache.IsEmpty());
}
return r;

View file

@ -57,6 +57,7 @@ public:
int index;
Mitor<int> pos;
const Convert *convert;
Function<Value(const Value&)> convertby;
Ptr<Ctrl> edit;
const Display *display;
Event<int, One<Ctrl>&> factory;
@ -88,6 +89,7 @@ public:
Column& AddIndex() { Add(arrayctrl->GetIndexCount()); arrayctrl->AddIndex(); return *this; }
Column& SetConvert(const Convert& c);
Column& ConvertBy(Function<Value(const Value&)> cv);
Column& SetFormat(const char *fmt);
Column& SetDisplay(const Display& d);
Column& NoEdit();