/* * Copyright (C) 2008 Louai Al-Khanji * * This program is free software; you can redistribute it and/ * or modify it under the terms of the GNU General Public Li- * cence as published by the Free Software Foundation; either * version 2 of the Licence, or any later version. * * This program is distributed in the hope that it will be use- * ful, but WITHOUT ANY WARRANTY; without even the implied war- * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public Licence for more details. * * You should have received a copy of the GNU General Public * Licence along with this program; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, * USA. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mainwindow.h" #include "mainwidget.h" #include "globals.h" #include "rommodel.h" #include "plugins.h" // Autogenerated files #include "settings.h" #include "ui_mainsettingswidget.h" #include "ui_pluginssettingswidget.h" #include "ui_rombrowsersettingswidget.h" namespace core { extern "C" { #include "../main.h" #include "../plugin.h" #include "../savestates.h" #include "../rom.h" #include "../config.h" } } enum StatusBarFields { ItemCountField }; MainWindow::MainWindow() : KXmlGuiWindow() , m_mainWidget(0) , m_actionRecentFiles(0) { m_mainWidget = new MainWidget(this); setCentralWidget(m_mainWidget); createActions(); statusBar()->insertPermanentItem("", ItemCountField); connect(m_mainWidget, SIGNAL(itemCountChanged(int)), this, SLOT(updateItemCount(int))); connect(m_mainWidget, SIGNAL(romDoubleClicked(KUrl, unsigned int)), this, SLOT(romOpen(KUrl, unsigned int))); char resourcefilename[PATH_MAX]; std::sprintf(resourcefilename, "%s%s", core::get_installpath(), "mupen64plusui.rc"); QFile resourcefile; resourcefile.setFileName(resourcefilename); if(!resourcefile.open(QIODevice::ReadOnly)) { printf("Error, unable to open Qt4 resource file %s.\n", resourcefilename); } resourcefile.close(); setupGUI(KXmlGuiWindow::Default, resourcefilename); QSize size(core::config_get_number("MainWindowWidth",600),core::config_get_number("MainWindowHeight",400)); QPoint position(core::config_get_number("MainWindowXPosition",0),core::config_get_number("MainWindowYPosition",0)); QDesktopWidget *d = QApplication::desktop(); QSize desktop(d->width(),d->height()); if(position.x()>desktop.width()) position.setX(0); if(position.y()>desktop.height()) position.setY(0); if(size.width()>desktop.width()) size.setWidth(600); if(size.height()>desktop.height()) size.setHeight(400); if((position.x()+size.width())>desktop.width()) position.setX(desktop.width() - size.width()); if((position.y()+size.height())>desktop.height()) position.setY(desktop.height() - size.height()); resize(size); move(position); } void MainWindow::closeEvent(QCloseEvent *event) { core::config_put_number("MainWindowWidth",width()); core::config_put_number("MainWindowHeight",height()); core::config_put_number("MainWindowXPosition",x()); core::config_put_number("MainWindowYPosition",y()); } void MainWindow::showInfoMessage(const QString& msg) { statusBar()->showMessage(msg); } void MainWindow::showAlertMessage(const QString& msg) { KMessageBox::error(this, msg); } bool MainWindow::confirmMessage(const QString& msg) { switch(KMessageBox::questionYesNo(this, msg)) { case KMessageBox::Yes: return true; break; default: return false; break; } } void MainWindow::romOpen() { QString filter = RomExtensions.join(" "); QString filename = KFileDialog::getOpenFileName(KUrl(), filter); if (!filename.isEmpty()) { romOpen(filename, 0); } } void MainWindow::romOpen(const KUrl& url) { romOpen(url, 0); } void MainWindow::romOpen(const KUrl& url, unsigned int archivefile) { QString path = url.path(); if (url.isLocalFile()) { m_actionRecentFiles->addUrl(url); m_actionRecentFiles->saveEntries(KGlobal::config()->group("Recent Roms")); KGlobal::config()->sync(); if(core::open_rom(path.toLocal8Bit(), archivefile)==0) { core::startEmulation(); } } } void MainWindow::romClose() { core::close_rom(); } void MainWindow::emulationStart() { if(!core::rom) { QModelIndex index = m_mainWidget->getRomBrowserIndex(); QString filename = index.data(RomModel::FullPath).toString(); if(filename.isEmpty()) { if(confirmMessage(i18n("There is no Rom loaded. Do you want to load one?"))) { romOpen(); } return; } } else { core::startEmulation(); } } void MainWindow::emulationPauseContinue() { core::pauseContinueEmulation(); } void MainWindow::emulationStop() { core::stopEmulation(); } void MainWindow::viewFullScreen() { core::changeWindow(); } void MainWindow::saveStateSave() { if (core::g_EmulationThread) { core::savestates_job |= SAVESTATE; } } void MainWindow::saveStateSaveAs() { if (core::g_EmulationThread) { QString filename = KFileDialog::getSaveFileName(); if (!filename.isEmpty()) { core::savestates_select_filename(filename.toLocal8Bit()); core::savestates_job |= SAVESTATE; } } else { showAlertMessage(i18n("Emulation not running!")); } } void MainWindow::saveStateRestore() { if (core::g_EmulationThread) { core::savestates_job |= LOADSTATE; } } void MainWindow::saveStateLoad() { if (core::g_EmulationThread) { QString filename = KFileDialog::getOpenFileName(); if (!filename.isEmpty()) { core::savestates_select_filename(filename.toLocal8Bit()); core::savestates_job |= LOADSTATE; } } else { showAlertMessage(i18n("Emulation not running!")); } } void MainWindow::savestateCheckSlot() { int slot = core::savestates_get_slot(); QAction* a = slotActions.at(slot); a->setChecked(true); } void MainWindow::savestateSelectSlot(QAction* a) { bool ok = false; int slot = a->data().toInt(&ok); if (ok) { core::savestates_select_slot(slot); } } void MainWindow::configDialogShow() { if (KConfigDialog::showDialog("settings")) { return; } KConfigDialog* dialog = new KConfigDialog(this, "settings", Settings::self()); // Main settings QWidget* mainSettingsWidget = new QWidget(dialog); Ui::MainSettings().setupUi(mainSettingsWidget); dialog->addPage(mainSettingsWidget, i18n("Main Settings"), "preferences-system"); // Plugin Settings QWidget* pluginsSettingsWidget = new QWidget(dialog); Plugins* plugins = Plugins::self(); QSize labelIconSize(32, 32); Ui::PluginsSettings pluginsSettingsUi; pluginsSettingsUi.setupUi(pluginsSettingsWidget); // gfx plugin pluginsSettingsUi.kcfg_GraphicsPlugin->addItems( plugins->plugins(Plugins::Graphics) ); pluginsSettingsUi.graphicsPluginIconLabel->setPixmap( KIcon("applications-graphics").pixmap(labelIconSize) ); connect(pluginsSettingsUi.aboutGraphicsPluginButton, SIGNAL(clicked()), plugins, SLOT(aboutGraphicsPlugin())); connect(pluginsSettingsUi.configureGraphicsPluginButton, SIGNAL(clicked()), plugins, SLOT(configureGraphicsPlugin())); connect(pluginsSettingsUi.testGraphicsPluginButton, SIGNAL(clicked()), plugins, SLOT(testGraphicsPlugin())); // audio plugin pluginsSettingsUi.kcfg_AudioPlugin->addItems( plugins->plugins(Plugins::Audio) ); pluginsSettingsUi.audioPluginIconLabel->setPixmap( KIcon("audio-headset").pixmap(labelIconSize) ); connect(pluginsSettingsUi.aboutAudioPluginButton, SIGNAL(clicked()), plugins, SLOT(aboutAudioPlugin())); connect(pluginsSettingsUi.configureAudioPluginButton, SIGNAL(clicked()), plugins, SLOT(configureAudioPlugin())); connect(pluginsSettingsUi.testAudioPluginButton, SIGNAL(clicked()), plugins, SLOT(testAudioPlugin())); // input plugin pluginsSettingsUi.kcfg_InputPlugin->addItems( plugins->plugins(Plugins::Input) ); pluginsSettingsUi.inputPluginIconLabel->setPixmap( KIcon("input-gaming").pixmap(labelIconSize) ); connect(pluginsSettingsUi.aboutInputPluginButton, SIGNAL(clicked()), plugins, SLOT(aboutInputPlugin())); connect(pluginsSettingsUi.configureInputPluginButton, SIGNAL(clicked()), plugins, SLOT(configureInputPlugin())); connect(pluginsSettingsUi.testInputPluginButton, SIGNAL(clicked()), plugins, SLOT(testInputPlugin())); // rsp plugin pluginsSettingsUi.kcfg_RspPlugin->addItems( plugins->plugins(Plugins::Rsp) ); pluginsSettingsUi.rspPluginIconLabel->setPixmap( KIcon("cpu").pixmap(labelIconSize) ); connect(pluginsSettingsUi.aboutRspPluginButton, SIGNAL(clicked()), plugins, SLOT(aboutRspPlugin())); connect(pluginsSettingsUi.configureRspPluginButton, SIGNAL(clicked()), plugins, SLOT(configureRspPlugin())); connect(pluginsSettingsUi.testRspPluginButton, SIGNAL(clicked()), plugins, SLOT(testRspPlugin())); dialog->addPage(pluginsSettingsWidget, plugins, i18n("Plugins"), "applications-engineering"); // Rom browser settings QWidget* romBrowserSettingsWidget = new QWidget(dialog); Ui::RomBrowserSettings().setupUi(romBrowserSettingsWidget); dialog->addPage(romBrowserSettingsWidget, i18n("Rom Browser"), "preferences-system-network"); connect(dialog, SIGNAL(settingsChanged(QString)), RomModel::self(), SLOT(settingsChanged())); dialog->show(); } void MainWindow::updateItemCount(int count) { statusBar()->changeItem(i18n("%0 roms").arg(count), ItemCountField); } bool MainWindow::event(QEvent* event) { bool retval = false; switch (event->type()) { case InfoEventType: showInfoMessage(static_cast(event)->message); retval = true; break; case AlertEventType: showAlertMessage(static_cast(event)->message); retval = true; break; default: retval = KXmlGuiWindow::event(event); break; } return retval; } void MainWindow::createActions() { KAction *act = 0; //"File" menu act = actionCollection()->addAction("rom_open"); act->setText(i18n("&Open Rom...")); act->setIcon(KIcon("document-open")); connect(act, SIGNAL(triggered()), this, SLOT(romOpen())); m_actionRecentFiles = KStandardAction::openRecent(this, SLOT(romOpen(KUrl)), actionCollection()); m_actionRecentFiles->loadEntries(KGlobal::config()->group("Recent Roms")); act = actionCollection()->addAction("rom_close"); act->setText(i18n("&Close Rom")); act->setIcon(KIcon("dialog-close")); connect(act, SIGNAL(triggered()), this, SLOT(romClose())); KStandardAction::quit(KApplication::instance(), SLOT(quit()), actionCollection()); //"Emulation" menu act = actionCollection()->addAction("emulation_start"); act->setText(i18n("&Start")); act->setIcon(KIcon("media-playback-start")); connect(act, SIGNAL(triggered()), this, SLOT(emulationStart())); act = actionCollection()->addAction("emulation_pause_continue"); act->setText(i18n("&Pause")); act->setIcon(KIcon("media-playback-pause")); act->setShortcut(Qt::Key_Pause); connect(act, SIGNAL(triggered()), this, SLOT(emulationPauseContinue())); act = actionCollection()->addAction("emulation_stop"); act->setText(i18n("S&top")); act->setIcon(KIcon("media-playback-stop")); act->setShortcut(Qt::Key_Escape); connect(act, SIGNAL(triggered()), this, SLOT(emulationStop())); act = actionCollection()->addAction("fullscreen"); act->setText(i18n("&Full Screen")); act->setIcon(KIcon("view-fullscreen")); act->setShortcut(Qt::AltModifier+Qt::Key_Return); connect(act, SIGNAL(triggered()), this, SLOT(viewFullScreen())); act = actionCollection()->addAction("save_state_save_as"); act->setText(i18n("Save State &as...")); act->setIcon(KIcon("document-save-as")); connect(act, SIGNAL(triggered()), this, SLOT(saveStateSaveAs())); act = actionCollection()->addAction("save_state_load"); act->setText(i18n("&Load State from...")); act->setIcon(KIcon("document-open")); connect(act, SIGNAL(triggered()), this, SLOT(saveStateLoad())); act = actionCollection()->addAction("save_state_save"); act->setText(i18n("Sa&ve State")); act->setIcon(KIcon("document-save")); act->setShortcut(Qt::Key_F5); connect(act, SIGNAL(triggered()), this, SLOT(saveStateSave())); act = actionCollection()->addAction("save_state_restore"); act->setText(i18n("&Restore State")); act->setIcon(KIcon("document-revert")); act->setShortcut(Qt::Key_F7); connect(act, SIGNAL(triggered()), this, SLOT(saveStateRestore())); act = actionCollection()->addAction("save_state_current"); act->setText(i18n("&Current Save State Slot")); QMenu* m = new QMenu(this); QActionGroup* ag = new QActionGroup(act); for (int i = 0; i < 10; i++) { QAction* a = m->addAction(i18n("Slot &%1", i)); a->setCheckable(true); a->setData(i); ag->addAction(a); } act->setMenu(m); slotActions = ag->actions(); connect(m, SIGNAL(aboutToShow()), this, SLOT(savestateCheckSlot())); connect(ag, SIGNAL(triggered(QAction*)), this, SLOT(savestateSelectSlot(QAction*))); //Other stuff KStandardAction::preferences(this, SLOT(configDialogShow()), actionCollection()); } #include "mainwindow.moc"