Merge pull request #141 from mjbudd77/master

Qt SDL GUI Message Dialog Updates
This commit is contained in:
mjbudd77 2020-07-26 22:41:58 -04:00 committed by GitHub
commit 42df5f6171
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 211 additions and 14 deletions

View File

@ -4,6 +4,7 @@
#include <iostream> #include <iostream>
#include <cstdlib> #include <cstdlib>
#include <QFileDialog> #include <QFileDialog>
#include <QMessageBox>
#include "../../fceu.h" #include "../../fceu.h"
#include "../../fds.h" #include "../../fds.h"
@ -39,6 +40,7 @@ consoleWin_t::consoleWin_t(QWidget *parent)
g_config->getOption( "SDL.VideoDriver", &use_SDL_video ); g_config->getOption( "SDL.VideoDriver", &use_SDL_video );
errorMsgValid = false;
viewport_GL = NULL; viewport_GL = NULL;
viewport_SDL = NULL; viewport_SDL = NULL;
@ -72,6 +74,7 @@ consoleWin_t::consoleWin_t(QWidget *parent)
emulatorThread->start(); emulatorThread->start();
gamePadConfWin = NULL; gamePadConfWin = NULL;
} }
consoleWin_t::~consoleWin_t(void) consoleWin_t::~consoleWin_t(void)
@ -116,6 +119,26 @@ void consoleWin_t::setCyclePeriodms( int ms )
//printf("Period Set to: %i ms \n", ms ); //printf("Period Set to: %i ms \n", ms );
} }
void consoleWin_t::showErrorMsgWindow()
{
QMessageBox msgBox(this);
fceuWrapperLock();
msgBox.setIcon( QMessageBox::Critical );
msgBox.setText( tr(errorMsg.c_str()) );
errorMsg.clear();
fceuWrapperUnLock();
msgBox.show();
msgBox.exec();
}
void consoleWin_t::QueueErrorMsgWindow( const char *msg )
{
errorMsg.append( msg );
errorMsg.append("\n");
errorMsgValid = true;
}
void consoleWin_t::closeEvent(QCloseEvent *event) void consoleWin_t::closeEvent(QCloseEvent *event)
{ {
//printf("Main Window Close Event\n"); //printf("Main Window Close Event\n");
@ -489,12 +512,20 @@ void consoleWin_t::createMainMenu(void)
//----------------------------------------------------------------------- //-----------------------------------------------------------------------
// Help // Help
helpMenu = menuBar()->addMenu(tr("Help")); helpMenu = menuBar()->addMenu(tr("Help"));
aboutAct = new QAction(tr("About"), this); // Help -> About FCEUX
aboutAct = new QAction(tr("About FCEUX"), this);
aboutAct->setStatusTip(tr("About FCEUX")); aboutAct->setStatusTip(tr("About FCEUX"));
connect(aboutAct, SIGNAL(triggered()), this, SLOT(aboutFCEUX(void)) ); connect(aboutAct, SIGNAL(triggered()), this, SLOT(aboutFCEUX(void)) );
helpMenu->addAction(aboutAct); helpMenu->addAction(aboutAct);
// Help -> About Qt
aboutActQt = new QAction(tr("About Qt"), this);
aboutActQt->setStatusTip(tr("About Qt"));
connect(aboutActQt, SIGNAL(triggered()), this, SLOT(aboutQt(void)) );
helpMenu->addAction(aboutActQt);
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void consoleWin_t::closeApp(void) void consoleWin_t::closeApp(void)
@ -1331,6 +1362,16 @@ void consoleWin_t::aboutFCEUX(void)
return; return;
} }
void consoleWin_t::aboutQt(void)
{
//printf("About Qt Window\n");
QMessageBox::aboutQt(this);
//printf("About Qt Destroyed\n");
return;
}
void consoleWin_t::syncActionConfig( QAction *act, const char *property ) void consoleWin_t::syncActionConfig( QAction *act, const char *property )
{ {
if ( act->isCheckable() ) if ( act->isCheckable() )
@ -1373,6 +1414,12 @@ void consoleWin_t::updatePeriodic(void)
} }
} }
if ( errorMsgValid )
{
showErrorMsgWindow();
errorMsgValid = false;
}
return; return;
} }

View File

@ -46,6 +46,8 @@ class consoleWin_t : public QMainWindow
QMutex *mutex; QMutex *mutex;
void QueueErrorMsgWindow( const char *msg );
protected: protected:
QMenu *fileMenu; QMenu *fileMenu;
QMenu *optMenu; QMenu *optMenu;
@ -72,6 +74,7 @@ class consoleWin_t : public QMainWindow
QAction *autoResume; QAction *autoResume;
QAction *fullscreen; QAction *fullscreen;
QAction *aboutAct; QAction *aboutAct;
QAction *aboutActQt;
QAction *state[10]; QAction *state[10];
QAction *powerAct; QAction *powerAct;
QAction *resetAct; QAction *resetAct;
@ -89,15 +92,20 @@ class consoleWin_t : public QMainWindow
QAction *recAsMovAct; QAction *recAsMovAct;
QTimer *gameTimer; QTimer *gameTimer;
emulatorThread_t *emulatorThread; emulatorThread_t *emulatorThread;
GamePadConfDialog_t *gamePadConfWin; GamePadConfDialog_t *gamePadConfWin;
std::string errorMsg;
bool errorMsgValid;
protected: protected:
void closeEvent(QCloseEvent *event); void closeEvent(QCloseEvent *event);
void keyPressEvent(QKeyEvent *event); void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event);
void syncActionConfig( QAction *act, const char *property ); void syncActionConfig( QAction *act, const char *property );
void showErrorMsgWindow(void);
private: private:
void createMainMenu(void); void createMainMenu(void);
@ -112,6 +120,7 @@ class consoleWin_t : public QMainWindow
void quickSave(void); void quickSave(void);
void closeROMCB(void); void closeROMCB(void);
void aboutFCEUX(void); void aboutFCEUX(void);
void aboutQt(void);
void openGamePadConfWin(void); void openGamePadConfWin(void);
void openGameSndConfWin(void); void openGameSndConfWin(void);
void openGameVideoConfWin(void); void openGameVideoConfWin(void);

View File

@ -2,6 +2,7 @@
// //
#include <QDir> #include <QDir>
#include <QInputDialog> #include <QInputDialog>
#include <QMessageBox>
#include "Qt/GamePadConf.h" #include "Qt/GamePadConf.h"
#include "Qt/main.h" #include "Qt/main.h"
@ -12,6 +13,29 @@
#include "Qt/sdl-joystick.h" #include "Qt/sdl-joystick.h"
#include "Qt/fceuWrapper.h" #include "Qt/fceuWrapper.h"
struct GamePadConfigLocalData_t
{
std::string guid;
std::string profile;
struct {
char needsSave;
} btn[GAMEPAD_NUM_BUTTONS];
GamePadConfigLocalData_t(void)
{
for (int i=0; i<GAMEPAD_NUM_BUTTONS; i++)
{
btn[i].needsSave = 0;
}
}
};
static GamePadConfigLocalData_t lcl[GAMEPAD_NUM_DEVICES];
//---------------------------------------------------- //----------------------------------------------------
GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent) GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
: QDialog( parent ) : QDialog( parent )
@ -29,6 +53,8 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
QPushButton *clearAllButton; QPushButton *clearAllButton;
QPushButton *closebutton; QPushButton *closebutton;
QPushButton *clearButton[GAMEPAD_NUM_BUTTONS]; QPushButton *clearButton[GAMEPAD_NUM_BUTTONS];
std::string prefix;
char stmp[256];
InitJoysticks(); InitJoysticks();
@ -71,10 +97,8 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
{ {
if ( js->isConnected() ) if ( js->isConnected() )
{ {
char stmp[128];
sprintf( stmp, "%i: %s", i, js->getName() ); sprintf( stmp, "%i: %s", i, js->getName() );
devSel->addItem( tr(stmp), i ); devSel->addItem( tr(stmp), i );
} }
} }
} }
@ -236,6 +260,16 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
inputTimer->start( 33 ); // 30hz inputTimer->start( 33 ); // 30hz
for (int i=0; i<GAMEPAD_NUM_DEVICES; i++)
{
sprintf( stmp, "SDL.Input.GamePad.%i.", i );
prefix = stmp;
g_config->getOption(prefix + "Profile", &lcl[i].profile );
lcl[i].guid.assign( GamePad[i].getGUID() );
}
loadMapList(); loadMapList();
} }
@ -345,7 +379,17 @@ void GamePadConfDialog_t::updateCntrlrDpy(void)
{ {
strcpy( keyNameStr, ButtonName( &GamePad[portNum].bmap[i] ) ); strcpy( keyNameStr, ButtonName( &GamePad[portNum].bmap[i] ) );
} }
keyName[i]->setText( tr(keyNameStr) ); keyName[i]->setText( tr(keyNameStr) );
//if ( lcl[portNum].btn[i].needsSave )
//{
// keyName[i]->setStyleSheet("color: red;");
//}
//else
//{
// keyName[i]->setStyleSheet("color: black;");
//}
} }
} }
//---------------------------------------------------- //----------------------------------------------------
@ -387,6 +431,9 @@ void GamePadConfDialog_t::deviceSelect(int index)
} }
GamePad[portNum].setDeviceIndex( devIdx ); GamePad[portNum].setDeviceIndex( devIdx );
lcl[portNum].guid.assign( GamePad[portNum].getGUID() );
lcl[portNum].profile.assign("default");
loadMapList(); loadMapList();
updateCntrlrDpy(); updateCntrlrDpy();
@ -429,6 +476,7 @@ void GamePadConfDialog_t::changeButton(int padNo, int x)
keyName[x]->setText( keyNameStr ); keyName[x]->setText( keyNameStr );
button[x]->setText("Change"); button[x]->setText("Change");
lcl[padNo].btn[x].needsSave = 1;
ButtonConfigEnd (); ButtonConfigEnd ();
@ -440,11 +488,15 @@ void GamePadConfDialog_t::clearButton( int padNo, int x )
GamePad[padNo].bmap[x].ButtonNum = -1; GamePad[padNo].bmap[x].ButtonNum = -1;
keyName[x]->setText(""); keyName[x]->setText("");
lcl[padNo].btn[x].needsSave = 1;
} }
//---------------------------------------------------- //----------------------------------------------------
void GamePadConfDialog_t::closeEvent(QCloseEvent *event) void GamePadConfDialog_t::closeEvent(QCloseEvent *event)
{ {
//printf("GamePad Close Window Event\n"); promptToSave();
printf("GamePad Close Window Event\n");
buttonConfigStatus = 0; buttonConfigStatus = 0;
done(0); done(0);
event->accept(); event->accept();
@ -452,7 +504,9 @@ void GamePadConfDialog_t::closeEvent(QCloseEvent *event)
//---------------------------------------------------- //----------------------------------------------------
void GamePadConfDialog_t::closeWindow(void) void GamePadConfDialog_t::closeWindow(void)
{ {
//printf("Close Window\n"); promptToSave();
printf("Close Window\n");
buttonConfigStatus = 0; buttonConfigStatus = 0;
done(0); done(0);
} }
@ -567,6 +621,7 @@ void GamePadConfDialog_t::clearAllCallback(void)
//---------------------------------------------------- //----------------------------------------------------
void GamePadConfDialog_t::saveConfig(void) void GamePadConfDialog_t::saveConfig(void)
{ {
int i;
char stmp[256]; char stmp[256];
std::string prefix, mapName; std::string prefix, mapName;
@ -577,15 +632,27 @@ void GamePadConfDialog_t::saveConfig(void)
g_config->setOption(prefix + "DeviceGUID", GamePad[portNum].getGUID() ); g_config->setOption(prefix + "DeviceGUID", GamePad[portNum].getGUID() );
g_config->setOption(prefix + "Profile" , mapName.c_str() ); g_config->setOption(prefix + "Profile" , mapName.c_str() );
for (i=0; i<GAMEPAD_NUM_BUTTONS; i++)
{
lcl[portNum].btn[i].needsSave = 0;
}
} }
//---------------------------------------------------- //----------------------------------------------------
void GamePadConfDialog_t::createNewProfile( const char *name ) void GamePadConfDialog_t::createNewProfile( const char *name )
{ {
printf("Creating: %s \n", name ); char stmp[256];
//printf("Creating: %s \n", name );
GamePad[portNum].createProfile(name); GamePad[portNum].createProfile(name);
mapSel->addItem( tr(name) ); mapSel->addItem( tr(name) );
mapSel->setCurrentIndex( mapSel->count() - 1 );
saveConfig();
sprintf( stmp, "Mapping Created: %s/%s \n", GamePad[portNum].getGUID(), name );
mapMsg->setText( tr(stmp) );
} }
//---------------------------------------------------- //----------------------------------------------------
void GamePadConfDialog_t::newProfileCallback(void) void GamePadConfDialog_t::newProfileCallback(void)
@ -689,6 +756,71 @@ void GamePadConfDialog_t::deleteProfileCallback(void)
loadMapList(); loadMapList();
} }
//---------------------------------------------------- //----------------------------------------------------
void GamePadConfDialog_t::promptToSave(void)
{
int i,j,n;
std::string msg;
QMessageBox msgBox(this);
char saveRequired = 0;
char padNeedsSave[GAMEPAD_NUM_DEVICES];
char stmp[256];
n=0;
for (i=0; i<GAMEPAD_NUM_DEVICES; i++)
{
padNeedsSave[i] = 0;
for (j=0; j<GAMEPAD_NUM_BUTTONS; j++)
{
if ( lcl[i].btn[j].needsSave )
{
padNeedsSave[i] = 1;
saveRequired = 1;
n++;
break;
}
}
}
if ( !saveRequired )
{
return;
}
sprintf( stmp, "Warning: Gamepad mappings have not been saved for port%c ", (n > 1) ? 's':' ');
msg.assign( stmp );
j=n;
for (i=0; i<GAMEPAD_NUM_DEVICES; i++)
{
if ( padNeedsSave[i] )
{
sprintf( stmp, "%i", i+1 );
msg.append(stmp);
j--;
if ( j > 1 )
{
msg.append(", ");
}
else if ( j == 1 )
{
msg.append(" and ");
}
}
}
msg.append(".");
msgBox.setIcon( QMessageBox::Warning );
msgBox.setText( tr(msg.c_str()) );
msgBox.show();
//msgBox.resize( 512, 128 );
msgBox.exec();
}
//----------------------------------------------------
void GamePadConfDialog_t::updatePeriodic(void) void GamePadConfDialog_t::updatePeriodic(void)
{ {
for (int i=0; i<GAMEPAD_NUM_BUTTONS; i++) for (int i=0; i<GAMEPAD_NUM_BUTTONS; i++)
@ -706,6 +838,15 @@ void GamePadConfDialog_t::updatePeriodic(void)
} }
keyState[i]->setText( tr(txt) ); keyState[i]->setText( tr(txt) );
keyState[i]->setStyleSheet( style ); keyState[i]->setStyleSheet( style );
if ( lcl[portNum].btn[i].needsSave )
{
keyName[i]->setStyleSheet("color: red;");
}
else
{
keyName[i]->setStyleSheet("color: black;");
}
} }
} }
//---------------------------------------------------- //----------------------------------------------------

View File

@ -62,6 +62,7 @@ class GamePadConfDialog_t : public QDialog
void createNewProfile( const char *name ); void createNewProfile( const char *name );
void loadMapList(void); void loadMapList(void);
void saveConfig(void); void saveConfig(void);
void promptToSave(void);
public slots: public slots:
void closeWindow(void); void closeWindow(void);

View File

@ -80,20 +80,22 @@ int mutecapture = 0;
void FCEUD_Message(const char *text) void FCEUD_Message(const char *text)
{ {
fputs(text, stdout); fputs(text, stdout);
fprintf(stdout, "\n"); //fprintf(stdout, "\n");
} }
/** /**
* Shows an error message in a message box. * Shows an error message in a message box.
* (For now: prints to stderr.) * (For now: prints to stderr.)
* *
* If running in GTK mode, display a dialog message box of the error. * If running in Qt mode, display a dialog message box of the error.
* *
* @param errormsg Text of the error message. * @param errormsg Text of the error message.
**/ **/
void FCEUD_PrintError(const char *errormsg) void FCEUD_PrintError(const char *errormsg)
{ {
fprintf(stderr, "%s\n", errormsg); fprintf(stderr, "%s\n", errormsg);
consoleWindow->QueueErrorMsgWindow( errormsg );
} }
/** /**

View File

@ -742,7 +742,6 @@ int GamePad_t::saveMappingToFile( const char *filename, const char *txtMap )
//******************************************************************************** //********************************************************************************
int GamePad_t::createProfile( const char *name ) int GamePad_t::createProfile( const char *name )
{ {
char txtMap[256];
const char *guid = NULL; const char *guid = NULL;
const char *baseDir = FCEUI_GetBaseDirectory(); const char *baseDir = FCEUI_GetBaseDirectory();
std::string path; std::string path;
@ -771,13 +770,11 @@ int GamePad_t::createProfile( const char *name )
dir.mkpath( QString::fromStdString(path) ); dir.mkpath( QString::fromStdString(path) );
//printf("DIR: '%s'\n", path.c_str() ); //printf("DIR: '%s'\n", path.c_str() );
path += "/" + std::string(name) + ".txt"; //path += "/" + std::string(name) + ".txt";
//printf("File: '%s'\n", path.c_str() ); //printf("File: '%s'\n", path.c_str() );
getDefaultMap( txtMap, guid ); saveCurrentMapToFile( name );
saveMappingToFile( path.c_str(), txtMap );
return 0; return 0;
} }