Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UIレイアウトシステム再設計 #216

Open
lriki opened this issue Jun 13, 2022 · 0 comments
Open

UIレイアウトシステム再設計 #216

lriki opened this issue Jun 13, 2022 · 0 comments
Milestone

Comments

@lriki
Copy link
Collaborator

lriki commented Jun 13, 2022

flex だけ、はやめよう

ui-layout-2 ブランチで yoga を使った flex レイアウトをデフォルトにしてみたが、どうにも flex レイアウトはゲームでは使いづらい。
画面の上下左右にスナップしたコンテナをまずルート要素近くに用意し、flex はその中で使うことが多いだろう。(それでもほとんど StackPanel で足りるが)

grid layout は欲しい。この grid も、WPF のような高さを指定できるものと Flutter のような列数だけ指定してあとは Flow にするもの、など欲しい。

Style vs 派生クラス

そうするとやっぱり UIElement ごとにレイアウト方法を変えたくなる。

HTML/CSS のように Style でやるならこんな感じ。

auto i = UIElement::With()
    .layoutDisplay(UILayoutDisplay::Grid)
    .size(100, 100)
    .build();

これまでのように派生クラスを用意するならこんな感じ。

auto i = UIGridLayout::With()
    .size(100, 100)
    .build();

後者の方が読みやすいだろう。

WPF, UE, Godot, Kivy, Flutter, Android あたりは後者。Unity の UIElements は前者。ゲームエンジンでは前者は珍しいかも。

デフォルトの Layout は?

これまで同様でよいだろう。
ただ、UIVAlignment, UIHAlignment をやめたい。この指定がどうしても冗長になってしまう。

次のようにできないだろうか?

  • Margin の有無で Alignment を決める。
    • Left または Right が指定されていたら、UIHAlignment::Left, UIHAlignment::Right と同義。
    • 両方指定されていたら、UIHAlignment::Sretch と同義。
    • 両方指定されていなかったら、UIHAlignment::Center と同義。
    • Sretch 以外の場合、幅は Width を使う。Width 未指定の場合、desirdSize を使う。

パーセントの指定方法はどうしよう?

Litho は positionDippositionPercent といった具合で別関数がある。というかコアになってる yoga そのまま。
https://fblitho.com/javadoc/com/facebook/litho/Component.Builder.html

ComponentKit は オブジェクトを渡す。
https://componentkit.org/docs/avoid-width-100-percent/

Flutter, Kivy, WPF はそもそも無いみたい。親の Grid など側で割合を指定できる。
https://stackoverflow.com/questions/43122113/sizing-elements-to-percentage-of-screen-width-height

Grid があればパーセントの指定は要らないかなという気がする。そうすると nan を無効値として扱うだけでよいため API はかなりシンプルにできる。

@lriki lriki added this to the v0.11.0 milestone Aug 10, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: No status
Development

No branches or pull requests

1 participant