From ed5507be904f0fea3e19331500cba566c051f580 Mon Sep 17 00:00:00 2001 From: kohait Date: Wed, 26 Jan 2011 10:31:59 +0000 Subject: [PATCH] bazaar: ValueCtrl: using Instancer for default Value editors definition, uses WhenEnterAction; CtrlProp: major handling restructure, CtrlMover git-svn-id: svn://ultimatepp.org/upp/trunk@3100 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- bazaar/CtrlMover/CtrlMover.cpp | 64 +++++++ bazaar/CtrlMover/CtrlMover.h | 39 ++++ bazaar/CtrlMover/CtrlMover.upp | 13 ++ bazaar/CtrlMover/init | 7 + bazaar/CtrlProp/CtrlProp.h | 171 +----------------- bazaar/CtrlProp/CtrlProp.hpp | 10 - bazaar/CtrlProp/CtrlProp.upp | 9 +- .../{CtrlProp.cpp => CtrlPropCommon.cpp} | 3 +- bazaar/CtrlProp/CtrlPropCommon.h | 124 +++++++++++++ bazaar/CtrlProp/CtrlPropEdit.cpp | 125 ++++++++----- bazaar/CtrlProp/CtrlPropEdit.h | 78 ++++++++ bazaar/CtrlProp/CtrlPropEdit.lay | 15 +- bazaar/CtrlProp/init | 1 + bazaar/CtrlPropTest/CtrlPropTest.h | 31 ++-- bazaar/CtrlPropTest/CtrlPropTest.upp | 9 +- bazaar/CtrlPropTest/edit.cpp | 31 ++-- bazaar/CtrlPropTest/find.cpp | 34 ---- bazaar/CtrlPropTest/hook.cpp | 26 --- bazaar/CtrlPropTest/init | 3 +- bazaar/CtrlPropTest/main.cpp | 12 +- bazaar/ValueCtrl/ValueCtrl.cpp | 93 +++++++--- bazaar/ValueCtrl/ValueCtrl.h | 2 + bazaar/ValueCtrl/ValueCtrl.upp | 3 +- bazaar/ValueCtrl/init | 1 + 24 files changed, 534 insertions(+), 370 deletions(-) create mode 100644 bazaar/CtrlMover/CtrlMover.cpp create mode 100644 bazaar/CtrlMover/CtrlMover.h create mode 100644 bazaar/CtrlMover/CtrlMover.upp create mode 100644 bazaar/CtrlMover/init delete mode 100644 bazaar/CtrlProp/CtrlProp.hpp rename bazaar/CtrlProp/{CtrlProp.cpp => CtrlPropCommon.cpp} (84%) create mode 100644 bazaar/CtrlProp/CtrlPropCommon.h create mode 100644 bazaar/CtrlProp/CtrlPropEdit.h delete mode 100644 bazaar/CtrlPropTest/find.cpp delete mode 100644 bazaar/CtrlPropTest/hook.cpp diff --git a/bazaar/CtrlMover/CtrlMover.cpp b/bazaar/CtrlMover/CtrlMover.cpp new file mode 100644 index 000000000..1cecd6f4d --- /dev/null +++ b/bazaar/CtrlMover/CtrlMover.cpp @@ -0,0 +1,64 @@ +#include "CtrlMover.h" + +void CtrlMover::OnCtrlLeft(Ctrl& c, Point p, dword keyflags) +{ + if(&c == &rc) return; + if(&c == this) return; + Visit(c); + Action(); +} + +void CtrlMover::OnRectChange() +{ + if(IsEmpty()) return; + Get().SetRect(rc.GetData()); + Action(); +} + +void CtrlMover::OnMissed(Point p, dword keyflags) +{ + Clear(); + Action(); + LeftDown(p, keyflags); +} + +void CtrlMover::Updated() +{ + Reload(); +} + +void CtrlMover::State(int reason) +{ + if(reason != ENABLE) return; + if(!IsEnabled()) Clear(); +} + +void CtrlMover::Visit(Ctrl& c) +{ + rc.Remove(); + Add(rc.SizePos()); + V::Visit(c); +} + +void CtrlMover::Clear() +{ + V::Clear(); + rc.Remove(); +} + +void CtrlMover::Reload() +{ + V::Reload(); + rc.SetData(Get().GetRect()); +} + +CtrlMover::CtrlMover() +{ + WhenLeftDown = THISBACK(OnCtrlLeft); + + rcst = RectCtrl::StyleDefault(); + rcst.rectcol = Null; + rc.SetStyle(rcst); + rc <<= THISBACK(OnRectChange); + rc.WhenMissed = THISBACK(OnMissed); +} diff --git a/bazaar/CtrlMover/CtrlMover.h b/bazaar/CtrlMover/CtrlMover.h new file mode 100644 index 000000000..8b6f0b3fa --- /dev/null +++ b/bazaar/CtrlMover/CtrlMover.h @@ -0,0 +1,39 @@ +#ifndef _CtrlMover_CtrlMover_h +#define _CtrlMover_CtrlMover_h + +#include + +using namespace Upp; + +#include +#include +#include + +//the control mover is a layer on top of other ctrl surfaces, and can grab their Ctrls to move them. + +class CtrlMover : public CtrlFinder, public Visiting +{ +public: + typedef CtrlMover CLASSNAME; + typedef Visiting V; + CtrlMover(); + + virtual void Visit(Ctrl& c); + virtual void Clear(); + virtual void Reload(); + + virtual void State(int reason); + virtual void Updated(); + + void OnCtrlLeft(Ctrl& c, Point p, dword keyflags); + void OnMissed(Point p, dword keyflags); + +protected: + void OnRectChange(); + + RectCtrl rc; + RectCtrl::Style rcst; +}; + +#endif + diff --git a/bazaar/CtrlMover/CtrlMover.upp b/bazaar/CtrlMover/CtrlMover.upp new file mode 100644 index 000000000..97e2497d2 --- /dev/null +++ b/bazaar/CtrlMover/CtrlMover.upp @@ -0,0 +1,13 @@ +uses + CtrlLib, + CtrlFinder, + RectCtrl, + Gen; + +file + CtrlMover.h, + CtrlMover.cpp; + +mainconfig + "" = "GUI MT"; + diff --git a/bazaar/CtrlMover/init b/bazaar/CtrlMover/init new file mode 100644 index 000000000..99a31612a --- /dev/null +++ b/bazaar/CtrlMover/init @@ -0,0 +1,7 @@ +#ifndef _CtrlMover_icpp_init_stub +#define _CtrlMover_icpp_init_stub +#include "CtrlLib/init" +#include "CtrlFinder/init" +#include "RectCtrl/init" +#include "Gen/init" +#endif diff --git a/bazaar/CtrlProp/CtrlProp.h b/bazaar/CtrlProp/CtrlProp.h index af961a1cb..d49c8dd6c 100644 --- a/bazaar/CtrlProp/CtrlProp.h +++ b/bazaar/CtrlProp/CtrlProp.h @@ -1,170 +1,7 @@ -#ifndef _CtrlProp_CtrlProp_h -#define _CtrlProp_CtrlProp_h - -#include -using namespace Upp; - -enum -{ - PROPGET = 0, - PROPSET = 1, -}; - -template struct GetTyper{ - typedef bool (*H)(const C&, Value&); - typedef Gate2 Handler; - static ArrayMap& map() { static ArrayMap _; return _; } -}; -template struct SetTyper{ - typedef bool (*H)(C&, const Value&); - typedef Gate2 Handler; - static ArrayMap& map() { static ArrayMap _; return _; } -}; - -typedef Gate4 ParamHandler; -VectorMap& pmap(); -#define REGISTERPROPS(CTRL) pmap().GetAdd(String(typeid(CTRL).name())) = callback(&GetSetProp##CTRL) - -void AddToValueArray(Value& v, const Vector& k); -bool GetSetPropRecurseDone(Ctrl& c, const String& p, Value& v, int f); - -#define DEC_CTRL_PROPERTIES(CTRL) \ -bool GetSetProp##CTRL(Ctrl& c, const String& p, Value& v, int f) \ - - -#define CTRL_PROPERTIES(CTRL, BASE) \ -DEC_CTRL_PROPERTIES(CTRL); \ -DEC_CTRL_PROPERTIES(BASE); \ -INITBLOCK { REGISTERPROPS(CTRL); } \ -DEC_CTRL_PROPERTIES(CTRL) \ -{ \ - typedef CTRL _CTRL_; \ - if(0) { __base: return GetSetProp##BASE(c,p,v,f); } \ - ONCELOCK { \ - - -#define END_CTRL_PROPERTIES \ - } \ - _CTRL_* pc = dynamic_cast<_CTRL_*>(&c); \ - if(!pc) return false; \ - _CTRL_& o = *pc; \ - \ - ArrayMap::Handler>& s = SetTyper<_CTRL_>::map(); \ - ArrayMap::Handler>& g = GetTyper<_CTRL_>::map(); \ - if(f&PROPSET) \ - { \ - int i = s.Find(p); if(i>=0) return s[i](o, v); \ - } \ - else \ - { \ - int i = g.Find(p); if(i>=0) return g[i](o, v); \ - if(p == "listset") AddToValueArray(v, s.GetKeys()); \ - else if(p == "listget") AddToValueArray(v, g.GetKeys()); \ - } \ - goto __base; \ -} \ - - -#define EXT_PROPERTY_SET(CTRL, name, fset) \ - SetTyper::map().GetAdd(name) = callback((SetTyper::H)&fset); \ - - -#define EXT_PROPERTY_GET(CTRL, name, fget) \ - GetTyper::map().GetAdd(name) = callback((GetTyper::H)&fget); \ - - -#define EXT_PROPERTY(CTRL, name, fset, fget) \ - EXT_PROPERTY_SET(CTRL, name, fset) \ - EXT_PROPERTY_GET(CTRL, name, fget) \ - - -#define PROPERTY_SET(name, fset) \ - EXT_PROPERTY_SET(_CTRL_, name, fset) \ - - -#define PROPERTY_GET(name, fset) \ - EXT_PROPERTY_GET(_CTRL_, name, fset) \ - - -#define PROPERTY(name, fset, fget) \ - EXT_PROPERTY_SET(_CTRL_, name, fset) \ - EXT_PROPERTY_GET(_CTRL_, name, fget) \ - - - -#define EXT_UNPROPERTY_SET(CTRL, name) \ - SetTyper::map().RemoveKey(name); \ - -#define EXT_UNPROPERTY_GET(CTRL, name) \ - GetTyper::map().RemoveKey(name); \ - -#define EXT_UNPROPERTY(CTRL, name) \ - EXT_UNPROPERTY_SET(CTRL, name) \ - EXT_UNPROPERTY_GET(CTRL, name) \ - - -#define UNPROPERTY_SET(name, fset) \ - EXT_UNPROPERTY_SET(_CTRL_, name, fset) \ - - -#define UNPROPERTY_GET(name, fset) \ - EXT_UNPROPERTY_GET(_CTRL_, name, fset) \ - - -#define UNPROPERTY(name, fset, fget) \ - EXT_UNPROPERTY_SET(_CTRL_, name, fset) \ - EXT_UNPROPERTY_GET(_CTRL_, name, fget) \ - - -bool Property(Ctrl& c, const String& p, Value& v, int f); -inline bool SetProperty(Ctrl& c, const String& p, const Value& v) { return Property(c,p,const_cast(v),PROPSET); } -inline bool GetProperty(const Ctrl& c, const String& p, Value& v) { return Property(const_cast(c),p,v,PROPGET); } - -//helpers for editing - -#include -using namespace Upp; - -#include -#include - -VectorMap BidirProps(Ctrl& c); - -#define LAYOUTFILE -#include - -class PropList : public WithPropListLay -{ -public: - typedef PropList CLASSNAME; - PropList(); - - void Evaluate(Ctrl& e); - void PopUp(Ctrl* owner, Ctrl& e) { Evaluate(e); PopUpC::PopUp(owner); } -}; - -class PropEdit : public WithPropEditLay -{ -public: - typedef PropEdit CLASSNAME; - PropEdit(); - - virtual void Deactivate() {} //let other popups open - - void Evaluate(Ctrl& e); - void PopUp(Ctrl* owner, Ctrl& e) { Evaluate(e); PopUpC::PopUp(owner); } - - virtual void Rejector(); - virtual void Acceptor(); - -public: - void OnUpdateRow(); - - Ctrl* pe; - ArrayMap > vsav; -}; - +#ifndef _CtrlProp_CtrlProp_h_ +#define _CtrlProp_CtrlProp_h_ +#include "CtrlPropCommon.h" +#include "CtrlPropEdit.h" #endif - diff --git a/bazaar/CtrlProp/CtrlProp.hpp b/bazaar/CtrlProp/CtrlProp.hpp deleted file mode 100644 index d8e101961..000000000 --- a/bazaar/CtrlProp/CtrlProp.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _CtrlProp_CtrlProp_hpp -#define _CtrlProp_CtrlProp_hpp - -#include "CtrlProp.h" - -//type specific maps for the handlers -template ArrayMap >& wpmap() { static ArrayMap > _; return _; } -template ArrayMap >& rpmap() { static ArrayMap > _; return _; } - -#endif diff --git a/bazaar/CtrlProp/CtrlProp.upp b/bazaar/CtrlProp/CtrlProp.upp index d121bc7d5..7a9f50e19 100644 --- a/bazaar/CtrlProp/CtrlProp.upp +++ b/bazaar/CtrlProp/CtrlProp.upp @@ -3,13 +3,16 @@ description "Ctrl properties editing in a common interface, see CtrlPropTest\377 uses CtrlLib, LogPosCtrl, - ValueCtrl; + ValueCtrl, + Gen; file - CtrlProp.h, - CtrlProp.cpp, + CtrlPropCommon.h, + CtrlPropCommon.cpp, + CtrlPropEdit.h, CtrlPropEdit.cpp, CtrlPropEdit.lay, + CtrlProp.h, Props readonly separator, Ctrl.cpp, PushCtrl.cpp, diff --git a/bazaar/CtrlProp/CtrlProp.cpp b/bazaar/CtrlProp/CtrlPropCommon.cpp similarity index 84% rename from bazaar/CtrlProp/CtrlProp.cpp rename to bazaar/CtrlProp/CtrlPropCommon.cpp index fe836cfb2..945ca24cb 100644 --- a/bazaar/CtrlProp/CtrlProp.cpp +++ b/bazaar/CtrlProp/CtrlPropCommon.cpp @@ -1,4 +1,4 @@ -#include "CtrlProp.h" +#include "CtrlPropCommon.h" void AddToValueArray(Value& v, const Vector& k) { @@ -23,6 +23,7 @@ VectorMap& pmap() bool Property(Ctrl& c, const String& p, Value& v, int f) { int i = pmap().Find(String(typeid(c).name())); + if(i<0) i = pmap().Find(String(typeid(Ctrl).name())); if(i<0) return false; return pmap()[i](c,p,v,f); } diff --git a/bazaar/CtrlProp/CtrlPropCommon.h b/bazaar/CtrlProp/CtrlPropCommon.h new file mode 100644 index 000000000..bb593fed1 --- /dev/null +++ b/bazaar/CtrlProp/CtrlPropCommon.h @@ -0,0 +1,124 @@ +#ifndef _CtrlProp_CtrlPropCommon_h +#define _CtrlProp_CtrlPropCommon_h + +#include +using namespace Upp; + +enum +{ + PROPGET = 0, + PROPSET = 1, +}; + +template struct GetTyper{ + typedef bool (*H)(const C&, Value&); + typedef Gate2 Handler; + static ArrayMap& map() { static ArrayMap _; return _; } +}; +template struct SetTyper{ + typedef bool (*H)(C&, const Value&); + typedef Gate2 Handler; + static ArrayMap& map() { static ArrayMap _; return _; } +}; + +typedef Gate4 ParamHandler; +VectorMap& pmap(); +#define REGISTERPROPS(CTRL) pmap().GetAdd(String(typeid(CTRL).name())) = callback(&GetSetProp##CTRL) + +void AddToValueArray(Value& v, const Vector& k); +bool GetSetPropRecurseDone(Ctrl& c, const String& p, Value& v, int f); + +#define DEC_CTRL_PROPERTIES(CTRL) \ +bool GetSetProp##CTRL(Ctrl& c, const String& p, Value& v, int f) \ + + +#define CTRL_PROPERTIES(CTRL, BASE) \ +DEC_CTRL_PROPERTIES(CTRL); \ +DEC_CTRL_PROPERTIES(BASE); \ +INITBLOCK { REGISTERPROPS(CTRL); } \ +DEC_CTRL_PROPERTIES(CTRL) \ +{ \ + typedef CTRL _CTRL_; \ + if(0) { __base: return GetSetProp##BASE(c,p,v,f); } \ + ONCELOCK { \ + + +#define END_CTRL_PROPERTIES \ + } \ + _CTRL_* pc = dynamic_cast<_CTRL_*>(&c); \ + if(!pc) return false; \ + _CTRL_& o = *pc; \ + \ + ArrayMap::Handler>& s = SetTyper<_CTRL_>::map(); \ + ArrayMap::Handler>& g = GetTyper<_CTRL_>::map(); \ + if(f&PROPSET) \ + { \ + int i = s.Find(p); if(i>=0) return s[i](o, v); \ + } \ + else \ + { \ + int i = g.Find(p); if(i>=0) return g[i](o, v); \ + if(p == "listset") AddToValueArray(v, s.GetKeys()); \ + else if(p == "listget") AddToValueArray(v, g.GetKeys()); \ + } \ + goto __base; \ +} \ + + +#define EXT_PROPERTY_SET(CTRL, name, fset) \ + SetTyper::map().GetAdd(name) = callback((SetTyper::H)&fset); \ + + +#define EXT_PROPERTY_GET(CTRL, name, fget) \ + GetTyper::map().GetAdd(name) = callback((GetTyper::H)&fget); \ + + +#define EXT_PROPERTY(CTRL, name, fset, fget) \ + EXT_PROPERTY_SET(CTRL, name, fset) \ + EXT_PROPERTY_GET(CTRL, name, fget) \ + + +#define PROPERTY_SET(name, fset) \ + EXT_PROPERTY_SET(_CTRL_, name, fset) \ + + +#define PROPERTY_GET(name, fset) \ + EXT_PROPERTY_GET(_CTRL_, name, fset) \ + + +#define PROPERTY(name, fset, fget) \ + EXT_PROPERTY_SET(_CTRL_, name, fset) \ + EXT_PROPERTY_GET(_CTRL_, name, fget) \ + + + +#define EXT_UNPROPERTY_SET(CTRL, name) \ + SetTyper::map().RemoveKey(name); \ + +#define EXT_UNPROPERTY_GET(CTRL, name) \ + GetTyper::map().RemoveKey(name); \ + +#define EXT_UNPROPERTY(CTRL, name) \ + EXT_UNPROPERTY_SET(CTRL, name) \ + EXT_UNPROPERTY_GET(CTRL, name) \ + + +#define UNPROPERTY_SET(name, fset) \ + EXT_UNPROPERTY_SET(_CTRL_, name, fset) \ + + +#define UNPROPERTY_GET(name, fset) \ + EXT_UNPROPERTY_GET(_CTRL_, name, fset) \ + + +#define UNPROPERTY(name, fset, fget) \ + EXT_UNPROPERTY_SET(_CTRL_, name, fset) \ + EXT_UNPROPERTY_GET(_CTRL_, name, fget) \ + + +bool Property(Ctrl& c, const String& p, Value& v, int f); +inline bool SetProperty(Ctrl& c, const String& p, const Value& v) { return Property(c,p,const_cast(v),PROPSET); } +inline bool GetProperty(const Ctrl& c, const String& p, Value& v) { return Property(const_cast(c),p,v,PROPGET); } + +#endif + diff --git a/bazaar/CtrlProp/CtrlPropEdit.cpp b/bazaar/CtrlProp/CtrlPropEdit.cpp index c321ebf97..216c6675e 100644 --- a/bazaar/CtrlProp/CtrlPropEdit.cpp +++ b/bazaar/CtrlProp/CtrlPropEdit.cpp @@ -1,14 +1,13 @@ -#include "CtrlProp.h" +#include "CtrlPropEdit.h" VectorMap BidirProps(Ctrl& c) { VectorMap is; + Value vs; GetProperty(c, "listset", vs); - if(!vs.Is()) - return is; + if(!vs.Is()) return is; ValueArray vas = vs; - for(int i = 0; i < vas.GetCount(); i++) { int& m = is.GetAdd(vas.Get(i), 0); @@ -17,10 +16,8 @@ VectorMap BidirProps(Ctrl& c) Value vg; GetProperty(c, "listget", vg); - if(!vg.Is()) - return is; + if(!vg.Is()) return is; ValueArray vag = vg; - for(int i = 0; i < vag.GetCount(); i++) { int& m = is.GetAdd(vag.Get(i), 0); @@ -30,15 +27,16 @@ VectorMap BidirProps(Ctrl& c) return is; } -PropList::PropList() +PropListCtrl::PropListCtrl() { CtrlLayout(*this); - ok <<= THISBACK(Acceptor); - cancel <<= THISBACK(Rejector); } -void PropList::Evaluate(Ctrl& e) +void PropListCtrl::Reload() { + V::Reload(); + Ctrl& e = Get(); + Value v; bool b; String t; @@ -68,22 +66,38 @@ void PropList::Evaluate(Ctrl& e) sl.SetData(t); } -PropEdit::PropEdit() +PropList::PropList() +{ + SetRect(plc.GetRect()); + Add(plc.HSizePos().VSizePos(0,20)); + Add(exit.RightPos(0, 64).BottomPos(0, 20)); + exit.SetLabel("Close"); + exit <<= THISBACK(Acceptor); + //cancel <<= THISBACK(Rejector); +} + +void PropList::Acceptor() +{ + plc.Clear(); + PopUpC::Acceptor(); +} + +// + +PropEditCtrl::PropEditCtrl() { CtrlLayout(*this); - ok <<= THISBACK(Acceptor); - cancel <<= THISBACK(Rejector); - ac.AddColumn("Property"); ac.AddColumn("Value"); //ac.WhenUpdateRow = THISBACK(OnUpdateRow); } -void PropEdit::Evaluate(Ctrl& e) +void PropEditCtrl::Visit(Ctrl& e) { - pe = &e; + V::Visit(e); + ac.Clear(); - vsav.Clear(); + vsav.Clear(); VectorMap is = BidirProps(e); @@ -151,42 +165,71 @@ void PropEdit::Evaluate(Ctrl& e) break; } } + ac.Layout(); + //ac.UpdateRefresh(); } -void PropEdit::OnUpdateRow() +void PropEditCtrl::Clear() { - if(!pe) return; + V::Clear(); + ac.Clear(); + vsav.Clear(); +} + +void PropEditCtrl::Reload() +{ + V::Reload(); + Ctrl& e = Get(); + for(int i = 0; i < ac.GetCount(); i++) + { + Value v; + if(!GetProperty(e, ac.Get(i, 0), v)) continue; + ac.Set(i, 1, v); + } +} + +void PropEditCtrl::OnUpdateRow() +{ + if(IsEmpty()) return; if(!ac.IsCursor()) return; //FIXME Option Focus issue - SetProperty(*pe, ac.Get(0), ac.Get(1)); + SetProperty(Get(), ac.Get(0), ac.Get(1)); vsav.GetAdd(ac.Get(0)).a = true; //dirty - pe->UpdateRefresh(); + Action(); + Get().UpdateActionRefresh(); +} + +void PropEditCtrl::Restore() +{ + if(!IsEmpty()) + { + for(int i = 0; i < vsav.GetCount(); i++) + if(vsav[i].a) + SetProperty(Get(), vsav.GetKey(i), vsav[i].b); + } +} + + +PropEdit::PropEdit() +{ + SetRect(pec.GetRect()); + Add(pec.HSizePos().VSizePos(0,20)); + Add(ok.RightPos(60,60).BottomPos(0,20)); + Add(cancel.RightPos(0,60).BottomPos(0,20)); + ok <<= THISBACK(Acceptor); + cancel <<= THISBACK(Rejector); + ok.SetLabel("OK"); + cancel.SetLabel("Cancel"); } void PropEdit::Rejector() { - if(pe) - { - for(int i = 0; i < vsav.GetCount(); i++) - if(vsav[i].a) - SetProperty(*pe, vsav.GetKey(i), vsav[i].b); - } - pe = NULL; - ac.Clear(); - vsav.Clear(); - + pec.Restore(); + pec.Clear(); PopUpC::Rejector(); } void PropEdit::Acceptor() { - if(0 && pe) //FIXME when direct editing works, we can spare this out - { - for(int i = 0; i < ac.GetCount(); i++) - SetProperty(*pe, ac.Get(i, 0), ac.Get(i, 1)); - } - pe = NULL; - ac.Clear(); - vsav.Clear(); - + pec.Clear(); PopUpC::Acceptor(); } diff --git a/bazaar/CtrlProp/CtrlPropEdit.h b/bazaar/CtrlProp/CtrlPropEdit.h new file mode 100644 index 000000000..51b77a0ca --- /dev/null +++ b/bazaar/CtrlProp/CtrlPropEdit.h @@ -0,0 +1,78 @@ +#ifndef _CtrlProp_CtrlPropEdit_h_ +#define _CtrlProp_CtrlPropEdit_h_ + +#include "CtrlPropCommon.h" + +#include +using namespace Upp; + +#include +#include + +#include + +VectorMap BidirProps(Ctrl& c); + +#define LAYOUTFILE +#include + +class PropListCtrl : public WithPropListLay, public Visiting +{ +public: + typedef PropListCtrl CLASSNAME; + typedef Visiting V; + PropListCtrl(); + + virtual void Reload(); +}; + +class PropList : public PopUpC +{ +public: + typedef PropList CLASSNAME; + PropList(); + + void PopUp(Ctrl* owner, Ctrl& e) { plc.Visit(e); PopUpC::PopUp(owner); } + virtual void Acceptor(); + +protected: + PropListCtrl plc; + Button exit; +}; + +class PropEditCtrl : public WithPropEditLay, public Visiting +{ +public: + typedef PropEditCtrl CLASSNAME; + typedef Visiting V; + PropEditCtrl(); + + virtual void Visit(Ctrl& e); + virtual void Reload(); + virtual void Clear(); + virtual void Restore(); + +public: + void OnUpdateRow(); + ArrayMap > vsav; +}; + +class PropEdit : public PopUpC +{ +public: + typedef PropEdit CLASSNAME; + PropEdit(); + + virtual void Deactivate() {} //let other popups open + + void PopUp(Ctrl* owner, Ctrl& e) { pec.Visit(e); PopUpC::PopUp(owner); } + + virtual void Rejector(); + virtual void Acceptor(); + +protected: + PropEditCtrl pec; + Button ok, cancel; +}; + +#endif diff --git a/bazaar/CtrlProp/CtrlPropEdit.lay b/bazaar/CtrlProp/CtrlPropEdit.lay index 8ac4a148b..eb1a3b586 100644 --- a/bazaar/CtrlProp/CtrlPropEdit.lay +++ b/bazaar/CtrlProp/CtrlPropEdit.lay @@ -1,18 +1,9 @@ LAYOUT(PropListLay, 400, 200) - ITEM(DocEdit, gl, WantFocus(false).SetEditable(false).LeftPosZ(0, 168).VSizePosZ(0, 20)) - ITEM(DocEdit, sl, WantFocus(false).SetEditable(false).HSizePosZ(168, 0).VSizePosZ(0, 20)) - ITEM(Button, cancel, SetLabel(t_("Cancel")).RightPosZ(0, 56).BottomPosZ(0, 20)) - ITEM(Button, ok, SetLabel(t_("Ok")).RightPosZ(56, 56).BottomPosZ(0, 20)) + ITEM(DocEdit, gl, WantFocus(false).SetEditable(false).LeftPosZ(0, 168).VSizePosZ(0, 0)) + ITEM(DocEdit, sl, WantFocus(false).SetEditable(false).HSizePosZ(168, 0).VSizePosZ(0, 0)) END_LAYOUT LAYOUT(PropEditLay, 400, 200) - ITEM(ArrayCtrl, ac, HSizePosZ(0, 0).VSizePosZ(0, 20)) - ITEM(Button, cancel, SetLabel(t_("Cancel")).RightPosZ(0, 56).BottomPosZ(0, 20)) - ITEM(Button, ok, SetLabel(t_("Ok")).RightPosZ(56, 56).BottomPosZ(0, 20)) -END_LAYOUT - -LAYOUT(ValuePopUp, 400, 200) - ITEM(Button, ok, SetLabel(t_("OK")).RightPosZ(56, 56).BottomPosZ(0, 20)) - ITEM(Button, cancel, SetLabel(t_("Cancel")).RightPosZ(0, 56).BottomPosZ(0, 20)) + ITEM(ArrayCtrl, ac, HSizePosZ(0, 0).VSizePosZ(0, 0)) END_LAYOUT diff --git a/bazaar/CtrlProp/init b/bazaar/CtrlProp/init index ea2db2173..a249d7484 100644 --- a/bazaar/CtrlProp/init +++ b/bazaar/CtrlProp/init @@ -3,4 +3,5 @@ #include "CtrlLib/init" #include "LogPosCtrl/init" #include "ValueCtrl/init" +#include "Gen/init" #endif diff --git a/bazaar/CtrlPropTest/CtrlPropTest.h b/bazaar/CtrlPropTest/CtrlPropTest.h index eed320742..471835ecd 100644 --- a/bazaar/CtrlPropTest/CtrlPropTest.h +++ b/bazaar/CtrlPropTest/CtrlPropTest.h @@ -8,15 +8,8 @@ using namespace Upp; #define LAYOUTFILE #include +#include #include -#include -#include - -bool MyMouseHook(Ctrl *ctrl, bool inframe, int event, Point p, - int zdelta, dword keyflags); -void DoList(Ctrl& c); -void DoEdit(Ctrl& c); -bool CanEdit(); class CtrlPropTest : public WithCtrlPropTestLayout { public: @@ -26,24 +19,26 @@ public: //hook void EditCB(); - void OnCtrlLeft(Ctrl& c, Point p, dword keyflags); - void OnCtrlRight(Ctrl& c, Point p, dword keyflags); - void OnRectChange(); - void OnMissed(Point p, dword keyflags); - //misc void Test(); void InitDummies(); + //edit + void DoList(Ctrl& c); + void DoEdit(Ctrl& c); + bool CanEdit(); + + void OnCtrlRight(Ctrl& c, Point p, dword keyflags); + public: ToolBar mb; ToolBar::Item * mbi; - CtrlFinder hk; - RectCtrl rc; - RectCtrl::Style rcst; - Ptr ctrl; - Array arc; + + PropEdit pe; + PropList pl; + + CtrlMover hk; }; #endif diff --git a/bazaar/CtrlPropTest/CtrlPropTest.upp b/bazaar/CtrlPropTest/CtrlPropTest.upp index cdbc8c6b4..b75389d0c 100644 --- a/bazaar/CtrlPropTest/CtrlPropTest.upp +++ b/bazaar/CtrlPropTest/CtrlPropTest.upp @@ -3,17 +3,14 @@ description "Ctrl Properties editor, grabber, resizer..\377"; uses CtrlLib, CtrlProp, - CtrlFinder, - RectCtrl; + CtrlMover; file CtrlPropTest.h, main.cpp, edit.cpp, - find.cpp, - hook.cpp, - misc.cpp, - CtrlPropTest.lay; + CtrlPropTest.lay, + misc.cpp; mainconfig "" = "GUI MT"; diff --git a/bazaar/CtrlPropTest/edit.cpp b/bazaar/CtrlPropTest/edit.cpp index baa0a004c..66a0792ea 100644 --- a/bazaar/CtrlPropTest/edit.cpp +++ b/bazaar/CtrlPropTest/edit.cpp @@ -1,8 +1,7 @@ #include "CtrlPropTest.h" -void DoEdit(Ctrl& c) +void CtrlPropTest::DoEdit(Ctrl& c) { - PropEdit& pe = Single(); if(pe.IsOpen()) return; Ctrl* owner = Ctrl::GetActiveWindow(); @@ -12,13 +11,12 @@ void DoEdit(Ctrl& c) return; } - pe.Rejector(); pe.PopUp(owner, c); + pe.PopUp(owner, c); } -void DoList(Ctrl& c) +void CtrlPropTest::DoList(Ctrl& c) { - PropList& pe = Single(); - if(pe.IsOpen()) return; + if(pl.IsOpen()) return; Ctrl* owner = Ctrl::GetActiveWindow(); if(!owner) @@ -27,14 +25,23 @@ void DoList(Ctrl& c) return; } - pe.Rejector(); pe.PopUp(owner, c); + pl.PopUp(owner, c); } -bool CanEdit() +bool CtrlPropTest::CanEdit() { - PropEdit& pe = Single(); - if(pe.IsOpen()) return false; - PropList& pl = Single(); - if(pl.IsOpen()) return false; + if(pe.IsOpen() || pl.IsOpen()) return false; return true; } + +void CtrlPropTest::OnCtrlRight(Ctrl& c, Point p, dword keyflags) +{ +// if(&c == &rc) return; + if(&c == &hk) return; + if(!CanEdit()) return; + if(keyflags & K_SHIFT) + DoList(c); + else + DoEdit(c); +} + diff --git a/bazaar/CtrlPropTest/find.cpp b/bazaar/CtrlPropTest/find.cpp deleted file mode 100644 index 53e8f2f95..000000000 --- a/bazaar/CtrlPropTest/find.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "CtrlPropTest.h" - -void CtrlPropTest::OnCtrlLeft(Ctrl& c, Point p, dword keyflags) -{ - if(&c == &rc) return; - if(&c == &hk) return; - if(!CanEdit()) return; - rc.SetData(c.GetRect()); - Add(rc.SizePos()); - ctrl = &c; -} - -void CtrlPropTest::OnCtrlRight(Ctrl& c, Point p, dword keyflags) -{ - if(&c == &rc) return; - if(&c == &hk) return; - if(!CanEdit()) return; - if(keyflags == K_SHIFT) - DoList(c); - else - DoEdit(c); -} - -void CtrlPropTest::OnRectChange() -{ - if(!ctrl) return; - ctrl->SetRect(rc.GetData()); -} - -void CtrlPropTest::OnMissed(Point p, dword keyflags) -{ - rc.Remove(); //leave move - hk.LeftDown(p, keyflags); -} diff --git a/bazaar/CtrlPropTest/hook.cpp b/bazaar/CtrlPropTest/hook.cpp deleted file mode 100644 index 78ca999a7..000000000 --- a/bazaar/CtrlPropTest/hook.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "CtrlPropTest.h" - -bool MyMouseHook(Ctrl *ctrl, bool inframe, int event, Point p, - int zdelta, dword keyflags) -{ - if(event & (Ctrl::MOUSEMOVE | Ctrl::MOUSEENTER | Ctrl::MOUSELEAVE | Ctrl::CURSORIMAGE)) return false; - if((keyflags & K_MOUSERIGHT)) - if((keyflags & K_SHIFT_CTRL)) - { - if(!CanEdit()) return false; - - CallbackArgTarget m; - MenuBar menu; - menu.Add("List Properties",m[0]); - menu.Add("Edit Properties",m[1]); - menu.Execute(); - if(IsNull(m)) return true; - switch(m) - { - case 0: DoList(*ctrl); break; - case 1: DoEdit(*ctrl); break; - } - return true; - } - return false; -} diff --git a/bazaar/CtrlPropTest/init b/bazaar/CtrlPropTest/init index 5eaded6df..c921ad258 100644 --- a/bazaar/CtrlPropTest/init +++ b/bazaar/CtrlPropTest/init @@ -2,6 +2,5 @@ #define _CtrlPropTest_icpp_init_stub #include "CtrlLib/init" #include "CtrlProp/init" -#include "CtrlFinder/init" -#include "RectCtrl/init" +#include "CtrlMover/init" #endif diff --git a/bazaar/CtrlPropTest/main.cpp b/bazaar/CtrlPropTest/main.cpp index 11971c52c..cefebad76 100644 --- a/bazaar/CtrlPropTest/main.cpp +++ b/bazaar/CtrlPropTest/main.cpp @@ -9,10 +9,9 @@ void CtrlPropTest::EditCB() } else { - SetFocus(); //kill foucus from all others hk.Enable(); - rc.Remove(); mbi->Check(true); + SetFocus(); //kill foucus from all others } } @@ -24,19 +23,10 @@ CtrlPropTest::CtrlPropTest() THISBACK(EditCB)); AddFrame(mb); - InstallMouseHook(&MyMouseHook); - - hk.WhenLeftDown = THISBACK(OnCtrlLeft); hk.WhenRightDown = THISBACK(OnCtrlRight); hk.Disable(); Add(hk.SizePos()); - rcst = RectCtrl::StyleDefault(); - rcst.rectcol = Null; - rc.SetStyle(rcst); - rc <<= THISBACK(OnRectChange); - rc.WhenMissed = THISBACK(OnMissed); - InitDummies(); } diff --git a/bazaar/ValueCtrl/ValueCtrl.cpp b/bazaar/ValueCtrl/ValueCtrl.cpp index 09c933611..a1e7b62d5 100644 --- a/bazaar/ValueCtrl/ValueCtrl.cpp +++ b/bazaar/ValueCtrl/ValueCtrl.cpp @@ -1,39 +1,80 @@ #include "ValueCtrl.h" +Ctrl* OptionInstancer() +{ + Option* p = new Option(); p->ClickFocus(); return p; +} + +INITBLOCK +{ + VectorMap::InstancerType>& map = Instancer::Map(); + + map.Add(int(INT_V), Instancer::Typed >::GetInstancer()); + map.Add(int(DOUBLE_V), Instancer::Typed >::GetInstancer()); + map.Add(int(STRING_V), Instancer::Typed >::GetInstancer()); + map.Add(int(DATE_V), Instancer::Typed::GetInstancer()); + map.Add(int(TIME_V), Instancer::Typed::GetInstancer()); + map.Add(int(WSTRING_V),Instancer::Typed::GetInstancer()); + map.Add(int(INT64_V), Instancer::Typed< WithEnterAction >::GetInstancer()); + + //map.Add(int(BOOL_V), Instancer::Typed