first commit
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
import json
|
||||
|
||||
import db
|
||||
|
||||
from ..widgets.widget_meta import widget_meta
|
||||
from .get_element import get_element
|
||||
|
||||
|
||||
def _is_default_value(control, raw_value):
|
||||
"""Compare la valeur reçue du formulaire à la valeur par défaut du
|
||||
réglage (en tenant compte de l'unité ajoutée pour les sliders), pour
|
||||
savoir si le champ a simplement été renvoyé tel quel sans être
|
||||
personnalisé."""
|
||||
default = control.get("default", "")
|
||||
if control["type"] == "slider":
|
||||
unit = control.get("unit", "")
|
||||
default = f"{default}{unit}" if default not in (None, "") else ""
|
||||
return str(raw_value) == str(default)
|
||||
|
||||
|
||||
def save_element_controls(slug, element_id, form):
|
||||
"""Lit, pour chaque réglage du widget de cet élément, la valeur envoyée
|
||||
par le panneau de propriétés (un seul formulaire, un champ par réglage)
|
||||
et met à jour content / attributs / style en conséquence."""
|
||||
el = get_element(slug, element_id)
|
||||
if not el:
|
||||
return
|
||||
meta = widget_meta(el["widget"])
|
||||
content = el["content"]
|
||||
attributes = dict(el["attributes"])
|
||||
style = dict(el["style"])
|
||||
toggle_groups = {} # propriété CSS -> ensemble des "tokens" cochés (ex: text-decoration)
|
||||
|
||||
for control in meta.get("controls", []):
|
||||
ctype = control["type"]
|
||||
field_name = "ctrl_" + control["key"]
|
||||
|
||||
if ctype == "toggle_token":
|
||||
_kind, name = control["target"].split(":", 1)
|
||||
toggle_groups.setdefault(name, set())
|
||||
if form.get(field_name) is not None:
|
||||
toggle_groups[name].add(control["token"])
|
||||
continue
|
||||
|
||||
if ctype == "preset":
|
||||
chosen = form.get(field_name, control.get("default"))
|
||||
opt = next((o for o in control["options"] if o[0] == chosen), None)
|
||||
if opt:
|
||||
for k, v in opt[2].items():
|
||||
if v in (None, ""):
|
||||
style.pop(k, None)
|
||||
else:
|
||||
style[k] = v
|
||||
continue
|
||||
|
||||
if ctype == "scale":
|
||||
try:
|
||||
val = float(form.get(field_name, control.get("default", 1)))
|
||||
except (TypeError, ValueError):
|
||||
val = 1.0
|
||||
if abs(val - 1) < 1e-6:
|
||||
style.pop("transform", None)
|
||||
else:
|
||||
style["transform"] = f"scale({val})"
|
||||
continue
|
||||
|
||||
target = control["target"]
|
||||
if ctype == "checkbox":
|
||||
checked = form.get(field_name) is not None
|
||||
raw_value = control["true_value"] if checked else control["false_value"]
|
||||
else:
|
||||
raw_value = form.get(field_name, control.get("default", ""))
|
||||
if ctype == "slider":
|
||||
unit = control.get("unit", "")
|
||||
raw_value = f"{raw_value}{unit}" if raw_value not in (None, "") else ""
|
||||
|
||||
if target == "content":
|
||||
content = raw_value
|
||||
else:
|
||||
kind, name = target.split(":", 1)
|
||||
store = attributes if kind == "attr" else style
|
||||
if raw_value in (None, ""):
|
||||
store.pop(name, None)
|
||||
elif ctype != "checkbox" and name not in store and _is_default_value(control, raw_value):
|
||||
# Ce réglage n'a jamais été personnalisé (la clé est absente
|
||||
# du style/des attributs stockés) et la valeur reçue est
|
||||
# simplement celle par défaut affichée dans le champ (un
|
||||
# <input type="color"> ou un slider a TOUJOURS une valeur à
|
||||
# l'écran, même quand rien n'a été choisi). Comme le
|
||||
# panneau de propriétés envoie TOUS les réglages du widget
|
||||
# en un seul formulaire, sauvegarder n'importe quel autre
|
||||
# champ (ex. changer la disposition) écrirait sinon cette
|
||||
# valeur par défaut "en dur" dans l'élément — ce qui faisait
|
||||
# apparaître par exemple une couleur de fond qui n'avait
|
||||
# jamais été demandée. On laisse donc ce réglage "non
|
||||
# défini" tant qu'il n'a pas été explicitement changé.
|
||||
pass
|
||||
else:
|
||||
store[name] = raw_value
|
||||
|
||||
for prop, tokens in toggle_groups.items():
|
||||
if tokens:
|
||||
style[prop] = " ".join(sorted(tokens))
|
||||
else:
|
||||
style.pop(prop, None)
|
||||
|
||||
conn = db.connect(slug)
|
||||
conn.execute(
|
||||
"UPDATE _screen_elements SET content = ?, attributes = ?, style = ? WHERE id = ?",
|
||||
(content, json.dumps(attributes), json.dumps(style), element_id),
|
||||
)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user