parent
058fc066c5
commit
c9f3a6bf86
|
@ -30,8 +30,7 @@
|
|||
#undef GPOINTER_TO_INT
|
||||
#define GPOINTER_TO_INT(p) ((gint) (glong) (p))
|
||||
|
||||
enum
|
||||
{
|
||||
enum {
|
||||
COLUMN_INDEX,
|
||||
COLUMN_TYPE,
|
||||
COLUMN_ENABLED,
|
||||
|
@ -45,30 +44,30 @@ enum
|
|||
|
||||
enum
|
||||
{
|
||||
COLUMN_SIZE_TEXT,
|
||||
NUM_SIZE_COLUMNS
|
||||
COLUMN_SIZE_TEXT,
|
||||
NUM_SIZE_COLUMNS
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
enum {
|
||||
TYPE_TOGGLE,
|
||||
TYPE_COMBO,
|
||||
TYPE_STRING
|
||||
};
|
||||
|
||||
static struct
|
||||
{
|
||||
static struct {
|
||||
const gchar *caption;
|
||||
gint type;
|
||||
gint column;
|
||||
} columnTable[] = { { "Index", TYPE_STRING, COLUMN_INDEX },
|
||||
{ "Type", TYPE_STRING, COLUMN_TYPE },
|
||||
{ "Enabled", TYPE_TOGGLE, COLUMN_ENABLED },
|
||||
{ "Size", TYPE_COMBO, COLUMN_SIZE },
|
||||
{ "Address", TYPE_STRING, COLUMN_HI },
|
||||
{ "Value", TYPE_STRING, COLUMN_LO },
|
||||
{ "AR Code", TYPE_STRING, COLUMN_AR },
|
||||
{ "Description", TYPE_STRING, COLUMN_DESC } };
|
||||
} columnTable[]={
|
||||
{ "Index", TYPE_STRING, COLUMN_INDEX},
|
||||
{ "Type", TYPE_STRING, COLUMN_TYPE},
|
||||
{ "Enabled", TYPE_TOGGLE, COLUMN_ENABLED},
|
||||
{ "Size", TYPE_COMBO, COLUMN_SIZE},
|
||||
{ "Address", TYPE_STRING, COLUMN_HI},
|
||||
{ "Value", TYPE_STRING, COLUMN_LO},
|
||||
{ "AR Code", TYPE_STRING, COLUMN_AR},
|
||||
{ "Description", TYPE_STRING, COLUMN_DESC}
|
||||
};
|
||||
|
||||
static GtkWidget *win = NULL;
|
||||
static BOOL shouldBeRunning = FALSE;
|
||||
|
@ -77,8 +76,9 @@ static BOOL shouldBeRunning = FALSE;
|
|||
// CHEATS MENU
|
||||
// ---------------------------------------------------------------------------------
|
||||
|
||||
static void enabled_toggled(GtkCellRendererToggle *cell, gchar *path_str,
|
||||
gpointer data)
|
||||
static void
|
||||
enabled_toggled(GtkCellRendererToggle * cell,
|
||||
gchar * path_str, gpointer data)
|
||||
{
|
||||
GtkTreeModel *model = (GtkTreeModel *) data;
|
||||
GtkTreeIter iter, f_iter;
|
||||
|
@ -102,21 +102,21 @@ static void enabled_toggled(GtkCellRendererToggle *cell, gchar *path_str,
|
|||
|
||||
cheats->toggle(cheatEnabled, ii);
|
||||
|
||||
gtk_list_store_set(GTK_LIST_STORE(store), &iter, COLUMN_ENABLED, guiEnabled,
|
||||
-1);
|
||||
gtk_list_store_set(GTK_LIST_STORE(store), &iter, COLUMN_ENABLED, guiEnabled, -1);
|
||||
|
||||
gtk_tree_path_free(path);
|
||||
}
|
||||
|
||||
static void cheat_list_modify_cheat(GtkCellRendererText *cell,
|
||||
const gchar *path_string,
|
||||
const gchar *new_text, gpointer data)
|
||||
static void cheat_list_modify_cheat(GtkCellRendererText * cell,
|
||||
const gchar * path_string,
|
||||
const gchar * new_text, gpointer data)
|
||||
{
|
||||
GtkTreeModel *model = (GtkTreeModel *) data;
|
||||
GtkTreePath *path = gtk_tree_path_new_from_string(path_string);
|
||||
GtkTreeIter iter, f_iter;
|
||||
|
||||
gint column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column"));
|
||||
gint column =
|
||||
GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column"));
|
||||
|
||||
gtk_tree_model_get_iter(model, &f_iter, path);
|
||||
gtk_tree_path_free(path);
|
||||
|
@ -134,8 +134,8 @@ static void cheat_list_modify_cheat(GtkCellRendererText *cell,
|
|||
|
||||
cheats->copyItemFromIndex(ii, cheat);
|
||||
|
||||
if (column == COLUMN_LO || column == COLUMN_HI ||
|
||||
column == COLUMN_SIZE) {
|
||||
if (column == COLUMN_LO || column == COLUMN_HI
|
||||
|| column == COLUMN_SIZE) {
|
||||
u32 v = 0;
|
||||
u32 data;
|
||||
switch (column) {
|
||||
|
@ -145,29 +145,29 @@ static void cheat_list_modify_cheat(GtkCellRendererText *cell,
|
|||
// out of range, so cap it at its maximum value.
|
||||
data = std::min(0xFFFFFFFF >> (24 - ((v - 1) << 3)),
|
||||
cheat.code[0][1]);
|
||||
cheats->update(v - 1, cheat.code[0][0], data, cheat.description,
|
||||
cheat.enabled, ii);
|
||||
cheats->update(v-1, cheat.code[0][0], data,
|
||||
cheat.description, cheat.enabled, ii);
|
||||
gtk_list_store_set(GTK_LIST_STORE(store), &iter, COLUMN_LO,
|
||||
data, -1);
|
||||
break;
|
||||
case COLUMN_HI:
|
||||
sscanf(new_text, "%x", &v);
|
||||
v &= 0x0FFFFFFF;
|
||||
cheats->update(cheat.size, v, cheat.code[0][1],
|
||||
cheat.description, cheat.enabled, ii);
|
||||
cheats->update(cheat.size, v, cheat.code[0][1], cheat.description,
|
||||
cheat.enabled, ii);
|
||||
break;
|
||||
case COLUMN_LO:
|
||||
v = atoi(new_text);
|
||||
v = std::min(0xFFFFFFFF >> (24 - (cheat.size << 3)), v);
|
||||
cheats->update(cheat.size, cheat.code[0][0], v,
|
||||
cheat.description, cheat.enabled, ii);
|
||||
cheats->update(cheat.size, cheat.code[0][0], v, cheat.description,
|
||||
cheat.enabled, ii);
|
||||
break;
|
||||
}
|
||||
gtk_list_store_set(GTK_LIST_STORE(store), &iter, column, v, -1);
|
||||
} else if (column == COLUMN_DESC) {
|
||||
} else if (column == COLUMN_DESC){
|
||||
cheats->setDescription(new_text, ii);
|
||||
gtk_list_store_set(GTK_LIST_STORE(store), &iter, column, new_text,
|
||||
-1);
|
||||
gtk_list_store_set(GTK_LIST_STORE(store), &iter, column,
|
||||
new_text, -1);
|
||||
} else if (column == COLUMN_AR) {
|
||||
// Safety: CHEATS::update_AR, though it takes `code` as not const,
|
||||
// only performs a non-null check and passes `code` to
|
||||
|
@ -184,19 +184,19 @@ static void cheat_list_modify_cheat(GtkCellRendererText *cell,
|
|||
}
|
||||
}
|
||||
|
||||
static void cheat_list_remove_cheat(GtkWidget *widget, gpointer data)
|
||||
static void cheat_list_remove_cheat(GtkWidget * widget, gpointer data)
|
||||
{
|
||||
GtkTreeView *tree = (GtkTreeView *) data;
|
||||
GtkTreeSelection *selection = gtk_tree_view_get_selection(tree);
|
||||
GtkTreeModel *model = gtk_tree_view_get_model(tree);
|
||||
GtkTreeSelection *selection = gtk_tree_view_get_selection (tree);
|
||||
GtkTreeModel *model = gtk_tree_view_get_model (tree);
|
||||
GtkTreeIter iter, f_iter;
|
||||
|
||||
if (gtk_tree_selection_get_selected(selection, NULL, &f_iter)) {
|
||||
if (gtk_tree_selection_get_selected (selection, NULL, &f_iter)){
|
||||
u32 ii;
|
||||
gboolean valid;
|
||||
GtkTreePath *path;
|
||||
|
||||
path = gtk_tree_model_get_path(model, &f_iter);
|
||||
path = gtk_tree_model_get_path (model, &f_iter);
|
||||
gtk_tree_model_filter_convert_iter_to_child_iter(
|
||||
GTK_TREE_MODEL_FILTER(model), &iter, &f_iter);
|
||||
GtkTreeModel *store =
|
||||
|
@ -213,11 +213,11 @@ static void cheat_list_remove_cheat(GtkWidget *widget, gpointer data)
|
|||
valid = gtk_tree_model_iter_next(store, &iter);
|
||||
}
|
||||
|
||||
gtk_tree_path_free(path);
|
||||
gtk_tree_path_free (path);
|
||||
}
|
||||
}
|
||||
|
||||
static void cheat_list_add_cheat(GtkWidget *widget, gpointer data)
|
||||
static void cheat_list_add_cheat(GtkWidget * widget, gpointer data)
|
||||
{
|
||||
#define NEW_DESC "New cheat"
|
||||
GtkListStore *store = (GtkListStore *) data;
|
||||
|
@ -227,9 +227,13 @@ static void cheat_list_add_cheat(GtkWidget *widget, gpointer data)
|
|||
// const.
|
||||
cheats->add(0, 0, 0, const_cast<char *>(NEW_DESC), false);
|
||||
gtk_list_store_append(store, &iter);
|
||||
gtk_list_store_set(store, &iter, COLUMN_INDEX, cheats->getListSize() - 1,
|
||||
COLUMN_TYPE, 0, COLUMN_ENABLED, FALSE, COLUMN_SIZE, 1,
|
||||
COLUMN_HI, 0, COLUMN_LO, 0, COLUMN_DESC, NEW_DESC, -1);
|
||||
gtk_list_store_set(store, &iter,
|
||||
COLUMN_INDEX, cheats->getListSize() - 1,
|
||||
COLUMN_TYPE, 0,
|
||||
COLUMN_ENABLED, FALSE,
|
||||
COLUMN_SIZE, 1,
|
||||
COLUMN_HI, 0,
|
||||
COLUMN_LO, 0, COLUMN_DESC, NEW_DESC, -1);
|
||||
#undef NEW_DESC
|
||||
}
|
||||
|
||||
|
@ -244,8 +248,11 @@ static void cheat_list_add_cheat_AR(GtkWidget *widget, gpointer data)
|
|||
cheats->add_AR(const_cast<char *>(NEW_AR), const_cast<char *>(NEW_DESC),
|
||||
false);
|
||||
gtk_list_store_append(store, &iter);
|
||||
gtk_list_store_set(store, &iter, COLUMN_INDEX, cheats->getListSize() - 1,
|
||||
COLUMN_TYPE, 1, COLUMN_ENABLED, FALSE, COLUMN_AR, NEW_AR,
|
||||
gtk_list_store_set(store, &iter,
|
||||
COLUMN_INDEX, cheats->getListSize() - 1,
|
||||
COLUMN_TYPE, 1,
|
||||
COLUMN_ENABLED, FALSE,
|
||||
COLUMN_AR, NEW_AR,
|
||||
COLUMN_DESC, NEW_DESC, -1);
|
||||
#undef NEW_DESC
|
||||
#undef NEW_AR
|
||||
|
@ -293,11 +300,11 @@ static void cheat_list_address_to_hex(GtkTreeViewColumn *column,
|
|||
g_free(hex_addr);
|
||||
}
|
||||
|
||||
static void cheat_list_add_columns(GtkTreeView *tree, GtkListStore *store,
|
||||
static void cheat_list_add_columns(GtkTreeView * tree, GtkListStore * store,
|
||||
u8 cheat_type)
|
||||
{
|
||||
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));
|
||||
static GtkTreeModel *size_model;
|
||||
static GtkTreeModel * size_model;
|
||||
|
||||
for (u32 ii = 0; ii < sizeof(columnTable) / sizeof(columnTable[0]); ii++) {
|
||||
GtkCellRenderer *renderer = NULL;
|
||||
|
@ -306,8 +313,8 @@ static void cheat_list_add_columns(GtkTreeView *tree, GtkListStore *store,
|
|||
switch (columnTable[ii].type) {
|
||||
case TYPE_TOGGLE:
|
||||
renderer = gtk_cell_renderer_toggle_new();
|
||||
g_signal_connect(renderer, "toggled", G_CALLBACK(enabled_toggled),
|
||||
model);
|
||||
g_signal_connect(renderer, "toggled",
|
||||
G_CALLBACK(enabled_toggled), model);
|
||||
attrib = "active";
|
||||
break;
|
||||
case TYPE_STRING:
|
||||
|
@ -323,8 +330,11 @@ static void cheat_list_add_columns(GtkTreeView *tree, GtkListStore *store,
|
|||
case TYPE_COMBO:
|
||||
renderer = gtk_cell_renderer_combo_new();
|
||||
size_model = create_numbers_model();
|
||||
g_object_set(renderer, "model", size_model, "text-column",
|
||||
COLUMN_SIZE_TEXT, "editable", TRUE, "has-entry", FALSE,
|
||||
g_object_set(renderer,
|
||||
"model", size_model,
|
||||
"text-column", COLUMN_SIZE_TEXT,
|
||||
"editable", TRUE,
|
||||
"has-entry", FALSE,
|
||||
NULL);
|
||||
g_object_unref(size_model);
|
||||
g_signal_connect(renderer, "edited",
|
||||
|
@ -333,8 +343,11 @@ static void cheat_list_add_columns(GtkTreeView *tree, GtkListStore *store,
|
|||
break;
|
||||
}
|
||||
gint c = columnTable[ii].column;
|
||||
column = gtk_tree_view_column_new_with_attributes(
|
||||
columnTable[ii].caption, renderer, attrib, c, NULL);
|
||||
column =
|
||||
gtk_tree_view_column_new_with_attributes(columnTable[ii].
|
||||
caption, renderer,
|
||||
attrib, c,
|
||||
NULL);
|
||||
if (c == COLUMN_HI && cheat_type == CHEAT_TYPE_INTERNAL) {
|
||||
gtk_tree_view_column_set_cell_data_func(
|
||||
column, renderer, cheat_list_address_to_hex, NULL, NULL);
|
||||
|
@ -353,7 +366,7 @@ static void cheat_list_add_columns(GtkTreeView *tree, GtkListStore *store,
|
|||
static void cheatListEnd()
|
||||
{
|
||||
cheats->save();
|
||||
if (shouldBeRunning)
|
||||
if(shouldBeRunning)
|
||||
Launch(NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
|
@ -361,15 +374,15 @@ static GtkListStore *cheat_list_populate()
|
|||
{
|
||||
// COLUMN_INDEX, COLUMN_TYPE, COLUMN_ENABLED, COLUMN_SIZE,
|
||||
// COLUMN_HI, COLUMN_LO, COLUMN_AR, COLUMN_DESC
|
||||
GtkListStore *store = gtk_list_store_new(
|
||||
GtkListStore *store = gtk_list_store_new (
|
||||
8, G_TYPE_INT, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_INT,
|
||||
G_TYPE_INT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING);
|
||||
|
||||
CHEATS_LIST cheat;
|
||||
u32 chsize = cheats->getListSize();
|
||||
for (u32 ii = 0; ii < chsize; ii++) {
|
||||
for(u32 ii = 0; ii < chsize; ii++){
|
||||
GtkTreeIter iter;
|
||||
cheats->copyItemFromIndex(ii, cheat);
|
||||
cheats->copyItemFromIndex(ii, cheat);
|
||||
gtk_list_store_append(store, &iter);
|
||||
if (cheat.type == CHEAT_TYPE_INTERNAL) {
|
||||
gtk_list_store_set(store, &iter, COLUMN_INDEX, ii,
|
||||
|
@ -441,14 +454,13 @@ static void cheat_list_create_ui()
|
|||
gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(box));
|
||||
|
||||
button = gtk_button_new_with_label("Add internal cheat");
|
||||
g_signal_connect(button, "clicked", G_CALLBACK(cheat_list_add_cheat),
|
||||
store);
|
||||
gtk_container_add(GTK_CONTAINER(hbbox), button);
|
||||
g_signal_connect (button, "clicked", G_CALLBACK (cheat_list_add_cheat), store);
|
||||
gtk_container_add(GTK_CONTAINER(hbbox),button);
|
||||
|
||||
button = gtk_button_new_with_label("Remove internal cheat");
|
||||
g_signal_connect(button, "clicked", G_CALLBACK(cheat_list_remove_cheat),
|
||||
g_signal_connect (button, "clicked", G_CALLBACK (cheat_list_remove_cheat),
|
||||
GTK_TREE_VIEW(tree_raw));
|
||||
gtk_container_add(GTK_CONTAINER(hbbox), button);
|
||||
gtk_container_add(GTK_CONTAINER(hbbox),button);
|
||||
|
||||
GtkTreeModel *filter_ar =
|
||||
gtk_tree_model_filter_new(GTK_TREE_MODEL(store), NULL);
|
||||
|
@ -475,10 +487,10 @@ static void cheat_list_create_ui()
|
|||
|
||||
/* Setup the selection handler */
|
||||
GtkTreeSelection *select;
|
||||
select = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_raw));
|
||||
gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
|
||||
select = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_ar));
|
||||
gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
|
||||
select = gtk_tree_view_get_selection (GTK_TREE_VIEW(tree_raw));
|
||||
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
|
||||
select = gtk_tree_view_get_selection (GTK_TREE_VIEW(tree_ar));
|
||||
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
|
||||
}
|
||||
|
||||
void CheatList(GSimpleAction *action, GVariant *parameter, gpointer user_data)
|
||||
|
@ -486,7 +498,7 @@ void CheatList(GSimpleAction *action, GVariant *parameter, gpointer user_data)
|
|||
shouldBeRunning = desmume_running();
|
||||
Pause(NULL, NULL, NULL);
|
||||
win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_title(GTK_WINDOW(win), "Cheat List");
|
||||
gtk_window_set_title(GTK_WINDOW(win),"Cheat List");
|
||||
gtk_window_set_modal(GTK_WINDOW(win), TRUE);
|
||||
g_signal_connect(G_OBJECT(win), "destroy", cheatListEnd, NULL);
|
||||
|
||||
|
|
Loading…
Reference in New Issue