Added new GUI based on wxWidgets. Patch from bit.
This commit is contained in:
parent
a2f44b8ea7
commit
7fe91626d6
60 changed files with 11647 additions and 78 deletions
224
src/wx-app.cc
Normal file
224
src/wx-app.cc
Normal file
|
|
@ -0,0 +1,224 @@
|
|||
#include "wx-app.h"
|
||||
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/event.h>
|
||||
#include "wx-utils.h"
|
||||
#include "wx-common.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
int wx_load_config(void*);
|
||||
int wx_start(void*);
|
||||
int wx_stop(void*);
|
||||
void wx_show(void*);
|
||||
void wx_handle_command(void*, int, int);
|
||||
|
||||
int start_emulation(void*);
|
||||
int resume_emulation();
|
||||
int pause_emulation();
|
||||
int stop_emulation();
|
||||
}
|
||||
|
||||
extern void InitXmlResource();
|
||||
|
||||
wxDEFINE_EVENT(WX_CALLBACK_EVENT, CallbackEvent);
|
||||
wxDEFINE_EVENT(WX_EXIT_EVENT, wxCommandEvent);
|
||||
wxDEFINE_EVENT(WX_STOP_EMULATION_EVENT, wxCommandEvent);
|
||||
wxDEFINE_EVENT(WX_EXIT_COMPLETE_EVENT, wxCommandEvent);
|
||||
wxDEFINE_EVENT(WX_SHOW_WINDOW_EVENT, wxCommandEvent);
|
||||
wxDEFINE_EVENT(WX_POPUP_MENU_EVENT, PopupMenuEvent);
|
||||
|
||||
wxBEGIN_EVENT_TABLE(Frame, wxFrame)
|
||||
wxEND_EVENT_TABLE()
|
||||
|
||||
wxIMPLEMENT_APP_NO_MAIN(App);
|
||||
|
||||
App::App()
|
||||
{
|
||||
this->frame = NULL;
|
||||
}
|
||||
|
||||
bool App::OnInit()
|
||||
{
|
||||
wxImage::AddHandler( new wxPNGHandler );
|
||||
wxXmlResource::Get()->InitAllHandlers();
|
||||
// if (!wxXmlResource::Get()->Load("src/pc.xrc"))
|
||||
// {
|
||||
// std::cout << "Could not load resource file" << std::endl;
|
||||
// return false;
|
||||
// }
|
||||
InitXmlResource();
|
||||
|
||||
frame = new Frame(this, "null frame", wxPoint(500, 500),
|
||||
wxSize(100, 100));
|
||||
frame->Start();
|
||||
return true;
|
||||
}
|
||||
|
||||
int App::OnRun()
|
||||
{
|
||||
return wxApp::OnRun();
|
||||
}
|
||||
|
||||
#include <sstream>
|
||||
|
||||
Frame::Frame(App* app, const wxString& title, const wxPoint& pos,
|
||||
const wxSize& size) :
|
||||
wxFrame(NULL, wxID_ANY, title, pos, size, 0)//wxDEFAULT_FRAME_STYLE & ~(wxRESIZE_BORDER))
|
||||
{
|
||||
this->closing = false;
|
||||
this->menu = wxXmlResource::Get()->LoadMenu(wxT("main_menu"));
|
||||
|
||||
Bind(wxEVT_CLOSE_WINDOW, &Frame::OnClose, this);
|
||||
Bind(wxEVT_MENU, &Frame::OnCommand, this);
|
||||
Bind(wxEVT_TOOL, &Frame::OnCommand, this);
|
||||
Bind(WX_SHOW_WINDOW_EVENT, &Frame::OnShowWindowEvent, this);
|
||||
Bind(WX_POPUP_MENU_EVENT, &Frame::OnPopupMenuEvent, this);
|
||||
Bind(WX_EXIT_EVENT, &Frame::OnExitEvent, this);
|
||||
Bind(WX_EXIT_COMPLETE_EVENT, &Frame::OnExitCompleteEvent, this);
|
||||
Bind(WX_STOP_EMULATION_EVENT, &Frame::OnStopEmulationEvent, this);
|
||||
Bind(WX_CALLBACK_EVENT, &Frame::OnCallbackEvent, this);
|
||||
|
||||
CenterOnScreen();
|
||||
}
|
||||
|
||||
void Frame::Start()
|
||||
{
|
||||
if (wx_start(this))
|
||||
ShowConfigSelection();
|
||||
else
|
||||
Quit(0);
|
||||
}
|
||||
|
||||
void Frame::ShowConfigSelection()
|
||||
{
|
||||
if (wx_load_config(this))
|
||||
start_emulation(this);
|
||||
else
|
||||
Quit(1);
|
||||
}
|
||||
|
||||
void Frame::OnCallbackEvent(CallbackEvent& event)
|
||||
{
|
||||
WX_CALLBACK callback = event.GetCallback();
|
||||
callback();
|
||||
}
|
||||
|
||||
void Frame::OnStopEmulationEvent(wxCommandEvent& event)
|
||||
{
|
||||
if (emulation_state != EMULATION_STOPPED)
|
||||
{
|
||||
pause_emulation();
|
||||
int ret = wxID_OK;
|
||||
|
||||
if (confirm_on_stop_emulation)
|
||||
{
|
||||
wxDialog dlg;
|
||||
wxXmlResource::Get()->LoadDialog(&dlg, this, "ConfirmRememberDlg");
|
||||
dlg.FindWindow("IDC_CONFIRM_LABEL")->SetLabel("Stop emulation?");
|
||||
dlg.FindWindow("IDC_CONFIRM_REMEMBER")->SetLabel("Do not ask again");
|
||||
dlg.Fit();
|
||||
ret = dlg.ShowModal();
|
||||
if (ret == wxID_OK)
|
||||
confirm_on_stop_emulation = !((wxCheckBox*)dlg.FindWindow("IDC_CONFIRM_REMEMBER"))->IsChecked();
|
||||
}
|
||||
|
||||
if (ret == wxID_OK)
|
||||
{
|
||||
stop_emulation();
|
||||
ShowConfigSelection();
|
||||
}
|
||||
else
|
||||
resume_emulation();
|
||||
}
|
||||
}
|
||||
|
||||
void Frame::OnShowWindowEvent(wxCommandEvent& event)
|
||||
{
|
||||
wxWindow* window = (wxWindow*)event.GetEventObject();
|
||||
int shown = window->IsShown();
|
||||
int value = event.GetInt();
|
||||
if (value < 0)
|
||||
window->Show(!shown);
|
||||
else
|
||||
window->Show(value > 0);
|
||||
if (!shown)
|
||||
window->Refresh();
|
||||
}
|
||||
|
||||
void Frame::OnPopupMenuEvent(PopupMenuEvent& event)
|
||||
{
|
||||
wxWindow* window = event.GetWindow();
|
||||
wxMenu* menu = event.GetMenu();
|
||||
int* x = event.GetX();
|
||||
int* y = event.GetY();
|
||||
|
||||
if (x && y)
|
||||
window->PopupMenu(menu, *x, *y);
|
||||
else
|
||||
window->PopupMenu(menu);
|
||||
}
|
||||
|
||||
void Frame::OnCommand(wxCommandEvent& event)
|
||||
{
|
||||
wx_handle_command(this, event.GetId(), event.IsChecked());
|
||||
}
|
||||
|
||||
void Frame::OnClose(wxCloseEvent& event)
|
||||
{
|
||||
wx_exit(this, 0);
|
||||
}
|
||||
|
||||
wxMenu* Frame::GetMenu()
|
||||
{
|
||||
return menu;
|
||||
}
|
||||
|
||||
/* Exit */
|
||||
|
||||
void Frame::Quit(bool stop_emulator)
|
||||
{
|
||||
if (closing)
|
||||
return;
|
||||
closing = true;
|
||||
if (stop_emulator)
|
||||
{
|
||||
if (!wx_stop(this))
|
||||
{
|
||||
// cancel quit
|
||||
closing = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
Destroy();
|
||||
}
|
||||
|
||||
void Frame::OnExitEvent(wxCommandEvent& event)
|
||||
{
|
||||
if (closing)
|
||||
return;
|
||||
closing = true;
|
||||
CExitThread* exitThread = new CExitThread(this);
|
||||
exitThread->Run();
|
||||
}
|
||||
|
||||
void Frame::OnExitCompleteEvent(wxCommandEvent& event)
|
||||
{
|
||||
if (event.GetInt())
|
||||
Destroy();
|
||||
else
|
||||
closing = false;
|
||||
}
|
||||
|
||||
CExitThread::CExitThread(Frame* frame)
|
||||
{
|
||||
this->frame = frame;
|
||||
}
|
||||
|
||||
wxThread::ExitCode CExitThread::Entry()
|
||||
{
|
||||
wxCommandEvent* event = new wxCommandEvent(WX_EXIT_COMPLETE_EVENT, wxID_ANY);
|
||||
event->SetInt(wx_stop(frame));
|
||||
wxQueueEvent(frame, event);
|
||||
return 0;
|
||||
}
|
||||
Loading…
Reference in a new issue