🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    [UiFlow] The ability to display multiple "screens" or "cards"

    Features Wish List
    5
    8
    13.0k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      DaveC
      last edited by

      I've not found this function after a lot of use, so I'm making the assumption that it's not present.

      What I'd like to suggest, is the ability to define separate "Screens" in a single integrated UiFlow Program.

      This would operate somewhat like an old "HyperCard" stack, where each "screen" has a separate and defined UI that can be set up via the UiFlow editor.
      (Navigation between screens during coding could be added just above the "Units" Selector)

      To keep code clean, there could be a "screen 0" that contains code that is present across the whole project (e.g. Wifi Connections, MQTT, Global Variables) and sets instructions for an initial screen display or which screen to switch to.
      Screens are traversed via blocks that instruct which screen to switch to, which could be tied to events or button presses.
      Events/Functions can be triggered by switching into screens (Much like Setup is used per project) or switching away.

      This simple change could clean up messy projects that rely on code to move the screen around, enhance projects that are data driven, make UI design simpler and more intuitive and add a world of function and the opportunity for more complexity into this simple software.

      1 Reply Last reply Reply Quote 4
      • ajb2k3A
        ajb2k3
        last edited by

        Currently you could define separate screens as separate functions that are called buy actions however a dedicated "screen" block would be handy.

        UIFlow, so easy an adult can learn it!
        If I don't know it, be patient!
        I've ether not learned it or am too drunk to remember it!
        Author of the WIP UIFlow Handbook!
        M5Black, Go, Stick, Core2, and so much more it cant be fit in here!

        P 1 Reply Last reply Reply Quote 1
        • IAMLIUBOI
          IAMLIUBO
          last edited by

          Hi @DaveC ,
          I understand your thoughts. This feature is indeed very practical. We are also investigating how to implement it. It may not be launched soon. I think we will launch this feature at the right time.
          The main problem at present is that we may need to unify the GUI framework of all devices.
          This may take a long time.

          1 Reply Last reply Reply Quote 1
          • P
            pumpkinetcher @ajb2k3
            last edited by

            @ajb2k3 This is what my bud and I have been talking about today. I figured this would be the work around since there isn't a dedicated "screen" block.

            I haven't figured out how to implement it quite yet, as I am still learning the basics of the device and the language.

            1 Reply Last reply Reply Quote 0
            • P
              pumpkinetcher
              last edited by

              Are you able to build some code that allows you to switch between screens? If so would you mind sharing? I am currently trying to work out how you could set up multiple screens as well. NGL I'm a newb so sorry if I am asking for some basic stuff over here.

              J 2 Replies Last reply Reply Quote 0
              • ajb2k3A
                ajb2k3
                last edited by

                I did several versions back but lost the code but IIRC I created seperate function for each screen with a clear screen block before defining the new screen.
                When a button is pressed or function triggered, the screen function gets called.

                UIFlow, so easy an adult can learn it!
                If I don't know it, be patient!
                I've ether not learned it or am too drunk to remember it!
                Author of the WIP UIFlow Handbook!
                M5Black, Go, Stick, Core2, and so much more it cant be fit in here!

                1 Reply Last reply Reply Quote 1
                • J
                  Josef @pumpkinetcher
                  last edited by

                  @pumpkinetcher

                  You can have multiple screens, for example in an array, and then switch the screens with screen.load_screen(screens[i])

                  I use it like this

                  screen = M5Screen()
                  screen.clean_screen()
                  screen.set_screen_bg_color(0xadefeb)
                  screen.set_screen_brightness(60)
                  #an array to store screens
                  screens=[]

                  now everything (M5Label etc) will be drawn on the current screen.
                  I end the screen with
                  screen0 = screen.get_act_screen()
                  screens.append(screen0)

                  then start a new screen with

                  get a new screen

                  screen1 = screen.get_new_screen()
                  screen.load_screen(screen1)
                  then end this screen and so on
                  screen1 = screen.get_act_screen()
                  screens.append(screen1)

                  To switch the screen I use
                  def getPrevScreen():
                  global current_screen, screens
                  lock_obj.acquire()
                  print('getPrevScreen called')
                  current_screen-=1
                  if current_screen < 0 :
                  current_screen=0
                  else:
                  screen.load_screen(screens[current_screen])
                  lock_obj.release()
                  pass
                  def getNextScreen():
                  global current_screen, screens
                  lock_obj.acquire()
                  print('getNextScreen called')
                  current_screen+=1
                  if current_screen > len(screens)-1 :
                  current_screen=len(screens)-1
                  else:
                  screen.load_screen(screens[current_screen])
                  lock_obj.release()
                  pass
                  these are called by
                  def buttonA_wasPressed():

                  global params

                  do_beep()
                  reset_idle_counter()
                  print('ButtonA pressed')

                  screen.clean_screen()

                  screen.load_screen(screen0)

                  screen.load_screen(screens[0])

                  getPrevScreen()

                  _thread.start_new_thread(getPrevScreen, ())
                  pass
                  btnA.wasPressed(buttonA_wasPressed)
                  and
                  def buttonC_wasPressed():
                  do_beep()
                  reset_idle_counter()
                  print('ButtonC pressed')

                  screen.clean_screen()

                  screen.load_screen(screen2)

                  getNextScreen()

                  _thread.start_new_thread(getNextScreen, ())

                  screen.clean_screen()

                  screen.load_screen(screen1)

                  screen.load_screen(screens[2])

                  pass
                  btnC.wasPressed(buttonC_wasPressed)

                  The formatting here is terrible, as it reads # for markdown...

                  I will put my code on github (hjgode) later on

                  BTW: the UIFlow doc is a mess. They use // in fron of line for a python comment line (needs to be a # in front). And I am missing examples, examples....
                  Still looking for a complete developer doc for the UIFlow micropython stuff. Some functions are named differently and some just do not work, if you try the micropython basic ones (like for example umqtt.simple, which just crashes as someone forget to implement socket.set_timeout)

                  1 Reply Last reply Reply Quote 1
                  • J
                    Josef @pumpkinetcher
                    last edited by

                    @pumpkinetcher

                    see https://github.com/hjgode/m5home main.py

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post