Merge branch 'rr1-maint'

Conflicts:
	src/platform/wxwidgets/mainwindow.cpp
This commit is contained in:
Ilari Liusvaara 2012-04-03 13:19:35 +03:00
commit 2ef9d55de7
11 changed files with 437 additions and 72 deletions

View file

@ -32,6 +32,7 @@ void wxeditor_axes_display(wxWindow* parent);
void wxeditor_authors_display(wxWindow* parent); void wxeditor_authors_display(wxWindow* parent);
void wxeditor_settings_display(wxWindow* parent); void wxeditor_settings_display(wxWindow* parent);
void wxeditor_hotkeys_display(wxWindow* parent); void wxeditor_hotkeys_display(wxWindow* parent);
void wxeditor_paths_display(wxWindow* parent);
std::string wxeditor_keyselect(wxWindow* parent, bool clearable); std::string wxeditor_keyselect(wxWindow* parent, bool clearable);
void wxeditor_screen_display(wxWindow* parent, double& horiz, double& vert, int& flags); void wxeditor_screen_display(wxWindow* parent, double& horiz, double& vert, int& flags);

View file

@ -35,7 +35,7 @@ public:
void menu_entry(int id, wxString name); void menu_entry(int id, wxString name);
void menu_entry_check(int id, wxString name); void menu_entry_check(int id, wxString name);
void menu_start_sub(wxString name); void menu_start_sub(wxString name);
void menu_end_sub(wxString name); void menu_end_sub();
bool menu_ischecked(int id); bool menu_ischecked(int id);
void menu_check(int id, bool newstate); void menu_check(int id, bool newstate);
void menu_separator(); void menu_separator();

View file

@ -2748,6 +2748,19 @@ L[<name>]
Can be used anywhere. Can be used anywhere.
\end_layout \end_layout
\begin_layout Subsubsection
gui.rainbow(number step, number steps[, number color])
\end_layout
\begin_layout Standard
Perform hue rotation of color <color> (default bright red), by <step> steps.
The number of steps per full rotation is given by absolute value of <steps>.
\end_layout
\begin_layout Standard
If <steps> is negative, the rotation will be counterclockwise.
\end_layout
\begin_layout Subsection \begin_layout Subsection
table input table input
\end_layout \end_layout

View file

@ -1354,6 +1354,14 @@ The default alpha is 256.
Set status field “L[<name>]” to <value> in status area. Can be Set status field “L[<name>]” to <value> in status area. Can be
used anywhere. used anywhere.
8.3.26 gui.rainbow(number step, number steps[, number color])
Perform hue rotation of color <color> (default bright red), by
<step> steps. The number of steps per full rotation is given by
absolute value of <steps>.
If <steps> is negative, the rotation will be counterclockwise.
8.4 table input 8.4 table input
Input handling. Only available in on_input callback. Input handling. Only available in on_input callback.
@ -1746,7 +1754,7 @@ Called if savestate goes wrong.
8.10.12 Callback: on_post_save(string name, boolean is_savestate) 8.10.12 Callback: on_post_save(string name, boolean is_savestate)
Called on successful savaestate. is_savestate gives if this was a Called on successful savaestate. is_savestate gives if this was a
savestate or a movie. savestate or a
8.10.13 Callback: on_quit() 8.10.13 Callback: on_quit()
@ -2629,7 +2637,7 @@ set-axis joystick0axis19 disabled
• Remove calls to runtosave() that aren't supposed to be there • Remove calls to runtosave() that aren't supposed to be there
• Lua function: movie.read_rtc() • Lua function: read_rtc()
• Ignore src/fonts/font.cpp • Ignore src/fonts/font.cpp
@ -2850,7 +2858,7 @@ set-axis joystick0axis19 disabled
• Wxwidgets: 128 -> 1024 Autohold slots (in case more are • Wxwidgets: 128 -> 1024 Autohold slots (in case more are
needed). needed).
• Don't append trailing '-' to prefix when saving movie. • Don't append trailing '-' to prefix when saving
• Fix ROM/savestate handling (don't let user mismatch ROM and • Fix ROM/savestate handling (don't let user mismatch ROM and
savestates). savestates).

View file

@ -95,8 +95,11 @@ public:
void set(const std::string& value) throw(std::bad_alloc, std::runtime_error) void set(const std::string& value) throw(std::bad_alloc, std::runtime_error)
{ {
if(value != "") {
_firmwarepath = value; _firmwarepath = value;
default_firmware = false; default_firmware = false;
} else
blank();
} }
std::string get() throw(std::bad_alloc) std::string get() throw(std::bad_alloc)

View file

@ -1,5 +1,6 @@
#include "lua/internal.hpp" #include "lua/internal.hpp"
#include "core/window.hpp" #include "core/window.hpp"
#include "library/minmax.hpp"
namespace namespace
{ {
@ -73,4 +74,61 @@ namespace
return 1; return 1;
}); });
//0: m
//1: M
//2: m + phue
//3: M - phue
uint8_t hsl2rgb_flags[] = {24, 52, 6, 13, 33, 19};
uint32_t shifthue(uint32_t color, double shift)
{
int16_t R = (color >> 16) & 0xFF;
int16_t G = (color >> 8) & 0xFF;
int16_t B = color & 0xFF;
int16_t m = min(R, min(G, B));
int16_t M = max(R, max(G, B));
int16_t S = M - m;
if(!S)
return color; //Grey.
int16_t hue;
if(R == M)
hue = G - B + 6 * S;
else if(G == M)
hue = B - R + 2 * S;
else
hue = R - G + 4 * S;
int16_t ohue = hue % (6 * S);
hue = (hue + static_cast<uint32_t>(shift * S)) % (6 * S);
uint32_t V[4];
V[0] = m;
V[1] = M;
V[2] = m + hue % S;
V[3] = M - hue % S;
uint8_t flag = hsl2rgb_flags[hue / S];
return (V[(flag >> 4) & 3] << 16) | (V[(flag >> 2) & 3] << 8) | (V[flag & 3]);
}
function_ptr_luafun gui_rainbow("gui.rainbow", [](lua_State* LS, const std::string& fname) -> int {
int64_t basecolor = 0x00FF0000;
uint64_t step = get_numeric_argument<uint64_t>(LS, 1, fname.c_str());
int32_t steps = get_numeric_argument<int32_t>(LS, 2, fname.c_str());
get_numeric_argument<int64_t>(LS, 3, basecolor, fname.c_str());
if(!steps) {
lua_pushstring(LS, "Expected nonzero steps for gui.rainbow");
lua_error(LS);
}
if(basecolor < 0) {
//Special: Any rotation of transparent is transparent.
lua_pushnumber(LS, -1);
return 1;
}
uint32_t asteps = std::abs(steps);
if(steps < 0)
step = asteps - step % asteps; //Reverse order.
double hueshift = 6.0 * (step % asteps) / asteps;
basecolor = shifthue(basecolor & 0xFFFFFF, hueshift) | (basecolor & 0xFF000000);
lua_pushnumber(LS, basecolor);
return 1;
});
} }

View file

@ -59,7 +59,7 @@ namespace
int audiocb(const void *input, void *output, unsigned long frame_count, int audiocb(const void *input, void *output, unsigned long frame_count,
const PaStreamCallbackTimeInfo* time_info, PaStreamCallbackFlags flags, void* user) const PaStreamCallbackTimeInfo* time_info, PaStreamCallbackFlags flags, void* user)
{ {
static uint16_t lprev, rprev; static uint16_t lprev = 32768, rprev = 32768;
int16_t* _output = reinterpret_cast<int16_t*>(output); int16_t* _output = reinterpret_cast<int16_t*>(output);
for(unsigned long i = 0; i < frame_count; i++) { for(unsigned long i = 0; i < frame_count; i++) {
uint16_t l, r; uint16_t l, r;

View file

@ -146,12 +146,12 @@ void dumper_menu::update(const std::map<std::string, dumper_info>& new_dumpers)
if(!i.second.active) { if(!i.second.active) {
if(i.second.modes.empty()) { if(i.second.modes.empty()) {
menustructure[i.first].start_items[id] = Append(id, towxstring("Dump " + menustructure[i.first].start_items[id] = Append(id, towxstring("Dump " +
i.second.name)); i.second.name + "..."));
menustructure[i.first].start_wxids[id++] = ""; menustructure[i.first].start_wxids[id++] = "";
} }
for(auto j : i.second.modes) { for(auto j : i.second.modes) {
menustructure[i.first].start_items[id] = Append(id, towxstring("Dump " + menustructure[i.first].start_items[id] = Append(id, towxstring("Dump " +
i.second.name + " (" + j.second + ")")); i.second.name + " (" + j.second + ")..."));
menustructure[i.first].start_wxids[id++] = j.first; menustructure[i.first].start_wxids[id++] = j.first;
} }
} else { } else {

View file

@ -0,0 +1,112 @@
#include "platform/wxwidgets/platform.hpp"
#include "core/settings.hpp"
#include "library/string.hpp"
#include <wx/wx.h>
#include <wx/event.h>
#include <wx/control.h>
#include <wx/combobox.h>
#include <vector>
#include <string>
#include <boost/lexical_cast.hpp>
#include <sstream>
#define FIRMWAREPATH "firmwarepath"
#define ROMPATH "rompath"
#define MOVIEPATH "moviepath"
class wxeditor_paths : public wxDialog
{
public:
wxeditor_paths(wxWindow* parent);
~wxeditor_paths();
bool ShouldPreventAppExit() const;
void on_cancel(wxCommandEvent& e);
void on_ok(wxCommandEvent& e);
private:
wxButton* okbutton;
wxButton* cancel;
wxTextCtrl* rompath;
wxTextCtrl* moviepath;
wxTextCtrl* firmwarepath;
};
wxeditor_paths::wxeditor_paths(wxWindow* parent)
: wxDialog(parent, wxID_ANY, wxT("lsnes: Paths"), wxDefaultPosition, wxSize(-1, -1))
{
std::string cur_rompath, cur_moviepath, cur_firmwarepath;
runemufn([&cur_firmwarepath, &cur_moviepath, &cur_rompath]() {
cur_firmwarepath = setting::get(FIRMWAREPATH);
cur_rompath = setting::get(ROMPATH);
cur_moviepath = setting::get(MOVIEPATH);
});
Centre();
wxFlexGridSizer* top_s = new wxFlexGridSizer(2, 1, 0, 0);
SetSizer(top_s);
wxFlexGridSizer* t_s = new wxFlexGridSizer(3, 2, 0, 0);
t_s->Add(new wxStaticText(this, wxID_ANY, wxT("ROMs:")), 0, wxGROW);
t_s->Add(rompath = new wxTextCtrl(this, wxID_ANY, towxstring(cur_rompath), wxDefaultPosition, wxSize(400, -1)),
1, wxGROW);
t_s->Add(new wxStaticText(this, wxID_ANY, wxT("Movies:")), 0, wxGROW);
t_s->Add(moviepath = new wxTextCtrl(this, wxID_ANY, towxstring(cur_moviepath), wxDefaultPosition,
wxSize(400, -1)), 1, wxGROW);
t_s->Add(new wxStaticText(this, wxID_ANY, wxT("Firmware:")), 0, wxGROW);
t_s->Add(firmwarepath = new wxTextCtrl(this, wxID_ANY, towxstring(cur_firmwarepath), wxDefaultPosition,
wxSize(400, -1)), 1, wxGROW);
top_s->Add(t_s);
wxBoxSizer* pbutton_s = new wxBoxSizer(wxHORIZONTAL);
pbutton_s->AddStretchSpacer();
pbutton_s->Add(okbutton = new wxButton(this, wxID_OK, wxT("OK")), 0, wxGROW);
pbutton_s->Add(cancel = new wxButton(this, wxID_CANCEL, wxT("Cancel")), 0, wxGROW);
okbutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(wxeditor_paths::on_ok), NULL, this);
cancel->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(wxeditor_paths::on_cancel), NULL, this);
top_s->Add(pbutton_s, 0, wxGROW);
t_s->SetSizeHints(this);
top_s->SetSizeHints(this);
Fit();
}
wxeditor_paths::~wxeditor_paths()
{
}
bool wxeditor_paths::ShouldPreventAppExit() const
{
return false;
}
void wxeditor_paths::on_cancel(wxCommandEvent& e)
{
EndModal(wxID_CANCEL);
}
void wxeditor_paths::on_ok(wxCommandEvent& e)
{
std::string cur_rompath = tostdstring(rompath->GetValue());
std::string cur_moviepath = tostdstring(moviepath->GetValue());
std::string cur_firmwarepath = tostdstring(firmwarepath->GetValue());
runemufn([cur_firmwarepath, cur_moviepath, cur_rompath]() {
setting::set(ROMPATH, cur_rompath);
setting::set(MOVIEPATH, cur_moviepath);
setting::set(FIRMWAREPATH, cur_firmwarepath);
});
EndModal(wxID_OK);
}
void wxeditor_paths_display(wxWindow* parent)
{
modal_pause_holder hld;
wxDialog* editor;
try {
editor = new wxeditor_paths(parent);
editor->ShowModal();
} catch(...) {
}
editor->Destroy();
}

View file

@ -82,7 +82,20 @@ enum
wxID_SHOW_STATUS, wxID_SHOW_STATUS,
wxID_SET_SPEED, wxID_SET_SPEED,
wxID_SET_VOLUME, wxID_SET_VOLUME,
wxID_SET_SCREEN wxID_SET_SCREEN,
wxID_SET_PATHS,
wxID_SPEED_5,
wxID_SPEED_10,
wxID_SPEED_17,
wxID_SPEED_20,
wxID_SPEED_25,
wxID_SPEED_33,
wxID_SPEED_50,
wxID_SPEED_100,
wxID_SPEED_150,
wxID_SPEED_200,
wxID_SPEED_300,
wxID_SPEED_TURBO
}; };
@ -198,6 +211,15 @@ namespace
return ret; return ret;
} }
void set_speed(double target)
{
std::string v = (stringfmt() << target).str();
if(target < 0)
runemufn([]() { setting::set("targetfps", "infinite"); });
else
runemufn([v]() { setting::set("targetfps", v); });
}
class controller_autohold_menu : public wxMenu class controller_autohold_menu : public wxMenu
{ {
public: public:
@ -426,6 +448,52 @@ namespace
{ {
runuifun([ahmenu]() { ahmenu->reconfigure(); }); runuifun([ahmenu]() { ahmenu->reconfigure(); });
} }
class movie_path_setting : public setting
{
public:
movie_path_setting() : setting("moviepath") { _moviepath = "."; default_movie = true; }
void blank() throw(std::bad_alloc, std::runtime_error)
{
_moviepath = ".";
default_movie = true;
}
bool is_set() throw()
{
return !default_movie;
}
void set(const std::string& value) throw(std::bad_alloc, std::runtime_error)
{
if(value != "") {
_moviepath = value;
default_movie = false;
} else
blank();
}
std::string get() throw(std::bad_alloc)
{
return _moviepath;
}
operator std::string() throw(std::bad_alloc)
{
return _moviepath;
}
private:
std::string _moviepath;
bool default_movie;
} moviepath_setting;
std::string movie_path()
{
std::string x;
runemufn([&x]() { x = setting::get("moviepath"); });
return x;
}
} }
void boot_emulator(loaded_rom& rom, moviefile& movie) void boot_emulator(loaded_rom& rom, moviefile& movie)
@ -506,7 +574,7 @@ void wxwin_mainwindow::menu_start_sub(wxString name)
old->AppendSubMenu(current_menu, name); old->AppendSubMenu(current_menu, name);
} }
void wxwin_mainwindow::menu_end_sub(wxString name) void wxwin_mainwindow::menu_end_sub()
{ {
current_menu = upper.top(); current_menu = upper.top();
upper.pop(); upper.pop();
@ -617,75 +685,90 @@ wxwin_mainwindow::wxwin_mainwindow()
SetMenuBar(menubar); SetMenuBar(menubar);
//TOP-level accels: ACFOS. //TOP-level accels: ACFOS.
//System menu: (ACFOS)EMNPQRU //System menu: (ACOS)ELNPQTV
menu_start(wxT("&System")); menu_start(wxT("&System"));
menu_entry(wxID_FRAMEADVANCE, wxT("Fra&me advance"));
menu_entry(wxID_SUBFRAMEADVANCE, wxT("S&ubframe advance"));
menu_entry(wxID_NEXTPOLL, wxT("&Next poll"));
menu_entry(wxID_PAUSE, wxT("&Pause/Unpause"));
menu_separator();
menu_entry(wxID_ERESET, wxT("&Reset"));
menu_separator();
menu_entry(wxID_EDIT_AUTHORS, wxT("&Edit game name && authors"));
menu_separator();
menu_entry(wxID_EXIT, wxT("&Quit"));
menu_separator();
menu_entry(wxID_ABOUT, wxT("About"));
//File menu: (ACFOS)DEILMNPRTUVW
menu_start(wxT("&File"));
menu_entry_check(wxID_READONLY_MODE, wxT("Reado&nly mode")); menu_entry_check(wxID_READONLY_MODE, wxT("Reado&nly mode"));
menu_check(wxID_READONLY_MODE, is_readonly_mode()); menu_check(wxID_READONLY_MODE, is_readonly_mode());
menu_entry(wxID_EDIT_AUTHORS, wxT("Edit game name && authors..."));
menu_start_sub(wxT("Spee&d"));
menu_entry(wxID_SPEED_5, wxT("1/20x"));
menu_entry(wxID_SPEED_10, wxT("1/10x"));
menu_entry(wxID_SPEED_17, wxT("1/6x"));
menu_entry(wxID_SPEED_20, wxT("1/5x"));
menu_entry(wxID_SPEED_25, wxT("1/4x"));
menu_entry(wxID_SPEED_33, wxT("1/3x"));
menu_entry(wxID_SPEED_50, wxT("1/2x"));
menu_entry(wxID_SPEED_100, wxT("1x"));
menu_entry(wxID_SPEED_150, wxT("1.5x"));
menu_entry(wxID_SPEED_200, wxT("2x"));
menu_entry(wxID_SPEED_300, wxT("3x"));
menu_entry(wxID_SPEED_TURBO, wxT("Turbo"));
menu_entry(wxID_SET_SPEED, wxT("Set..."));
menu_end_sub();
menu_separator(); menu_separator();
menu_entry(wxID_SAVE_STATE, wxT("Save stat&e")); menu_start_sub(wxT("&Load"));
menu_entry(wxID_SAVE_MOVIE, wxT("Sa&ve movie")); menu_entry(wxID_LOAD_STATE, wxT("&Load state..."));
menu_separator(); menu_entry(wxID_LOAD_STATE_RO, wxT("Loa&d state (readonly)..."));
menu_entry(wxID_LOAD_STATE, wxT("&Load state")); menu_entry(wxID_LOAD_STATE_RW, wxT("Load s&tate (read-write)..."));
menu_entry(wxID_LOAD_STATE_RO, wxT("Loa&d state (readonly)")); menu_entry(wxID_LOAD_STATE_P, wxT("Load state (&preserve input)..."));
menu_entry(wxID_LOAD_STATE_RW, wxT("Load s&tate (read-write)")); menu_entry(wxID_LOAD_MOVIE, wxT("Load &movie..."));
menu_entry(wxID_LOAD_STATE_P, wxT("Load state (&preserve)")); menu_entry(wxID_REWIND_MOVIE, wxT("Re&wind movie..."));
menu_entry(wxID_LOAD_MOVIE, wxT("Load &movie"));
menu_entry(wxID_REWIND_MOVIE, wxT("Re&wind movie"));
menu_separator();
menu_entry(wxID_CANCEL_SAVES, wxT("Cancel pend&ing saves"));
menu_separator();
menu_entry(wxID_SAVE_SCREENSHOT, wxT("Save sc&reenshot"));
menu_separator();
menu_special_sub(wxT("D&ump video"), reinterpret_cast<dumper_menu*>(dmenu = new dumper_menu(this,
wxID_DUMP_FIRST, wxID_DUMP_LAST)));
if(load_library_supported) { if(load_library_supported) {
menu_separator(); menu_separator();
menu_entry(wxID_LOAD_LIBRARY, towxstring(std::string("Load ") + library_is_called)); menu_entry(wxID_LOAD_LIBRARY, towxstring(std::string("Load ") + library_is_called));
} }
//Autohold menu: (ACFOS) menu_end_sub();
menu_start_sub(wxT("Sa&ve"));
menu_entry(wxID_SAVE_STATE, wxT("Save stat&e..."));
menu_entry(wxID_SAVE_MOVIE, wxT("Sa&ve movie..."));
menu_entry(wxID_SAVE_SCREENSHOT, wxT("Save sc&reenshot..."));
menu_entry(wxID_CANCEL_SAVES, wxT("Cancel pend&ing saves..."));
menu_end_sub();
menu_separator();
menu_entry(wxID_PAUSE, wxT("&Pause/Unpause"));
menu_entry(wxID_FRAMEADVANCE, wxT("S&tep frame"));
menu_entry(wxID_SUBFRAMEADVANCE, wxT("St&ep subframe"));
menu_entry(wxID_NEXTPOLL, wxT("Step poll"));
menu_separator();
menu_entry(wxID_ERESET, wxT("&Reset"));
menu_separator();
menu_entry_check(wxID_SHOW_STATUS, wxT("Show/Hide status panel"));
menu_separator();
menu_special_sub(wxT("D&ump video"), reinterpret_cast<dumper_menu*>(dmenu = new dumper_menu(this,
wxID_DUMP_FIRST, wxID_DUMP_LAST)));
menu_separator();
menu_entry(wxID_EXIT, wxT("&Quit"));
menu_separator();
menu_entry(wxID_ABOUT, wxT("About..."));
//Autohold menu: (ACOS)
menu_special(wxT("&Autohold"), reinterpret_cast<autohold_menu*>(ahmenu = new autohold_menu(this))); menu_special(wxT("&Autohold"), reinterpret_cast<autohold_menu*>(ahmenu = new autohold_menu(this)));
blistener->set_autohold_menu(reinterpret_cast<autohold_menu*>(ahmenu)); blistener->set_autohold_menu(reinterpret_cast<autohold_menu*>(ahmenu));
//Scripting menu: (ACFOS)ERU //Scripting menu: (ACOS)ERU
menu_start(wxT("S&cripting")); menu_start(wxT("S&cripting"));
menu_entry(wxID_RUN_SCRIPT, wxT("&Run script")); menu_entry(wxID_RUN_SCRIPT, wxT("&Run script..."));
if(lua_supported) { if(lua_supported) {
menu_separator(); menu_separator();
menu_entry(wxID_EVAL_LUA, wxT("&Evaluate Lua statement")); menu_entry(wxID_EVAL_LUA, wxT("&Evaluate Lua statement..."));
menu_entry(wxID_RUN_LUA, wxT("R&un Lua script")); menu_entry(wxID_RUN_LUA, wxT("R&un Lua script..."));
} }
menu_separator(); menu_separator();
menu_entry(wxID_EDIT_MEMORYWATCH, wxT("Edit memory watch")); menu_entry(wxID_EDIT_MEMORYWATCH, wxT("Edit memory watch..."));
menu_separator(); menu_separator();
menu_entry(wxID_LOAD_MEMORYWATCH, wxT("Load memory watch")); menu_entry(wxID_LOAD_MEMORYWATCH, wxT("Load memory watch..."));
menu_entry(wxID_SAVE_MEMORYWATCH, wxT("Save memory watch")); menu_entry(wxID_SAVE_MEMORYWATCH, wxT("Save memory watch..."));
menu_separator(); menu_separator();
menu_entry(wxID_MEMORY_SEARCH, wxT("Memory Search")); menu_entry(wxID_MEMORY_SEARCH, wxT("Memory Search..."));
//Settings menu: (ACFOS) //Settings menu: (ACFOS)
menu_start(wxT("Settings")); menu_start(wxT("Settings"));
menu_entry(wxID_EDIT_AXES, wxT("Configure axes")); menu_entry(wxID_EDIT_AXES, wxT("Configure axes..."));
menu_entry(wxID_EDIT_SETTINGS, wxT("Configure settings")); menu_entry(wxID_EDIT_SETTINGS, wxT("Configure settings..."));
menu_entry(wxID_EDIT_HOTKEYS, wxT("Configure hotkeys")); menu_entry(wxID_EDIT_KEYBINDINGS, wxT("Configure keybindings..."));
menu_entry(wxID_EDIT_KEYBINDINGS, wxT("Configure keybindings")); menu_entry(wxID_EDIT_ALIAS, wxT("Configure aliases..."));
menu_entry(wxID_EDIT_ALIAS, wxT("Configure aliases")); menu_entry(wxID_EDIT_JUKEBOX, wxT("Configure jukebox..."));
menu_entry(wxID_EDIT_JUKEBOX, wxT("Configure jukebox"));
menu_separator(); menu_separator();
menu_entry_check(wxID_SHOW_STATUS, wxT("Show status panel")); menu_entry(wxID_SET_SCREEN, wxT("Set screen scaling..."));
menu_entry(wxID_SET_SPEED, wxT("Set speed")); menu_entry(wxID_SET_PATHS, wxT("Set paths..."));
menu_entry(wxID_SET_SCREEN, wxT("Set screen scaling")); menu_entry(wxID_EDIT_HOTKEYS, wxT("Configure hotkeys..."));
menu_check(wxID_SHOW_STATUS, true); menu_check(wxID_SHOW_STATUS, true);
if(platform::sound_initialized()) { if(platform::sound_initialized()) {
//Sound menu: (ACFOS)EHU //Sound menu: (ACFOS)EHU
@ -794,31 +877,31 @@ void wxwin_mainwindow::handle_menu_click_cancelable(wxCommandEvent& e)
platform::queue("cancel-saves"); platform::queue("cancel-saves");
return; return;
case wxID_LOAD_MOVIE: case wxID_LOAD_MOVIE:
platform::queue("load-movie " + pick_file(this, "Load Movie", ".")); platform::queue("load-movie " + pick_file(this, "Load Movie", movie_path()));
return; return;
case wxID_LOAD_STATE: case wxID_LOAD_STATE:
platform::queue("load " + pick_file(this, "Load State", ".")); platform::queue("load " + pick_file(this, "Load State", movie_path()));
return; return;
case wxID_LOAD_STATE_RO: case wxID_LOAD_STATE_RO:
platform::queue("load-readonly " + pick_file(this, "Load State (Read-Only)", ".")); platform::queue("load-readonly " + pick_file(this, "Load State (Read-Only)", movie_path()));
return; return;
case wxID_LOAD_STATE_RW: case wxID_LOAD_STATE_RW:
platform::queue("load-state " + pick_file(this, "Load State (Read-Write)", ".")); platform::queue("load-state " + pick_file(this, "Load State (Read-Write)", movie_path()));
return; return;
case wxID_LOAD_STATE_P: case wxID_LOAD_STATE_P:
platform::queue("load-preserve " + pick_file(this, "Load State (Preserve)", ".")); platform::queue("load-preserve " + pick_file(this, "Load State (Preserve)", movie_path()));
return; return;
case wxID_REWIND_MOVIE: case wxID_REWIND_MOVIE:
platform::queue("rewind-movie"); platform::queue("rewind-movie");
return; return;
case wxID_SAVE_MOVIE: case wxID_SAVE_MOVIE:
platform::queue("save-movie " + pick_file(this, "Save Movie", ".")); platform::queue("save-movie " + pick_file(this, "Save Movie", movie_path()));
return; return;
case wxID_SAVE_STATE: case wxID_SAVE_STATE:
platform::queue("save-state " + pick_file(this, "Save State", ".")); platform::queue("save-state " + pick_file(this, "Save State", movie_path()));
return; return;
case wxID_SAVE_SCREENSHOT: case wxID_SAVE_SCREENSHOT:
platform::queue("take-screenshot " + pick_file(this, "Save State", ".")); platform::queue("take-screenshot " + pick_file(this, "Save Screenshot", movie_path()));
return; return;
case wxID_RUN_SCRIPT: case wxID_RUN_SCRIPT:
platform::queue("run-script " + pick_file_member(this, "Select Script", ".")); platform::queue("run-script " + pick_file_member(this, "Select Script", "."));
@ -1054,5 +1137,44 @@ void wxwin_mainwindow::handle_menu_click_cancelable(wxCommandEvent& e)
case wxID_SET_SCREEN: case wxID_SET_SCREEN:
wxeditor_screen_display(this, horizontal_multiplier, vertical_multiplier, libswscale_flags); wxeditor_screen_display(this, horizontal_multiplier, vertical_multiplier, libswscale_flags);
return; return;
case wxID_SET_PATHS:
wxeditor_paths_display(this);
return;
case wxID_SPEED_5:
set_speed(5);
break;
case wxID_SPEED_10:
set_speed(10);
break;
case wxID_SPEED_17:
set_speed(16.66666666666);
break;
case wxID_SPEED_20:
set_speed(20);
break;
case wxID_SPEED_25:
set_speed(25);
break;
case wxID_SPEED_33:
set_speed(33.3333333333333);
break;
case wxID_SPEED_50:
set_speed(50);
break;
case wxID_SPEED_100:
set_speed(100);
break;
case wxID_SPEED_150:
set_speed(150);
break;
case wxID_SPEED_200:
set_speed(200);
break;
case wxID_SPEED_300:
set_speed(300);
break;
case wxID_SPEED_TURBO:
set_speed(-1);
break;
}; };
} }

View file

@ -3,6 +3,7 @@
#include "core/moviedata.hpp" #include "core/moviedata.hpp"
#include "core/framerate.hpp" #include "core/framerate.hpp"
#include "core/settings.hpp"
#include "library/zip.hpp" #include "library/zip.hpp"
#include "interface/core.hpp" #include "interface/core.hpp"
@ -245,6 +246,50 @@ namespace
private: private:
wxTextCtrl* ctrl; wxTextCtrl* ctrl;
}; };
class rom_path_setting : public setting
{
public:
rom_path_setting() : setting("rompath") { _rompath = "."; default_rom = true; }
void blank() throw(std::bad_alloc, std::runtime_error)
{
_rompath = ".";
default_rom = true;
}
bool is_set() throw()
{
return !default_rom;
}
void set(const std::string& value) throw(std::bad_alloc, std::runtime_error)
{
if(value != "") {
_rompath = value;
default_rom = false;
} else
blank();
}
std::string get() throw(std::bad_alloc)
{
return _rompath;
}
operator std::string() throw(std::bad_alloc)
{
return _rompath;
}
private:
std::string _rompath;
bool default_rom;
} rompath_setting;
std::string rom_path()
{
//This is pre-boot, so read directly.
return setting::get("rompath");
}
} }
@ -286,7 +331,7 @@ wxwin_romselect::wxwin_romselect()
romgrid->Add(rom_label[i] = new wxStaticText(this, wxID_ANY, wxT("")), 0, wxGROW); romgrid->Add(rom_label[i] = new wxStaticText(this, wxID_ANY, wxT("")), 0, wxGROW);
romgrid->Add(rom_name[i] = new wxTextCtrl(this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(500, -1)), romgrid->Add(rom_name[i] = new wxTextCtrl(this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(500, -1)),
1, wxGROW); 1, wxGROW);
romgrid->Add(rom_change[i] = new wxButton(this, ROM_SELECTS_BASE + i, wxT("...")), 0, wxGROW); romgrid->Add(rom_change[i] = new wxButton(this, ROM_SELECTS_BASE + i, wxT("Pick")), 0, wxGROW);
rom_name[i]->Connect(wxEVT_COMMAND_TEXT_UPDATED, rom_name[i]->Connect(wxEVT_COMMAND_TEXT_UPDATED,
wxCommandEventHandler(wxwin_romselect::on_filename_change), NULL, this); wxCommandEventHandler(wxwin_romselect::on_filename_change), NULL, this);
rom_change[i]->Connect(wxEVT_COMMAND_BUTTON_CLICKED, rom_change[i]->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
@ -353,7 +398,7 @@ void wxwin_romselect::on_ask_rom_filename(wxCommandEvent& e)
{ {
try { try {
std::string fname = pick_file_member(this, "Choose " + tostdstring( std::string fname = pick_file_member(this, "Choose " + tostdstring(
rom_label[e.GetId() - ROM_SELECTS_BASE]->GetLabel()), "."); rom_label[e.GetId() - ROM_SELECTS_BASE]->GetLabel()), rom_path());
wxTextCtrl* textbox = rom_name[e.GetId() - ROM_SELECTS_BASE]; wxTextCtrl* textbox = rom_name[e.GetId() - ROM_SELECTS_BASE];
if(textbox) if(textbox)
textbox->SetValue(towxstring(fname)); textbox->SetValue(towxstring(fname));
@ -471,7 +516,7 @@ wxwin_patch::wxwin_patch(loaded_rom& rom)
patchsel->Add(new wxStaticText(this, wxID_ANY, wxT("File:")), 0, wxGROW); patchsel->Add(new wxStaticText(this, wxID_ANY, wxT("File:")), 0, wxGROW);
patchsel->Add(patchfile = new wxTextCtrl(this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(500, -1)), patchsel->Add(patchfile = new wxTextCtrl(this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(500, -1)),
1, wxGROW); 1, wxGROW);
patchsel->Add(choosefile = new wxButton(this, wxID_ANY, wxT("...")), 0, wxGROW); patchsel->Add(choosefile = new wxButton(this, wxID_ANY, wxT("Pick")), 0, wxGROW);
patchfile->Connect(wxEVT_COMMAND_TEXT_UPDATED, patchfile->Connect(wxEVT_COMMAND_TEXT_UPDATED,
wxCommandEventHandler(wxwin_patch::on_patchfile_change), NULL, this); wxCommandEventHandler(wxwin_patch::on_patchfile_change), NULL, this);
choosefile->Connect(wxEVT_COMMAND_BUTTON_CLICKED, choosefile->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
@ -517,7 +562,7 @@ wxwin_patch::wxwin_patch(loaded_rom& rom)
void wxwin_patch::on_ask_patchfile(wxCommandEvent& e) void wxwin_patch::on_ask_patchfile(wxCommandEvent& e)
{ {
try { try {
std::string fname = pick_file_member(this, "Choose patch file", "."); std::string fname = pick_file_member(this, "Choose patch file", rom_path());
patchfile->SetValue(towxstring(fname)); patchfile->SetValue(towxstring(fname));
on_patchfile_change(e); on_patchfile_change(e);
} catch(canceled_exception& e) { } catch(canceled_exception& e) {
@ -649,7 +694,9 @@ wxwin_project::wxwin_project(loaded_rom& rom)
wxFlexGridSizer* fileblock = new wxFlexGridSizer(1, 2, 0, 0); wxFlexGridSizer* fileblock = new wxFlexGridSizer(1, 2, 0, 0);
fileblock->Add(savefile = new wxTextCtrl(this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(500, -1)), fileblock->Add(savefile = new wxTextCtrl(this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(500, -1)),
1, wxGROW); 1, wxGROW);
fileblock->Add(ask_savefile = new wxButton(this, ASK_FILENAME_BUTTON, wxT("...")), 0, wxGROW); savefile->SetDropTarget(new textboxloadfilename(savefile));
fileblock->Add(ask_savefile = new wxButton(this, ASK_FILENAME_BUTTON, wxT("Pick")), 0, wxGROW);
savefile->Connect(wxEVT_COMMAND_TEXT_UPDATED, savefile->Connect(wxEVT_COMMAND_TEXT_UPDATED,
wxCommandEventHandler(wxwin_project::on_filename_change), NULL, this); wxCommandEventHandler(wxwin_project::on_filename_change), NULL, this);
ask_savefile->Connect(wxEVT_COMMAND_BUTTON_CLICKED, ask_savefile->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
@ -681,7 +728,8 @@ wxwin_project::wxwin_project(loaded_rom& rom)
wxFlexGridSizer* fileblock2 = new wxFlexGridSizer(1, 2, 0, 0); wxFlexGridSizer* fileblock2 = new wxFlexGridSizer(1, 2, 0, 0);
fileblock2->Add(sram_files[i] = new wxTextCtrl(this, wxID_ANY, wxT(""), wxDefaultPosition, fileblock2->Add(sram_files[i] = new wxTextCtrl(this, wxID_ANY, wxT(""), wxDefaultPosition,
wxSize(500, -1)), 1, wxGROW); wxSize(500, -1)), 1, wxGROW);
fileblock2->Add(sram_choosers[i] = new wxButton(this, ASK_SRAMS_BASE + idx, wxT("...")), 0, wxGROW); sram_files[i]->SetDropTarget(new textboxloadfilename(sram_files[i]));
fileblock2->Add(sram_choosers[i] = new wxButton(this, ASK_SRAMS_BASE + idx, wxT("Pick")), 0, wxGROW);
sram_files[i]->Connect(wxEVT_COMMAND_TEXT_UPDATED, sram_files[i]->Connect(wxEVT_COMMAND_TEXT_UPDATED,
wxCommandEventHandler(wxwin_project::on_filename_change), NULL, this); wxCommandEventHandler(wxwin_project::on_filename_change), NULL, this);
sram_choosers[i]->Connect(wxEVT_COMMAND_BUTTON_CLICKED, sram_choosers[i]->Connect(wxEVT_COMMAND_BUTTON_CLICKED,