diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ae0c780b..9821e1b8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -430,6 +430,7 @@ set(SRC_DRIVERS_SDL ${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/HotKeyConf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/PaletteConf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/GuiConf.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/MovieOptions.cpp ${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/LuaControl.cpp ${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/CheatsConf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/HexEditor.cpp diff --git a/src/drivers/Qt/ConsoleWindow.cpp b/src/drivers/Qt/ConsoleWindow.cpp index 4582bff9..f34661a1 100644 --- a/src/drivers/Qt/ConsoleWindow.cpp +++ b/src/drivers/Qt/ConsoleWindow.cpp @@ -24,6 +24,7 @@ #include "Qt/HotKeyConf.h" #include "Qt/PaletteConf.h" #include "Qt/GuiConf.h" +#include "Qt/MovieOptions.h" #include "Qt/LuaControl.h" #include "Qt/CheatsConf.h" #include "Qt/HexEditor.h" @@ -378,6 +379,14 @@ void consoleWin_t::createMainMenu(void) optMenu->addAction(guiConfig); + // Options -> Movie Options + movieConfig = new QAction(tr("Movie Options"), this); + //movieConfig->setShortcut( QKeySequence(tr("Ctrl+C"))); + movieConfig->setStatusTip(tr("Movie Options")); + connect(movieConfig, SIGNAL(triggered()), this, SLOT(openMovieOptWin(void)) ); + + optMenu->addAction(movieConfig); + // Options -> Auto-Resume autoResume = new QAction(tr("Auto-Resume Play"), this); //autoResume->setShortcut( QKeySequence(tr("Ctrl+C"))); @@ -1203,6 +1212,17 @@ void consoleWin_t::openGuiConfWin(void) guiConfWin->show(); } +void consoleWin_t::openMovieOptWin(void) +{ + MovieOptionsDialog_t *win; + + //printf("Open Movie Options Window\n"); + + win = new MovieOptionsDialog_t(this); + + win->show(); +} + void consoleWin_t::openCheats(void) { //printf("Open GUI Cheat Window\n"); @@ -1590,6 +1610,7 @@ void consoleWin_t::openMovie(void) QString filename; std::string last; char dir[512]; + char replayReadOnlySetting; QFileDialog dialog(this, tr("Open FM2 Movie") ); dialog.setFileMode(QFileDialog::ExistingFile); @@ -1637,9 +1658,18 @@ void consoleWin_t::openMovie(void) FCEUI_printf ("Playing back movie located at %s\n", filename.toStdString().c_str() ); + if (suggestReadOnlyReplay) + { + replayReadOnlySetting = true; + } + else + { + replayReadOnlySetting = FCEUI_GetMovieToggleReadOnly(); + } + fceuWrapperLock(); if (FCEUI_LoadMovie( filename.toStdString().c_str(), - false, pauseframe ? pauseframe : false) == false) + replayReadOnlySetting, pauseframe ? pauseframe : false) == false) { printf("Error: Could not open movie file: %s \n", filename.toStdString().c_str() ); } diff --git a/src/drivers/Qt/ConsoleWindow.h b/src/drivers/Qt/ConsoleWindow.h index a5726d76..53df423e 100644 --- a/src/drivers/Qt/ConsoleWindow.h +++ b/src/drivers/Qt/ConsoleWindow.h @@ -78,6 +78,7 @@ class consoleWin_t : public QMainWindow QAction *hotkeyConfig; QAction *paletteConfig; QAction *guiConfig; + QAction *movieConfig; QAction *autoResume; QAction *fullscreen; QAction *aboutAct; @@ -145,6 +146,7 @@ class consoleWin_t : public QMainWindow void openHotkeyConfWin(void); void openPaletteConfWin(void); void openGuiConfWin(void); + void openMovieOptWin(void); void openCodeDataLogger(void); void openTraceLogger(void); void toggleAutoResume(void); diff --git a/src/drivers/Qt/MovieOptions.cpp b/src/drivers/Qt/MovieOptions.cpp new file mode 100644 index 00000000..ceb3855c --- /dev/null +++ b/src/drivers/Qt/MovieOptions.cpp @@ -0,0 +1,132 @@ +// HotKeyConf.cpp +// +#include +#include +#include +#include + +#include +#include + +#include "../../fceu.h" +#include "../../movie.h" + +#include "Qt/main.h" +#include "Qt/dface.h" +#include "Qt/input.h" +#include "Qt/config.h" +#include "Qt/keyscan.h" +#include "Qt/fceuWrapper.h" +#include "Qt/MovieOptions.h" + +//---------------------------------------------------------------------------- +MovieOptionsDialog_t::MovieOptionsDialog_t(QWidget *parent) + : QDialog( parent ) +{ + QVBoxLayout *mainLayout; + + setWindowTitle("Movie Options"); + + mainLayout = new QVBoxLayout(); + + readOnlyReplay = new QCheckBox( tr("Always Suggest Read-Only Replay") ); + pauseAfterPlay = new QCheckBox( tr("Pause After Playback") ); + closeAfterPlay = new QCheckBox( tr("Close After Playback") ); + bindSaveStates = new QCheckBox( tr("Bind Save-States to Movies") ); + dpySubTitles = new QCheckBox( tr("Display Movie Sub Titles") ); + putSubTitlesAvi = new QCheckBox( tr("Put Movie Sub Titles in AVI") ); + autoBackUp = new QCheckBox( tr("Automatically Backup Movies") ); + loadFullStates = new QCheckBox( tr("Load Full Save-State Movies:") ); + + mainLayout->addWidget( readOnlyReplay ); + mainLayout->addWidget( pauseAfterPlay ); + mainLayout->addWidget( closeAfterPlay ); + mainLayout->addWidget( bindSaveStates ); + mainLayout->addWidget( dpySubTitles ); + mainLayout->addWidget( putSubTitlesAvi ); + mainLayout->addWidget( autoBackUp ); + mainLayout->addWidget( loadFullStates ); + + readOnlyReplay->setChecked( suggestReadOnlyReplay ); + pauseAfterPlay->setChecked( pauseAfterPlayback ); + closeAfterPlay->setChecked( closeFinishedMovie ); + bindSaveStates->setChecked( bindSavestate ); + dpySubTitles->setChecked( movieSubtitles ); + putSubTitlesAvi->setChecked( subtitlesOnAVI ); + autoBackUp->setChecked( autoMovieBackup ); + loadFullStates->setChecked( fullSaveStateLoads ); + + setLayout( mainLayout ); + + connect( readOnlyReplay , SIGNAL(stateChanged(int)), this, SLOT(readOnlyReplayChanged(int)) ); + connect( pauseAfterPlay , SIGNAL(stateChanged(int)), this, SLOT(pauseAfterPlayChanged(int)) ); + connect( closeAfterPlay , SIGNAL(stateChanged(int)), this, SLOT(closeAfterPlayChanged(int)) ); + connect( bindSaveStates , SIGNAL(stateChanged(int)), this, SLOT(bindSaveStatesChanged(int)) ); + connect( dpySubTitles , SIGNAL(stateChanged(int)), this, SLOT(dpySubTitlesChanged(int)) ); + connect( putSubTitlesAvi, SIGNAL(stateChanged(int)), this, SLOT(putSubTitlesAviChanged(int)) ); + connect( autoBackUp , SIGNAL(stateChanged(int)), this, SLOT(autoBackUpChanged(int)) ); + connect( loadFullStates , SIGNAL(stateChanged(int)), this, SLOT(loadFullStatesChanged(int)) ); +} +//---------------------------------------------------------------------------- +MovieOptionsDialog_t::~MovieOptionsDialog_t(void) +{ + printf("Destroy Movie Options Window\n"); +} +//---------------------------------------------------------------------------- +void MovieOptionsDialog_t::closeEvent(QCloseEvent *event) +{ + printf("Movie Options Close Window Event\n"); + done(0); + deleteLater(); + event->accept(); +} +//---------------------------------------------------------------------------- +void MovieOptionsDialog_t::closeWindow(void) +{ + //printf("Close Window\n"); + done(0); + deleteLater(); +} +//---------------------------------------------------------------------------- +void MovieOptionsDialog_t::readOnlyReplayChanged( int state ) +{ + suggestReadOnlyReplay = (state != Qt::Unchecked); +} +//---------------------------------------------------------------------------- +void MovieOptionsDialog_t::pauseAfterPlayChanged( int state ) +{ + pauseAfterPlayback = (state != Qt::Unchecked); +} +//---------------------------------------------------------------------------- +void MovieOptionsDialog_t::closeAfterPlayChanged( int state ) +{ + closeFinishedMovie = (state != Qt::Unchecked); +} +//---------------------------------------------------------------------------- +void MovieOptionsDialog_t::bindSaveStatesChanged( int state ) +{ + bindSavestate = (state != Qt::Unchecked); +} +//---------------------------------------------------------------------------- +void MovieOptionsDialog_t::dpySubTitlesChanged( int state ) +{ + movieSubtitles = (state != Qt::Unchecked); + + g_config->setOption("SDL.SubtitleDisplay", movieSubtitles); +} +//---------------------------------------------------------------------------- +void MovieOptionsDialog_t::putSubTitlesAviChanged( int state ) +{ + subtitlesOnAVI = (state != Qt::Unchecked); +} +//---------------------------------------------------------------------------- +void MovieOptionsDialog_t::autoBackUpChanged( int state ) +{ + autoMovieBackup = (state != Qt::Unchecked); +} +//---------------------------------------------------------------------------- +void MovieOptionsDialog_t::loadFullStatesChanged( int state ) +{ + fullSaveStateLoads = (state != Qt::Unchecked); +} +//---------------------------------------------------------------------------- diff --git a/src/drivers/Qt/MovieOptions.h b/src/drivers/Qt/MovieOptions.h new file mode 100644 index 00000000..c229c846 --- /dev/null +++ b/src/drivers/Qt/MovieOptions.h @@ -0,0 +1,55 @@ +// MovieOptions.h +// + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Qt/main.h" + +class MovieOptionsDialog_t : public QDialog +{ + Q_OBJECT + + public: + MovieOptionsDialog_t(QWidget *parent = 0); + ~MovieOptionsDialog_t(void); + + protected: + void closeEvent(QCloseEvent *event); + + QCheckBox *readOnlyReplay; + QCheckBox *pauseAfterPlay; + QCheckBox *closeAfterPlay; + QCheckBox *bindSaveStates; + QCheckBox *dpySubTitles; + QCheckBox *putSubTitlesAvi; + QCheckBox *autoBackUp; + QCheckBox *loadFullStates; + + private: + + public slots: + void closeWindow(void); + private slots: + void readOnlyReplayChanged( int state ); + void pauseAfterPlayChanged( int state ); + void closeAfterPlayChanged( int state ); + void bindSaveStatesChanged( int state ); + void dpySubTitlesChanged( int state ); + void putSubTitlesAviChanged( int state ); + void autoBackUpChanged( int state ); + void loadFullStatesChanged( int state ); + +}; diff --git a/src/drivers/Qt/fceuWrapper.cpp b/src/drivers/Qt/fceuWrapper.cpp index e025641a..f0a37bf5 100644 --- a/src/drivers/Qt/fceuWrapper.cpp +++ b/src/drivers/Qt/fceuWrapper.cpp @@ -54,6 +54,8 @@ int KillFCEUXonFrame = 0; bool swapDuty = 0; bool turbo = false; +bool pauseAfterPlayback = false; +bool suggestReadOnlyReplay = true; unsigned int gui_draw_area_width = 256; unsigned int gui_draw_area_height = 256; @@ -696,8 +698,7 @@ int fceuWrapperInit( int argc, char *argv[] ) input_display = id; // not exactly an id as an true/false switch; still better than creating another int for that g_config->getOption("SDL.SubtitleDisplay", &id); - extern int movieSubtitles; - movieSubtitles = id; + movieSubtitles = id ? true : false; } // load the hotkeys from the config life @@ -725,10 +726,20 @@ int fceuWrapperInit( int argc, char *argv[] ) if(s.find(".fm2") != std::string::npos || s.find(".fm3") != std::string::npos) { static int pauseframe; + char replayReadOnlySetting; g_config->getOption("SDL.PauseFrame", &pauseframe); g_config->setOption("SDL.PauseFrame", 0); + + if (suggestReadOnlyReplay) + { + replayReadOnlySetting = true; + } + else + { + replayReadOnlySetting = FCEUI_GetMovieToggleReadOnly(); + } FCEUI_printf("Playing back movie located at %s\n", s.c_str()); - FCEUI_LoadMovie(s.c_str(), false, pauseframe ? pauseframe : false); + FCEUI_LoadMovie(s.c_str(), replayReadOnlySetting, pauseframe ? pauseframe : false); } else { @@ -1354,7 +1365,7 @@ void FCEUI_AviVideoUpdate(const unsigned char* buffer) { } int FCEUD_ShowStatusIcon(void) {return 0;} bool FCEUI_AviIsRecording(void) {return false;} void FCEUI_UseInputPreset(int preset) { } -bool FCEUD_PauseAfterPlayback() { return false; } +bool FCEUD_PauseAfterPlayback() { return pauseAfterPlayback; } void FCEUD_TurboOn (void) { /* TODO */ }; void FCEUD_TurboOff (void) { /* TODO */ }; diff --git a/src/drivers/Qt/fceuWrapper.h b/src/drivers/Qt/fceuWrapper.h index 3d20719b..a7d49ab5 100644 --- a/src/drivers/Qt/fceuWrapper.h +++ b/src/drivers/Qt/fceuWrapper.h @@ -13,6 +13,8 @@ extern int gametype; extern int closeFinishedMovie; extern bool turbo; extern bool swapDuty; +extern bool pauseAfterPlayback; +extern bool suggestReadOnlyReplay; extern unsigned int gui_draw_area_width; extern unsigned int gui_draw_area_height; diff --git a/src/drivers/Qt/input.cpp b/src/drivers/Qt/input.cpp index 8feebdcc..4d6bd9c6 100644 --- a/src/drivers/Qt/input.cpp +++ b/src/drivers/Qt/input.cpp @@ -754,8 +754,7 @@ static void KeyboardCommands (void) if (_keyonly (Hotkeys[HK_TOGGLE_SUBTITLE])) { - extern int movieSubtitles; - movieSubtitles ^= 1; + movieSubtitles = !movieSubtitles; FCEUI_DispMessage ("Movie subtitles o%s.", 0, movieSubtitles ? "n" : "ff"); } diff --git a/src/fceu.h b/src/fceu.h index fbcbc567..07280a70 100644 --- a/src/fceu.h +++ b/src/fceu.h @@ -94,6 +94,7 @@ extern int GameAttributes; extern uint8 PAL; extern int dendy; +extern bool movieSubtitles; //#include "driver.h"