// Copyright 2015 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. #include #include #include #include "Core/State.h" #include "DolphinQt2/AboutDialog.h" #include "DolphinQt2/MenuBar.h" #include "DolphinQt2/Settings.h" MenuBar::MenuBar(QWidget* parent) : QMenuBar(parent) { AddFileMenu(); AddEmulationMenu(); addMenu(tr("Movie")); addMenu(tr("Options")); addMenu(tr("Tools")); AddViewMenu(); AddHelpMenu(); EmulationStopped(); } void MenuBar::EmulationStarted() { // Emulation m_play_action->setEnabled(false); m_play_action->setVisible(false); m_pause_action->setEnabled(true); m_pause_action->setVisible(true); m_stop_action->setEnabled(true); m_reset_action->setEnabled(true); m_fullscreen_action->setEnabled(true); m_frame_advance_action->setEnabled(true); m_screenshot_action->setEnabled(true); m_state_load_menu->setEnabled(true); m_state_save_menu->setEnabled(true); UpdateStateSlotMenu(); } void MenuBar::EmulationPaused() { m_play_action->setEnabled(true); m_play_action->setVisible(true); m_pause_action->setEnabled(false); m_pause_action->setVisible(false); } void MenuBar::EmulationStopped() { // Emulation m_play_action->setEnabled(true); m_play_action->setVisible(true); m_pause_action->setEnabled(false); m_pause_action->setVisible(false); m_stop_action->setEnabled(false); m_reset_action->setEnabled(false); m_fullscreen_action->setEnabled(false); m_frame_advance_action->setEnabled(false); m_screenshot_action->setEnabled(false); m_state_load_menu->setEnabled(false); m_state_save_menu->setEnabled(false); UpdateStateSlotMenu(); } void MenuBar::AddFileMenu() { QMenu* file_menu = addMenu(tr("File")); m_open_action = file_menu->addAction(tr("Open"), this, SIGNAL(Open())); m_exit_action = file_menu->addAction(tr("Exit"), this, SIGNAL(Exit())); } void MenuBar::AddEmulationMenu() { QMenu* emu_menu = addMenu(tr("Emulation")); m_play_action = emu_menu->addAction(tr("Play"), this, SIGNAL(Play())); m_pause_action = emu_menu->addAction(tr("Pause"), this, SIGNAL(Pause())); m_stop_action = emu_menu->addAction(tr("Stop"), this, SIGNAL(Stop())); m_reset_action = emu_menu->addAction(tr("Reset"), this, SIGNAL(Reset())); m_fullscreen_action = emu_menu->addAction(tr("Fullscreen"), this, SIGNAL(Fullscreen())); m_frame_advance_action = emu_menu->addAction(tr("Frame Advance"), this, SIGNAL(FrameAdvance())); m_screenshot_action = emu_menu->addAction(tr("Take Screenshot"), this, SIGNAL(Screenshot())); AddStateLoadMenu(emu_menu); AddStateSaveMenu(emu_menu); AddStateSlotMenu(emu_menu); UpdateStateSlotMenu(); } void MenuBar::AddStateLoadMenu(QMenu* emu_menu) { m_state_load_menu = emu_menu->addMenu(tr("Load State")); m_state_load_menu->addAction(tr("Load State from File"), this, SIGNAL(StateLoad())); m_state_load_menu->addAction(tr("Load State from Selected Slot"), this, SIGNAL(StateLoadSlot())); m_state_load_slots_menu = m_state_load_menu->addMenu(tr("Load State from Slot")); m_state_load_menu->addAction(tr("Undo Load State"), this, SIGNAL(StateLoadUndo())); for (int i = 1; i <= 10; i++) { QAction* action = m_state_load_slots_menu->addAction(QStringLiteral("")); connect(action, &QAction::triggered, this, [=]() { emit StateLoadSlotAt(i); }); } } void MenuBar::AddStateSaveMenu(QMenu* emu_menu) { m_state_save_menu = emu_menu->addMenu(tr("Save State")); m_state_save_menu->addAction(tr("Save State to File"), this, SIGNAL(StateSave())); m_state_save_menu->addAction(tr("Save State to Selected Slot"), this, SIGNAL(StateSaveSlot())); m_state_save_menu->addAction(tr("Save State to Oldest Slot"), this, SIGNAL(StateSaveOldest())); m_state_save_slots_menu = m_state_save_menu->addMenu(tr("Save State to Slot")); m_state_save_menu->addAction(tr("Undo Save State"), this, SIGNAL(StateSaveUndo())); for (int i = 1; i <= 10; i++) { QAction* action = m_state_save_slots_menu->addAction(QStringLiteral("")); connect(action, &QAction::triggered, this, [=]() { emit StateSaveSlotAt(i); }); } } void MenuBar::AddStateSlotMenu(QMenu* emu_menu) { m_state_slot_menu = emu_menu->addMenu(tr("Select State Slot")); m_state_slots = new QActionGroup(this); for (int i = 1; i <= 10; i++) { QAction* action = m_state_slot_menu->addAction(QStringLiteral("")); action->setCheckable(true); action->setActionGroup(m_state_slots); if (Settings().GetStateSlot() == i) action->setChecked(true); connect(action, &QAction::triggered, this, [=]() { emit SetStateSlot(i); }); } } void MenuBar::UpdateStateSlotMenu() { QList actions_slot = m_state_slots->actions(); QList actions_load = m_state_load_slots_menu->actions(); QList actions_save = m_state_save_slots_menu->actions(); for (int i = 0; i < actions_slot.length(); i++) { int slot = i + 1; QString info = QString::fromStdString(State::GetInfoStringOfSlot(slot)); QString action_string = tr(" Slot %1 - %2").arg(slot).arg(info); actions_load.at(i)->setText(tr("Load from") + action_string); actions_save.at(i)->setText(tr("Save to") + action_string); actions_slot.at(i)->setText(tr("Select") + action_string); } } void MenuBar::AddViewMenu() { QMenu* view_menu = addMenu(tr("View")); AddGameListTypeSection(view_menu); view_menu->addSeparator(); AddTableColumnsMenu(view_menu); } void MenuBar::AddHelpMenu() { QMenu* help_menu = addMenu(tr("Help")); QAction* documentation = help_menu->addAction(tr("Online Documentation")); connect(documentation, &QAction::triggered, this, [=]() { QDesktopServices::openUrl(QUrl(QStringLiteral("https://dolphin-emu.org/docs/guides"))); }); help_menu->addAction(tr("About"), this, SIGNAL(ShowAboutDialog())); } void MenuBar::AddGameListTypeSection(QMenu* view_menu) { QAction* table_view = view_menu->addAction(tr("Table")); table_view->setCheckable(true); QAction* list_view = view_menu->addAction(tr("List")); list_view->setCheckable(true); QActionGroup* list_group = new QActionGroup(this); list_group->addAction(table_view); list_group->addAction(list_view); bool prefer_table = Settings().GetPreferredView(); table_view->setChecked(prefer_table); list_view->setChecked(!prefer_table); connect(table_view, &QAction::triggered, this, &MenuBar::ShowTable); connect(list_view, &QAction::triggered, this, &MenuBar::ShowList); } // TODO implement this void MenuBar::AddTableColumnsMenu(QMenu* view_menu) { QActionGroup* column_group = new QActionGroup(this); QMenu* cols_menu = view_menu->addMenu(tr("Table Columns")); column_group->setExclusive(false); QStringList col_names{tr("Platform"), tr("ID"), tr("Banner"), tr("Title"), tr("Description"), tr("Maker"), tr("Size"), tr("Country"), tr("Quality")}; for (int i = 0; i < col_names.count(); i++) { QAction* action = column_group->addAction(cols_menu->addAction(col_names[i])); action->setCheckable(true); } }