On 27/05/2014 at 10:08, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 13
Platform: Windows ;
Language(s) : C++ ;
---------
Can anyone tell me how to make the ToolData class communicate with it's subdialog?
I want to make the MouseInput() code do different things, depending on the options set in the tool's subdialog. But I can't get it to communicate with the dialog's gizmos.
#include "c4d.h"
#include "c4d_symbols.h"
#include "mytool.h"
#include "ge_dynamicarray.h"
#define PLUGIN_ID 12345678
enum
{
MY_BOX = 1111,
};
//////////////// The sub dialog class
class ToolDialog: public SubDialog
{
public:
virtual Bool InitDialog(void);
virtual Bool CreateLayout(void);
virtual Bool InitValues(void);
virtual Bool Command(LONG id,const BaseContainer &msg);
};
Bool ToolDialog::InitDialog(void)
{
BaseContainer *toolData = GetToolData(GetActiveDocument(), PLUGIN_ID);
if (!toolData) return FALSE;
return TRUE;
}
Bool ToolDialog::CreateLayout(void)
{
GroupBegin(0,BFV_SCALEFIT|BFH_SCALEFIT,0,4,"GUI Options",0);
GroupBorder(BORDER_GROUP_IN|BORDER_WITH_TITLE);
{
C4DGadget *g1 = AddCheckbox(MY_BOX, BFH_LEFT, 0, 0, "Enabled");
}
GroupEnd();
return TRUE;
}
Bool ToolDialog::InitValues(void)
{
SetBool(MY_BOX, FALSE);
return TRUE;
}
Bool ToolDialog::Command(LONG id, const BaseContainer &msg)
{
BaseDocument *doc = GetActiveDocument();
Bool enabled;
if(id == MY_BOX)
{
this->GetBool(MY_BOX, enabled);
GePrint("Gizmo value sent by the dialog class= " + RealToString(enabled));
}
return TRUE;
}
//////////////// The Tool class
class MyTool : public ToolData
{
public:
ToolDialog *dlg;
virtual LONG GetToolPluginId() { return PLUGIN_ID; }
virtual SubDialog *AllocSubDialog(BaseContainer *bc);
virtual Bool InitTool(BaseDocument* doc, BaseContainer& data, BaseThread* bt);
virtual const String GetResourceSymbol() { return String("mytool"); } //The name of the .res file
virtual Bool GetCursorInfo(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, Real x, Real y, BaseContainer &bc);
virtual Bool MouseInput(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, EditorWindow *win, const BaseContainer &msg);
};
Bool MyTool::InitTool(BaseDocument* doc, BaseContainer& data, BaseThread* bt)
{
return TRUE;
}
Bool MyTool::GetCursorInfo(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, Real x, Real y, BaseContainer &bc)
{
return TRUE;
}
Bool MyTool::MouseInput(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, EditorWindow *win, const BaseContainer &msg)
{
Real mx = msg.GetReal(BFM_INPUT_X);
Real my = msg.GetReal(BFM_INPUT_Y);
LONG button;
switch (msg.GetLong(BFM_INPUT_CHANNEL))
{
case BFM_INPUT_MOUSELEFT : button=KEY_MLEFT; break;
case BFM_INPUT_MOUSERIGHT: button=KEY_MRIGHT; break;
default: return TRUE;
}
BaseContainer device;
Real dx,dy;
win->MouseDragStart(button,mx,my,MOUSEDRAGFLAGS_DONTHIDEMOUSE|MOUSEDRAGFLAGS_NOMOVE);
while (win->MouseDrag(&dx,&dy,&device)==MOUSEDRAGRESULT_CONTINUE)
{
GePrint("LMB is down");
Bool enabled;
dlg->GetBool(MY_BOX, enabled); //<--------Not working!?
GePrint("Gizmo value from tool= " + LongToString(enabled)); //<--------Not working!?
DrawViews(DRAWFLAGS_ONLY_ACTIVE_VIEW|DRAWFLAGS_NO_THREAD|DRAWFLAGS_NO_ANIMATION);
}
if(win->MouseDragEnd()==MOUSEDRAGRESULT_FINISHED)
{
GePrint("LMB Was released");
doc->DoUndo(TRUE);
}
return TRUE;
}
SubDialog *MyTool::AllocSubDialog(BaseContainer *bc)
{
return gNew ToolDialog();
}
Bool RegisterMyTool()
{
return RegisterToolPlugin(PLUGIN_ID, GeLoadString(IDS_MYTOOL), 0, AutoBitmap("icon.png"),"C++ ToolData Example",gNew MyTool);
}
-ScottA