A slightly modified(fixed a memleak and sizer spacing) version of avindra's patch to improve the layout of the new "Cheat Search" dialog.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5942 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Jordan Woyak 2010-07-22 05:28:24 +00:00
parent 6795551a8c
commit 41f5379c8c
2 changed files with 71 additions and 61 deletions

View File

@ -145,78 +145,92 @@ void wxCheatsWindow::Init_ChildControls()
CheatSearchTab::CheatSearchTab(wxWindow* const parent)
: wxPanel(parent, -1, wxDefaultPosition, wxDefaultSize)
{
// new search box
// first scan button
btnInitScan = new wxButton(this, -1, wxT("New Scan"));
_connect_macro_(btnInitScan, CheatSearchTab::StartNewSearch, wxEVT_COMMAND_BUTTON_CLICKED, this);
// next scan button
btnNextScan = new wxButton(this, -1, wxT("Next Scan"));
_connect_macro_(btnNextScan, CheatSearchTab::FilterCheatSearchResults, wxEVT_COMMAND_BUTTON_CLICKED, this);
btnNextScan->Disable();
// data size radio buttons
size_radiobtn.rad_8 = new wxRadioButton(this, -1, wxT("8 bit"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
size_radiobtn.rad_16 = new wxRadioButton(this, -1, wxT("16 bit"));
size_radiobtn.rad_32 = new wxRadioButton(this, -1, wxT("32 bit"));
size_radiobtn.rad_8->SetValue(true);
wxButton* const button_start_search = new wxButton(this, -1, wxT("Start"));
_connect_macro_(button_start_search, CheatSearchTab::StartNewSearch, wxEVT_COMMAND_BUTTON_CLICKED, this);
// data sizes groupbox
wxStaticBoxSizer* const sizer_cheat_new_search = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("Data Size"));
sizer_cheat_new_search->Add(size_radiobtn.rad_8, 0, wxLEFT | wxRIGHT | wxBOTTOM | wxALIGN_CENTER_VERTICAL, 5);
sizer_cheat_new_search->Add(size_radiobtn.rad_16, 0, wxRIGHT | wxBOTTOM | wxALIGN_CENTER_VERTICAL, 5);
sizer_cheat_new_search->Add(size_radiobtn.rad_32, 0, wxRIGHT | wxBOTTOM | wxALIGN_CENTER_VERTICAL, 5);
wxStaticBoxSizer* const sizer_cheat_new_search = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("New Search"));
sizer_cheat_new_search->Add(size_radiobtn.rad_8, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
sizer_cheat_new_search->Add(size_radiobtn.rad_16, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
sizer_cheat_new_search->Add(size_radiobtn.rad_32, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
sizer_cheat_new_search->Add(button_start_search, 0, wxRIGHT | wxBOTTOM | wxALIGN_CENTER_VERTICAL, 5);
// results box
// result controls
lbox_search_results = new wxListBox(this, -1, wxDefaultPosition, wxDefaultSize);
label_results_count = new wxStaticText(this, -1, wxT("Count:"));
// create AR code button
wxButton* const button_cheat_search_copy_address = new wxButton(this, -1, wxT("Create AR Code"));
_connect_macro_(button_cheat_search_copy_address, CheatSearchTab::CreateARCode, wxEVT_COMMAND_BUTTON_CLICKED, this);
// results groupbox
wxStaticBoxSizer* const sizer_cheat_search_results = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Results"));
sizer_cheat_search_results->Add(label_results_count, 0, wxALIGN_LEFT | wxALL, 5);
sizer_cheat_search_results->Add(lbox_search_results, 1, wxEXPAND | wxALL, 5);
sizer_cheat_search_results->Add(button_cheat_search_copy_address, 0, wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND, 5);
// filter box
// x value box
value_x_radiobtn.rad_oldvalue = new wxRadioButton(this, -1, wxT("Old Value"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
// Search value radio buttons
value_x_radiobtn.rad_oldvalue = new wxRadioButton(this, -1, wxT("Previous Value"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
value_x_radiobtn.rad_uservalue = new wxRadioButton(this, -1, wxT(""));
value_x_radiobtn.rad_oldvalue->SetValue(true);
// search value textbox
textctrl_value_x = new wxTextCtrl(this, -1, wxT("0x0"), wxDefaultPosition, wxSize(96,-1));
_connect_macro_(textctrl_value_x, CheatSearchTab::ApplyFocus, wxEVT_SET_FOCUS, this);
wxBoxSizer* const sizer_cheat_filter_text = new wxBoxSizer(wxHORIZONTAL);
sizer_cheat_filter_text->Add(value_x_radiobtn.rad_uservalue, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
sizer_cheat_filter_text->Add(textctrl_value_x, 1, wxALIGN_CENTER_VERTICAL, 5);
wxStaticBoxSizer* const sizer_cheat_search_filter_x = new wxStaticBoxSizer(wxVERTICAL, this, wxT("X"));
// value groupbox
wxStaticBoxSizer* const sizer_cheat_search_filter_x = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Value"));
sizer_cheat_search_filter_x->Add(value_x_radiobtn.rad_oldvalue, 0, wxLEFT | wxRIGHT | wxBOTTOM, 5);
sizer_cheat_search_filter_x->Add(sizer_cheat_filter_text, 0, wxALL, 5);
sizer_cheat_search_filter_x->Add(sizer_cheat_filter_text, 0, wxALL | wxEXPAND, 5);
// filter types
filter_radiobtn.rad_none = new wxRadioButton(this, -1, wxT("None"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
filter_radiobtn.rad_notequal = new wxRadioButton(this, -1, wxT("!= X"));
filter_radiobtn.rad_equal = new wxRadioButton(this, -1, wxT("= X"));
filter_radiobtn.rad_greater = new wxRadioButton(this, -1, wxT("> X"));
filter_radiobtn.rad_less = new wxRadioButton(this, -1, wxT("< X"));
filter_radiobtn.rad_none->SetValue(true);
// filter types in the compare dropdown
static const wxString searches[] = {
wxT("Unknown"),
wxT("Not Equals"),
wxT("Equals"),
wxT("Greater Than"),
wxT("Less Than"),
// TODO: Implement between search.
//wxT("Between"),
};
search_type = new wxChoice(this, -1, wxDefaultPosition, wxDefaultSize, sizeof(searches)/sizeof(*searches), searches);
search_type->Select(0);
wxStaticBoxSizer* const sizer_cheat_search_filter = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Search Filter"));
sizer_cheat_search_filter->Add(sizer_cheat_search_filter_x, 0, wxLEFT | wxRIGHT | wxBOTTOM, 5);
sizer_cheat_search_filter->Add(filter_radiobtn.rad_none, 0, wxALL, 5);
sizer_cheat_search_filter->Add(filter_radiobtn.rad_notequal, 0, wxALL, 5);
sizer_cheat_search_filter->Add(filter_radiobtn.rad_equal, 0, wxALL, 5);
sizer_cheat_search_filter->Add(filter_radiobtn.rad_greater, 0, wxALL, 5);
sizer_cheat_search_filter->Add(filter_radiobtn.rad_less, 0, wxALL, 5);
wxButton* const button_cheat_search_update = new wxButton(this, -1, wxT("Search"));
_connect_macro_(button_cheat_search_update, CheatSearchTab::FilterCheatSearchResults, wxEVT_COMMAND_BUTTON_CLICKED, this);
sizer_cheat_search_filter->Add(sizer_cheat_search_filter_x, 0, wxALL | wxEXPAND, 5);
sizer_cheat_search_filter->Add(search_type, 0, wxALL, 5);
// left sizer
wxBoxSizer* const sizer_left = new wxBoxSizer(wxVERTICAL);
sizer_left->Add(sizer_cheat_new_search, 0, wxBOTTOM, 5);
sizer_left->Add(sizer_cheat_search_results, 1, wxEXPAND, 5);
// button sizer
wxBoxSizer* boxButtons = new wxBoxSizer(wxHORIZONTAL);
boxButtons->Add(btnInitScan, 1, wxRIGHT, 5);
boxButtons->Add(btnNextScan, 1);
// right sizer
wxBoxSizer* const sizer_right = new wxBoxSizer(wxVERTICAL);
sizer_right->Add(sizer_cheat_new_search, 0, wxBOTTOM, 5);
sizer_right->Add(sizer_cheat_search_filter, 0, wxEXPAND | wxBOTTOM, 5);
sizer_right->AddStretchSpacer(1);
sizer_right->Add(button_cheat_search_update, 0, wxTOP | wxEXPAND, 5);
sizer_right->Add(boxButtons, 0, wxTOP | wxEXPAND, 5);
// main sizer
wxBoxSizer* const sizer_main = new wxBoxSizer(wxHORIZONTAL);
@ -328,11 +342,6 @@ void CheatSearchTab::StartNewSearch(wxCommandEvent& WXUNUSED (event))
{
search_results.clear();
search_type_size =
size_radiobtn.rad_8->GetValue() +
(size_radiobtn.rad_16->GetValue() << 1) +
(size_radiobtn.rad_32->GetValue() << 2);
const u8* const memptr = Memory::GetPointer(0);
if (NULL == memptr)
{
@ -340,6 +349,15 @@ void CheatSearchTab::StartNewSearch(wxCommandEvent& WXUNUSED (event))
}
else
{
// enable the next scan button
btnNextScan->Enable();
// determine the search data size
search_type_size =
size_radiobtn.rad_8->GetValue() +
(size_radiobtn.rad_16->GetValue() << 1) +
(size_radiobtn.rad_32->GetValue() << 2);
CheatSearchResult r;
// can I assume cheatable values will be aligned like this?
for (u32 addr = 0; addr != Memory::RAM_SIZE; addr += search_type_size)
@ -372,17 +390,9 @@ void CheatSearchTab::FilterCheatSearchResults(wxCommandEvent&)
// 1 : equal
// 2 : greater-than
// 4 : less-than
if (filter_radiobtn.rad_none->GetValue())
filter_mask = 7;
else if (filter_radiobtn.rad_notequal->GetValue())
filter_mask = 6;
else if (filter_radiobtn.rad_equal->GetValue())
filter_mask = 1;
else if (filter_radiobtn.rad_greater->GetValue())
filter_mask = 2;
else if (filter_radiobtn.rad_less->GetValue())
filter_mask = 4;
const int filters[] = {7, 6, 1, 2, 4};
filter_mask = filters[search_type->GetSelection()];
if (value_x_radiobtn.rad_oldvalue->GetValue()) // using old value comparison
{
@ -392,10 +402,8 @@ void CheatSearchTab::FilterCheatSearchResults(wxCommandEvent&)
int cmp_result = memcmp(memptr + i->address, &i->old_value, search_type_size);
if (cmp_result < 0)
cmp_result = 4;
else if (cmp_result)
cmp_result = 2;
else
cmp_result = 1;
cmp_result = cmp_result ? 2 : 1;
if (cmp_result & filter_mask)
{
@ -421,7 +429,7 @@ void CheatSearchTab::FilterCheatSearchResults(wxCommandEvent&)
val_base = 16;
}
if (false == x_val.ToLong(&parsed_x_val, val_base))
if (!x_val.ToLong(&parsed_x_val, val_base))
{
PanicAlert("You must enter a valid decimal or hex value.");
return;
@ -471,6 +479,11 @@ void CheatSearchTab::FilterCheatSearchResults(wxCommandEvent&)
}
}
void CheatSearchTab::ApplyFocus(wxCommandEvent&)
{
value_x_radiobtn.rad_uservalue->SetValue(true);
}
void CheatSearchTab::UpdateCheatSearchResultsList()
{
lbox_search_results->Clear();
@ -590,7 +603,7 @@ void CreateCodeDialog::PressOK(wxCommandEvent&)
}
long code_value;
if (false == textctrl_value->GetValue().ToLong(&code_value, 10 + checkbox_use_hex->GetValue()*6))
if (!textctrl_value->GetValue().ToLong(&code_value, 10 + checkbox_use_hex->GetValue()*6))
{
PanicAlert("Invalid Value!");
return;

View File

@ -76,9 +76,12 @@ protected:
std::vector<CheatSearchResult> search_results;
unsigned int search_type_size;
wxChoice* search_type;
wxListBox* lbox_search_results;
wxStaticText* label_results_count;
wxTextCtrl* textctrl_value_x;
wxTextCtrl* textctrl_value_x;
wxString* searches;
wxButton *btnInitScan, *btnNextScan;
struct
{
@ -86,12 +89,6 @@ protected:
} size_radiobtn;
struct
{
wxRadioButton *rad_none, *rad_equal, *rad_notequal, *rad_greater, *rad_less;
} filter_radiobtn;
struct
{
wxRadioButton *rad_oldvalue, *rad_uservalue;
@ -99,10 +96,10 @@ protected:
} value_x_radiobtn;
void UpdateCheatSearchResultsList();
void StartNewSearch(wxCommandEvent& event);
void FilterCheatSearchResults(wxCommandEvent& event);
void CreateARCode(wxCommandEvent&);
void ApplyFocus(wxCommandEvent&);
};
class wxCheatsWindow : public wxFrame