0511 (중요) 팝업GUI 해답 UILayer의 구현
UILayer의 구현?
"업데이트는 먼저, 렌더링은 나중에"
"IViewport::m_root_object를 default layer라고 간주하고,
선택적으로 레이어를 추가할 수 있음."
"UILayer는 자신이 속한 IViewport의 std::list<UILayer*> 들 안의
자신의 순서를 맨 위로 올려달라고 IViewport에게 요청할 수 있음."
-> 예를 들면 추적하고 있던 Panel이 포커싱 된 경우,
m_owner.request_make_top_layer(this) 를 해주면?
그 팬널이 맨 위에 오게 된다.
그리고 팬널은 m_focused_obj로
"유지되면 안된다!!!!!"
(여기서 팬널은 "마우스로 드래그 할 수 있는 IControl상속"이라는 뜻으로 쓰임)
팬널은 "드래그 할 때만!!!! m_focused_obj가 되는 거다!!"
팬널 포커싱을 유지해 버리면
"팬널 밑에 달린 버튼들이 감지가 안된다!!!"
class UILayer {
private:
IViewport& m_owner;
IObject* m_root_object = nullptr;
public:
void update() { m_root_object->update(); }
void draw()const { m_root_object->draw(); }
}
void IViewport::update() {
// TODO : 업데이트는 가장 위에 있는 레이어부터 해야 한다.
for (auto riter = m_layers.rbegin(); riter != m_layers.rend(); ++riter) {
layer->update(); // 여기서 m_focused가 먼저 쟁취될 수 있다.
}
m_root_obj->update();
}
void IViewport::update() {
m_root_obj->draw();
// TODO : 렌더링은 default layer이후부터 순방향으로 해야 한다.
for (const auto& layer : m_layers) {
layer->draw();
}
}