Skip to content

Commit

Permalink
Update example to show two products
Browse files Browse the repository at this point in the history
  • Loading branch information
laffra committed Feb 4, 2025
1 parent 396c67c commit 3dc1f18
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 25 deletions.
42 changes: 26 additions & 16 deletions examples/reactive.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
DELIVERY_OPTIONS = ["1-day", "2-day", "pickup"]

class Product(ltk.Model):
name: str = "Wrench"
price: float = 50.0
count: int = 10
name: str = "Screwdriver"
price: float = 50.0
warranty: bool = False
service: bool = True
delivery: int = 1
Expand All @@ -24,10 +24,21 @@ def changed(self, name, value):
- Delivery: {DELIVERY_OPTIONS[self.delivery]}
"""

product = Product(count=60)
product1 = Product(name="Wrench", delivery=0)
product2 = Product(name="Drill", count=6, price=500, service=False)

def create():
form = ltk.VBox(
def order_hammers(event):
product2.name = "Hammer"
product2.count = 10
product2.price = 100.0
product2.warranty = True
product2.delivery = 2
product2.service = False

def create_form(name, product):
print("Create form for", product)
return ltk.VBox(
ltk.Label(name),
row(
"Name:",
ltk.Input(product.name).width(300)
Expand Down Expand Up @@ -65,31 +76,30 @@ def create():
ltk.Text(product.summary)
)
)

def create():
return (
ltk.VBox(
ltk.Heading2("Reactive LTK Demo"),
form
create_form("Product 1", product1)
.css("border", "2px solid green")
.css("padding", 12)
.css("margin-bottom", 12)
.css("font-size", 24),
create_form("Product 1", product2)
.css("border", "2px solid green")
.css("padding", 12)
.css("font-size", 24)
.attr("name", "Reactive"),
ltk.Button("Buy Hammers", order_hammers)
ltk.Button("Set Product 2 to Hammer", order_hammers)
.css("margin-top", 24)
.css("border-radius", 8)
.css("padding", 12)
.css("padding", 12),
)
.attr("id", "reactive")
.attr("name", "Reactive")
)

def order_hammers(event):
product.name = "Hammer"
product.count = 10
product.price = 100.0
product.warranty = True
product.delivery = 2
product.service = False

def row(label, *widgets):
return ltk.HBox(
ltk.Text(label)
Expand Down
30 changes: 21 additions & 9 deletions ltk/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -549,15 +549,24 @@ def __init__(self, **kwargs):
getattr(self, name).set_value(value)

def __setattr__(self, name: str, value):
if hasattr(self, name) and isinstance(getattr(self, name), ModelAttribute):
attribute = getattr(self, name)
attribute.set_value(value)
try:
if hasattr(self, name) and isinstance(getattr(self, name), ModelAttribute):
attribute = getattr(self, name)
attribute.set_value(value)
try:
self.changed(name, value)
except Exception as e: # pylint: disable=broad-except
print(e)
else:
object.__setattr__(self, name, value)
except Exception as e: # pylint: disable=broad-except
print("Cannot set attribute", name, value, self, e)
try:
self.changed(name, value)
except Exception as e: # pylint: disable=broad-except
print(e)
else:
object.__setattr__(self, name, value)
import traceback
traceback.print_exc()
except:
pass
raise e

def decode(self, json_encoding: str):
""" Decode the JSON encoding of the model """
Expand Down Expand Up @@ -626,7 +635,10 @@ def get_value(self):

def set_value(self, value):
""" Set the value of the attribute """
typed_value = type(self.value)(value)
try:
typed_value = type(self.value)(value)
except:
typed_value = value
if typed_value == self.value:
return
self.value = typed_value
Expand Down

0 comments on commit 3dc1f18

Please sign in to comment.