From bca8bd3c14ef5d074b3efd9e1b009fc06b5bd16a Mon Sep 17 00:00:00 2001 From: in1tiate <32779090+in1tiate@users.noreply.github.com> Date: Wed, 28 Feb 2024 17:42:35 -0600 Subject: [PATCH 1/4] showname text outline, partial messagebox outline code --- include/courtroom.h | 7 ++++--- src/courtroom.cpp | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/include/courtroom.h b/include/courtroom.h index 65ef75af7..43cb53a6e 100644 --- a/include/courtroom.h +++ b/include/courtroom.h @@ -7,24 +7,25 @@ #include "aocharbutton.h" #include "aoclocklabel.h" #include "aoemotebutton.h" +#include "aoemotepreview.h" #include "aoevidencebutton.h" #include "aoevidencedisplay.h" #include "aoimage.h" #include "aolayer.h" #include "aomusicplayer.h" -#include "widgets/aooptionsdialog.h" #include "aopacket.h" #include "aosfxplayer.h" #include "aotextarea.h" +#include "aotextboxwidgets.h" #include "chatlogpiece.h" #include "datatypes.h" #include "debug_functions.h" +#include "eventfilters.h" #include "file_functions.h" #include "hardware_functions.h" #include "lobby.h" #include "scrolltext.h" -#include "eventfilters.h" -#include "aoemotepreview.h" +#include "widgets/aooptionsdialog.h" #include #include diff --git a/src/courtroom.cpp b/src/courtroom.cpp index 0e4ac25e8..71ab716bf 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -80,7 +80,7 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow() ui_vp_sticker->setAttribute(Qt::WA_TransparentForMouseEvents); ui_vp_sticker->setObjectName("ui_vp_sticker"); - ui_vp_showname = new QLabel(ui_vp_chatbox); + ui_vp_showname = new AOChatboxLabel(ui_vp_chatbox); ui_vp_showname->setObjectName("ui_vp_showname"); ui_vp_showname->setAlignment(Qt::AlignLeft); ui_vp_chat_arrow = new InterfaceLayer(this, ao_app); @@ -88,7 +88,7 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow() ui_vp_chat_arrow->set_cull_image(false); ui_vp_chat_arrow->setObjectName("ui_vp_chat_arrow"); - ui_vp_message = new QTextEdit(this); + ui_vp_message = new AOChatboxTextEdit(this); ui_vp_message->setFrameStyle(QFrame::NoFrame); ui_vp_message->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui_vp_message->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); From 6e5824921dfd9b623c1d8f6a9b552428b67c7f7d Mon Sep 17 00:00:00 2001 From: in1tiate <32779090+in1tiate@users.noreply.github.com> Date: Wed, 28 Feb 2024 17:43:32 -0600 Subject: [PATCH 2/4] your honor i plead oopsie daisies --- include/aotextboxwidgets.h | 74 +++++++++++++++++++++++++++++++++ src/aotextboxwidgets.cpp | 83 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 include/aotextboxwidgets.h create mode 100644 src/aotextboxwidgets.cpp diff --git a/include/aotextboxwidgets.h b/include/aotextboxwidgets.h new file mode 100644 index 000000000..bac77b3b2 --- /dev/null +++ b/include/aotextboxwidgets.h @@ -0,0 +1,74 @@ +#ifndef AOTEXTBOXWIDGETS_H +#define AOTEXTBOXWIDGETS_H + +#include +#include +#include +#include +#include +#include + +class AOChatboxLabel : public QLabel { + Q_OBJECT + +public: + AOChatboxLabel(QWidget *parent); + void paintEvent(QPaintEvent *event); + + void setOutlineColor(QColor color) { outline_color = color; }; + void setOutlineWidth(int width) { outline_width = width; }; + void setTextColor(QColor color) { text_color = color; }; + void setIsOutlined(bool outlined) { is_outlined = outlined; }; + +protected: +private: + QColor outline_color; + QColor text_color; + int outline_width = 1; + bool is_outlined = false; +}; + +class AOChatboxTextDocument : public QTextDocument { + Q_OBJECT + +public: + AOChatboxTextDocument(QWidget *parent); + void drawContents(QPainter *painter); + + void setCursor(QTextCursor newcursor) { cursor = newcursor; }; + + void setOutlineColor(QColor color) { outline_color = color; }; + void setOutlineWidth(int width) { outline_width = width; }; + void setTextColor(QColor color) { text_color = color; }; + void setIsOutlined(bool outlined) { is_outlined = outlined; }; + +private: + QColor outline_color; + QColor text_color; + int outline_width = 1; + bool is_outlined = false; + QTextCursor cursor; + QWidget *m_parent; +}; + +class AOChatboxTextEdit : public QTextEdit { + Q_OBJECT + +public: + AOChatboxTextEdit(QWidget *parent); + void paintEvent(QPaintEvent *event); + + void setOutlineColor(QColor color) { outline_color = color; }; + void setOutlineWidth(int width) { outline_width = width; }; + void setTextColor(QColor color) { text_color = color; }; + void setIsOutlined(bool outlined) { is_outlined = outlined; }; + +protected: +private: + QColor outline_color; + QColor text_color; + int outline_width = 1; + bool is_outlined = false; +}; + +#endif // AOTEXTBOXWIDGETS_H diff --git a/src/aotextboxwidgets.cpp b/src/aotextboxwidgets.cpp new file mode 100644 index 000000000..ad965bc4a --- /dev/null +++ b/src/aotextboxwidgets.cpp @@ -0,0 +1,83 @@ +#include "aotextboxwidgets.h" + +AOChatboxLabel::AOChatboxLabel(QWidget *parent) : QLabel(parent) {} + +void AOChatboxLabel::paintEvent(QPaintEvent *event) +{ + if (is_outlined) { + QBrush brush; + QPen pen; + QPointF baseline(outline_width, fontMetrics().height()); + + // Set up brush (base text) + brush.setColor(text_color); + brush.setStyle(Qt::SolidPattern); + + // Set up outline + pen.setColor(outline_color); + pen.setWidthF(outline_width); + + QPainterPath path; + path.addText(baseline, font(), text()); + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + // draw outline + painter.setPen(pen); + painter.drawPath(path); + // remove outline pen, then draw text on top + painter.setPen(Qt::NoPen); + painter.setBrush(brush); + painter.drawPath(path); + } + else { + // Use the default renderer + QLabel::paintEvent(event); + } +} + +AOChatboxTextDocument::AOChatboxTextDocument(QWidget *parent) + : QTextDocument(parent) +{ + m_parent = parent; +} + +void AOChatboxTextDocument::drawContents(QPainter *painter) +{ + // placeholder values + outline_color = QColor(255, 255, 255); + text_color = QColor(0, 0, 0); + outline_width = 4; + + QTextDocument::drawContents(painter); + + AOChatboxTextEdit *myParent = dynamic_cast(m_parent); + + QTextCursor myCursor = myParent->textCursor(); + QTextCharFormat myFormat = cursor.charFormat(); + + myFormat.setTextOutline(QPen(outline_color, outline_width)); + myCursor.movePosition(QTextCursor::Start, QTextCursor::KeepAnchor); + myCursor.mergeCharFormat(myFormat); + + QTextDocument::drawContents(painter); + + myFormat.setTextOutline(Qt::NoPen); + myCursor.mergeCharFormat(myFormat); + + QTextDocument::drawContents(painter); +} + +AOChatboxTextEdit::AOChatboxTextEdit(QWidget *parent) : QTextEdit(parent) +{ + AOChatboxTextDocument *newdocument = new AOChatboxTextDocument(this); + setDocument(newdocument); +} + +void AOChatboxTextEdit::paintEvent(QPaintEvent *event) +{ + QPainter *painter; + QTextEdit::paintEvent(event); + + document()->drawContents(painter); +} From 889f6e8a5c360ab8ae47fcba99f961884c151615 Mon Sep 17 00:00:00 2001 From: in1tiate <32779090+in1tiate@users.noreply.github.com> Date: Thu, 29 Feb 2024 03:23:09 -0600 Subject: [PATCH 3/4] Focus down code, add config hookups --- include/aotextboxwidgets.h | 50 +++++--------------------------------- include/courtroom.h | 6 +++-- src/aotextboxwidgets.cpp | 46 ----------------------------------- src/courtroom.cpp | 33 ++++++++++++++++++++++--- 4 files changed, 40 insertions(+), 95 deletions(-) diff --git a/include/aotextboxwidgets.h b/include/aotextboxwidgets.h index bac77b3b2..91dcb0983 100644 --- a/include/aotextboxwidgets.h +++ b/include/aotextboxwidgets.h @@ -1,6 +1,7 @@ #ifndef AOTEXTBOXWIDGETS_H #define AOTEXTBOXWIDGETS_H +#include #include #include #include @@ -18,50 +19,11 @@ class AOChatboxLabel : public QLabel { void setOutlineColor(QColor color) { outline_color = color; }; void setOutlineWidth(int width) { outline_width = width; }; void setTextColor(QColor color) { text_color = color; }; - void setIsOutlined(bool outlined) { is_outlined = outlined; }; - -protected: -private: - QColor outline_color; - QColor text_color; - int outline_width = 1; - bool is_outlined = false; -}; - -class AOChatboxTextDocument : public QTextDocument { - Q_OBJECT - -public: - AOChatboxTextDocument(QWidget *parent); - void drawContents(QPainter *painter); - - void setCursor(QTextCursor newcursor) { cursor = newcursor; }; - - void setOutlineColor(QColor color) { outline_color = color; }; - void setOutlineWidth(int width) { outline_width = width; }; - void setTextColor(QColor color) { text_color = color; }; - void setIsOutlined(bool outlined) { is_outlined = outlined; }; - -private: - QColor outline_color; - QColor text_color; - int outline_width = 1; - bool is_outlined = false; - QTextCursor cursor; - QWidget *m_parent; -}; - -class AOChatboxTextEdit : public QTextEdit { - Q_OBJECT - -public: - AOChatboxTextEdit(QWidget *parent); - void paintEvent(QPaintEvent *event); - - void setOutlineColor(QColor color) { outline_color = color; }; - void setOutlineWidth(int width) { outline_width = width; }; - void setTextColor(QColor color) { text_color = color; }; - void setIsOutlined(bool outlined) { is_outlined = outlined; }; + void setIsOutlined(bool outlined) + { + is_outlined = outlined; + qDebug() << "isOutlined set to" << outlined; + }; protected: private: diff --git a/include/courtroom.h b/include/courtroom.h index 43cb53a6e..0b26247f0 100644 --- a/include/courtroom.h +++ b/include/courtroom.h @@ -146,7 +146,9 @@ class Courtroom : public QMainWindow { // actual operation of setting the font on a widget void set_qfont(QWidget *widget, QString class_name, QFont font, - QColor f_color = Qt::black, bool bold = false); + QColor f_color = Qt::black, bool bold = false, + bool outlined = false, QColor outline_color = QColor(0, 0, 0), + int outline_width = 1); // helper function that calls above function on the relevant widgets void set_fonts(QString p_char = ""); @@ -655,7 +657,7 @@ class Courtroom : public QMainWindow { BackgroundLayer *ui_vp_desk; AOEvidenceDisplay *ui_vp_evidence_display; AOImage *ui_vp_chatbox; - QLabel *ui_vp_showname; + AOChatboxLabel *ui_vp_showname; InterfaceLayer *ui_vp_chat_arrow; QTextEdit *ui_vp_message; SplashLayer *ui_vp_testimony; diff --git a/src/aotextboxwidgets.cpp b/src/aotextboxwidgets.cpp index ad965bc4a..1a16e8fe9 100644 --- a/src/aotextboxwidgets.cpp +++ b/src/aotextboxwidgets.cpp @@ -35,49 +35,3 @@ void AOChatboxLabel::paintEvent(QPaintEvent *event) QLabel::paintEvent(event); } } - -AOChatboxTextDocument::AOChatboxTextDocument(QWidget *parent) - : QTextDocument(parent) -{ - m_parent = parent; -} - -void AOChatboxTextDocument::drawContents(QPainter *painter) -{ - // placeholder values - outline_color = QColor(255, 255, 255); - text_color = QColor(0, 0, 0); - outline_width = 4; - - QTextDocument::drawContents(painter); - - AOChatboxTextEdit *myParent = dynamic_cast(m_parent); - - QTextCursor myCursor = myParent->textCursor(); - QTextCharFormat myFormat = cursor.charFormat(); - - myFormat.setTextOutline(QPen(outline_color, outline_width)); - myCursor.movePosition(QTextCursor::Start, QTextCursor::KeepAnchor); - myCursor.mergeCharFormat(myFormat); - - QTextDocument::drawContents(painter); - - myFormat.setTextOutline(Qt::NoPen); - myCursor.mergeCharFormat(myFormat); - - QTextDocument::drawContents(painter); -} - -AOChatboxTextEdit::AOChatboxTextEdit(QWidget *parent) : QTextEdit(parent) -{ - AOChatboxTextDocument *newdocument = new AOChatboxTextDocument(this); - setDocument(newdocument); -} - -void AOChatboxTextEdit::paintEvent(QPaintEvent *event) -{ - QPainter *painter; - QTextEdit::paintEvent(event); - - document()->drawContents(painter); -} diff --git a/src/courtroom.cpp b/src/courtroom.cpp index 71ab716bf..4da295e24 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -88,7 +88,7 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow() ui_vp_chat_arrow->set_cull_image(false); ui_vp_chat_arrow->setObjectName("ui_vp_chat_arrow"); - ui_vp_message = new AOChatboxTextEdit(this); + ui_vp_message = new QTextEdit(this); ui_vp_message->setFrameStyle(QFrame::NoFrame); ui_vp_message->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui_vp_message->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -1187,8 +1187,28 @@ void Courtroom::set_font(QWidget *widget, QString class_name, design_file, ao_app->get_chat(p_char)) != "1"; // is the font anti-aliased or not? + bool outlined = ao_app->get_design_element(p_identifier + "_outlined", design_file, ao_app->get_chat(p_char)) == "1"; + qDebug() << p_identifier << "outlined?" << outlined; + QColor outline_color; + int outline_width = 1; + if (outlined) { + QString outline_color_result = + ao_app->get_design_element(p_identifier + "_outline_color", design_file, ao_app->get_chat(p_char)); + outline_color = QColor(0,0,0); + if (outline_color_result != "") { + QStringList o_color_list = outline_color_result.split(","); + + if (o_color_list.size() >= 3) { + outline_color.setRed(o_color_list.at(0).toInt()); + outline_color.setGreen(o_color_list.at(1).toInt()); + outline_color.setBlue(o_color_list.at(2).toInt()); + } + } + outline_width = ao_app->get_design_element(p_identifier + "_outline_width", design_file, ao_app->get_chat(p_char)).toInt() * Options::getInstance().themeScalingFactor(); + } + this->set_qfont(widget, class_name, - get_qfont(font_name, f_pointsize, antialias), f_color, bold); + get_qfont(font_name, f_pointsize, antialias), f_color, bold, outlined, outline_color, outline_width); } QFont Courtroom::get_qfont(QString font_name, int f_pointsize, bool antialias) @@ -1207,11 +1227,18 @@ QFont Courtroom::get_qfont(QString font_name, int f_pointsize, bool antialias) } void Courtroom::set_qfont(QWidget *widget, QString class_name, QFont font, - QColor f_color, bool bold) + QColor f_color, bool bold, bool outlined, QColor outline_color, int outline_width) { if (class_name.isEmpty()) class_name = widget->metaObject()->className(); + if (class_name == "AOChatboxLabel") { // Only shownames can be outlined + ui_vp_showname->setIsOutlined(outlined); + ui_vp_showname->setOutlineColor(outline_color); + ui_vp_showname->setTextColor(f_color); + ui_vp_showname->setOutlineWidth(outline_width); + } + font.setBold(bold); widget->setFont(font); From cc13dc1b06b5e1f4c60915bbf2aeac4c27e57c55 Mon Sep 17 00:00:00 2001 From: in1tiate <32779090+in1tiate@users.noreply.github.com> Date: Thu, 29 Feb 2024 03:24:27 -0600 Subject: [PATCH 4/4] remove extraneous qDebug calls --- include/aotextboxwidgets.h | 6 +----- src/courtroom.cpp | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/include/aotextboxwidgets.h b/include/aotextboxwidgets.h index 91dcb0983..39bf4062a 100644 --- a/include/aotextboxwidgets.h +++ b/include/aotextboxwidgets.h @@ -19,11 +19,7 @@ class AOChatboxLabel : public QLabel { void setOutlineColor(QColor color) { outline_color = color; }; void setOutlineWidth(int width) { outline_width = width; }; void setTextColor(QColor color) { text_color = color; }; - void setIsOutlined(bool outlined) - { - is_outlined = outlined; - qDebug() << "isOutlined set to" << outlined; - }; + void setIsOutlined(bool outlined) { is_outlined = outlined; }; protected: private: diff --git a/src/courtroom.cpp b/src/courtroom.cpp index 4da295e24..2e67504e6 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -1188,7 +1188,6 @@ void Courtroom::set_font(QWidget *widget, QString class_name, "1"; // is the font anti-aliased or not? bool outlined = ao_app->get_design_element(p_identifier + "_outlined", design_file, ao_app->get_chat(p_char)) == "1"; - qDebug() << p_identifier << "outlined?" << outlined; QColor outline_color; int outline_width = 1; if (outlined) {