From 7ce4dd6f618b64341c9d9520dfc98ede5a7500a7 Mon Sep 17 00:00:00 2001 From: Rosemary Witchaven <32779090+in1tiate@users.noreply.github.com> Date: Mon, 30 Aug 2021 21:23:11 -0500 Subject: [PATCH] Use event filters instead of subclassing QLineEdit and QPlainTextEdit (#587) * replace aolineedit and aotextedit with event filters * use a button to make evidence editable instead of double click --- include/CMakeLists.txt | 3 +- include/aolineedit.h | 26 ---------------- include/aotextedit.h | 21 ------------- include/courtroom.h | 19 +++++++----- include/eventfilters.h | 36 +++++++++++++++++++++++ src/CMakeLists.txt | 2 -- src/aolayer.cpp | 12 ++++---- src/aolineedit.cpp | 22 -------------- src/aotextedit.cpp | 17 ----------- src/courtroom.cpp | 6 ++-- src/evidence.cpp | 67 +++++++++++++++++++++++++----------------- 11 files changed, 98 insertions(+), 133 deletions(-) delete mode 100644 include/aolineedit.h delete mode 100644 include/aotextedit.h create mode 100644 include/eventfilters.h delete mode 100644 src/aolineedit.cpp delete mode 100644 src/aotextedit.cpp diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index 18cf23b..e74a49b 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -10,13 +10,11 @@ aoevidencebutton.h aoevidencedisplay.h aoimage.h aolayer.h -aolineedit.h aomusicplayer.h aooptionsdialog.h aopacket.h aosfxplayer.h aotextarea.h -aotextedit.h bass.h bassopus.h chatlogpiece.h @@ -28,6 +26,7 @@ discord-rpc.h discord_register.h discord_rich_presence.h discord_rpc.h +eventfilters.h file_functions.h hardware_functions.h lobby.h diff --git a/include/aolineedit.h b/include/aolineedit.h deleted file mode 100644 index 5dce3aa..0000000 --- a/include/aolineedit.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef AOLINEEDIT_H -#define AOLINEEDIT_H - -#include -#include - -class AOLineEdit : public QLineEdit { - Q_OBJECT - -public: - AOLineEdit(QWidget *parent); - - void preserve_selection(bool toggle) { p_selection = toggle; } - -private: - bool p_selection = false; - -protected: - void mouseDoubleClickEvent(QMouseEvent *e); - void focusOutEvent(QFocusEvent *ev); - -signals: - void double_clicked(); -}; - -#endif // AOLINEEDIT_H diff --git a/include/aotextedit.h b/include/aotextedit.h deleted file mode 100644 index 8d876f1..0000000 --- a/include/aotextedit.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef AOTEXTEDIT_H -#define AOTEXTEDIT_H - -#include - -class AOTextEdit : public QPlainTextEdit { - Q_OBJECT -public: - AOTextEdit(QWidget *parent); - -protected: - void mouseDoubleClickEvent(QMouseEvent *e); - -signals: - void double_clicked(); - -private slots: - void on_enter_pressed(); -}; - -#endif // AOTEXTEDIT_H diff --git a/include/courtroom.h b/include/courtroom.h index e814514..09ec486 100644 --- a/include/courtroom.h +++ b/include/courtroom.h @@ -11,13 +11,11 @@ #include "aoevidencedisplay.h" #include "aoimage.h" #include "aolayer.h" -#include "aolineedit.h" #include "aomusicplayer.h" #include "aooptionsdialog.h" #include "aopacket.h" #include "aosfxplayer.h" #include "aotextarea.h" -#include "aotextedit.h" #include "chatlogpiece.h" #include "datatypes.h" #include "debug_functions.h" @@ -25,6 +23,7 @@ #include "hardware_functions.h" #include "lobby.h" #include "scrolltext.h" +#include "eventfilters.h" #include #include @@ -648,7 +647,8 @@ private: QComboBox *ui_pair_order_dropdown; - AOLineEdit *ui_ic_chat_message; + QLineEdit *ui_ic_chat_message; + AOLineEditFilter *ui_ic_chat_message_filter; QLineEdit *ui_ic_chat_name; QLineEdit *ui_ooc_chat_message; @@ -730,7 +730,8 @@ private: AOButton *ui_evidence_button; AOImage *ui_evidence; - AOLineEdit *ui_evidence_name; + QLineEdit *ui_evidence_name; + AOLineEditFilter *ui_evidence_name_filter; QWidget *ui_evidence_buttons; QVector ui_evidence_list; AOButton *ui_evidence_left; @@ -738,7 +739,8 @@ private: AOButton *ui_evidence_present; AOImage *ui_evidence_overlay; AOButton *ui_evidence_delete; - AOLineEdit *ui_evidence_image_name; + QLineEdit *ui_evidence_image_name; + AOLineEditFilter *ui_evidence_image_name_filter; AOButton *ui_evidence_image_button; AOButton *ui_evidence_x; AOButton *ui_evidence_ok; @@ -746,7 +748,9 @@ private: AOButton *ui_evidence_transfer; AOButton *ui_evidence_save; AOButton *ui_evidence_load; - AOTextEdit *ui_evidence_description; + AOButton *ui_evidence_edit; + QPlainTextEdit *ui_evidence_description; + AOImage *ui_char_select_background; @@ -873,6 +877,7 @@ private slots: void on_evidence_image_button_clicked(); void on_evidence_clicked(int p_id); void on_evidence_double_clicked(int p_id); + void on_evidence_edit_clicked(); void on_evidence_hover(int p_id, bool p_state); @@ -928,8 +933,6 @@ private slots: void on_showname_enable_clicked(); - void on_evidence_name_double_clicked(); - void on_evidence_image_name_double_clicked(); void on_evidence_button_clicked(); void on_evidence_delete_clicked(); diff --git a/include/eventfilters.h b/include/eventfilters.h new file mode 100644 index 0000000..7847608 --- /dev/null +++ b/include/eventfilters.h @@ -0,0 +1,36 @@ +#ifndef EVENTFILTERS_H +#define EVENTFILTERS_H + +#include +#include + +class AOLineEditFilter : public QObject +{ + Q_OBJECT +public: + bool preserve_selection = false; + +protected: + bool eventFilter(QObject *obj, QEvent *event) override { + QLineEdit *lineEdit = qobject_cast(obj); + if (event->type() == QEvent::FocusOut && lineEdit != nullptr && preserve_selection) { // lost focus + int start = lineEdit->selectionStart(); + #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + int len = lineEdit->selectionLength(); + #else + int len = lineEdit->selectedText().length(); + #endif + if (start != -1 && len != -1) { + lineEdit->setSelection(start, len);\ + return true; + } + } + return false; + } +signals: + void double_clicked(); +}; + + + +#endif // EVENTFILTERS_H diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b04db8b..32e924a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,13 +10,11 @@ aoevidencebutton.cpp aoevidencedisplay.cpp aoimage.cpp aolayer.cpp -aolineedit.cpp aomusicplayer.cpp aooptionsdialog.cpp aopacket.cpp aosfxplayer.cpp aotextarea.cpp -aotextedit.cpp charselect.cpp chatlogpiece.cpp courtroom.cpp diff --git a/src/aolayer.cpp b/src/aolayer.cpp index 30ff652..201c724 100644 --- a/src/aolayer.cpp +++ b/src/aolayer.cpp @@ -52,7 +52,7 @@ StickerLayer::StickerLayer(QWidget *p_parent, AOApplication *p_ao_app) QString AOLayer::find_image(QStringList p_list) { QString image_path; - for (QString path : p_list) { + for (const QString &path : p_list) { #ifdef DEBUG_MOVIE qDebug() << "checking path " << path; #endif @@ -461,14 +461,14 @@ void CharLayer::play_frame_effect(int p_frame) if (p_frame < max_frames) { foreach (QString effect, movie_effects[p_frame]) { if (effect == "shake") { - shake(); + emit shake(); #ifdef DEBUG_MOVIE qDebug() << "[CharLayer::play_frame_effect] Attempting to play shake on frame" << frame; #endif } if (effect == "flash") { - flash(); + emit flash(); #ifdef DEBUG_MOVIE qDebug() << "[CharLayer::play_frame_effect] Attempting to play flash on frame" << frame; #endif @@ -476,7 +476,7 @@ void CharLayer::play_frame_effect(int p_frame) if (effect.startsWith("sfx^")) { QString sfx = effect.section("^", 1); - play_sfx(sfx); + emit play_sfx(sfx); #ifdef DEBUG_MOVIE qDebug() << "[CharLayer::play_frame_effect] Attempting to play sfx" << sfx << "on frame" << frame; #endif @@ -576,7 +576,7 @@ void AOLayer::preanim_done() { ticker->stop(); preanim_timer->stop(); - done(); + emit done(); } void AOLayer::shfx_timer_done() @@ -586,5 +586,5 @@ void AOLayer::shfx_timer_done() qDebug() << "shfx timer signaled done"; #endif // signal connected to courtroom object, let it figure out what to do - done(); + emit done(); } diff --git a/src/aolineedit.cpp b/src/aolineedit.cpp deleted file mode 100644 index d80fa01..0000000 --- a/src/aolineedit.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "aolineedit.h" - -AOLineEdit::AOLineEdit(QWidget *parent) : QLineEdit(parent) {} - -void AOLineEdit::mouseDoubleClickEvent(QMouseEvent *e) -{ - QLineEdit::mouseDoubleClickEvent(e); - - double_clicked(); -} -void AOLineEdit::focusOutEvent(QFocusEvent *ev) -{ - int start = selectionStart(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - int len = selectionLength(); -#else - int len = selectedText().length(); -#endif - QLineEdit::focusOutEvent(ev); - if (p_selection && start != -1 && len != -1) - this->setSelection(start, len); -} diff --git a/src/aotextedit.cpp b/src/aotextedit.cpp deleted file mode 100644 index 22d9a62..0000000 --- a/src/aotextedit.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "aotextedit.h" - -AOTextEdit::AOTextEdit(QWidget *parent) : QPlainTextEdit(parent) -{ - this->setReadOnly(true); - - // connect(this, SIGNAL(returnPressed()), this, SLOT(on_enter_pressed())); -} - -void AOTextEdit::mouseDoubleClickEvent(QMouseEvent *e) -{ - QPlainTextEdit::mouseDoubleClickEvent(e); - - this->setReadOnly(false); -} - -void AOTextEdit::on_enter_pressed() { this->setReadOnly(true); } diff --git a/src/courtroom.cpp b/src/courtroom.cpp index 25f256a..389dd74 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -164,10 +164,12 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow() ui_ic_chat_name->setText(p_ao_app->get_default_showname()); ui_ic_chat_name->setObjectName("ui_ic_chat_name"); - ui_ic_chat_message = new AOLineEdit(this); + ui_ic_chat_message = new QLineEdit(this); ui_ic_chat_message->setFrame(false); ui_ic_chat_message->setPlaceholderText(tr("Message")); - ui_ic_chat_message->preserve_selection(true); + ui_ic_chat_message_filter = new AOLineEditFilter(); + ui_ic_chat_message_filter->preserve_selection = true; + ui_ic_chat_message->installEventFilter(ui_ic_chat_message_filter); ui_ic_chat_message->setObjectName("ui_ic_chat_message"); ui_vp_sticker = new StickerLayer(ui_viewport, ao_app); diff --git a/src/evidence.cpp b/src/evidence.cpp index 2cc1d75..d34ba4f 100644 --- a/src/evidence.cpp +++ b/src/evidence.cpp @@ -6,7 +6,9 @@ void Courtroom::initialize_evidence() ui_evidence->setObjectName("ui_evidence"); // ui_evidence_name = new QLabel(ui_evidence); - ui_evidence_name = new AOLineEdit(ui_evidence); + ui_evidence_name = new QLineEdit(ui_evidence); + ui_evidence_name_filter = new AOLineEditFilter(); + ui_evidence_name->installEventFilter(ui_evidence_name_filter); ui_evidence_name->setAlignment(Qt::AlignCenter); ui_evidence_name->setFrame(false); ui_evidence_name->setObjectName("ui_evidence_name"); @@ -41,11 +43,14 @@ void Courtroom::initialize_evidence() ui_evidence_delete = new AOButton(ui_evidence_overlay, ao_app); ui_evidence_delete->setToolTip(tr("Destroy this piece of evidence")); ui_evidence_delete->setObjectName("ui_evidence_delete"); - ui_evidence_image_name = new AOLineEdit(ui_evidence_overlay); + ui_evidence_image_name = new QLineEdit(ui_evidence_overlay); + ui_evidence_image_name_filter = new AOLineEditFilter(); + ui_evidence_image_name->installEventFilter(ui_evidence_image_name_filter); ui_evidence_image_name->setObjectName("ui_evidence_image_name"); ui_evidence_image_button = new AOButton(ui_evidence_overlay, ao_app); ui_evidence_image_button->setText(tr("Choose..")); ui_evidence_image_button->setObjectName("ui_evidence_image_button"); + ui_evidence_image_button->setDisabled(true); ui_evidence_x = new AOButton(ui_evidence_overlay, ao_app); ui_evidence_x->setToolTip( tr("Close the evidence display/editing overlay.\n" @@ -56,16 +61,18 @@ void Courtroom::initialize_evidence() "evidence and send them to server.")); ui_evidence_ok->setObjectName("ui_evidence_ok"); - ui_evidence_description = new AOTextEdit(ui_evidence_overlay); + ui_evidence_description = new QPlainTextEdit(ui_evidence_overlay); ui_evidence_description->setFrameStyle(QFrame::NoFrame); ui_evidence_description->setToolTip( - tr("Double-click to edit. Press [X] to update your changes.")); + tr("Click the pencil icon to edit. Press [X] to update your changes.")); ui_evidence_description->setObjectName("ui_evidence_description"); + ui_evidence_edit = new AOButton(ui_evidence_overlay, ao_app); + ui_evidence_edit->setToolTip(tr("Edit this piece of evidence.")); + ui_evidence_edit->setObjectName("ui_evidence_edit"); + connect(ui_evidence_name, SIGNAL(returnPressed()), this, SLOT(on_evidence_name_edited())); - connect(ui_evidence_name, SIGNAL(double_clicked()), this, - SLOT(on_evidence_name_double_clicked())); connect(ui_evidence_left, SIGNAL(clicked()), this, SLOT(on_evidence_left_clicked())); connect(ui_evidence_right, SIGNAL(clicked()), this, @@ -85,8 +92,6 @@ void Courtroom::initialize_evidence() SLOT(on_evidence_delete_clicked())); connect(ui_evidence_image_name, SIGNAL(returnPressed()), this, SLOT(on_evidence_image_name_edited())); - connect(ui_evidence_image_name, SIGNAL(double_clicked()), this, - SLOT(on_evidence_image_name_double_clicked())); connect(ui_evidence_image_button, SIGNAL(clicked()), this, SLOT(on_evidence_image_button_clicked())); connect(ui_evidence_x, SIGNAL(clicked()), this, @@ -100,6 +105,7 @@ void Courtroom::initialize_evidence() SLOT(on_evidence_edited())); connect(ui_evidence_description, SIGNAL(textChanged()), this, SLOT(on_evidence_edited())); + connect(ui_evidence_edit, SIGNAL(clicked()), this, SLOT(on_evidence_edit_clicked())); ui_evidence->hide(); } @@ -156,6 +162,9 @@ void Courtroom::refresh_evidence() set_size_and_pos(ui_evidence_ok, "evidence_ok"); ui_evidence_ok->set_image("evidence_ok"); + set_size_and_pos(ui_evidence_edit, "evidence_edit"); + ui_evidence_edit->set_image("evidence_edit"); + set_size_and_pos(ui_evidence_switch, "evidence_switch"); if (current_evidence_global) { ui_evidence_switch->set_image("evidence_global"); @@ -368,26 +377,10 @@ void Courtroom::set_evidence_page() void Courtroom::on_evidence_name_edited() { - ui_evidence_name->setReadOnly(true); if (current_evidence >= local_evidence_list.size()) return; } -void Courtroom::on_evidence_name_double_clicked() -{ - if (ui_evidence_overlay->isVisible()) { - ui_evidence_name->setReadOnly(false); - } - else { - ui_evidence_name->setReadOnly(true); - } -} - -void Courtroom::on_evidence_image_name_double_clicked() -{ - ui_evidence_image_name->setReadOnly(false); -} - void Courtroom::on_evidence_image_name_edited() { ui_evidence_image_name->setReadOnly(true); @@ -469,14 +462,14 @@ void Courtroom::on_evidence_double_clicked(int p_id) ui_evidence_description->clear(); ui_evidence_description->appendPlainText(f_evi.description); ui_evidence_description->setReadOnly(true); - ui_evidence_description->setToolTip(tr("Double-click to edit...")); + ui_evidence_description->setToolTip(tr("Click the pencil to edit...")); ui_evidence_name->setText(f_evi.name); ui_evidence_name->setReadOnly(true); - ui_evidence_name->setToolTip(tr("Double-click to edit...")); + ui_evidence_name->setToolTip(tr("Click the pencil to edit...")); ui_evidence_image_name->setText(f_evi.image); ui_evidence_image_name->setReadOnly(true); - ui_evidence_image_name->setToolTip(tr("Double-click to edit...")); + ui_evidence_image_name->setToolTip(tr("Click the pencil to edit...")); ui_evidence_overlay->show(); ui_evidence_ok->hide(); @@ -598,6 +591,8 @@ void Courtroom::on_evidence_ok_clicked() ui_evidence_name->setReadOnly(true); ui_evidence_description->setReadOnly(true); ui_evidence_image_name->setReadOnly(true); + ui_evidence_edit->show(); + ui_evidence_image_button->setDisabled(true); if (current_evidence < local_evidence_list.size()) { evi_type f_evi = local_evidence_list.at(current_evidence); if (current_evidence_global) { @@ -680,6 +675,22 @@ void Courtroom::on_evidence_transfer_clicked() msgBox->exec(); } +void Courtroom::on_evidence_edit_clicked() +{ + if (!ui_evidence_overlay->isVisible()) + return; + if (!ui_evidence_edit->isHidden()) { + ui_evidence_name->setReadOnly(false); + ui_evidence_image_name->setReadOnly(false); + ui_evidence_description->setReadOnly(false); + ui_evidence_image_button->setDisabled(false); + ui_evidence_edit->hide(); + } + else { + return; + } +} + void Courtroom::on_evidence_edited() { if (current_evidence >= @@ -704,6 +715,8 @@ void Courtroom::evidence_close() ui_evidence_name->setToolTip(""); ui_evidence_image_name->setReadOnly(true); ui_evidence_image_name->setToolTip(""); + ui_evidence_edit->show(); + ui_evidence_image_button->setDisabled(true); ui_evidence_overlay->hide(); ui_ic_chat_message->setFocus(); }