محرّك تخطيط SadUI والمحاذاة المتقاطعة (RTL)
الغرض: شرح محرّك تخطيط واجهات SadUI (
LayoutEngine) ومنظومة المحاذاة المتقاطعة مع دعم RTL الأصيل — كيف تُوضَع أبناء الحاويات، وخاصّيّة «محاذاة»، والهامش والأوزان، ومصدر حقيقة مفاتيح الخصائص.
إطار SadUI عربيّ RTL-أوّلًا: الافتراض LayoutDirection::RTL في كلّ الطبقات.
لذا يبدأ محتوى الشاشة من اليمين لا اليسار.
المرحلتان المدموجتان
محرّك التخطيط (features/graphics/core/src/layout.cpp) يجمع منطقَي القياس
والترتيب في تمريرة تنازليّة واحدة: layout() يستدعي arrange() من الجذر
للأوراق، وarrange يستدعي measure() عند كلّ مستوًى حسب الحاجة.
- المحور الرئيسيّ: للعمود عموديّ (تكديس رأسيّ)، وللصفّ أفقيّ.
- المحور المتقاطع: المحور الآخر — للعمود أفقيّ (اتّجاهيّ RTL/LTR)، وللصفّ عموديّ (غير اتّجاهيّ).
خاصّيّة «محاذاة» المتقاطعة
| الوضع | العمود (RTL) | العمود (LTR) | الصفّ |
|---|---|---|---|
بداية (افتراضيّ) | اليمين | اليسار | الأعلى |
وسط | توسيط | توسيط | توسيط عموديّ |
نهاية | اليسار | اليمين | الأسفل |
تمدّد | يملأ العرض | يملأ العرض | يملأ الارتفاع |
- تمدّد يجعل الابن يملأ المحور المتقاطع كاملًا فيتخطّط هو وأحفاده بالمقاس
الكامل؛ الابن ذو المقاس الصريح في ذلك المحور يفوز على التمدّد (كـ
align-items: stretchفي CSS). - حدّ: «محاذاة» يُكرِّمها العمود والصفّ حصرًا؛ الشبكة/المكدّس/الالتفاف/ التمرير لها تموضع RTL مبيَّت خاصّ لكنّها تتجاهلها.
الهامش والحشو والأوزان
- حشو: إزاحة داخليّة تُقلّص منطقة المحتوى من الجانبين.
- هامش: إزاحة خارجيّة تُقحِم المحتوى
[هامش+حشو، العرض−هامش−حشو]، ويُخصم من قيود الأبناء فلا يتجاوز الابن مالئ-المحور فجوة الهامش. - وزن (وزن/flex): حصّة الابن من المساحة المتبقّية على المحور الرئيسيّ؛ توزيعه يحترم المقاس الصريح للحاوية (إن وُجد فالتوزيع ضمنه، وإلّا يتمدّد ليملأ القيد).
مصدر حقيقة مفاتيح الخصائص (SoT)
كلّ مفتاح خاصّيّة (نحو «محاذاة»/«حشو»/«عرض») معرَّف في
language-truth/ui_props.yaml (٨٢ مفتاحًا)، يُولَّد منه
sad_ui/prop_keys.h (ثوابت sad::ui::props::<ID>) عبر x.py gen. لا سلسلة
مفتاح خام في كود الرسوميّات — يُقرأ المفتاح دائمًا عبر الثابت المولَّد:
node.findProperty(props::ALIGN) // ✓ لا findProperty("محاذاة")
يحرسه check_no_raw_props.py + check_ui_props_consistency.py ضمن
x.py gen --check (محلّيًّا + CI)، وworkflow props-literals-lint.yml.
التفصيل المعماريّ الكامل (مع الأمثلة والرسوم) في مستودع اللغة:
docs/architecture/sadui-layout-alignment.md.