mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2025-08-13 21:29:46 +00:00
Send ASCII chars from USB serial to selected widget (#1708)
* Initial commit for keyboard emulation * Added on_keyboard to some widgets * TextEdit partly * Multi key send at once * Frequency control support * Fix encoder emulation * Add keyboard to geomap * More widgets
This commit is contained in:
@@ -371,6 +371,7 @@ enum class KeyEvent : uint8_t {
|
||||
};
|
||||
|
||||
using EncoderEvent = int32_t;
|
||||
using KeyboardEvent = uint8_t;
|
||||
|
||||
struct TouchEvent {
|
||||
enum class Type : uint32_t {
|
||||
|
@@ -172,6 +172,10 @@ bool Widget::on_touch(const TouchEvent event) {
|
||||
(void)event;
|
||||
return false;
|
||||
}
|
||||
bool Widget::on_keyboard(const KeyboardEvent event) {
|
||||
(void)event;
|
||||
return false;
|
||||
}
|
||||
|
||||
const std::vector<Widget*>& Widget::children() const {
|
||||
return no_children;
|
||||
@@ -853,6 +857,11 @@ bool Checkbox::on_key(const KeyEvent key) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Checkbox::on_keyboard(const KeyboardEvent event) {
|
||||
if (event == 10 || event == 32) return set_value(not value_);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Checkbox::on_touch(const TouchEvent event) {
|
||||
switch (event.type) {
|
||||
case TouchEvent::Type::Start:
|
||||
@@ -944,6 +953,16 @@ bool Button::on_key(const KeyEvent key) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Button::on_keyboard(const KeyboardEvent event) {
|
||||
if (event == 10 || event == 32) {
|
||||
if (on_select) {
|
||||
on_select(*this);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Button::on_touch(const TouchEvent event) {
|
||||
switch (event.type) {
|
||||
case TouchEvent::Type::Start:
|
||||
@@ -1080,6 +1099,16 @@ bool ButtonWithEncoder::on_key(const KeyEvent key) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ButtonWithEncoder::on_keyboard(const KeyboardEvent key) {
|
||||
if (key == 32 || key == 10) {
|
||||
if (on_select) {
|
||||
on_select(*this);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ButtonWithEncoder::on_touch(const TouchEvent event) {
|
||||
switch (event.type) {
|
||||
case TouchEvent::Type::Start:
|
||||
@@ -1274,6 +1303,16 @@ bool NewButton::on_key(const KeyEvent key) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool NewButton::on_keyboard(const KeyboardEvent key) {
|
||||
if (key == 32 || key == 10) {
|
||||
if (on_select) {
|
||||
on_select();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool NewButton::on_touch(const TouchEvent event) {
|
||||
switch (event.type) {
|
||||
case TouchEvent::Type::Start:
|
||||
@@ -1371,6 +1410,16 @@ bool ImageButton::on_key(const KeyEvent key) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ImageButton::on_keyboard(const KeyboardEvent key) {
|
||||
if (key == 32 || key == 10) {
|
||||
if (on_select) {
|
||||
on_select(*this);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ImageButton::on_touch(const TouchEvent event) {
|
||||
switch (event.type) {
|
||||
case TouchEvent::Type::Start:
|
||||
@@ -1537,6 +1586,12 @@ bool ImageOptionsField::on_encoder(const EncoderEvent delta) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ImageOptionsField::on_keyboard(const KeyboardEvent key) {
|
||||
if (key == '+' || key == ' ' || key == 10) return on_encoder(1);
|
||||
if (key == '-' || key == 8) return on_encoder(-1);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ImageOptionsField::on_touch(const TouchEvent event) {
|
||||
if (event.type == TouchEvent::Type::Start) {
|
||||
focus();
|
||||
@@ -1653,6 +1708,11 @@ bool OptionsField::on_encoder(const EncoderEvent delta) {
|
||||
set_selected_index(new_value);
|
||||
return true;
|
||||
}
|
||||
bool OptionsField::on_keyboard(const KeyboardEvent key) {
|
||||
if (key == '+' || key == ' ' || key == 10) return on_encoder(1);
|
||||
if (key == '-' || key == 8) return on_encoder(-1);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool OptionsField::on_touch(const TouchEvent event) {
|
||||
if (event.type == TouchEvent::Type::Start) {
|
||||
@@ -1772,6 +1832,19 @@ bool TextEdit::on_key(const KeyEvent key) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TextEdit::on_keyboard(const KeyboardEvent key) {
|
||||
// if ascii printable
|
||||
if (key >= 0x20 && key <= 0x7e) {
|
||||
char_add(key);
|
||||
return true;
|
||||
}
|
||||
if (key == 8) {
|
||||
char_delete();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TextEdit::on_encoder(const EncoderEvent delta) {
|
||||
int32_t new_pos = cursor_pos_ + delta;
|
||||
|
||||
@@ -1928,6 +2001,22 @@ bool NumberField::on_encoder(const EncoderEvent delta) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool NumberField::on_keyboard(const KeyboardEvent key) {
|
||||
if (key == 10) {
|
||||
if (on_select) {
|
||||
on_select(*this);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (key == '+' || key == ' ') {
|
||||
return on_encoder(1);
|
||||
}
|
||||
if (key == '-' || key == 8) {
|
||||
return on_encoder(-1);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool NumberField::on_touch(const TouchEvent event) {
|
||||
if (event.type == TouchEvent::Type::Start) {
|
||||
focus();
|
||||
|
@@ -101,6 +101,7 @@ class Widget {
|
||||
virtual bool on_key(const KeyEvent event);
|
||||
virtual bool on_encoder(const EncoderEvent event);
|
||||
virtual bool on_touch(const TouchEvent event);
|
||||
virtual bool on_keyboard(const KeyboardEvent event);
|
||||
virtual const std::vector<Widget*>& children() const;
|
||||
|
||||
virtual Context& context() const;
|
||||
@@ -382,6 +383,7 @@ class Checkbox : public Widget {
|
||||
void paint(Painter& painter) override;
|
||||
|
||||
bool on_key(const KeyEvent key) override;
|
||||
bool on_keyboard(const KeyboardEvent key) override;
|
||||
bool on_touch(const TouchEvent event) override;
|
||||
|
||||
private:
|
||||
@@ -418,6 +420,7 @@ class Button : public Widget {
|
||||
void on_focus() override;
|
||||
bool on_key(const KeyEvent key) override;
|
||||
bool on_touch(const TouchEvent event) override;
|
||||
bool on_keyboard(const KeyboardEvent event) override;
|
||||
|
||||
private:
|
||||
std::string text_;
|
||||
@@ -456,6 +459,7 @@ class ButtonWithEncoder : public Widget {
|
||||
bool on_key(const KeyEvent key) override;
|
||||
bool on_touch(const TouchEvent event) override;
|
||||
bool on_encoder(const EncoderEvent delta) override;
|
||||
bool on_keyboard(const KeyboardEvent event) override;
|
||||
|
||||
private:
|
||||
std::string text_;
|
||||
@@ -490,6 +494,7 @@ class NewButton : public Widget {
|
||||
void on_focus() override;
|
||||
bool on_key(const KeyEvent key) override;
|
||||
bool on_touch(const TouchEvent event) override;
|
||||
bool on_keyboard(const KeyboardEvent event) override;
|
||||
|
||||
void paint(Painter& painter) override;
|
||||
|
||||
@@ -544,6 +549,7 @@ class ImageButton : public Image {
|
||||
|
||||
bool on_key(const KeyEvent key) override;
|
||||
bool on_touch(const TouchEvent event) override;
|
||||
bool on_keyboard(const KeyboardEvent event) override;
|
||||
};
|
||||
|
||||
/* A button that toggles between two images when set. */
|
||||
@@ -621,6 +627,7 @@ class ImageOptionsField : public Widget {
|
||||
void on_focus() override;
|
||||
bool on_encoder(const EncoderEvent delta) override;
|
||||
bool on_touch(const TouchEvent event) override;
|
||||
bool on_keyboard(const KeyboardEvent event) override;
|
||||
|
||||
private:
|
||||
options_t options;
|
||||
@@ -658,6 +665,7 @@ class OptionsField : public Widget {
|
||||
void on_focus() override;
|
||||
bool on_encoder(const EncoderEvent delta) override;
|
||||
bool on_touch(const TouchEvent event) override;
|
||||
bool on_keyboard(const KeyboardEvent event) override;
|
||||
|
||||
private:
|
||||
const size_t length_;
|
||||
@@ -702,6 +710,7 @@ class TextEdit : public Widget {
|
||||
bool on_key(const KeyEvent key) override;
|
||||
bool on_encoder(const EncoderEvent delta) override;
|
||||
bool on_touch(const TouchEvent event) override;
|
||||
bool on_keyboard(const KeyboardEvent event) override;
|
||||
|
||||
void on_focus() override;
|
||||
void on_blur() override;
|
||||
@@ -763,6 +772,7 @@ class NumberField : public Widget {
|
||||
bool on_key(const KeyEvent key) override;
|
||||
bool on_encoder(const EncoderEvent delta) override;
|
||||
bool on_touch(const TouchEvent event) override;
|
||||
bool on_keyboard(const KeyboardEvent event) override;
|
||||
|
||||
private:
|
||||
range_t range;
|
||||
|
Reference in New Issue
Block a user