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
This commit is contained in:
Rosemary Witchaven 2021-08-30 21:23:11 -05:00 committed by GitHub
parent 8b82f5d592
commit 7ce4dd6f61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 98 additions and 133 deletions

View File

@ -10,13 +10,11 @@ aoevidencebutton.h
aoevidencedisplay.h aoevidencedisplay.h
aoimage.h aoimage.h
aolayer.h aolayer.h
aolineedit.h
aomusicplayer.h aomusicplayer.h
aooptionsdialog.h aooptionsdialog.h
aopacket.h aopacket.h
aosfxplayer.h aosfxplayer.h
aotextarea.h aotextarea.h
aotextedit.h
bass.h bass.h
bassopus.h bassopus.h
chatlogpiece.h chatlogpiece.h
@ -28,6 +26,7 @@ discord-rpc.h
discord_register.h discord_register.h
discord_rich_presence.h discord_rich_presence.h
discord_rpc.h discord_rpc.h
eventfilters.h
file_functions.h file_functions.h
hardware_functions.h hardware_functions.h
lobby.h lobby.h

View File

@ -1,26 +0,0 @@
#ifndef AOLINEEDIT_H
#define AOLINEEDIT_H
#include <QLineEdit>
#include <QMouseEvent>
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

View File

@ -1,21 +0,0 @@
#ifndef AOTEXTEDIT_H
#define AOTEXTEDIT_H
#include <QPlainTextEdit>
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

View File

@ -11,13 +11,11 @@
#include "aoevidencedisplay.h" #include "aoevidencedisplay.h"
#include "aoimage.h" #include "aoimage.h"
#include "aolayer.h" #include "aolayer.h"
#include "aolineedit.h"
#include "aomusicplayer.h" #include "aomusicplayer.h"
#include "aooptionsdialog.h" #include "aooptionsdialog.h"
#include "aopacket.h" #include "aopacket.h"
#include "aosfxplayer.h" #include "aosfxplayer.h"
#include "aotextarea.h" #include "aotextarea.h"
#include "aotextedit.h"
#include "chatlogpiece.h" #include "chatlogpiece.h"
#include "datatypes.h" #include "datatypes.h"
#include "debug_functions.h" #include "debug_functions.h"
@ -25,6 +23,7 @@
#include "hardware_functions.h" #include "hardware_functions.h"
#include "lobby.h" #include "lobby.h"
#include "scrolltext.h" #include "scrolltext.h"
#include "eventfilters.h"
#include <QCheckBox> #include <QCheckBox>
#include <QCloseEvent> #include <QCloseEvent>
@ -648,7 +647,8 @@ private:
QComboBox *ui_pair_order_dropdown; 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_ic_chat_name;
QLineEdit *ui_ooc_chat_message; QLineEdit *ui_ooc_chat_message;
@ -730,7 +730,8 @@ private:
AOButton *ui_evidence_button; AOButton *ui_evidence_button;
AOImage *ui_evidence; AOImage *ui_evidence;
AOLineEdit *ui_evidence_name; QLineEdit *ui_evidence_name;
AOLineEditFilter *ui_evidence_name_filter;
QWidget *ui_evidence_buttons; QWidget *ui_evidence_buttons;
QVector<AOEvidenceButton *> ui_evidence_list; QVector<AOEvidenceButton *> ui_evidence_list;
AOButton *ui_evidence_left; AOButton *ui_evidence_left;
@ -738,7 +739,8 @@ private:
AOButton *ui_evidence_present; AOButton *ui_evidence_present;
AOImage *ui_evidence_overlay; AOImage *ui_evidence_overlay;
AOButton *ui_evidence_delete; 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_image_button;
AOButton *ui_evidence_x; AOButton *ui_evidence_x;
AOButton *ui_evidence_ok; AOButton *ui_evidence_ok;
@ -746,7 +748,9 @@ private:
AOButton *ui_evidence_transfer; AOButton *ui_evidence_transfer;
AOButton *ui_evidence_save; AOButton *ui_evidence_save;
AOButton *ui_evidence_load; AOButton *ui_evidence_load;
AOTextEdit *ui_evidence_description; AOButton *ui_evidence_edit;
QPlainTextEdit *ui_evidence_description;
AOImage *ui_char_select_background; AOImage *ui_char_select_background;
@ -873,6 +877,7 @@ private slots:
void on_evidence_image_button_clicked(); void on_evidence_image_button_clicked();
void on_evidence_clicked(int p_id); void on_evidence_clicked(int p_id);
void on_evidence_double_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); void on_evidence_hover(int p_id, bool p_state);
@ -928,8 +933,6 @@ private slots:
void on_showname_enable_clicked(); 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_button_clicked();
void on_evidence_delete_clicked(); void on_evidence_delete_clicked();

36
include/eventfilters.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef EVENTFILTERS_H
#define EVENTFILTERS_H
#include <QEvent>
#include <QLineEdit>
class AOLineEditFilter : public QObject
{
Q_OBJECT
public:
bool preserve_selection = false;
protected:
bool eventFilter(QObject *obj, QEvent *event) override {
QLineEdit *lineEdit = qobject_cast<QLineEdit *>(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

View File

@ -10,13 +10,11 @@ aoevidencebutton.cpp
aoevidencedisplay.cpp aoevidencedisplay.cpp
aoimage.cpp aoimage.cpp
aolayer.cpp aolayer.cpp
aolineedit.cpp
aomusicplayer.cpp aomusicplayer.cpp
aooptionsdialog.cpp aooptionsdialog.cpp
aopacket.cpp aopacket.cpp
aosfxplayer.cpp aosfxplayer.cpp
aotextarea.cpp aotextarea.cpp
aotextedit.cpp
charselect.cpp charselect.cpp
chatlogpiece.cpp chatlogpiece.cpp
courtroom.cpp courtroom.cpp

View File

@ -52,7 +52,7 @@ StickerLayer::StickerLayer(QWidget *p_parent, AOApplication *p_ao_app)
QString AOLayer::find_image(QStringList p_list) QString AOLayer::find_image(QStringList p_list)
{ {
QString image_path; QString image_path;
for (QString path : p_list) { for (const QString &path : p_list) {
#ifdef DEBUG_MOVIE #ifdef DEBUG_MOVIE
qDebug() << "checking path " << path; qDebug() << "checking path " << path;
#endif #endif
@ -461,14 +461,14 @@ void CharLayer::play_frame_effect(int p_frame)
if (p_frame < max_frames) { if (p_frame < max_frames) {
foreach (QString effect, movie_effects[p_frame]) { foreach (QString effect, movie_effects[p_frame]) {
if (effect == "shake") { if (effect == "shake") {
shake(); emit shake();
#ifdef DEBUG_MOVIE #ifdef DEBUG_MOVIE
qDebug() << "[CharLayer::play_frame_effect] Attempting to play shake on frame" << frame; qDebug() << "[CharLayer::play_frame_effect] Attempting to play shake on frame" << frame;
#endif #endif
} }
if (effect == "flash") { if (effect == "flash") {
flash(); emit flash();
#ifdef DEBUG_MOVIE #ifdef DEBUG_MOVIE
qDebug() << "[CharLayer::play_frame_effect] Attempting to play flash on frame" << frame; qDebug() << "[CharLayer::play_frame_effect] Attempting to play flash on frame" << frame;
#endif #endif
@ -476,7 +476,7 @@ void CharLayer::play_frame_effect(int p_frame)
if (effect.startsWith("sfx^")) { if (effect.startsWith("sfx^")) {
QString sfx = effect.section("^", 1); QString sfx = effect.section("^", 1);
play_sfx(sfx); emit play_sfx(sfx);
#ifdef DEBUG_MOVIE #ifdef DEBUG_MOVIE
qDebug() << "[CharLayer::play_frame_effect] Attempting to play sfx" << sfx << "on frame" << frame; qDebug() << "[CharLayer::play_frame_effect] Attempting to play sfx" << sfx << "on frame" << frame;
#endif #endif
@ -576,7 +576,7 @@ void AOLayer::preanim_done()
{ {
ticker->stop(); ticker->stop();
preanim_timer->stop(); preanim_timer->stop();
done(); emit done();
} }
void AOLayer::shfx_timer_done() void AOLayer::shfx_timer_done()
@ -586,5 +586,5 @@ void AOLayer::shfx_timer_done()
qDebug() << "shfx timer signaled done"; qDebug() << "shfx timer signaled done";
#endif #endif
// signal connected to courtroom object, let it figure out what to do // signal connected to courtroom object, let it figure out what to do
done(); emit done();
} }

View File

@ -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);
}

View File

@ -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); }

View File

@ -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->setText(p_ao_app->get_default_showname());
ui_ic_chat_name->setObjectName("ui_ic_chat_name"); 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->setFrame(false);
ui_ic_chat_message->setPlaceholderText(tr("Message")); 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_ic_chat_message->setObjectName("ui_ic_chat_message");
ui_vp_sticker = new StickerLayer(ui_viewport, ao_app); ui_vp_sticker = new StickerLayer(ui_viewport, ao_app);

View File

@ -6,7 +6,9 @@ void Courtroom::initialize_evidence()
ui_evidence->setObjectName("ui_evidence"); ui_evidence->setObjectName("ui_evidence");
// ui_evidence_name = new QLabel(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->setAlignment(Qt::AlignCenter);
ui_evidence_name->setFrame(false); ui_evidence_name->setFrame(false);
ui_evidence_name->setObjectName("ui_evidence_name"); 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 = new AOButton(ui_evidence_overlay, ao_app);
ui_evidence_delete->setToolTip(tr("Destroy this piece of evidence")); ui_evidence_delete->setToolTip(tr("Destroy this piece of evidence"));
ui_evidence_delete->setObjectName("ui_evidence_delete"); 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_name->setObjectName("ui_evidence_image_name");
ui_evidence_image_button = new AOButton(ui_evidence_overlay, ao_app); ui_evidence_image_button = new AOButton(ui_evidence_overlay, ao_app);
ui_evidence_image_button->setText(tr("Choose..")); ui_evidence_image_button->setText(tr("Choose.."));
ui_evidence_image_button->setObjectName("ui_evidence_image_button"); 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 = new AOButton(ui_evidence_overlay, ao_app);
ui_evidence_x->setToolTip( ui_evidence_x->setToolTip(
tr("Close the evidence display/editing overlay.\n" tr("Close the evidence display/editing overlay.\n"
@ -56,16 +61,18 @@ void Courtroom::initialize_evidence()
"evidence and send them to server.")); "evidence and send them to server."));
ui_evidence_ok->setObjectName("ui_evidence_ok"); 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->setFrameStyle(QFrame::NoFrame);
ui_evidence_description->setToolTip( 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_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, connect(ui_evidence_name, SIGNAL(returnPressed()), this,
SLOT(on_evidence_name_edited())); 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, connect(ui_evidence_left, SIGNAL(clicked()), this,
SLOT(on_evidence_left_clicked())); SLOT(on_evidence_left_clicked()));
connect(ui_evidence_right, SIGNAL(clicked()), this, connect(ui_evidence_right, SIGNAL(clicked()), this,
@ -85,8 +92,6 @@ void Courtroom::initialize_evidence()
SLOT(on_evidence_delete_clicked())); SLOT(on_evidence_delete_clicked()));
connect(ui_evidence_image_name, SIGNAL(returnPressed()), this, connect(ui_evidence_image_name, SIGNAL(returnPressed()), this,
SLOT(on_evidence_image_name_edited())); 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, connect(ui_evidence_image_button, SIGNAL(clicked()), this,
SLOT(on_evidence_image_button_clicked())); SLOT(on_evidence_image_button_clicked()));
connect(ui_evidence_x, SIGNAL(clicked()), this, connect(ui_evidence_x, SIGNAL(clicked()), this,
@ -100,6 +105,7 @@ void Courtroom::initialize_evidence()
SLOT(on_evidence_edited())); SLOT(on_evidence_edited()));
connect(ui_evidence_description, SIGNAL(textChanged()), this, connect(ui_evidence_description, SIGNAL(textChanged()), this,
SLOT(on_evidence_edited())); SLOT(on_evidence_edited()));
connect(ui_evidence_edit, SIGNAL(clicked()), this, SLOT(on_evidence_edit_clicked()));
ui_evidence->hide(); ui_evidence->hide();
} }
@ -156,6 +162,9 @@ void Courtroom::refresh_evidence()
set_size_and_pos(ui_evidence_ok, "evidence_ok"); set_size_and_pos(ui_evidence_ok, "evidence_ok");
ui_evidence_ok->set_image("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"); set_size_and_pos(ui_evidence_switch, "evidence_switch");
if (current_evidence_global) { if (current_evidence_global) {
ui_evidence_switch->set_image("evidence_global"); ui_evidence_switch->set_image("evidence_global");
@ -368,26 +377,10 @@ void Courtroom::set_evidence_page()
void Courtroom::on_evidence_name_edited() void Courtroom::on_evidence_name_edited()
{ {
ui_evidence_name->setReadOnly(true);
if (current_evidence >= local_evidence_list.size()) if (current_evidence >= local_evidence_list.size())
return; 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() void Courtroom::on_evidence_image_name_edited()
{ {
ui_evidence_image_name->setReadOnly(true); 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->clear();
ui_evidence_description->appendPlainText(f_evi.description); ui_evidence_description->appendPlainText(f_evi.description);
ui_evidence_description->setReadOnly(true); 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->setText(f_evi.name);
ui_evidence_name->setReadOnly(true); 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->setText(f_evi.image);
ui_evidence_image_name->setReadOnly(true); 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_overlay->show();
ui_evidence_ok->hide(); ui_evidence_ok->hide();
@ -598,6 +591,8 @@ void Courtroom::on_evidence_ok_clicked()
ui_evidence_name->setReadOnly(true); ui_evidence_name->setReadOnly(true);
ui_evidence_description->setReadOnly(true); ui_evidence_description->setReadOnly(true);
ui_evidence_image_name->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()) { if (current_evidence < local_evidence_list.size()) {
evi_type f_evi = local_evidence_list.at(current_evidence); evi_type f_evi = local_evidence_list.at(current_evidence);
if (current_evidence_global) { if (current_evidence_global) {
@ -680,6 +675,22 @@ void Courtroom::on_evidence_transfer_clicked()
msgBox->exec(); 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() void Courtroom::on_evidence_edited()
{ {
if (current_evidence >= if (current_evidence >=
@ -704,6 +715,8 @@ void Courtroom::evidence_close()
ui_evidence_name->setToolTip(""); ui_evidence_name->setToolTip("");
ui_evidence_image_name->setReadOnly(true); ui_evidence_image_name->setReadOnly(true);
ui_evidence_image_name->setToolTip(""); ui_evidence_image_name->setToolTip("");
ui_evidence_edit->show();
ui_evidence_image_button->setDisabled(true);
ui_evidence_overlay->hide(); ui_evidence_overlay->hide();
ui_ic_chat_message->setFocus(); ui_ic_chat_message->setFocus();
} }