Merge pull request #250 from mjbudd77/master
Added message log viewer window to Qt GUI.
This commit is contained in:
commit
e86c001c2a
|
@ -443,6 +443,7 @@ set(SRC_DRIVERS_SDL
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/CheatsConf.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/CheatsConf.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/GameGenie.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/GameGenie.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/HexEditor.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/HexEditor.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/MsgLogViewer.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/CodeDataLogger.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/CodeDataLogger.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/SymbolicDebug.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/SymbolicDebug.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/ConsoleDebugger.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/ConsoleDebugger.cpp
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
#include "Qt/ConsoleUtilities.h"
|
#include "Qt/ConsoleUtilities.h"
|
||||||
#include "Qt/ConsoleSoundConf.h"
|
#include "Qt/ConsoleSoundConf.h"
|
||||||
#include "Qt/ConsoleVideoConf.h"
|
#include "Qt/ConsoleVideoConf.h"
|
||||||
|
#include "Qt/MsgLogViewer.h"
|
||||||
#include "Qt/AboutWindow.h"
|
#include "Qt/AboutWindow.h"
|
||||||
#include "Qt/fceuWrapper.h"
|
#include "Qt/fceuWrapper.h"
|
||||||
#include "Qt/ppuViewer.h"
|
#include "Qt/ppuViewer.h"
|
||||||
|
@ -776,6 +777,13 @@ void consoleWin_t::createMainMenu(void)
|
||||||
connect(aboutActQt, SIGNAL(triggered()), this, SLOT(aboutQt(void)) );
|
connect(aboutActQt, SIGNAL(triggered()), this, SLOT(aboutQt(void)) );
|
||||||
|
|
||||||
helpMenu->addAction(aboutActQt);
|
helpMenu->addAction(aboutActQt);
|
||||||
|
|
||||||
|
// Help -> Message Log
|
||||||
|
msgLogAct = new QAction(tr("Message Log"), this);
|
||||||
|
msgLogAct->setStatusTip(tr("Message Log"));
|
||||||
|
connect(msgLogAct, SIGNAL(triggered()), this, SLOT(openMsgLogWin(void)) );
|
||||||
|
|
||||||
|
helpMenu->addAction(msgLogAct);
|
||||||
};
|
};
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void consoleWin_t::closeApp(void)
|
void consoleWin_t::closeApp(void)
|
||||||
|
@ -1813,6 +1821,18 @@ void consoleWin_t::aboutQt(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void consoleWin_t::openMsgLogWin(void)
|
||||||
|
{
|
||||||
|
//printf("Open Message Log Window\n");
|
||||||
|
MsgLogViewDialog_t *msgLogWin;
|
||||||
|
|
||||||
|
msgLogWin = new MsgLogViewDialog_t(this);
|
||||||
|
|
||||||
|
msgLogWin->show();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int consoleWin_t::setNicePriority( int value )
|
int consoleWin_t::setNicePriority( int value )
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
|
@ -117,6 +117,7 @@ class consoleWin_t : public QMainWindow
|
||||||
QAction *fullscreen;
|
QAction *fullscreen;
|
||||||
QAction *aboutAct;
|
QAction *aboutAct;
|
||||||
QAction *aboutActQt;
|
QAction *aboutActQt;
|
||||||
|
QAction *msgLogAct;
|
||||||
QAction *state[10];
|
QAction *state[10];
|
||||||
QAction *powerAct;
|
QAction *powerAct;
|
||||||
QAction *resetAct;
|
QAction *resetAct;
|
||||||
|
@ -174,6 +175,7 @@ class consoleWin_t : public QMainWindow
|
||||||
void closeROMCB(void);
|
void closeROMCB(void);
|
||||||
void aboutFCEUX(void);
|
void aboutFCEUX(void);
|
||||||
void aboutQt(void);
|
void aboutQt(void);
|
||||||
|
void openMsgLogWin(void);
|
||||||
void openInputConfWin(void);
|
void openInputConfWin(void);
|
||||||
void openGameSndConfWin(void);
|
void openGameSndConfWin(void);
|
||||||
void openGameVideoConfWin(void);
|
void openGameVideoConfWin(void);
|
||||||
|
|
|
@ -0,0 +1,274 @@
|
||||||
|
// MsgLogViewer.cpp
|
||||||
|
//
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
#include <QHeaderView>
|
||||||
|
#include <QCloseEvent>
|
||||||
|
|
||||||
|
#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/MsgLogViewer.h"
|
||||||
|
#include "Qt/ConsoleWindow.h"
|
||||||
|
|
||||||
|
#define MSG_LOG_MAX_LINES 256
|
||||||
|
|
||||||
|
class msgLogBuf_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
msgLogBuf_t(void)
|
||||||
|
{
|
||||||
|
char filename[256];
|
||||||
|
|
||||||
|
strcpy( filename, "/tmp/fceux.log" );
|
||||||
|
|
||||||
|
fp = ::fopen( filename, "w+");
|
||||||
|
|
||||||
|
if ( fp == NULL )
|
||||||
|
{
|
||||||
|
printf("Error: Failed to open message log file: '%s'\n", filename);
|
||||||
|
}
|
||||||
|
maxLines = MSG_LOG_MAX_LINES;
|
||||||
|
totalLines = 0;
|
||||||
|
head = tail = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
~msgLogBuf_t(void)
|
||||||
|
{
|
||||||
|
if ( fp != NULL )
|
||||||
|
{
|
||||||
|
::fclose(fp); fp = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear(void)
|
||||||
|
{
|
||||||
|
head = tail = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addLine( const char *txt, bool NewLine = false )
|
||||||
|
{
|
||||||
|
long ofs;
|
||||||
|
|
||||||
|
if ( fp == NULL ) return;
|
||||||
|
|
||||||
|
::fseek( fp, 0L, SEEK_END);
|
||||||
|
|
||||||
|
ofs = ::ftell(fp);
|
||||||
|
|
||||||
|
if ( NewLine )
|
||||||
|
{
|
||||||
|
::fprintf( fp, "%s\n", txt );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
::fprintf( fp, "%s", txt );
|
||||||
|
}
|
||||||
|
|
||||||
|
fpOfsList[head] = ofs;
|
||||||
|
|
||||||
|
head = (head + 1) % MSG_LOG_MAX_LINES;
|
||||||
|
|
||||||
|
if ( head == tail )
|
||||||
|
{
|
||||||
|
tail = (tail + 1) % MSG_LOG_MAX_LINES;
|
||||||
|
}
|
||||||
|
|
||||||
|
totalLines++;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t getTotalLineCount(void)
|
||||||
|
{
|
||||||
|
return totalLines;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size(void)
|
||||||
|
{
|
||||||
|
size_t s;
|
||||||
|
|
||||||
|
s = head - tail;
|
||||||
|
|
||||||
|
if ( s < 0 )
|
||||||
|
{
|
||||||
|
s += MSG_LOG_MAX_LINES;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadTextViewer( QPlainTextEdit *viewer )
|
||||||
|
{
|
||||||
|
long ofs, nbytes;
|
||||||
|
|
||||||
|
if ( fp == NULL )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( head == tail )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
char buf[65536];
|
||||||
|
|
||||||
|
ofs = fpOfsList[tail];
|
||||||
|
|
||||||
|
::fseek( fp, ofs, SEEK_SET);
|
||||||
|
|
||||||
|
//printf("Seek: %li \n", ofs );
|
||||||
|
|
||||||
|
if ( (nbytes = ::fread( buf, 1, sizeof(buf), fp )) > 0 )
|
||||||
|
{
|
||||||
|
//printf("READ: %li \n", nbytes );
|
||||||
|
buf[ nbytes ] = 0;
|
||||||
|
viewer->setPlainText( buf );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
FILE *fp;
|
||||||
|
size_t maxLines;
|
||||||
|
size_t totalLines;
|
||||||
|
size_t head;
|
||||||
|
size_t tail;
|
||||||
|
|
||||||
|
long fpOfsList[MSG_LOG_MAX_LINES];
|
||||||
|
};
|
||||||
|
|
||||||
|
static msgLogBuf_t msgLog;
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
MsgLogViewDialog_t::MsgLogViewDialog_t(QWidget *parent)
|
||||||
|
: QDialog( parent )
|
||||||
|
{
|
||||||
|
QVBoxLayout *mainLayout;
|
||||||
|
QHBoxLayout *hbox;
|
||||||
|
QPushButton *clearBtn, *closeBtn;
|
||||||
|
|
||||||
|
setWindowTitle("Message Log Viewer");
|
||||||
|
|
||||||
|
resize( 512, 512 );
|
||||||
|
|
||||||
|
mainLayout = new QVBoxLayout();
|
||||||
|
|
||||||
|
txtView = new QPlainTextEdit();
|
||||||
|
txtView->setReadOnly(true);
|
||||||
|
|
||||||
|
mainLayout->addWidget( txtView );
|
||||||
|
|
||||||
|
hbox = new QHBoxLayout();
|
||||||
|
clearBtn = new QPushButton( tr("Clear") );
|
||||||
|
closeBtn = new QPushButton( tr("Close") );
|
||||||
|
hbox->addWidget( clearBtn );
|
||||||
|
hbox->addWidget( closeBtn );
|
||||||
|
|
||||||
|
connect( clearBtn, SIGNAL(clicked(void)), this, SLOT(clearLog(void)) );
|
||||||
|
connect( closeBtn, SIGNAL(clicked(void)), this, SLOT(closeWindow(void)) );
|
||||||
|
|
||||||
|
mainLayout->addLayout( hbox );
|
||||||
|
|
||||||
|
setLayout( mainLayout );
|
||||||
|
|
||||||
|
totalLines = 0;
|
||||||
|
|
||||||
|
updateTimer = new QTimer( this );
|
||||||
|
|
||||||
|
connect( updateTimer, &QTimer::timeout, this, &MsgLogViewDialog_t::updatePeriodic );
|
||||||
|
|
||||||
|
updateTimer->start( 500 ); // 2hz
|
||||||
|
|
||||||
|
msgLog.loadTextViewer( txtView );
|
||||||
|
|
||||||
|
totalLines = msgLog.getTotalLineCount();
|
||||||
|
|
||||||
|
txtView->moveCursor(QTextCursor::End);
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
MsgLogViewDialog_t::~MsgLogViewDialog_t(void)
|
||||||
|
{
|
||||||
|
printf("Destroy Msg Log Key Config Window\n");
|
||||||
|
updateTimer->stop();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void MsgLogViewDialog_t::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
printf("Msg Log Key Close Window Event\n");
|
||||||
|
done(0);
|
||||||
|
deleteLater();
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void MsgLogViewDialog_t::closeWindow(void)
|
||||||
|
{
|
||||||
|
//printf("Close Window\n");
|
||||||
|
done(0);
|
||||||
|
deleteLater();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void MsgLogViewDialog_t::clearLog(void)
|
||||||
|
{
|
||||||
|
fceuWrapperLock();
|
||||||
|
|
||||||
|
msgLog.clear();
|
||||||
|
|
||||||
|
txtView->clear();
|
||||||
|
|
||||||
|
fceuWrapperUnLock();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void MsgLogViewDialog_t::updatePeriodic(void)
|
||||||
|
{
|
||||||
|
if ( msgLog.getTotalLineCount() != totalLines )
|
||||||
|
{
|
||||||
|
fceuWrapperLock();
|
||||||
|
|
||||||
|
msgLog.loadTextViewer( txtView );
|
||||||
|
|
||||||
|
totalLines = msgLog.getTotalLineCount();
|
||||||
|
|
||||||
|
fceuWrapperUnLock();
|
||||||
|
|
||||||
|
txtView->moveCursor(QTextCursor::End);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* Prints a textual message without adding a newline at the end.
|
||||||
|
*
|
||||||
|
* @param text The text of the message.
|
||||||
|
*
|
||||||
|
* TODO: This function should have a better name.
|
||||||
|
**/
|
||||||
|
void FCEUD_Message(const char *text)
|
||||||
|
{
|
||||||
|
fputs(text, stdout);
|
||||||
|
//fprintf(stdout, "\n");
|
||||||
|
//
|
||||||
|
msgLog.addLine( text, false );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* Shows an error message in a message box.
|
||||||
|
* (For now: prints to stderr.)
|
||||||
|
*
|
||||||
|
* If running in Qt mode, display a dialog message box of the error.
|
||||||
|
*
|
||||||
|
* @param errormsg Text of the error message.
|
||||||
|
**/
|
||||||
|
void FCEUD_PrintError(const char *errormsg)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s\n", errormsg);
|
||||||
|
|
||||||
|
msgLog.addLine( errormsg, true );
|
||||||
|
|
||||||
|
if ( consoleWindow )
|
||||||
|
{
|
||||||
|
consoleWindow->QueueErrorMsgWindow( errormsg );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
|
@ -0,0 +1,46 @@
|
||||||
|
// MsgLogViewer.h
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QCheckBox>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QFrame>
|
||||||
|
#include <QGroupBox>
|
||||||
|
#include <QPlainTextEdit>
|
||||||
|
|
||||||
|
#include "Qt/main.h"
|
||||||
|
|
||||||
|
class MsgLogViewDialog_t : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
MsgLogViewDialog_t(QWidget *parent = 0);
|
||||||
|
~MsgLogViewDialog_t(void);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void closeEvent(QCloseEvent *event);
|
||||||
|
|
||||||
|
QTimer *updateTimer;
|
||||||
|
QPlainTextEdit *txtView;
|
||||||
|
|
||||||
|
size_t totalLines;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void closeWindow(void);
|
||||||
|
private slots:
|
||||||
|
void updatePeriodic(void);
|
||||||
|
void clearLog(void);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
|
@ -82,33 +82,9 @@ int mutecapture = 0;
|
||||||
//*****************************************************************
|
//*****************************************************************
|
||||||
//
|
//
|
||||||
|
|
||||||
/**
|
// Message functions defined in MsgLogViewer.cpp
|
||||||
* Prints a textual message without adding a newline at the end.
|
//void FCEUD_Message(const char *text)
|
||||||
*
|
//void FCEUD_PrintError(const char *errormsg)
|
||||||
* @param text The text of the message.
|
|
||||||
*
|
|
||||||
* TODO: This function should have a better name.
|
|
||||||
**/
|
|
||||||
void FCEUD_Message(const char *text)
|
|
||||||
{
|
|
||||||
fputs(text, stdout);
|
|
||||||
//fprintf(stdout, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shows an error message in a message box.
|
|
||||||
* (For now: prints to stderr.)
|
|
||||||
*
|
|
||||||
* If running in Qt mode, display a dialog message box of the error.
|
|
||||||
*
|
|
||||||
* @param errormsg Text of the error message.
|
|
||||||
**/
|
|
||||||
void FCEUD_PrintError(const char *errormsg)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s\n", errormsg);
|
|
||||||
|
|
||||||
consoleWindow->QueueErrorMsgWindow( errormsg );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens a file, C++ style, to be read a byte at a time.
|
* Opens a file, C++ style, to be read a byte at a time.
|
||||||
|
|
Loading…
Reference in New Issue