|
@@ -282,12 +282,12 @@ MenuItem* Menu::hovered_item() const
|
|
void Menu::update_for_new_hovered_item()
|
|
void Menu::update_for_new_hovered_item()
|
|
{
|
|
{
|
|
if (hovered_item() && hovered_item()->is_submenu()) {
|
|
if (hovered_item() && hovered_item()->is_submenu()) {
|
|
|
|
+ ASSERT(menu_window());
|
|
MenuManager::the().close_everyone_not_in_lineage(*hovered_item()->submenu());
|
|
MenuManager::the().close_everyone_not_in_lineage(*hovered_item()->submenu());
|
|
- hovered_item()->submenu()->popup(hovered_item()->rect().top_right().translated(menu_window()->rect().location()), true);
|
|
|
|
|
|
+ hovered_item()->submenu()->popup(hovered_item()->rect().top_right().translated(menu_window()->rect().location()));
|
|
} else {
|
|
} else {
|
|
MenuManager::the().close_everyone_not_in_lineage(*this);
|
|
MenuManager::the().close_everyone_not_in_lineage(*this);
|
|
- MenuManager::the().set_current_menu(this);
|
|
|
|
- menu_window()->set_visible(true);
|
|
|
|
|
|
+ ensure_menu_window().set_visible(true);
|
|
}
|
|
}
|
|
redraw();
|
|
redraw();
|
|
}
|
|
}
|
|
@@ -306,17 +306,17 @@ void Menu::open_hovered_item()
|
|
void Menu::descend_into_submenu_at_hovered_item()
|
|
void Menu::descend_into_submenu_at_hovered_item()
|
|
{
|
|
{
|
|
ASSERT(hovered_item());
|
|
ASSERT(hovered_item());
|
|
- ASSERT(hovered_item()->is_submenu());
|
|
|
|
auto submenu = hovered_item()->submenu();
|
|
auto submenu = hovered_item()->submenu();
|
|
- submenu->m_hovered_item_index = 0;
|
|
|
|
|
|
+ ASSERT(submenu);
|
|
|
|
+ MenuManager::the().open_menu(*submenu);
|
|
|
|
+ submenu->set_hovered_item(0);
|
|
ASSERT(submenu->hovered_item()->type() != MenuItem::Separator);
|
|
ASSERT(submenu->hovered_item()->type() != MenuItem::Separator);
|
|
- submenu->update_for_new_hovered_item();
|
|
|
|
- m_in_submenu = true;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
void Menu::handle_mouse_move_event(const MouseEvent& mouse_event)
|
|
void Menu::handle_mouse_move_event(const MouseEvent& mouse_event)
|
|
{
|
|
{
|
|
ASSERT(menu_window());
|
|
ASSERT(menu_window());
|
|
|
|
+ MenuManager::the().set_current_menu(this);
|
|
if (hovered_item() && hovered_item()->is_submenu()) {
|
|
if (hovered_item() && hovered_item()->is_submenu()) {
|
|
|
|
|
|
auto item = *hovered_item();
|
|
auto item = *hovered_item();
|
|
@@ -336,8 +336,6 @@ void Menu::handle_mouse_move_event(const MouseEvent& mouse_event)
|
|
return;
|
|
return;
|
|
m_hovered_item_index = index;
|
|
m_hovered_item_index = index;
|
|
|
|
|
|
- // FIXME: Tell parent menu (if it exists) that it is currently in a submenu
|
|
|
|
- m_in_submenu = false;
|
|
|
|
update_for_new_hovered_item();
|
|
update_for_new_hovered_item();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -385,23 +383,6 @@ void Menu::event(Core::Event& event)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- // Pass the event for the submenu that we are currently in to handle
|
|
|
|
- if (m_in_submenu && key != Key_Left) {
|
|
|
|
- ASSERT(hovered_item()->is_submenu());
|
|
|
|
- hovered_item()->submenu()->dispatch_event(event);
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (key == Key_Return) {
|
|
|
|
- if (!hovered_item()->is_enabled())
|
|
|
|
- return;
|
|
|
|
- if (hovered_item()->is_submenu())
|
|
|
|
- descend_into_submenu_at_hovered_item();
|
|
|
|
- else
|
|
|
|
- open_hovered_item();
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if (key == Key_Up) {
|
|
if (key == Key_Up) {
|
|
ASSERT(m_items.at(0).type() != MenuItem::Separator);
|
|
ASSERT(m_items.at(0).type() != MenuItem::Separator);
|
|
|
|
|
|
@@ -451,22 +432,6 @@ void Menu::event(Core::Event& event)
|
|
update_for_new_hovered_item();
|
|
update_for_new_hovered_item();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
|
|
- if (key == Key_Left) {
|
|
|
|
- if (!m_in_submenu)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- ASSERT(hovered_item()->is_submenu());
|
|
|
|
- hovered_item()->submenu()->clear_hovered_item();
|
|
|
|
- m_in_submenu = false;
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (key == Key_Right) {
|
|
|
|
- if (hovered_item()->is_enabled() && hovered_item()->is_submenu())
|
|
|
|
- descend_into_submenu_at_hovered_item();
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
Core::Object::event(event);
|
|
Core::Object::event(event);
|
|
}
|
|
}
|
|
@@ -476,7 +441,6 @@ void Menu::clear_hovered_item()
|
|
if (!hovered_item())
|
|
if (!hovered_item())
|
|
return;
|
|
return;
|
|
m_hovered_item_index = -1;
|
|
m_hovered_item_index = -1;
|
|
- m_in_submenu = false;
|
|
|
|
redraw();
|
|
redraw();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -525,7 +489,7 @@ void Menu::redraw_if_theme_changed()
|
|
redraw();
|
|
redraw();
|
|
}
|
|
}
|
|
|
|
|
|
-void Menu::popup(const Gfx::Point& position, bool is_submenu)
|
|
|
|
|
|
+void Menu::popup(const Gfx::Point& position)
|
|
{
|
|
{
|
|
if (is_empty()) {
|
|
if (is_empty()) {
|
|
dbg() << "Menu: Empty menu popup";
|
|
dbg() << "Menu: Empty menu popup";
|
|
@@ -550,8 +514,7 @@ void Menu::popup(const Gfx::Point& position, bool is_submenu)
|
|
|
|
|
|
window.move_to(adjusted_pos);
|
|
window.move_to(adjusted_pos);
|
|
window.set_visible(true);
|
|
window.set_visible(true);
|
|
- MenuManager::the().set_current_menu(this, is_submenu);
|
|
|
|
-
|
|
|
|
|
|
+ MenuManager::the().open_menu(*this, false);
|
|
WindowManager::the().did_popup_a_menu({});
|
|
WindowManager::the().did_popup_a_menu({});
|
|
}
|
|
}
|
|
|
|
|