TreeView in material description
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 06/04/2004 at 00:45, xxxxxxxx wrote:
So far I found out: You always need a CustomGuiData AND an according CustomDataTypeClass with it.
I continue working on it, if I know how all of that works, I'll post a howto -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 06/04/2004 at 02:13, xxxxxxxx wrote:
Here's an example of a custom GUI: (Originally from MSA. I'm not sure if I've posted it here before.)
struct SplinePos : public CustomDataType {...} LONG convfrom[] = { ID_GV_VALUE_TYPE_REAL }; LONG convto[] = { ID_GV_VALUE_TYPE_REAL }; class MSASplinePos : public CustomDataTypeClass { INSTANCEOF(MSASplinePos,CustomDataTypeClass) public: virtual LONG GetId() { return MSA_SPLINEPOS_DATATYPE_ID; } virtual CustomDataType* AllocData() { return gNew SplinePos; }; virtual void FreeData(CustomDataType* data) { SplinePos* d = static_cast<SplinePos*>(data); gDelete(d); } virtual Bool CopyData(const CustomDataType* src, CustomDataType* dst, GeAliasTrans *aliastrans) { const SplinePos* s = static_cast<const SplinePos*>(src); SplinePos* d = static_cast<SplinePos*>(dst); if (!s || !d) return FALSE; *d = *s; return TRUE; } virtual LONG Compare(const CustomDataType* d1,const CustomDataType* d2) { const SplinePos* s1 = static_cast<const SplinePos*>(d1); const SplinePos* s2 = static_cast<const SplinePos*>(d2); if (!s1 || !s2) return FALSE; return (*s1 == *s2) ? 0 : (*s1 < *s2 ? -1 : 1); } virtual Bool WriteData(const CustomDataType *t_d,HyperFile *hf) { if (!t_d || !hf) return FALSE; const SplinePos* s = static_cast<const SplinePos*>(t_d); // level == 0 hf->WriteReal(s->m_value); hf->WriteLong(s->m_unit); return TRUE; } virtual Bool ReadData(CustomDataType *t_d, HyperFile *hf, LONG level) { if (!t_d || !hf) return FALSE; SplinePos* s = static_cast<SplinePos*>(t_d); if (level >= 0) { hf->ReadReal(&s->m_value); hf->ReadLong(&s->m_unit); } return TRUE; } virtual Bool _GetDescription(const CustomDataType *data, Description &res, LONG &flags, const BaseContainer &parentdescription, DescID *singledescid) { const SplinePos* s = static_cast<const SplinePos*>(data); if (!s) return FALSE; BaseContainer value = GetCustomDataTypeDefault(DTYPE_REAL); value.SetString(DESC_NAME, GeLoadString(MSA_SPLINEPOS_VALUE_TEXT)); value.SetLong(DESC_UNIT, UnitToFormat(s->m_unit)); res.SetParameter(DescLevel(MSA_SPLINEPOS, DTYPE_REAL, MSA_SPLINEPOS_DATATYPE_ID), value, DESCID_ROOT); BaseContainer unit = GetCustomDataTypeDefault(DTYPE_LONG); unit.SetString(DESC_NAME, GeLoadString(MSA_SPLINEPOS_UNIT_TEXT)); BaseContainer cycle; cycle.SetString(UNIT_METER, "m"); cycle.SetString(UNIT_PERCENT, "%"); cycle.SetString(UNIT_POINT, "p"); unit.SetContainer(DESC_CYCLE, cycle); res.SetParameter(DescLevel(MSA_SPLINEPOS_UNIT, DTYPE_LONG, MSA_SPLINEPOS_DATATYPE_ID), unit, DESCID_ROOT); flags |= DESCFLAGS_DESC_LOADED; return SUPER::_GetDescription(data, res, flags, parentdescription, singledescid); } virtual Bool GetParameter(const CustomDataType *data,const DescID &id,GeData &t_data,LONG &flags) { const SplinePos* s = static_cast<const SplinePos*>(data); if (!s) return FALSE; if (id[0].id == MSA_SPLINEPOS) { t_data = s->m_value; flags |= DESCFLAGS_PARAM_GET; } else if (id[0].id == MSA_SPLINEPOS_UNIT) { t_data = s->m_unit; flags |= DESCFLAGS_PARAM_GET; } return SUPER::GetParameter(data, id, t_data, flags); } virtual Bool SetDParameter(CustomDataType *data,const DescID &id,const GeData &t_data,LONG &flags) { SplinePos* s = static_cast<SplinePos*>(data); if (!s) return FALSE; if (id[0].id == MSA_SPLINEPOS) { s->m_value = t_data.GetReal(); flags |= DESCFLAGS_PARAM_SET; } else if (id[0].id == MSA_SPLINEPOS_UNIT) { s->m_unit = t_data.GetLong(); flags |= DESCFLAGS_PARAM_SET; } return SUPER::SetDParameter(data, id, t_data, flags); } virtual void GetDefaultProperties(BaseContainer &data) { data.SetLong(DESC_CUSTOMGUI, MSA_SPLINEPOS_GUI_ID); data.SetLong(DESC_ANIMATE, DESC_ANIMATE_ON); } virtual CHAR *GetResourceSym() { return "MSA_SPLINEPOS"; } virtual LONG GetConversionsFrom(LONG *&table) { table = convfrom; return sizeof(convfrom)/sizeof(LONG); } virtual GvError ConvertFromGv(LONG type, const void *const src, LONG cpu_id, CustomDataType *dst) { SplinePos* d = static_cast<SplinePos*>(dst); if (!d) return GV_CALC_ERR_NOT_VALID; switch (type) { case ID_GV_VALUE_TYPE_REAL: { d->m_value = ((Real* ) src)[cpu_id]; d->m_unit = -1; } return GV_CALC_ERR_NONE; } return SUPER::ConvertFromGv(type, src, cpu_id, dst); } virtual LONG GetConversionsTo(LONG *&table) { table = convto; return sizeof(convto)/sizeof(LONG); } virtual GvError ConvertToGv(LONG type,const CustomDataType *src,void *dst,LONG cpu_id) { const SplinePos* s = static_cast<const SplinePos*>(src); if (!s) return GV_CALC_ERR_NOT_VALID; switch (type) { case ID_GV_VALUE_TYPE_REAL: { ((Real* ) dst)[cpu_id] = s->m_value; } return GV_CALC_ERR_NONE; } return SUPER::ConvertToGv(type,src,dst,cpu_id); } }; static LONG restypetable[] = { MSA_SPLINEPOS_DATATYPE_ID }; class MSASplinePosDialog : public iCustomGui { INSTANCEOF(MSASplinePosDialog, iCustomGui) private: SplinePos m_pos; Bool m_tristate; public: MSASplinePosDialog(const BaseContainer &settings, CUSTOMGUIPLUGIN *plugin) : iCustomGui(settings, plugin), m_tristate(false), m_Settings(settings) { } virtual Bool CreateLayout (void) { return LoadDialogResource(MSA_SPLINEPOS_DIALOG, NULL, 0); } virtual Bool InitValues() { switch(m_pos.m_unit) { case UNIT_METER: SetReal(MSA_SPLINEPOS, m_pos.m_value, MINREAL, MAXREAL, 1.0, FORMAT_METER, 0.0, 0.0, FALSE, m_tristate); break; case UNIT_PERCENT: SetReal(MSA_SPLINEPOS, m_pos.m_value, MINREAL, MAXREAL, 0.01, FORMAT_PERCENT, 0.0, 0.0, FALSE, m_tristate); break; case UNIT_POINT: default: SetReal(MSA_SPLINEPOS, m_pos.m_value, MINREAL, MAXREAL, 1.0, FORMAT_REAL, 0.0, 0.0, FALSE, m_tristate); break; } SetLong(MSA_SPLINEPOS_UNIT, m_pos.m_unit); // We cannot look at the return value from SetReal()/SetLong() since it's broken in 8.503 return TRUE; } virtual Bool Command(LONG id, const BaseContainer& msg) { switch (id) { case MSA_SPLINEPOS: case MSA_SPLINEPOS_UNIT: { BaseContainer m(msg); m.SetLong(BFM_ACTION_ID, GetId()); m.RemoveData(BFM_ACTION_VALUE); m.SetData(BFM_ACTION_VALUE, GetData().GetValue()); SendParentMessage(m); break; } } return TRUE; } virtual Bool SetData(const TriState<GeData> &tristate) { SplinePos* d = static_cast<SplinePos*>( tristate.GetValue().GetCustomDataType(MSA_SPLINEPOS_DATATYPE_ID)); if (!d) return FALSE; m_pos = *d; m_tristate = tristate.GetTri(); return InitValues(); } virtual TriState<GeData> GetData() { GetLong(MSA_SPLINEPOS_UNIT, m_pos.m_unit); GetReal(MSA_SPLINEPOS, m_pos.m_value); return GeData(m_pos); } private: BaseContainer m_Settings; }; class MSASplinePosGUI : public CustomGuiData { public: virtual LONG GetId() { return MSA_SPLINEPOS_GUI_ID; } virtual CDialog* Alloc(const BaseContainer &settings) { MSASplinePosDialog* dlg = gNew MSASplinePosDialog(settings, GetPlugin()); if (!dlg) return NULL; CDialog *cdlg = dlg->Get(); if (!cdlg) return NULL; return cdlg; } virtual void Free(CDialog *dlg, void *userdata) { if (!dlg || !userdata) return; MSASplinePosDialog *sub = static_cast<MSASplinePosDialog*>(userdata); gDelete(sub); } virtual CHAR *GetResourceSym() { return "MSA_SPLINEPOS_GUI"; } virtual LONG GetResourceDataType(LONG *&table) { table = restypetable; return sizeof(restypetable)/sizeof(LONG); } }; Bool RegisterMSASplinePos() { static BaseCustomGuiLib mylib; ClearMem(&mylib,sizeof(mylib)); FillBaseCustomGui(mylib); return InstallLibrary(MSA_SPLINEPOS_GUI_ID, &mylib, 1000, sizeof(mylib)) && RegisterCustomDataTypePlugin("MSA SplinePos", 0*PLUGINFLAG_HIDE | CUSTOMDATATYPE_INFO_HASSUBDESCRIPTION | CUSTOMDATATYPE_INFO_NEEDDATAFORSUBDESC | CUSTOMDATATYPE_INFO_SUBDESCRIPTIONDISABLEGUI, gNew MSASplinePos, 0) && RegisterCustomGuiPlugin("MSA SplinePos GUI", 0*PLUGINFLAG_HIDE, gNew MSASplinePosGUI); }
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 06/04/2004 at 08:12, xxxxxxxx wrote:
With the source code I'm going on, and my plugin nearly works now. Only one problem is left: The data connection between the data type and the gui. The gui receives data with Bool iGlyphListGui::SetData( const TriState<GeData>& tristate ). I tried to understand in in the example above, I even did compile it, but in the MSA occures the same problem that I have....tristate does not contain data. Before I tried it I thought, SetData receives a GeData, so maybe within my datatype I have to wrap my data into a GeData within ConvertToGeData....but this function is never called.
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 06/04/2004 at 15:56, xxxxxxxx wrote:
Sorry, I don't understand what the problem could be. The code was literaly pasted from the latest MSA version. What do you mean by "tristate does not contain data"? That tristate.GetValue().GetType()==DA_NIL? Or that tristate.GetValue().GetCustomDataType(YOUR_ID) returns NULL?
For completeness, here's the left-out part of the code:struct SplinePos : public CustomDataType { SplinePos() : m_value(0.0), m_unit(-1) {} SplinePos(Real value, LONG unit) : m_value(value), m_unit(unit) {} SplinePos(const SplinePos& s) { *this = s; } Real m_value; LONG m_unit; const SplinePos& operator = (const SplinePos& s) { if (s.m_unit != -1) m_unit = s.m_unit; m_value = s.m_value; return *this; } operator GeData() const { return GeData(MSA_SPLINEPOS_DATATYPE_ID, *this); } String ToString() const { return "[" + RealToString(m_value * (m_unit == UNIT_PERCENT ? 100.0 : 1.0)) + " " + (m_unit == UNIT_METER ? "m" : "") + (m_unit == UNIT_PERCENT ? "pct" : "") + (m_unit == UNIT_POINT ? "p" : "") + "]"; } Bool operator<(const SplinePos& rhs) const { return m_unit != rhs.m_unit ? m_unit < rhs.m_unit : m_value != rhs.m_value ? m_value < rhs.m_value : FALSE; } Bool operator==(const SplinePos& rhs) const { return m_value == rhs.m_value && m_unit == rhs.m_unit; } };
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 06/04/2004 at 23:50, xxxxxxxx wrote:
Yes, in the MSA example the type is DA_NIL, and GetCustomDataType returns a NULL pointer. I even compiled the above code with it, the result is the same. In fact I dont understand the mechanism how it should work, to receive data, I should first somewhere have to define, what data is put into GeData, but I have no idea where!
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 07/04/2004 at 00:07, xxxxxxxx wrote:
One main problem - in my own data class - surely is, that AllocData is never called...haves no idea why
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 07/04/2004 at 01:09, xxxxxxxx wrote:
And even in the MSA example, AllocData is never called...this seems to be the reason why it doesn't work.
I call the MSA examply by
MSA_SPLINEPOS ID_TEST { }
in my container....thats ok, isn't it? -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 07/04/2004 at 02:22, xxxxxxxx wrote:
Aaaah.....
BaseContainer->InsData !
Now the AllocData is called....only my gui is now ignored -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 07/04/2004 at 02:33, xxxxxxxx wrote:
Ok....also my gui is there
And SetData seems to bew the better choice....
So now I hope I can pass data to my gui...wow what a fight Surely the second customgui I will do will be much easier -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 07/04/2004 at 04:06, xxxxxxxx wrote:
Yeeeha!
SetData
Fill in Compare and CopyTo....et voila, data reaches SetData