Cleaned out treeview logic in favor of text view. Text view is much more efficient.

This commit is contained in:
Matthew Budd 2020-05-19 01:00:14 -04:00
parent 284a787104
commit 5db17d7913
1 changed files with 2 additions and 482 deletions

View File

@ -84,27 +84,16 @@ static int getROM( unsigned int offset)
struct memViewWin_t struct memViewWin_t
{ {
GtkWidget *win; GtkWidget *win;
GtkWidget *tree;
GtkWidget *vbar;
GtkWidget *ivbar; GtkWidget *ivbar;
GtkWidget *selCellLabel; GtkWidget *selCellLabel;
GtkTextView *textview; GtkTextView *textview;
GtkTextBuffer *textbuf; GtkTextBuffer *textbuf;
GtkTreeStore *memview_store; GtkTreeStore *memview_store;
GtkAdjustment *vadj;
int baseAddr;
int maxAddr;
int selAddr;
int selRowIdx;
int selColIdx;
int editRowIdx;
int editColIdx;
int row_vis_start; int row_vis_start;
int row_vis_end; int row_vis_end;
int row_vis_center; int row_vis_center;
int mode; int mode;
int evntSrcID; int evntSrcID;
int treeViewLines;
int numLines; int numLines;
int numCharsPerLine; int numCharsPerLine;
unsigned char *mbuf; unsigned char *mbuf;
@ -123,19 +112,10 @@ struct memViewWin_t
memViewWin_t(void) memViewWin_t(void)
{ {
win = NULL; win = NULL;
tree = NULL;
vbar = NULL;
vadj = NULL;
textview = NULL; textview = NULL;
textbuf = NULL; textbuf = NULL;
selCellLabel = NULL; selCellLabel = NULL;
memview_store = NULL; memview_store = NULL;
selRowIdx = -1;
selColIdx = -1;
editRowIdx = -1;
editColIdx = -1;
selAddr = -1;
baseAddr = 0;
row_vis_start = 0; row_vis_start = 0;
row_vis_end = 64; row_vis_end = 64;
row_vis_center= 32; row_vis_center= 32;
@ -143,7 +123,6 @@ struct memViewWin_t
mbuf = NULL; mbuf = NULL;
numLines = 0; numLines = 0;
evntSrcID = 0; evntSrcID = 0;
treeViewLines = 64;
numCharsPerLine = 90; numCharsPerLine = 90;
redraw = 1; redraw = 1;
memAccessFunc = getRAM; memAccessFunc = getRAM;
@ -171,49 +150,6 @@ struct memViewWin_t
mode = new_mode; mode = new_mode;
} }
void setBaseAddr( double value )
{
int addr, r, max;
addr = (int)( value + 0.50 );
printf("Set BaseAddr Req: %i 0x%08x\n", addr, addr );
r = addr % 16;
addr = addr - r;
max = mbuf_size - (treeViewLines * 16);
if ( addr >= max )
{
addr = max;
}
baseAddr = addr;
redraw = 1;
}
void incrBaseAddr( int value )
{
int addr, r, max;
addr = baseAddr + value;
printf("Set BaseAddr Req: %i 0x%08x\n", addr, addr );
r = addr % 16;
addr = addr - r;
max = mbuf_size - (treeViewLines * 16);
if ( addr >= max )
{
addr = max;
}
baseAddr = addr;
redraw = 1;
}
int writeMem( unsigned int addr, int value ) int writeMem( unsigned int addr, int value )
{ {
switch ( mode ) switch ( mode )
@ -241,26 +177,7 @@ struct memViewWin_t
} }
} }
//int set_inner_slider( double value )
//{
// GtkAdjustment *ivadj;
// double l, u;
// ivadj = gtk_range_get_adjustment( GTK_RANGE(ivbar) );
// l = gtk_adjustment_get_lower( ivadj );
// u = gtk_adjustment_get_upper( ivadj );
// printf("Inner VBAR Limits: %f %f \n" ,
// l, u );
// gtk_range_set_value( GTK_RANGE(ivbar), l + value*(u-l) );
// return 0;
//}
void showMemViewResults (int reset); void showMemViewResults (int reset);
//int calcVisibleRange( int *start_out, int *end_out, int *center_out );
int calcVisibleRange( int *start_out, int *end_out, int *center_out ); int calcVisibleRange( int *start_out, int *end_out, int *center_out );
}; };
@ -456,246 +373,6 @@ void memViewWin_t::showMemViewResults (int reset)
} }
//void memViewWin_t::showMemViewResults (int reset)
//{
//
// int lineAddr = 0, line_addr_start, line_addr_end, i, row=0;
// int addr, memSize = 0, un, ln;
// unsigned int c;
// GtkTreeIter iter;
// char addrStr[16], valStr[16][8], ascii[18], row_changed;
// int *indexArray;
// GtkTreePath *start_path = NULL, *end_path = NULL;
// int (*memAccessFunc)( unsigned int offset) = NULL;
//
// switch ( mode )
// {
// default:
// case MODE_NES_RAM:
// memAccessFunc = getRAM;
// memSize = 0x10000;
// break;
// case MODE_NES_PPU:
// memAccessFunc = getPPU;
// memSize = (GameInfo->type == GIT_NSF ? 0x2000 : 0x4000);
// break;
// case MODE_NES_OAM:
// memAccessFunc = getOAM;
// memSize = 0x100;
// break;
// case MODE_NES_ROM:
// memAccessFunc = getROM;
// memSize = 16 + CHRsize[0] + PRGsize[0];
// break;
// }
//
// if ( (mbuf == NULL) || (mbuf_size != memSize) )
// {
// printf("Mode: %i MemSize:%i 0x%08x\n", mode, memSize, (unsigned int)memSize );
// reset = 1;
//
// if ( mbuf )
// {
// free(mbuf); mbuf = NULL;
// }
// mbuf = (unsigned char *)malloc( memSize );
//
// if ( mbuf )
// {
// mbuf_size = memSize;
// initMem( mbuf, memSize );
// }
// else
// {
// printf("Error: Failed to allocate memview buffer size\n");
// mbuf_size = 0;
// return;
// }
//
// gtk_adjustment_configure ( vadj,
// 0.0, // value,
// 0.0, // lower,
// mbuf_size, // upper,
// 16.0, // step_increment,
// 32.0, // page_increment,
// 32.0 ); // page_size);
// }
//
// if (reset)
// {
// line_addr_start = 0;
// line_addr_end = memSize;
//
// gtk_tree_store_clear (memview_store);
//
// for ( i=0; i < treeViewLines; i++)
// {
// gtk_tree_store_append (memview_store, &iter, NULL); // aquire iter
// }
// gtk_tree_model_get_iter_first( GTK_TREE_MODEL (memview_store), &iter );
//
// line_addr_start = 0;
// line_addr_end = treeViewLines * 16;
//
// row_vis_start = 0;
// row_vis_end = treeViewLines;
// row_vis_center = treeViewLines/2;
// }
//
// if ( !reset )
// {
// if ( gtk_tree_view_get_visible_range ( GTK_TREE_VIEW(tree), &start_path, &end_path ) )
// {
// int iterValid;
// indexArray = gtk_tree_path_get_indices (start_path);
//
// if ( indexArray != NULL )
// {
// row_vis_start = indexArray[0];
// }
//
// indexArray = gtk_tree_path_get_indices (end_path);
//
// if ( indexArray != NULL )
// {
// row_vis_end = indexArray[0] + 1;
// }
//
// iterValid = gtk_tree_model_get_iter( GTK_TREE_MODEL (memview_store), &iter, start_path );
//
// gtk_tree_path_free( start_path );
// gtk_tree_path_free( end_path );
//
// if ( !iterValid )
// {
// printf("Error: Failed to get start iterator.\n");
// return;
// }
// row_vis_center = row_vis_start + (row_vis_end - row_vis_start + 1) / 2;
// //printf("Tree View Start: %i End: %i Center: %i \n", row_vis_start, row_vis_end, row_vis_center );
//
// //if ( row_vis_center > 48 )
// //{
// // set_inner_slider( 0.50 );
// //}
// }
// }
// line_addr_start = row_vis_start * 16;
// line_addr_end = row_vis_end * 16;
//
// for ( row=row_vis_start; row<row_vis_end; row++)
// {
// lineAddr = baseAddr + (row*16);
// row_changed = reset || redraw;
//
// sprintf( addrStr, "%08X", lineAddr );
//
// for (i=0; i<16; i++)
// {
// addr = lineAddr+i;
//
// c = memAccessFunc(addr);
//
// un = ( c & 0x00f0 ) >> 4;
// ln = ( c & 0x000f );
//
// valStr[i][0] = conv2xchar(un);
// valStr[i][1] = conv2xchar(ln);
// valStr[i][2] = 0;
//
// if ( isprint(c) )
// {
// ascii[i] = c;
// }
// else
// {
// ascii[i] = '.';
// }
// if ( c != mbuf[addr] )
// {
// row_changed = 1;
// mbuf[addr] = c;
// }
// }
// ascii[16] = 0;
//
// if ( row_changed && (editRowIdx != row) )
// {
// gtk_tree_store_set( memview_store, &iter, 0, addrStr,
// 1 , valStr[0] , 2, valStr[1] , 3, valStr[2] , 4, valStr[3],
// 5 , valStr[4] , 6, valStr[5] , 7, valStr[6] , 8, valStr[7],
// 9 , valStr[8] , 10, valStr[9] , 11, valStr[10], 12, valStr[11],
// 13, valStr[12], 14, valStr[13], 15, valStr[14], 16, valStr[15],
// 17, ascii,
// -1 );
// }
//
// if (!gtk_tree_model_iter_next
// (GTK_TREE_MODEL (memview_store), &iter))
// {
// return;
// }
// }
// redraw = 0;
//}
//int memViewWin_t::calcVisibleRange( int *start_out, int *end_out, int *center_out )
//{
// int retval = 0;
// int *indexArray;
// int start=0, end=64, center=32;
// GtkTreePath *start_path = NULL, *end_path = NULL;
//
// if ( gtk_tree_view_get_visible_range ( GTK_TREE_VIEW(tree), &start_path, &end_path ) )
// {
// indexArray = gtk_tree_path_get_indices (start_path);
//
// if ( indexArray != NULL )
// {
// start = indexArray[0];
// }
// else
// {
// retval = -1;
// }
//
// indexArray = gtk_tree_path_get_indices (end_path);
//
// if ( indexArray != NULL )
// {
// end = indexArray[0] + 1;
// }
// else
// {
// retval = -1;
// }
//
// gtk_tree_path_free( start_path );
// gtk_tree_path_free( end_path );
//
// center = start + (end - start + 1) / 2;
//
// if ( start_out != NULL )
// {
// *start_out = start;
// }
// if ( end_out != NULL )
// {
// *end_out = end;
// }
// if ( center_out != NULL )
// {
// *center_out = center;
// }
// }
// else
// {
// retval = -1;
// }
// return retval;
//}
int memViewWin_t::calcVisibleRange( int *start_out, int *end_out, int *center_out ) int memViewWin_t::calcVisibleRange( int *start_out, int *end_out, int *center_out )
{ {
GtkAdjustment *ivadj; GtkAdjustment *ivadj;
@ -907,38 +584,6 @@ textbuffer_string_insert (GtkTextBuffer *textbuffer,
} }
} }
static void
treeRowActivated (GtkTreeView *tree_view,
GtkTreePath *path,
GtkTreeViewColumn *column,
memViewWin_t * mv )
{
char stmp[128];
mv->selRowIdx = strtol( gtk_tree_path_to_string(path), NULL, 0 );
mv->selColIdx = strtol( gtk_tree_view_column_get_title(column), NULL, 16 );
mv->selAddr = mv->baseAddr + (mv->selRowIdx*16) + mv->selColIdx;
sprintf( stmp, "<span font_desc=\"mono 12\">Selected Cell Address: 0x%04X</span>", mv->selAddr );
gtk_label_set_markup ( GTK_LABEL(mv->selCellLabel), stmp );
//printf("Row:Col Active: %i:%i Addr: 0x%04X \n", mv->selRowIdx, mv->selColIdx, mv->selAddr );
}
static gboolean
vscroll_changed (GtkRange *range,
GtkScrollType scroll,
gdouble value,
memViewWin_t * mv)
{
//mv->setBaseAddr( value );
return FALSE;
}
static void static void
inner_vbar_changed (GtkRange *range, inner_vbar_changed (GtkRange *range,
memViewWin_t * mv) memViewWin_t * mv)
@ -959,63 +604,14 @@ inner_vbar_changed (GtkRange *range,
// v, l, u, r ); // v, l, u, r );
} }
static void
outer_vbar_changed (GtkRange *range,
memViewWin_t * mv)
{
//printf("Outer VBAR: %f \n", gtk_range_get_value( range ) );
//mv->setBaseAddr( gtk_range_get_value( range ) );
}
static void static void
textview_backspace_cb (GtkTextView *text_view, textview_backspace_cb (GtkTextView *text_view,
memViewWin_t * mv) memViewWin_t * mv)
{ {
printf("BackSpace:\n"); //printf("BackSpace:\n");
mv->redraw = 1; mv->redraw = 1;
} }
static void memview_cell_edited_cb (GtkCellRendererText * cell,
gchar * path_string,
gchar * new_text, memViewWin_t * mv)
{
int addr, rowIdx;
unsigned int value;
writefunc wfunc;
//printf("PATH: %s \n", path_string );
rowIdx = atoi( path_string );
addr = mv->baseAddr + (rowIdx*16) + mv->selColIdx;
wfunc = GetWriteHandler (addr);
if (wfunc)
{
value = strtoul (new_text, NULL, 16);
wfunc ((uint32) addr,
(uint8) (value & 0x000000ff));
}
mv->editRowIdx = -1;
mv->editColIdx = -1;
}
static void memview_cell_edited_start_cb (GtkCellRenderer * renderer, GtkCellEditable * editable, gchar * path, memViewWin_t * mv)
{
//printf("MemView Edit Start: '%s':%li\n", path, (long)user_data);
mv->editRowIdx = atoi (path);
mv->editColIdx = mv->selColIdx;
}
static void memview_cell_edited_cancel_cb (GtkCellRenderer * renderer, memViewWin_t * mv)
{
//printf("MemView Edit Cancel:%li\n", (long)user_data);
mv->editRowIdx = -1;
mv->editColIdx = -1;
}
static gint updateMemViewTree (void *userData) static gint updateMemViewTree (void *userData)
{ {
std::list <memViewWin_t*>::iterator it; std::list <memViewWin_t*>::iterator it;
@ -1034,10 +630,7 @@ void openMemoryViewWindow (void)
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *scroll; GtkWidget *scroll;
GtkWidget *menubar; GtkWidget *menubar;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
memViewWin_t *mv; memViewWin_t *mv;
//void (*memview_cell_edited_start_cbs)(GtkCellRenderer * renderer, GtkCellEditable * editable, gchar * path, memViewWin_t * mv)[16];
mv = new memViewWin_t; mv = new memViewWin_t;
@ -1058,65 +651,6 @@ void openMemoryViewWindow (void)
gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0); gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0);
mv->memview_store =
gtk_tree_store_new ( 18,
G_TYPE_STRING, // Address Field
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, // Bytes 0 -> 3
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, // Bytes 4 -> 7
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, // Bytes 8 -> 11
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, // Bytes 12 -> 15
G_TYPE_STRING ); // Ascii Byte Decoding
mv->tree =
gtk_tree_view_new_with_model (GTK_TREE_MODEL
(mv->memview_store));
gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (mv->tree),
GTK_TREE_VIEW_GRID_LINES_VERTICAL);
g_object_set( mv->tree, "activate-on-single-click", TRUE, NULL );
g_signal_connect (mv->tree, "row-activated",
(GCallback) treeRowActivated,
(gpointer) mv);
renderer = gtk_cell_renderer_text_new ();
g_object_set (renderer, "family", "MonoSpace", NULL);
column = gtk_tree_view_column_new_with_attributes ("Addr", renderer,
"text", 0, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (mv->tree), column);
for (long int i=0; i<16; i++)
{
char title[16];
sprintf( title, "%02lX", i );
renderer = gtk_cell_renderer_text_new ();
g_object_set (renderer, "family", "MonoSpace", NULL);
g_object_set (renderer, "editable", TRUE, NULL);
g_signal_connect (renderer, "edited",
(GCallback) memview_cell_edited_cb, (gpointer) mv);
g_signal_connect (renderer, "editing-started",
(GCallback) memview_cell_edited_start_cb,
(gpointer) mv);
g_signal_connect (renderer, "editing-canceled",
(GCallback) memview_cell_edited_cancel_cb,
(gpointer) mv);
column = gtk_tree_view_column_new_with_attributes ( title,
renderer, "text", i+1,
NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (mv->tree), column);
mv->hexByte_renderer[i] = renderer;
}
renderer = gtk_cell_renderer_text_new ();
g_object_set (renderer, "family", "MonoSpace", NULL);
column = gtk_tree_view_column_new_with_attributes ("ASCII", renderer,
"text", 17, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (mv->tree), column);
mv->textview = (GtkTextView*) gtk_text_view_new(); mv->textview = (GtkTextView*) gtk_text_view_new();
gtk_text_view_set_monospace( mv->textview, TRUE ); gtk_text_view_set_monospace( mv->textview, TRUE );
@ -1140,8 +674,7 @@ void openMemoryViewWindow (void)
scroll = gtk_scrolled_window_new (NULL, NULL); scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
//gtk_container_add (GTK_CONTAINER (scroll), mv->tree);
gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET(mv->textview) ); gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET(mv->textview) );
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
@ -1149,19 +682,6 @@ void openMemoryViewWindow (void)
gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 2);
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 2);
mv->vadj = gtk_adjustment_new( 0, 0, 100, 1, 20, 20 );
mv->vbar = gtk_scrollbar_new( GTK_ORIENTATION_VERTICAL, mv->vadj );
g_signal_connect (mv->vbar, "change-value",
G_CALLBACK (vscroll_changed), mv);
g_signal_connect (mv->vbar, "value-changed",
G_CALLBACK (outer_vbar_changed), mv);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
gtk_box_pack_start (GTK_BOX (vbox), mv->vbar, TRUE, TRUE, 2);
gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 2); gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 2);
gtk_box_pack_start (GTK_BOX (main_vbox), hbox, TRUE, TRUE, 5); gtk_box_pack_start (GTK_BOX (main_vbox), hbox, TRUE, TRUE, 5);