mirror of https://github.com/stella-emu/stella.git
Added per-textfield character filtering, and enabled it for CheatCodeDialog.
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@3146 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
26fcabc23c
commit
5dece736b1
|
@ -26,6 +26,10 @@
|
||||||
* Fixed bug when running ROMs using AtariVox controllers; the app would
|
* Fixed bug when running ROMs using AtariVox controllers; the app would
|
||||||
crash upon exiting the ROM.
|
crash upon exiting the ROM.
|
||||||
|
|
||||||
|
* Certain textfields in the UI now have filtering enabled, preventing
|
||||||
|
insertion of illegal characters. This will be extended throughout
|
||||||
|
the code in future releases.
|
||||||
|
|
||||||
-Have fun!
|
-Have fun!
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -83,11 +83,22 @@ CheatCodeDialog::CheatCodeDialog(OSystem& osystem, DialogContainer& parent,
|
||||||
|
|
||||||
// Inputbox which will pop up when adding/editing a cheat
|
// Inputbox which will pop up when adding/editing a cheat
|
||||||
StringList labels;
|
StringList labels;
|
||||||
labels.push_back("Name: ");
|
labels.push_back("Name: ");
|
||||||
labels.push_back("Code: ");
|
labels.push_back("Code (hex): ");
|
||||||
myCheatInput = make_ptr<InputTextDialog>(this, font, labels);
|
myCheatInput = make_ptr<InputTextDialog>(this, font, labels);
|
||||||
myCheatInput->setTarget(this);
|
myCheatInput->setTarget(this);
|
||||||
|
|
||||||
|
// Add filtering for each textfield
|
||||||
|
EditableWidget::TextFilter f0 = [](char c) {
|
||||||
|
return isprint(c) && c != '\"' && c != ':';
|
||||||
|
};
|
||||||
|
myCheatInput->setTextFilter(f0, 0);
|
||||||
|
|
||||||
|
EditableWidget::TextFilter f1 = [](char c) {
|
||||||
|
return (c >= 'a' && c <= 'f') || (c >= '0' && c <= '9');
|
||||||
|
};
|
||||||
|
myCheatInput->setTextFilter(f1, 1);
|
||||||
|
|
||||||
addToFocusList(wid);
|
addToFocusList(wid);
|
||||||
|
|
||||||
// Add OK and Cancel buttons
|
// Add OK and Cancel buttons
|
||||||
|
|
|
@ -40,6 +40,9 @@ EditableWidget::EditableWidget(GuiObject* boss, const GUI::Font& font,
|
||||||
_bgcolorhi = kWidColor;
|
_bgcolorhi = kWidColor;
|
||||||
_textcolor = kTextColor;
|
_textcolor = kTextColor;
|
||||||
_textcolorhi = kTextColor;
|
_textcolorhi = kTextColor;
|
||||||
|
|
||||||
|
// By default, include all printable chars except quotes
|
||||||
|
_filter = [](char c) { return isprint(c) && c != '\"'; };
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -50,9 +53,12 @@ EditableWidget::~EditableWidget()
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void EditableWidget::setText(const string& str, bool)
|
void EditableWidget::setText(const string& str, bool)
|
||||||
{
|
{
|
||||||
// TODO: We probably should filter the input string here,
|
// Filter input string
|
||||||
// e.g. using tryInsertChar.
|
_editString = "";
|
||||||
_editString = str;
|
for(int i = 0; i < str.size(); ++i)
|
||||||
|
if(_filter(tolower(str[i])))
|
||||||
|
_editString.push_back(str[i]);
|
||||||
|
|
||||||
_caretPos = (int)_editString.size();
|
_caretPos = (int)_editString.size();
|
||||||
|
|
||||||
_editScrollOffset = (_font.getStringWidth(_editString) - (getEditRect().width()));
|
_editScrollOffset = (_font.getStringWidth(_editString) - (getEditRect().width()));
|
||||||
|
@ -70,15 +76,15 @@ void EditableWidget::setEditable(bool editable)
|
||||||
{
|
{
|
||||||
_editable = editable;
|
_editable = editable;
|
||||||
if(_editable)
|
if(_editable)
|
||||||
setFlags(WIDGET_WANTS_RAWDATA|WIDGET_RETAIN_FOCUS);
|
setFlags(WIDGET_WANTS_RAWDATA | WIDGET_RETAIN_FOCUS);
|
||||||
else
|
else
|
||||||
clearFlags(WIDGET_WANTS_RAWDATA|WIDGET_RETAIN_FOCUS);
|
clearFlags(WIDGET_WANTS_RAWDATA | WIDGET_RETAIN_FOCUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bool EditableWidget::tryInsertChar(char c, int pos)
|
bool EditableWidget::tryInsertChar(char c, int pos)
|
||||||
{
|
{
|
||||||
if(isprint(c) && c != '\"')
|
if(_filter(tolower(c)))
|
||||||
{
|
{
|
||||||
_editString.insert(pos, 1, c);
|
_editString.insert(pos, 1, c);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -30,6 +30,9 @@
|
||||||
class EditableWidget : public Widget, public CommandSender
|
class EditableWidget : public Widget, public CommandSender
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/** Function used by 'tryInsertChar' to test validity of a character */
|
||||||
|
using TextFilter = std::function<bool(char)>;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
kAcceptCmd = 'EDac',
|
kAcceptCmd = 'EDac',
|
||||||
kCancelCmd = 'EDcl',
|
kCancelCmd = 'EDcl',
|
||||||
|
@ -53,6 +56,9 @@ class EditableWidget : public Widget, public CommandSender
|
||||||
// We only want to focus this widget when we can edit its contents
|
// We only want to focus this widget when we can edit its contents
|
||||||
virtual bool wantsFocus() { return _editable; }
|
virtual bool wantsFocus() { return _editable; }
|
||||||
|
|
||||||
|
// Set filter used by 'tryInsertChar'
|
||||||
|
void setTextFilter(TextFilter& filter) { _filter = filter; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void startEditMode() { setFlags(WIDGET_WANTS_RAWDATA); }
|
virtual void startEditMode() { setFlags(WIDGET_WANTS_RAWDATA); }
|
||||||
virtual void endEditMode() { clearFlags(WIDGET_WANTS_RAWDATA); }
|
virtual void endEditMode() { clearFlags(WIDGET_WANTS_RAWDATA); }
|
||||||
|
@ -64,6 +70,9 @@ class EditableWidget : public Widget, public CommandSender
|
||||||
bool setCaretPos(int newPos);
|
bool setCaretPos(int newPos);
|
||||||
bool adjustOffset();
|
bool adjustOffset();
|
||||||
|
|
||||||
|
// This method will use the current TextFilter to insert a character
|
||||||
|
// Note that classes which override this method will no longer use the
|
||||||
|
// current TextFilter, and will assume all responsibility for filtering
|
||||||
virtual bool tryInsertChar(char c, int pos);
|
virtual bool tryInsertChar(char c, int pos);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -91,6 +100,9 @@ class EditableWidget : public Widget, public CommandSender
|
||||||
int _editScrollOffset;
|
int _editScrollOffset;
|
||||||
|
|
||||||
static string _clippedText;
|
static string _clippedText;
|
||||||
|
|
||||||
|
private:
|
||||||
|
TextFilter _filter;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -71,7 +71,7 @@ void InputTextDialog::initialize(const GUI::Font& lfont, const GUI::Font& nfont,
|
||||||
WidgetArray wid;
|
WidgetArray wid;
|
||||||
|
|
||||||
// Calculate real dimensions
|
// Calculate real dimensions
|
||||||
_w = fontWidth * 30;
|
_w = fontWidth * 35;
|
||||||
_h = lineHeight * 4 + (int)labels.size() * (lineHeight + 5);
|
_h = lineHeight * 4 + (int)labels.size() * (lineHeight + 5);
|
||||||
|
|
||||||
// Determine longest label
|
// Determine longest label
|
||||||
|
@ -176,6 +176,13 @@ void InputTextDialog::setText(const string& str, int idx)
|
||||||
myInput[idx]->setText(str);
|
myInput[idx]->setText(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void InputTextDialog::setTextFilter(EditableWidget::TextFilter& f, int idx)
|
||||||
|
{
|
||||||
|
if((uInt32)idx < myInput.size())
|
||||||
|
myInput[idx]->setTextFilter(f);
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void InputTextDialog::setFocus(int idx)
|
void InputTextDialog::setFocus(int idx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,6 +26,7 @@ class EditTextWidget;
|
||||||
|
|
||||||
#include "Dialog.hxx"
|
#include "Dialog.hxx"
|
||||||
#include "Command.hxx"
|
#include "Command.hxx"
|
||||||
|
#include "EditableWidget.hxx"
|
||||||
|
|
||||||
class InputTextDialog : public Dialog, public CommandSender
|
class InputTextDialog : public Dialog, public CommandSender
|
||||||
{
|
{
|
||||||
|
@ -45,6 +46,8 @@ class InputTextDialog : public Dialog, public CommandSender
|
||||||
const string& getResult(int idx = 0);
|
const string& getResult(int idx = 0);
|
||||||
|
|
||||||
void setText(const string& str, int idx = 0);
|
void setText(const string& str, int idx = 0);
|
||||||
|
void setTextFilter(EditableWidget::TextFilter& f, int idx = 0);
|
||||||
|
|
||||||
void setEmitSignal(int cmd) { myCmd = cmd; }
|
void setEmitSignal(int cmd) { myCmd = cmd; }
|
||||||
void setTitle(const string& title);
|
void setTitle(const string& title);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue