Dialogs within Tags

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 07/10/2011 at 09:57, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   12 
Platform:   Windows  ;   
Language(s) :     C++  ;

---------
I'm trying to figure out how to create a tag plugin that also has a dialog plugin inside of it. So when a button is pressed in the tag. It launches the dialog plugin.
But I don't know how to handle the registration for something like this.

Here's my code:

#include "c4d.h"  
#include "c4d_symbols.h"  
#include "tsimpletag.h"  
  
#define TAG_PLUGIN_ID        1000003    //Be sure to use a unique ID obtained from www.plugincafe.com  
#define COMMAND_PLUGIN_ID   1000004    //Be sure to use a unique ID obtained from www.plugincafe.com  
  
  
///////////////////Dialog and Command sections /////////////////////////////  
  
class myDialog : public GeDialog  
{  
  public:  
      myDialog(void);  
      virtual Bool CreateLayout(void);  
      virtual Bool InitValues(void);  
      virtual Bool Command(LONG id,const BaseContainer &msg);  
      virtual LONG Message(const BaseContainer &msg,BaseContainer &result);  
      virtual Bool CoreMessage  (LONG id,const BaseContainer &msg);  
};  
  
  
myDialog::myDialog(void)  
{      
}  
  
Bool myDialog::CreateLayout(void)  
{  
  SetTitle("My Tag's Dialog");  
    
  GroupBegin(0,BFH_SCALEFIT,2,0,"",0);  
  {  
  AddStaticText(0,BFH_LEFT,0,0,"Hello World",0);                  
  }  
  GroupEnd();  
  
  return TRUE;  
}  
  
  
class mySimpleDialog : public CommandData   
{  
  private:  
      myDialog dlg;  
  
  public:  
      virtual Bool Execute(BaseDocument *doc);  
      virtual LONG GetState(BaseDocument *doc);  
      virtual Bool RestoreLayout(void *secret);          
};  
  
LONG mySimpleDialog::GetState(BaseDocument *doc)  
{  
  return CMD_ENABLED;  
}  
  
Bool mySimpleDialog::Execute(BaseDocument *doc)  
{      
  return dlg.Open(DLG_TYPE_ASYNC,COMMAND_PLUGIN_ID, -1, -1, 300,150);      
}  
  
Bool mySimpleDialog::RestoreLayout(void *secret)  
{  
  return dlg.RestoreLayout(COMMAND_PLUGIN_ID,0,secret);  
}  
  
  
  
  
///////////////////////// Tag Section /////////////////////////  
  
class SimpleTag : public TagData  
{  
  public:  
      virtual Bool Message(GeListNode *node, LONG type, void *t_data);  
      virtual Bool Init(GeListNode *node);  
      virtual Bool GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags);          
      virtual EXECUTIONRESULT Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags);  
        
      static NodeData *Alloc(void) { return gNew SimpleTag; }  
};  
  
Bool SimpleTag::Message(GeListNode *node, LONG type, void *data)  
{  
  switch (type)  
    {          
      case MSG_DESCRIPTION_COMMAND:                           // MSG_DESCRIPTION_COMMAND is sent when button is clicked  
      {              
          DescriptionCommand *dc = (DescriptionCommand* )data; // data contains the description ID of the button             
          LONG button = dc->id[0].id;                         // Get the ID of the button  
                        
          switch (button)                                     // Check for different button IDs  
          {  
              case BUTTON1:  
                  GePrint("Button1 was pushed");  
                  break;  
              case BUTTON2:  
                  // I want this button to launch my Command dialog  
                  break;  
          }  
      }  
    }  
  
  
  return TRUE;  
}  
  
Bool SimpleTag::Init(GeListNode *node)  
{          
  
  BaseTag    *tag  = (BaseTag* )node; // Assigns a variable to the tag's node  
  BaseContainer *data = tag->GetDataInstance(); // Assigns a variable to that node's container  
  
  return TRUE;  
}  
  
  
Bool SimpleTag::GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags)  
{   
  return TRUE;  
}  
  
EXECUTIONRESULT SimpleTag::Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags)  
{      
  return EXECUTIONRESULT_OK;  
}  
  
  
Bool RegisterSimpleTag(void)  
{  
  return RegisterTagPlugin(TAG_PLUGIN_ID, GeLoadString(IDS_SIMPLETAG),TAG_EXPRESSION|TAG_VISIBLE,SimpleTag::Alloc,"tsimpletag",AutoBitmap("myicon.tif"),0);  
}

I also need to figure out how to handle the button call that makes the dialog open.
I think the execute function I'm using in the mySimpleDialog class is wrong. And needs to be somehow placed in the Tag's Button code.
But first things first....I first need to know how to register the dialog plugin that's inside of the tag.

-ScottA

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 07/10/2011 at 11:20, xxxxxxxx wrote:

Hey ScottA,

I think your way to handle button call is not false. :)

When you will look in my thread: https://plugincafe.maxon.net/topic/6048/6199_dialog-in-dialog you will read about starting a dialog from an other. I think it is the same.

Not tested:

  
  
. . .  
  
///////////////////Dialog and Command sections /////////////////////////////  
  
class myDialog : public GeDialog  
{  
  public:  
      myDialog(void);  
      virtual Bool CreateLayout(void);  
      virtual Bool InitValues(void);  
      virtual Bool Command(LONG id,const BaseContainer &msg);  
      virtual LONG Message(const BaseContainer &msg,BaseContainer &result);  
      virtual Bool CoreMessage  (LONG id,const BaseContainer &msg);  
};  
  
  
myDialog::myDialog(void)  
{      
}  
  
Bool myDialog::CreateLayout(void)  
{  
  SetTitle("My Tag's Dialog");  
    
  GroupBegin(0,BFH_SCALEFIT,2,0,"",0);  
  {  
  AddStaticText(0,BFH_LEFT,0,0,"Hello World",0);                  
  }  
  GroupEnd();  
  
  return TRUE;  
}  
  
  
///////////////////////// Tag Section /////////////////////////  
  
class SimpleTag : public TagData  
{  
  private  
      mySimpleDialog* dlg;  
  public:  
      SimpleTag();  
      ~SimpleTag();  
      virtual Bool Message(GeListNode *node, LONG type, void *t_data);  
      virtual Bool Init(GeListNode *node);  
      virtual Bool GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags);          
      virtual EXECUTIONRESULT Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags);  
        
      static NodeData *Alloc(void) { return gNew SimpleTag; }  
};  
  
SimpleTag::SimpleTag  
{  
  dlg = NULL;  
}  
  
SimpleTag::~SimpleTag  
{  
  GeFree(dlg);  
}  
  
Bool SimpleTag::Message(GeListNode *node, LONG type, void *data)  
{  
  switch (type)  
    {          
      case MSG_DESCRIPTION_COMMAND:                           // MSG_DESCRIPTION_COMMAND is sent when button is clicked  
      {              
          DescriptionCommand *dc = (DescriptionCommand* )data; // data contains the description ID of the button             
          LONG button = dc->id[0].id;                         // Get the ID of the button  
                        
          switch (button)                                     // Check for different button IDs  
          {  
              case BUTTON1:  
                  GePrint("Button1 was pushed");  
                  break;  
              case BUTTON2:  
                  dlg.Open(DLG_TYPE_MODAL, TAG_PLUGIN_ID)  
                  // I want this button to launch my Command dialog  
                  break;  
          }  
      }  
    }  
  
  
  return TRUE;  
}  
  
Bool SimpleTag::Init(GeListNode *node)  
{          
  
  BaseTag    *tag  = (BaseTag* )node; // Assigns a variable to the tag's node  
  BaseContainer *data = tag->GetDataInstance(); // Assigns a variable to that node's container  
    
  dlg = gNew SimpleTag;  
  
  return TRUE;  
}  
  
  
Bool SimpleTag::GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags)  
{   
  return TRUE;  
}  
  
EXECUTIONRESULT SimpleTag::Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags)  
{      
  return EXECUTIONRESULT_OK;  
}  
  
  
Bool RegisterSimpleTag(void)  
{  
  return RegisterTagPlugin(TAG_PLUGIN_ID, GeLoadString(IDS_SIMPLETAG),TAG_EXPRESSION|TAG_VISIBLE,SimpleTag::Alloc,"tsimpletag",AutoBitmap("myicon.tif"),0);  
}  

You don´t need the CommandData. But if you want to use the CommandData, you can use SendModelingCommand().

Oh and you don´t registrate the CommandData anywhere.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 07/10/2011 at 12:08, xxxxxxxx wrote:

Thanks Toni.

I think you're on the right track. But I'm getting lots of errors.
Starting with the declaration of the CommandData class from within the TagData class:

  
class SimpleTag : public TagData  
{  
  private  
      mySimpleDialog *dlg; //This does not work

From there it all goes down hill because of that bad declaration.
I'm not sure how to fix this.

-ScottA

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 07/10/2011 at 12:09, xxxxxxxx wrote:

Oh my fault.  Now it should work.

. . .  
  
///////////////////Dialog and Command sections /////////////////////////////  
  
class myDialog : public GeDialog  
{  
  public:  
      myDialog(void);  
      virtual Bool CreateLayout(void);  
      virtual Bool InitValues(void);  
      virtual Bool Command(LONG id,const BaseContainer &msg);  
      virtual LONG Message(const BaseContainer &msg,BaseContainer &result);  
      virtual Bool CoreMessage  (LONG id,const BaseContainer &msg);  
};  
  
  
myDialog::myDialog(void)  
{      
}  
  
Bool myDialog::CreateLayout(void)  
{  
  SetTitle("My Tag's Dialog");  
    
  GroupBegin(0,BFH_SCALEFIT,2,0,"",0);  
  {  
  AddStaticText(0,BFH_LEFT,0,0,"Hello World",0);                  
  }  
  GroupEnd();  
  
  return TRUE;  
}  
  
  
///////////////////////// Tag Section /////////////////////////  
  
class SimpleTag : public TagData  
{  
  private  
      myDialog\* dlg;  
  public:  
      SimpleTag();  
      ~SimpleTag();  
      virtual Bool Message(GeListNode \*node, LONG type, void \*t_data);  
      virtual Bool Init(GeListNode \*node);  
      virtual Bool GetDDescription(GeListNode \*node, Description \*description,DESCFLAGS_DESC &flags);          
      virtual EXECUTIONRESULT Execute(BaseTag \*tag, BaseDocument \*doc, BaseObject \*op, BaseThread \*bt, LONG priority, EXECUTIONFLAGS flags);  
        
      static NodeData \*Alloc(void) { return gNew SimpleTag; }  
};  
  
SimpleTag::SimpleTag  
{  
  dlg = NULL;  
}  
  
SimpleTag::~SimpleTag  
{  
  GeFree(dlg);  
}  
  
Bool SimpleTag::Message(GeListNode \*node, LONG type, void \*data)  
{  
  switch (type)  
    {          
      case MSG_DESCRIPTION_COMMAND:                           // MSG_DESCRIPTION_COMMAND is sent when button is clicked  
      {              
          DescriptionCommand \*dc = (DescriptionCommand\* )data; // data contains the description ID of the button             
          LONG button = dc->id[0].id;                         // Get the ID of the button  
                        
          switch (button)                                     // Check for different button IDs  
          {  
              case BUTTON1:  
                  GePrint("Button1 was pushed");  
                  break;  
              case BUTTON2:  
                  dlg = gNew myDialog;  
                  dlg->Open(DLG_TYPE_MODAL, TAG_PLUGIN_ID);  
                  // I want this button to launch my Command dialog  
                  break;  
          }  
      }  
    }  
  
  
  return TRUE;  
}  
  
Bool SimpleTag::Init(GeListNode \*node)  
{          
  
  BaseTag    \*tag  = (BaseTag\* )node; // Assigns a variable to the tag's node  
  BaseContainer \*data = tag->GetDataInstance(); // Assigns a variable to that node's container  
    
  dlg = gNew myDialog;  
  
  return TRUE;  
}  
  
  
Bool SimpleTag::GetDDescription(GeListNode \*node, Description \*description,DESCFLAGS_DESC &flags)  
{   
  return TRUE;  
}  
  
EXECUTIONRESULT SimpleTag::Execute(BaseTag \*tag, BaseDocument \*doc, BaseObject \*op, BaseThread \*bt, LONG priority, EXECUTIONFLAGS flags)  
{      
  return EXECUTIONRESULT_OK;  
}  
  
  
Bool RegisterSimpleTag(void)  
{  
  return RegisterTagPlugin(TAG_PLUGIN_ID, GeLoadString(IDS_SIMPLETAG),TAG_EXPRESSION|TAG_VISIBLE,SimpleTag::Alloc,"tsimpletag",AutoBitmap("myicon.tif"),0);  
}

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 07/10/2011 at 12:23, xxxxxxxx wrote:

Hmmm. Nope. Still doesn't work for me.
It's probably my fault because I'm missing something simple.
Same type of declaration problems:

class SimpleTag : public TagData  
{  
  private  
      myDialog* dlg;// Does not work..Intellisense says needs a : 

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 07/10/2011 at 12:45, xxxxxxxx wrote:

Just change private to private :

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 07/10/2011 at 13:42, xxxxxxxx wrote:

Doh!
See. I knew it was something simple.:blush:
I actually figured out how to do it another way.

Here's the entire code example minus the resource stuff:

#include "c4d.h"  
#include "c4d_symbols.h"  
#include "tsimpletag.h"  
  
#define TAG_PLUGIN_ID    1000003    //Be sure to use a unique ID obtained from www.plugincafe.com  
  
///////////////////Dialog and Command sections /////////////////////////////  
  
class myDialog : public GeDialog  
{  
  public:  
      myDialog(void);  
      virtual Bool CreateLayout(void);  
      virtual Bool InitValues(void);  
      virtual Bool Command(LONG id,const BaseContainer &msg);  
      virtual LONG Message(const BaseContainer &msg,BaseContainer &result);  
      virtual Bool CoreMessage  (LONG id,const BaseContainer &msg);  
};  
  
  
myDialog::myDialog(void)  
{      
}  
  
Bool myDialog::CreateLayout(void)  
{  
  SetTitle("My Tag's Dialog");  
    
  GroupBegin(0,BFH_SCALEFIT,2,0,"",0);  
  {  
  AddStaticText(10005,BFH_LEFT,200,10,"Hello World",0);  
  AddCheckbox(10006, BFH_LEFT, 4, 4, "mycheckbox");  
  }  
  GroupEnd();  
  
  return TRUE;  
}  
  
Bool myDialog::InitValues(void)  
{  
  // first call the parent instance  
  if (!GeDialog::InitValues()) return FALSE;          
  
  SetString(10005, "Hello World");  
  SetBool(10006, FALSE);  
    
  return TRUE;  
}  
  
Bool myDialog::Command(LONG id,const BaseContainer &msg)  
{  
        
  switch (id) //id is the variable used to trigger an event   
  {  
      case 10006:              
          SetString(10005, "CheckBox is enabled");              
          break;  
  }      
  
  return TRUE;  
}  
  
  
  
Bool myDialog::CoreMessage(LONG id,const BaseContainer &msg)  
{  
  return GeDialog::CoreMessage(id,msg);  
}  
  
LONG myDialog::Message(const BaseContainer &msg,BaseContainer &result)  
{  
  
  return GeDialog::Message(msg,result);  
}  
  
  
  
///////////////////////// Tag Section /////////////////////////  
  
class SimpleTag : public TagData  
{  
  public:  
      virtual Bool Message(GeListNode *node, LONG type, void *t_data);  
      virtual Bool Init(GeListNode *node);  
      virtual Bool GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags);          
      virtual EXECUTIONRESULT Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags);  
        
      static NodeData *Alloc(void) { return gNew SimpleTag; }  
};  
  
Bool SimpleTag::Message(GeListNode *node, LONG type, void *data)  
{  
  switch (type)  
    {          
      case MSG_DESCRIPTION_COMMAND:                           // MSG_DESCRIPTION_COMMAND is sent when button is clicked  
      {              
          DescriptionCommand *dc = (DescriptionCommand* )data; // data contains the description ID of the button             
          LONG button = dc->id[0].id;                         // Get the ID of the button  
                        
          switch (button)                                     // Check for different button IDs  
          {  
              case BUTTON1:  
                  GePrint("Button1 was pushed");  
                  break;  
              case BUTTON2:  
                  myDialog *dlg = gNew myDialog;  
                  dlg->Open(DLG_TYPE_MODAL, TAG_PLUGIN_ID);  
                  break;  
          }  
      }  
    }  
  
  
  return TRUE;  
}  
  
Bool SimpleTag::Init(GeListNode *node)  
{          
  
  BaseTag    *tag  = (BaseTag* )node; // Assigns a variable to the tag's node  
  BaseContainer *data = tag->GetDataInstance(); // Assigns a variable to that node's container  
  
  return TRUE;  
}  
  
  
Bool SimpleTag::GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags)  
{   
  return TRUE;  
}  
  
EXECUTIONRESULT SimpleTag::Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags)  
{      
  return EXECUTIONRESULT_OK;  
}  
  
  
Bool RegisterSimpleTag(void)  
{  
  return RegisterTagPlugin(TAG_PLUGIN_ID, GeLoadString(IDS_SIMPLETAG),TAG_EXPRESSION|TAG_VISIBLE,SimpleTag::Alloc,"tsimpletag",AutoBitmap("myicon.tif"),0);  
}

Thanks for the help. :beer:

-ScottA