Control cursor position in EditText



  • On 28/06/2013 at 03:57, xxxxxxxx wrote:

    Hi y'all!
    I was wondering if it's possible at all to control the cursor position in a EditText field, within a GeDialog. The MultiLineEditText field has a SetMultilinePos() function, but so far I haven't figured out how to do the same with the EditText.
    The thing is, that when my plugin opens the dialog, I initialize the field with the SetString() method, which causes Cinema to highlight the whole String, instead of simply setting the cursor to the last position. Apart from the Get/Set methods there don't seem to be any more means of manipulating C4DGadgets. The GeDialog.SendMessage() looks promising, but there's no further documentation on what to put into the BaseContainer.

    Is there a way to do this at all?



  • On 28/06/2013 at 05:05, xxxxxxxx wrote:

    BFM_EDITFIELD_SETCURSORPOS might be what your are looking for. have not used it yet, but
    from the ccp sdk it looks like you have to write simply the caret position into the ID 1 of the
    message container.

    check the cpp sdk for the message id (its in BFM_Message).



  • On 28/06/2013 at 05:42, xxxxxxxx wrote:

    That looks promising! Didn't get it to work so far but I'll keep at it.



  • On 28/06/2013 at 09:16, xxxxxxxx wrote:

    Here's a script that shows how to Get & Set the cursor position in a text field.
    When you press the period key on your keyboard. A popup list opens.
    After you make a choice, it adds it to the text field. And then automatically moves the cursor to the end of the text. It's one of my favorite R13 SDK additions.

    import c4d  
    from c4d import gui  
         
    GROUP1 = 1000   #GROUP1  id  
    TEXTBOX= 1001   #TEXTBOX id  
    BUTTON = 1002   #BUTTON1 id  
      
    class ExampleDlg(gui.GeDialog) :   
      
      def CreateLayout(self) :  
      
          self.SetTitle("Simple Dialog")  
          self.GroupBegin(GROUP1, c4d.BFH_SCALEFIT|c4d.BFV_SCALEFIT, 0, 0, "Press The Period Key", c4d.BFH_SCALEFIT)  
          self.GroupBorder(c4d.BORDER_BLACK)       
          self.AddEditText(TEXTBOX, c4d.BFH_SCALEFIT)  
          self.AddButton(BUTTON, c4d.BFH_SCALE, name="Close")  
          self.GroupEnd()  
          return True  
      
      def InitValues(self) :  
          #initiate the gadgets with values  
          self.SetString(TEXTBOX, "value")  
          return True  
      
      def Command(self, id, msg) :  
          
          if id==BUTTON: self.Close()       
          
          if id==TEXTBOX:  
              text = self.GetString(TEXTBOX)   
              bc = c4d.BaseContainer(c4d.BFM_EDITFIELD_GETCURSORPOS)  #R13+ flag  
              pos = dlg.SendMessage(TEXTBOX, bc)  #Returns the current index position on the cursor in the text  
      
              if pos > 0 and text[pos-1]=='.' :  
                  entries = c4d.BaseContainer()  
                  entries.SetString(c4d.FIRST_POPUP_ID+0, "first") #The &d& code is used to grey out the entry  
                  entries.SetString(c4d.FIRST_POPUP_ID+1, "second")  
                  entries.SetString(c4d.FIRST_POPUP_ID+2, "Third")  
                  entries.SetString(c4d.FIRST_POPUP_ID+3, "Fourth")  
                  entries.SetString(c4d.FIRST_POPUP_ID+4, "Fifth") #The &c& code is used to add a checkmark to the entry  
      
                  mypopup = gui.ShowPopupDialog(cd=None, bc=entries, x=600, y=200)  
                  text += entries.GetString(mypopup)  
                  self.SetString(TEXTBOX, text)  
                  bc = c4d.BaseContainer(c4d.BFM_EDITFIELD_SETCURSORPOS)  #R13+ flag    
                  bc.SetLong(1, len(text))             #Puts the cursor at the end of the text  
                  pos = dlg.SendMessage(TEXTBOX, bc)   #Execute the cursor position code  
             
          return True  
      
    dlg = ExampleDlg()  
    dlg.Open(c4d.DLG_TYPE_ASYNC, defaultw=300, defaulth=50) 
    

    -ScottA



  • On 28/06/2013 at 09:33, xxxxxxxx wrote:

    Thats fantastic! Thanks a ton for this! I actually didn't think it would be possible because it's something so useful, yet so hidden away in the C++ SDK.
    This is gonna come in handy in the future for sure (The plugin I originally needed this for sadly got obsolete).
    I think I'll have to scan the docs for some more BFM IDs to see what else can be done. ;)


Log in to reply