gtk-port: fix a few bugs in cheat window

keeping cheats disabled (until release)
This commit is contained in:
matusz 2009-06-13 14:14:43 +00:00
parent 99e1e3b5d5
commit a8bed32619
2 changed files with 109 additions and 101 deletions

View File

@ -25,14 +25,12 @@
#include "cheatsGTK.h"
#include "cheatSystem.h"
#include "main.h"
#include "desmume.h"
static GtkWidget *win;
static void enabled_toggled(GtkCellRendererToggle * cell,
gchar * path_str, gpointer data);
static BOOL shouldBeRunning;
enum {
COLUMN_POS,
COLUMN_ENABLED,
COLUMN_SIZE,
COLUMN_HI,
@ -51,7 +49,6 @@ static struct {
gint type;
gint column;
} columnTable[]={
{ "Position", TYPE_STRING, COLUMN_POS},
{ "Enabled", TYPE_TOGGLE, COLUMN_ENABLED},
{ "Size", TYPE_STRING, COLUMN_SIZE},
{ "Offset", TYPE_STRING, COLUMN_HI},
@ -59,7 +56,37 @@ static struct {
{ "Description", TYPE_STRING, COLUMN_DESC}
};
static void cell_edited(GtkCellRendererText * cell,
static void
enabled_toggled(GtkCellRendererToggle * cell,
gchar * path_str, gpointer data)
{
GtkTreeModel *model = (GtkTreeModel *) data;
GtkTreeIter iter;
GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
gboolean enabled;
gtk_tree_model_get_iter(model, &iter, path);
gtk_tree_model_get(model, &iter, COLUMN_ENABLED, &enabled, -1);
enabled ^= 1;
CHEATS_LIST cheat;
u32 ii;
GtkTreePath *path1;
path1 = gtk_tree_model_get_path (model, &iter);
ii = gtk_tree_path_get_indices (path)[0];
cheatsGet(&cheat, ii);
cheatsUpdate(cheat.size, cheat.hi[0], cheat.lo[0], cheat.description,
enabled, ii);
gtk_list_store_set(GTK_LIST_STORE(model), &iter, COLUMN_ENABLED, enabled, -1);
gtk_tree_path_free(path);
}
static void cheat_list_modify_cheat(GtkCellRendererText * cell,
const gchar * path_string,
const gchar * new_text, gpointer data)
{
@ -78,14 +105,12 @@ static void cell_edited(GtkCellRendererText * cell,
CHEATS_LIST cheat;
path1 = gtk_tree_model_get_path (model, &iter);
ii = gtk_tree_path_get_indices (path)[0];
gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
cheatsRemove(ii);
cheatsGet(&cheat, ii);
gtk_tree_path_free (path1);
ii = gtk_tree_path_get_indices (path)[0];
cheatsGet(&cheat, ii);
if (column == COLUMN_LO || column == COLUMN_HI
|| column == COLUMN_SIZE) {
u32 v = atoi(new_text);
@ -105,7 +130,7 @@ static void cell_edited(GtkCellRendererText * cell,
}
gtk_list_store_set(GTK_LIST_STORE(model), &iter, column,
atoi(new_text), -1);
} else {
} else if (column == COLUMN_DESC){
cheatsUpdate(cheat.size, cheat.hi[0], cheat.lo[0],
g_strdup(new_text), cheat.enabled, ii);
gtk_list_store_set(GTK_LIST_STORE(model), &iter, column,
@ -115,63 +140,6 @@ static void cell_edited(GtkCellRendererText * cell,
}
}
static void cheat_list_add_columns(GtkTreeView * tree, GtkListStore *store)
{
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));
for (u32 ii = 0; ii < sizeof(columnTable) / sizeof(columnTable[0]); ii++) {
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
const gchar *attrib;
if (columnTable[ii].type == TYPE_TOGGLE) {
renderer = gtk_cell_renderer_toggle_new();
g_signal_connect(renderer, "toggled",
G_CALLBACK(enabled_toggled), model);
attrib = "active";
} else {
renderer = gtk_cell_renderer_text_new();
g_object_set (renderer, "editable", TRUE, NULL);
g_signal_connect (renderer, "edited", G_CALLBACK (cell_edited), store);
attrib = "text";
}
column = gtk_tree_view_column_new_with_attributes(columnTable[ii].caption,
renderer, attrib, columnTable[ii].column, NULL);
g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (columnTable[ii].column));
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
}
}
static void cheatListEnd()
{
cheatsSave();
Launch();
}
static GtkListStore *cheat_list_populate()
{
GtkListStore *store = gtk_list_store_new (6, G_TYPE_INT, G_TYPE_BOOLEAN,
G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING);
CHEATS_LIST cheat;
u32 chsize = cheatsGetSize();
for(u32 ii = 0; ii < chsize; ii++){
GtkTreeIter iter;
cheatsGet(&cheat, ii);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COLUMN_POS, ii,
COLUMN_ENABLED, cheat.enabled,
COLUMN_SIZE, cheat.size+1,
COLUMN_HI, cheat.hi[0],
COLUMN_LO, cheat.lo[0],
COLUMN_DESC, cheat.description,
-1);
}
return store;
}
static void cheat_list_remove_cheat(GtkWidget * widget, gpointer data)
{
GtkTreeView *tree = (GtkTreeView *) data;
@ -201,7 +169,6 @@ static void cheat_list_add_cheat(GtkWidget * widget, gpointer data)
cheatsAdd(1, 0, 0, g_strdup(NEW_DESC), FALSE);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COLUMN_POS, 1,
COLUMN_ENABLED, FALSE,
COLUMN_SIZE, 1,
COLUMN_HI, 0,
@ -210,6 +177,63 @@ static void cheat_list_add_cheat(GtkWidget * widget, gpointer data)
#undef NEW_DESC
}
static void cheat_list_add_columns(GtkTreeView * tree, GtkListStore *store)
{
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));
for (u32 ii = 0; ii < sizeof(columnTable) / sizeof(columnTable[0]); ii++) {
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
const gchar *attrib;
if (columnTable[ii].type == TYPE_TOGGLE) {
renderer = gtk_cell_renderer_toggle_new();
g_signal_connect(renderer, "toggled",
G_CALLBACK(enabled_toggled), model);
attrib = "active";
} else {
renderer = gtk_cell_renderer_text_new();
g_object_set (renderer, "editable", TRUE, NULL);
g_signal_connect (renderer, "edited", G_CALLBACK (cheat_list_modify_cheat), store);
attrib = "text";
}
column = gtk_tree_view_column_new_with_attributes(columnTable[ii].caption,
renderer, attrib, columnTable[ii].column, NULL);
g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (columnTable[ii].column));
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
}
}
static void cheatListEnd()
{
cheatsSave();
if(shouldBeRunning)
Launch();
}
static GtkListStore *cheat_list_populate()
{
GtkListStore *store = gtk_list_store_new (5, G_TYPE_BOOLEAN,
G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING);
CHEATS_LIST cheat;
u32 chsize = cheatsGetSize();
for(u32 ii = 0; ii < chsize; ii++){
GtkTreeIter iter;
cheatsGet(&cheat, ii);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COLUMN_ENABLED, cheat.enabled,
COLUMN_SIZE, cheat.size+1,
COLUMN_HI, cheat.hi[0],
COLUMN_LO, cheat.lo[0],
COLUMN_DESC, cheat.description,
-1);
}
return store;
}
static GtkWidget *cheat_list_create_ui()
{
GtkListStore *store = cheat_list_populate();
@ -242,7 +266,8 @@ static GtkWidget *cheat_list_create_ui()
void CheatList ()
{
#ifdef BROKENCHEATS
#ifdef DESMUME_GTK_CHEATS_BROKEN
shouldBeRunning = desmume_running();
Pause();
win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(win),"Cheat List");
@ -257,32 +282,6 @@ void CheatList ()
#endif
}
static void
enabled_toggled(GtkCellRendererToggle * cell,
gchar * path_str, gpointer data)
{
GtkTreeModel *model = (GtkTreeModel *) data;
GtkTreeIter iter;
GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
gboolean enabled;
gtk_tree_model_get_iter(model, &iter, path);
gtk_tree_model_get(model, &iter, COLUMN_ENABLED, &enabled, -1);
enabled ^= 1;
CHEATS_LIST cheat;
u32 ii;
gtk_tree_model_get(model, &iter, COLUMN_POS, &ii, -1);
cheatsGet(&cheat, ii);
cheatsUpdate(cheat.size, cheat.hi[0], cheat.lo[0], cheat.description,
enabled, ii);
gtk_list_store_set(GTK_LIST_STORE(model), &iter, COLUMN_ENABLED, enabled, -1);
gtk_tree_path_free(path);
}
void CheatSearch ()
{

View File

@ -124,11 +124,9 @@ static const char *ui_description =
" <menubar name='MainMenu'>"
" <menu action='FileMenu'>"
" <menuitem action='open'/>"
" <separator/>"
" <menuitem action='savestateto'/>"
" <menuitem action='loadstatefrom'/>"
" <menuitem action='recordmovie'/>"
" <menuitem action='playmovie'/>"
" <menuitem action='stopmovie'/>"
" <menu action='SavestateMenu'>"
" <menuitem action='savestate1'/>"
" <menuitem action='savestate2'/>"
@ -156,7 +154,12 @@ static const char *ui_description =
#ifdef GTK_DESMUME_FIRMWARE_BROKEN
" <menuitem action='loadfirmware'/>"
#endif
" <separator/>"
" <menuitem action='recordmovie'/>"
" <menuitem action='playmovie'/>"
" <menuitem action='stopmovie'/>"
" <menuitem action='printscreen'/>"
" <separator/>"
" <menuitem action='quit'/>"
" </menu>"
" <menu action='EmulationMenu'>"
@ -573,7 +576,11 @@ static void ToggleStatusbarVisible(GtkToggleAction *action)
static int Open(const char *filename, const char *cflash_disk_image)
{
return NDS_LoadROM( filename, cflash_disk_image );
int res;
res = NDS_LoadROM( filename, cflash_disk_image );
if(res > 0)
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatlist"), TRUE);
return res;
}
void Launch()
@ -1827,6 +1834,8 @@ common_gtk_main( struct configured_features *my_config)
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), FALSE);
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "reset"), FALSE);
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "printscreen"), FALSE);
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatlist"), FALSE);
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatsearch"), FALSE);
gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);