Your Digital Media Has Never Looked So Good

 
michelperez
Topic Author
Posts: 6
Joined: Mon Feb 18, 2019 4:41 pm

How to expose fields obtained inside screen to main thread for a SignIn component

Mon Feb 18, 2019 4:58 pm

Hi, I'm trying to create a SignIn component, but once I get username and password from the user in my component I can't "export" them back to the main thread. This is what I'm trying right now:
<component name = "SignInScene" extends = "Scene" >
  <script type = "text/brightscript" >
    <![CDATA[
    sub init()
       m.communicator = m.top.findNode("communicator")
       m.communicator.addField("password", "roString", true)
       ...
    end sub

    sub onPasswordKeyboardBtnSelected(roEvent)
      if roEvent.getData() = 0 then
         if m.password <> "" and m.password <> invalid then
             m.communicator.setField("password", m.password)
             ...
         end if
      end if
    end sub

    <children>
      <Label id="communicator"/>
    </children>
</component>


Now, in main.brs I have:

    screen = CreateObject("roSGScreen")
    m.port = [i]CreateObject[/i]("roMessagePort")
    screen.setMessagePort(m.port)
    scene = screen.CreateScene("SignInScene")
    screen.Show()
    
    scene.findNode("communicator").observeField("password", m.port)
    
     while (true)
        msg = wait(0, m.port)
        msgType = type(msg)
        LogToConsole(msgType)
    
        if msgType = "roSGScreenEvent"
          if msg.isScreenClosed() then return
        end if
      end while


When I set field "password" and I try a `getField` after that I get `invalid`, also nothing is caught in the main thread. Basically what I want is a way to pass login data out of the component. Is this the better approach? What am I doing wrong?

Thanks!!
 
renojim
** Valued Community Member **
Posts: 3490
Joined: Mon Feb 15, 2010 1:35 pm

Re: How to expose fields obtained inside screen to main thread for a SignIn component

Tue Feb 19, 2019 1:09 am

I think you're making it more complicated than it needs to be.  Just set the label's text value to the password/username.
<children>
   <Label id="password" translation="[0,0]" text="" visible="false" />
</children>

password = m.top.findNode("password")
...
password.text = "user's password"

In your main thread:
sg = createObject("roSGScreen")
scene = sg.createScene("SignInScene")
sg.Show()
sg.setMessagePort(m.port)
password = scene.findNode("password")
password.observeField("text", m.port)
while(true)
   msg = wait(0,m.port)
   msgType = type(msg)
   print "msgType: ";msgType

   if msgType = "roSGScreenEvent" then
      if msg.isScreenClosed() then
         print "isScreenClosed"
         exit while
      end if
   else if msgType = "roSGNodeEvent" then
      passwordText = password.text
   end if
end while

I hope that's enough to get the point across.  It may not be the best approach, but it works for me.

-JT
 
michelperez
Topic Author
Posts: 6
Joined: Mon Feb 18, 2019 4:41 pm

Re: How to expose fields obtained inside screen to main thread for a SignIn component

Tue Feb 19, 2019 9:57 am

Hi [color=inherit]renojim,[/color]

Thank you so much!!, that worked like a charm, you are the man!. For some reason I had a hard time finding an answer for this, which seems an obvious workflow, Roku samples from the guide are incomplete they show you how to create a keyboard component or a pin dialog but they don't mention how to interact with it, docs are lacking on that area.

Thanks!!!!

Who is online

Users browsing this forum: No registered users and 2 guests