Added modeless message box support for the wxWidgets port.

This commit is contained in:
Volker Ruppert 2023-11-05 19:05:24 +01:00
parent 5bb77620c3
commit 75d076b990
3 changed files with 95 additions and 4 deletions

View File

@ -2,7 +2,7 @@
// $Id$
/////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002-2021 The Bochs Project
// Copyright (C) 2002-2023 The Bochs Project
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
@ -1492,6 +1492,71 @@ int LogOptionsDialog::GetAction(int evtype)
return *ptrToChoice;
}
//////////////////////////////////////////////////////////////////////
// ModelessDialog implementation
//////////////////////////////////////////////////////////////////////
// all events go to OnEvent method
BEGIN_EVENT_TABLE(ModelessDialog, wxDialog)
EVT_BUTTON(-1, ModelessDialog::OnEvent)
END_EVENT_TABLE()
ModelessDialog::ModelessDialog(
wxWindow* parent,
wxWindowID id,
const wxString& title,
const wxString& msg)
: wxDialog(parent, id, title, wxDefaultPosition, wxDefaultSize,
wxDEFAULT_DIALOG_STYLE)
{
mainSizer = new wxBoxSizer(wxVERTICAL);
msgSizer = new wxBoxSizer(wxHORIZONTAL);
buttonSizer = new wxBoxSizer(wxHORIZONTAL);
mainSizer->Add(msgSizer, 0, wxALIGN_CENTER);
mainSizer->Add(buttonSizer, 0, wxALIGN_CENTER);
// msgSizer contents
message = new wxStaticText(this, -1, msg);
wxFont font = message->GetFont();
font.SetWeight(wxFONTWEIGHT_BOLD);
font.SetPointSize(2 + font.GetPointSize());
message->SetFont(font);
msgSizer->Add(message, 0, wxGROW|wxALIGN_LEFT|wxLEFT, 30);
// buttonSizer contents
wxButton *btn = new wxButton(this, wxID_OK, BTNLABEL_CLOSE);
buttonSizer->Add(btn, 0, wxALL, 5);
}
void ModelessDialog::Init()
{
SetSizer(mainSizer);
mainSizer->Fit(this);
wxSize size = mainSizer->GetMinSize();
int margin = 5;
SetSizeHints(size.GetWidth() + margin, size.GetHeight() + margin);
Center();
}
bool ModelessDialog::Show(bool val)
{
if (val) {
Init();
wxDialog::Raise();
}
return wxDialog::Show(val);
}
void ModelessDialog::OnEvent(wxCommandEvent& event)
{
int id = event.GetId();
switch (id) {
case wxID_OK:
Show(false);
break;
default:
event.Skip();
}
}
/////////////////////////////////////////////////////////////////
// utility

View File

@ -2,7 +2,7 @@
// $Id$
////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002-2021 The Bochs Project
// Copyright (C) 2002-2023 The Bochs Project
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
@ -369,6 +369,25 @@ public:
DECLARE_EVENT_TABLE()
};
////////////////////////////////////////////////////////////////////////////
// ModelessDialog
////////////////////////////////////////////////////////////////////////////
//
class ModelessDialog: public wxDialog
{
private:
wxBoxSizer *mainSizer, *msgSizer, *buttonSizer;
wxStaticText *message;
public:
ModelessDialog(wxWindow* parent, wxWindowID id,
const wxString& title,
const wxString& msg);
~ModelessDialog() {}
void Init();
bool Show(bool val);
void OnEvent(wxCommandEvent& event);
DECLARE_EVENT_TABLE()
};
/**************************************************************************
Everything else in here is a comment!

View File

@ -1085,6 +1085,7 @@ void MyFrame::OnSim2CIEvent(wxCommandEvent& event)
{
IFDBG_EVENT(wxLogDebug(wxT("received a bochs event in the GUI thread")));
BxEvent *be = (BxEvent *) event.GetEventObject();
ModelessDialog *ModelessMsgBox;
IFDBG_EVENT(wxLogDebug(wxT("event type = %d"), (int)be->type));
// all cases should return. sync event handlers MUST send back a
// response. async event handlers MUST delete the event.
@ -1111,10 +1112,16 @@ void MyFrame::OnSim2CIEvent(wxCommandEvent& event)
sim_thread->SendSyncResponse(be);
break;
case BX_SYNC_EVT_ML_MSG_BOX:
// TODO
ModelessMsgBox = new ModelessDialog(this, -1,
wxString(be->u.logmsg.prefix, wxConvUTF8),
wxString(be->u.logmsg.msg, wxConvUTF8));
ModelessMsgBox->Show(true);
be->param0 = (void*)ModelessMsgBox;
sim_thread->SendSyncResponse(be);
break;
case BX_SYNC_EVT_ML_MSG_BOX_KILL:
// TODO
delete (ModelessDialog*)be->param0;
sim_thread->SendSyncResponse(be);
break;
case BX_ASYNC_EVT_QUIT_SIM:
wxMessageBox(wxT("Bochs simulation has stopped."), wxT("Bochs Stopped"),