XuNeo / luavgl

lua + lvgl = luavgl An optimized lvgl Lua binding
MIT License
68 stars 15 forks source link

Data binding support #68

Open XuNeo opened 2 months ago

XuNeo commented 2 months ago

Introduce the problem

LVGL already has subject/objserver available, but it's in a poor state:

  1. Every widget needs custom code in lvgl/src/others/observer/lv_observer.c
  2. Cannot create subject on the fly, it must be predefined.
  3. It has overlap with lv_obj_property
  4. C language needs lots of callbacks.

Proposal

We can use lua for the same idea. Example of usage.

local subjectA = Subject()
local subjectB = Subject()

local obj = Object()
obj.w = subjectA
obj.h = Subject({subjectA, subjectB}, calculate = function(subjects) 
                            return subjects[0] + subjects[1] 
                            end
                           )

subjectA.value = 123

Under the hood, we monitor the value of a property set to obj in obj.__newindex meta method, bind the property to a subject.

Also monitor subject.__newindex meta method, call the obj.set method with subject's actual value.