/*
* TilEm II
*
* Copyright (c) 2010-2011 Thibault Duponchelle
* Copyright (c) 2011-2012 Benjamin Moody
*
* This program is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifdef HAVE_CONFIG_H
# include
#endif
#include
#include
#include
#include
#include "gui.h"
#include "msgbox.h"
static void action_send_file(G_GNUC_UNUSED GtkAction *act, gpointer data)
{
TilemEmulatorWindow *ewin = data;
load_file_dialog(ewin);
}
static void action_receive_file(G_GNUC_UNUSED GtkAction *act, gpointer data)
{
TilemEmulatorWindow *ewin = data;
//tilem_rcvmenu_new(ewin->emu);
//get_var(ewin->emu);
popup_receive_menu(ewin);
}
static void action_start_debugger(G_GNUC_UNUSED GtkAction *act, gpointer data)
{
TilemEmulatorWindow *ewin = data;
launch_debugger(ewin);
}
static void action_open_calc(G_GNUC_UNUSED GtkAction *act, gpointer data)
{
TilemEmulatorWindow *ewin = data;
tilem_calc_emulator_prompt_open_rom(ewin->emu);
}
static void action_save_calc(G_GNUC_UNUSED GtkAction *act, G_GNUC_UNUSED gpointer data)
{
TilemEmulatorWindow *ewin = data;
GError *err = NULL;
if (!tilem_calc_emulator_save_state(ewin->emu, &err)) {
messagebox01(GTK_WINDOW(ewin->window), GTK_MESSAGE_ERROR,
"Unable to save calculator state",
"%s", err->message);
g_error_free(err);
}
}
static void action_revert_calc(G_GNUC_UNUSED GtkAction *act, G_GNUC_UNUSED gpointer data)
{
TilemEmulatorWindow *ewin = data;
GError *err = NULL;
if (!tilem_calc_emulator_revert_state(ewin->emu, &err)) {
messagebox01(GTK_WINDOW(ewin->window), GTK_MESSAGE_ERROR,
"Unable to load calculator state",
"%s", err->message);
g_error_free(err);
}
}
static void action_reset_calc(G_GNUC_UNUSED GtkAction *act, gpointer data)
{
TilemEmulatorWindow *ewin = data;
tilem_calc_emulator_reset(ewin->emu);
}
static void action_begin_macro(G_GNUC_UNUSED GtkAction *act, gpointer data)
{
TilemEmulatorWindow *ewin = data;
tilem_macro_start(ewin->emu);
}
static void action_end_macro(G_GNUC_UNUSED GtkAction *act, gpointer data)
{
TilemEmulatorWindow *ewin = data;
tilem_macro_stop(ewin->emu);
/* tilem_macro_print(ewin->emu->macro); */
}
static void action_play_macro(G_GNUC_UNUSED GtkAction *act, gpointer data)
{
TilemEmulatorWindow *ewin = data;
tilem_macro_play(ewin->emu);
}
static void action_open_macro(G_GNUC_UNUSED GtkAction *act, G_GNUC_UNUSED gpointer data)
{
TilemEmulatorWindow *ewin = data;
tilem_macro_load(ewin->emu, NULL);
}
/* I will improve macro creation by saving it firstly into a macro object
* Save macro will only be done if user choose to save it */
static void action_save_macro(G_GNUC_UNUSED GtkAction *act, G_GNUC_UNUSED gpointer data)
{
TilemEmulatorWindow *ewin = data;
tilem_macro_write_file(ewin->emu);
}
static void action_screenshot(G_GNUC_UNUSED GtkAction *act, gpointer data)
{
TilemEmulatorWindow *ewin = data;
popup_screenshot_window(ewin);
}
static void action_quick_screenshot(G_GNUC_UNUSED GtkAction *act,
gpointer data)
{
TilemEmulatorWindow *ewin = data;
quick_screenshot(ewin);
}
static void action_preferences(G_GNUC_UNUSED GtkAction *act,
gpointer data)
{
TilemEmulatorWindow *ewin = data;
tilem_preferences_dialog(ewin);
}
static void action_about(G_GNUC_UNUSED GtkAction *act,
G_GNUC_UNUSED gpointer data)
{
show_about();
}
static void action_quit(G_GNUC_UNUSED GtkAction *act,
G_GNUC_UNUSED gpointer data)
{
TilemEmulatorWindow *ewin = data;
gtk_widget_destroy(ewin->window);
}
static const GtkActionEntry main_action_ents[] =
{{ "send-file",
GTK_STOCK_OPEN, "Send _File...", "O",
"Send a program or variable file to the calculator",
G_CALLBACK(action_send_file) },
{ "receive-file",
GTK_STOCK_SAVE_AS, "Re_ceive File...", "S",
"Receive a program or variable from the calculator",
G_CALLBACK(action_receive_file) },
{ "open-calc",
GTK_STOCK_OPEN, "_Open Calculator...", "O",
"Open a calculator ROM file",
G_CALLBACK(action_open_calc) },
{ "save-calc",
GTK_STOCK_SAVE, "_Save Calculator", "S",
"Save current calculator state",
G_CALLBACK(action_save_calc) },
{ "revert-calc",
GTK_STOCK_REVERT_TO_SAVED, "Re_vert Calculator State", 0,
"Revert to saved calculator state",
G_CALLBACK(action_revert_calc) },
{ "reset-calc",
GTK_STOCK_CLEAR, "_Reset Calculator", "Delete",
"Reset the calculator",
G_CALLBACK(action_reset_calc) },
{ "start-debugger",
0, "_Debugger", "Pause",
"Pause emulation and start the debugger",
G_CALLBACK(action_start_debugger) },
{ "begin-macro",
GTK_STOCK_MEDIA_RECORD, "_Record", 0,
"Begin recording a macro",
G_CALLBACK(action_begin_macro) },
{ "end-macro",
GTK_STOCK_MEDIA_STOP, "S_top", 0,
"Begin recording a macro",
G_CALLBACK(action_end_macro) },
{ "play-macro",
GTK_STOCK_MEDIA_PLAY, "_Play", 0,
"Play back the current macro",
G_CALLBACK(action_play_macro) },
{ "open-macro",
GTK_STOCK_OPEN, "_Open Macro File...", "",
"Load a macro from a file",
G_CALLBACK(action_open_macro) },
{ "save-macro",
GTK_STOCK_SAVE_AS, "_Save Macro File...", "",
"Save current macro to a file",
G_CALLBACK(action_save_macro) },
{ "screenshot",
0, "S_creenshot...", "Print",
"Save a screenshot",
G_CALLBACK(action_screenshot) },
{ "quick-screenshot",
0, "_Quick Screenshot", "Print",
"Save a screenshot using default settings",
G_CALLBACK(action_quick_screenshot) },
{ "preferences",
GTK_STOCK_PREFERENCES, 0, 0,
"Edit emulator settings",
G_CALLBACK(action_preferences) },
{ "about",
GTK_STOCK_ABOUT, "_About", "",
"Print some informations about TilEm 2 and its authors",
G_CALLBACK(action_about) },
{ "quit",
GTK_STOCK_QUIT, "_Quit", "Q",
"Quit the application",
G_CALLBACK(action_quit) }};
static GtkWidget *add_item(GtkWidget *menu, GtkAccelGroup *accelgrp,
GtkActionGroup *actions, const char *name)
{
GtkAction *action;
GtkWidget *item;
action = gtk_action_group_get_action(actions, name);
g_return_val_if_fail(action != NULL, NULL);
gtk_action_set_accel_group(action, accelgrp);
item = gtk_action_create_menu_item(action);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
gtk_widget_show(item);
return item;
}
static GtkWidget *add_separator(GtkWidget *menu)
{
GtkWidget *item;
item = gtk_separator_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
gtk_widget_show(item);
return item;
}
static GtkWidget *add_submenu(GtkWidget *menu, const char *label)
{
GtkWidget *item, *submenu;
item = gtk_menu_item_new_with_mnemonic(label);
submenu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
gtk_widget_show(item);
return submenu;
}
/* Build the menu */
void build_menu(TilemEmulatorWindow* ewin)
{
GtkActionGroup *acts;
GtkAccelGroup *ag;
GtkWidget *menu, *submenu;
ewin->actions = acts = gtk_action_group_new("Emulator");
gtk_action_group_add_actions(ewin->actions, main_action_ents,
G_N_ELEMENTS(main_action_ents), ewin);
ag = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(ewin->window), ag);
ewin->popup_menu = menu = gtk_menu_new();
add_item(menu, ag, acts, "send-file");
add_item(menu, ag, acts, "receive-file");
add_separator(menu);
add_item(menu, ag, acts, "open-calc");
add_item(menu, ag, acts, "save-calc");
add_item(menu, ag, acts, "revert-calc");
add_item(menu, ag, acts, "reset-calc");
add_separator(menu);
add_item(menu, ag, acts, "start-debugger");
submenu = add_submenu(menu, "_Macro");
add_item(submenu, ag, acts, "begin-macro");
add_item(submenu, ag, acts, "end-macro");
add_item(submenu, ag, acts, "play-macro");
add_separator(submenu);
add_item(submenu, ag, acts, "open-macro");
add_item(submenu, ag, acts, "save-macro");
add_item(menu, ag, acts, "screenshot");
add_item(menu, ag, acts, "quick-screenshot");
add_separator(menu);
add_item(menu, ag, acts, "preferences");
add_separator(menu);
add_item(menu, ag, acts, "about");
add_item(menu, ag, acts, "quit");
}