Added hex editor bookmark auto load/save functionality.
This commit is contained in:
parent
1032e6f443
commit
ca59812e97
|
@ -59,7 +59,7 @@ int getFileBaseName( const char *filepath, char *base )
|
|||
{
|
||||
if ( (filepath[i] == '/') || (filepath[i] == '\\') )
|
||||
{
|
||||
j = i;
|
||||
j = i+1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
|
|
@ -37,6 +37,8 @@
|
|||
#include "Qt/ConsoleUtilities.h"
|
||||
|
||||
static HexBookMarkManager_t hbm;
|
||||
static std::list <HexEditorDialog_t*> winList;
|
||||
static const char *memViewNames[] = { "RAM", "PPU", "OAM", "ROM", NULL };
|
||||
//----------------------------------------------------------------------------
|
||||
static int getRAM( unsigned int i )
|
||||
{
|
||||
|
@ -315,6 +317,7 @@ void HexBookMarkManager_t::removeAll(void)
|
|||
|
||||
ls.pop_front();
|
||||
}
|
||||
v.clear();
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
int HexBookMarkManager_t::addBookMark( int addr, int mode, const char *desc )
|
||||
|
@ -371,6 +374,142 @@ HexBookMark *HexBookMarkManager_t::getBookMark( int index )
|
|||
return v[index];
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
int HexBookMarkManager_t::loadFromFile(void)
|
||||
{
|
||||
int i,j,mode,addr;
|
||||
FILE *fp;
|
||||
QDir dir;
|
||||
char line[256], fd[256], baseFile[512];
|
||||
const char *romFile = getRomFile();
|
||||
const char *baseDir = FCEUI_GetBaseDirectory();
|
||||
std::string path;
|
||||
|
||||
if ( romFile == NULL )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
path = std::string(baseDir) + "/bookmarks/";
|
||||
|
||||
dir.mkpath( QString::fromStdString(path) );
|
||||
|
||||
getFileBaseName( romFile, baseFile );
|
||||
|
||||
path += std::string(baseFile) + ".txt";
|
||||
|
||||
fp = ::fopen( path.c_str(), "r");
|
||||
|
||||
if ( fp == NULL )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
while ( ::fgets( line, sizeof(line), fp ) != NULL )
|
||||
{
|
||||
i=0; j=0;
|
||||
//printf("%s\n", line );
|
||||
//
|
||||
while ( isspace(line[i]) ) i++;
|
||||
|
||||
while ( isalpha(line[i]) )
|
||||
{
|
||||
fd[j] = line[i]; i++; j++;
|
||||
}
|
||||
fd[j] = 0;
|
||||
|
||||
mode = -1;
|
||||
|
||||
for (j=0; j<4; j++)
|
||||
{
|
||||
if ( strcmp( fd, memViewNames[j] ) == 0 )
|
||||
{
|
||||
mode = j; break;
|
||||
}
|
||||
}
|
||||
if ( mode < 0 ) continue;
|
||||
|
||||
while ( isspace(line[i]) ) i++;
|
||||
if ( line[i] == ':' ) i++;
|
||||
while ( isspace(line[i]) ) i++;
|
||||
|
||||
j=0;
|
||||
while ( isxdigit(line[i]) )
|
||||
{
|
||||
fd[j] = line[i]; i++; j++;
|
||||
}
|
||||
fd[j] = 0;
|
||||
|
||||
addr = strtol( fd, NULL, 16 );
|
||||
|
||||
while ( isspace(line[i]) ) i++;
|
||||
if ( line[i] == ':' ) i++;
|
||||
while ( isspace(line[i]) ) i++;
|
||||
|
||||
j=0;
|
||||
while ( line[i] )
|
||||
{
|
||||
fd[j] = line[i]; i++; j++;
|
||||
}
|
||||
fd[j] = 0;
|
||||
j--;
|
||||
|
||||
while ( j >= 0 )
|
||||
{
|
||||
if ( isspace( fd[j] ) )
|
||||
{
|
||||
fd[j] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
j--;
|
||||
}
|
||||
|
||||
addBookMark( addr, mode, fd );
|
||||
}
|
||||
::fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
int HexBookMarkManager_t::saveToFile(void)
|
||||
{
|
||||
FILE *fp;
|
||||
QDir dir;
|
||||
char baseFile[512];
|
||||
const char *romFile = getRomFile();
|
||||
const char *baseDir = FCEUI_GetBaseDirectory();
|
||||
std::string path;
|
||||
|
||||
if ( romFile == NULL )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
path = std::string(baseDir) + "/bookmarks/";
|
||||
|
||||
dir.mkpath( QString::fromStdString(path) );
|
||||
|
||||
getFileBaseName( romFile, baseFile );
|
||||
|
||||
path += std::string(baseFile) + ".txt";
|
||||
|
||||
fp = ::fopen( path.c_str(), "w");
|
||||
|
||||
if ( fp == NULL )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (int i=0; i<v.size(); i++)
|
||||
{
|
||||
fprintf( fp, "%s:%08X:%s\n",
|
||||
memViewNames[ v[i]->mode ], v[i]->addr, v[i]->desc );
|
||||
}
|
||||
::fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
HexBookMarkMenuAction::HexBookMarkMenuAction(QString desc, QWidget *parent)
|
||||
: QAction( desc, parent )
|
||||
{
|
||||
|
@ -535,8 +674,6 @@ HexEditorDialog_t::HexEditorDialog_t(QWidget *parent)
|
|||
// Bookmarks Menu
|
||||
bookmarkMenu = menuBar->addMenu(tr("Bookmarks"));
|
||||
|
||||
populateBookmarkMenu();
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// Menu End
|
||||
//-----------------------------------------------------------------------
|
||||
|
@ -574,12 +711,29 @@ HexEditorDialog_t::HexEditorDialog_t(QWidget *parent)
|
|||
connect( periodicTimer, &QTimer::timeout, this, &HexEditorDialog_t::updatePeriodic );
|
||||
|
||||
periodicTimer->start( 100 ); // 10hz
|
||||
|
||||
winList.push_back(this);
|
||||
|
||||
populateBookmarkMenu();
|
||||
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
HexEditorDialog_t::~HexEditorDialog_t(void)
|
||||
{
|
||||
std::list <HexEditorDialog_t*>::iterator it;
|
||||
|
||||
printf("Hex Editor Deleted\n");
|
||||
periodicTimer->stop();
|
||||
|
||||
for (it = winList.begin(); it != winList.end(); it++)
|
||||
{
|
||||
if ( (*it) == this )
|
||||
{
|
||||
winList.erase(it);
|
||||
//printf("Removing Hex Edit Window\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
void HexEditorDialog_t::removeAllBookmarks(void)
|
||||
|
@ -611,6 +765,7 @@ void HexEditorDialog_t::populateBookmarkMenu(void)
|
|||
|
||||
if ( b )
|
||||
{
|
||||
//printf("%p %p \n", b, editor );
|
||||
hAct = new HexBookMarkMenuAction(tr(b->desc), bookmarkMenu);
|
||||
bookmarkMenu->addAction(hAct);
|
||||
hAct->bm = b; hAct->qedit = editor;
|
||||
|
@ -1707,3 +1862,30 @@ void QHexEdit::paintEvent(QPaintEvent *event)
|
|||
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
void hexEditorLoadBookmarks(void)
|
||||
{
|
||||
std::list <HexEditorDialog_t*>::iterator it;
|
||||
|
||||
hbm.removeAll();
|
||||
hbm.loadFromFile();
|
||||
|
||||
for (it = winList.begin(); it != winList.end(); it++)
|
||||
{
|
||||
(*it)->populateBookmarkMenu();
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
void hexEditorSaveBookmarks(void)
|
||||
{
|
||||
std::list <HexEditorDialog_t*>::iterator it;
|
||||
|
||||
printf("Save Bookmarks\n");
|
||||
hbm.saveToFile();
|
||||
hbm.removeAll();
|
||||
|
||||
for (it = winList.begin(); it != winList.end(); it++)
|
||||
{
|
||||
(*it)->populateBookmarkMenu();
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
|
|
|
@ -67,6 +67,8 @@ class HexBookMarkManager_t
|
|||
int addBookMark( int addr, int mode, const char *desc );
|
||||
int size(void);
|
||||
HexBookMark *getBookMark( int index );
|
||||
int saveToFile(void);
|
||||
int loadFromFile(void);
|
||||
private:
|
||||
void updateVector(void);
|
||||
std::list <HexBookMark*> ls;
|
||||
|
@ -224,3 +226,6 @@ class HexEditorDialog_t : public QDialog
|
|||
void pickBackGroundColor(void);
|
||||
void removeAllBookmarks(void);
|
||||
};
|
||||
|
||||
void hexEditorLoadBookmarks(void);
|
||||
void hexEditorSaveBookmarks(void);
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "Qt/sdl-video.h"
|
||||
#include "Qt/nes_shm.h"
|
||||
#include "Qt/unix-netplay.h"
|
||||
#include "Qt/HexEditor.h"
|
||||
#include "Qt/ConsoleWindow.h"
|
||||
#include "Qt/fceux_git_info.h"
|
||||
|
||||
|
@ -231,6 +232,8 @@ int LoadGame(const char *path)
|
|||
return 0;
|
||||
}
|
||||
|
||||
hexEditorLoadBookmarks();
|
||||
|
||||
int state_to_load;
|
||||
g_config->getOption("SDL.AutoLoadState", &state_to_load);
|
||||
if (state_to_load >= 0 && state_to_load < 10){
|
||||
|
@ -277,6 +280,7 @@ CloseGame(void)
|
|||
if(!isloaded) {
|
||||
return(0);
|
||||
}
|
||||
hexEditorSaveBookmarks();
|
||||
|
||||
int state_to_save;
|
||||
g_config->getOption("SDL.AutoSaveState", &state_to_save);
|
||||
|
|
Loading…
Reference in New Issue