diff options
Diffstat (limited to 'src/aotextboxwidgets.cpp')
| -rw-r--r-- | src/aotextboxwidgets.cpp | 124 |
1 files changed, 98 insertions, 26 deletions
diff --git a/src/aotextboxwidgets.cpp b/src/aotextboxwidgets.cpp index a6999beb..c39b26f3 100644 --- a/src/aotextboxwidgets.cpp +++ b/src/aotextboxwidgets.cpp @@ -1,57 +1,129 @@ #include "aotextboxwidgets.h" +// Sane outlined QLabel solution ported from PyQt solution on StackOverflow by alec +// https://stackoverflow.com/questions/64290561/qlabel-correct-positioning-for-text-outline + AOChatboxLabel::AOChatboxLabel(QWidget *parent) : QLabel(parent) -{} +{ + setBrush(QBrush(Qt::white)); + setPen(QPen(Qt::black)); +} -void AOChatboxLabel::setOutlineColor(QColor color) +void AOChatboxLabel::setIsOutlined(bool outlined) { - m_outline_color = color; + m_outline = outlined; } -void AOChatboxLabel::setOutlineWidth(int width) +bool AOChatboxLabel::pointMode() { - m_outline_width = width; + return m_pointmode; } -void AOChatboxLabel::setIsOutlined(bool outlined) +void AOChatboxLabel::setPointMode(bool mode) { - m_outline = outlined; + m_pointmode = mode; +} + +double AOChatboxLabel::outlineThickness() +{ + if (pointMode()) + { + return m_outline_width * font().pointSize(); + } + else + return m_outline_width; +} + +void AOChatboxLabel::setOutlineThickness(double w) +{ + m_outline_width = w; +} + +void AOChatboxLabel::setBrush(QBrush brush) +{ + m_brush = brush; +} +void AOChatboxLabel::setPen(QPen pen) +{ + m_pen = pen; } -void AOChatboxLabel::setTextColor(QColor color) +QSize AOChatboxLabel::sizeHint() { - m_text_color = color; + int nrml_w = std::ceil(outlineThickness() * 2); + return QLabel::sizeHint() + QSize(nrml_w, nrml_w); +} +QSize AOChatboxLabel::minimumSizeHint() +{ + int nrml_w = std::ceil(outlineThickness() * 2); + return QLabel::minimumSizeHint() + QSize(nrml_w, nrml_w); } void AOChatboxLabel::paintEvent(QPaintEvent *event) { if (m_outline) { - QBrush brush; - QPen pen; - QPointF baseline(m_outline_width, fontMetrics().height()); + double w = outlineThickness(); + QRectF rect = this->rect(); + QFontMetrics metrics = QFontMetrics(this->font()); + QRect tr = metrics.boundingRect(text()).adjusted(0, 0, w, w); + int l_indent; + int x; + int y; + + if (indent() == -1) + { + if (frameWidth()) + { + l_indent = (metrics.boundingRect("x").width() + w * 2) / 2; + } + else + { + l_indent = w; + } + } + else + { + l_indent = indent(); + } - // Set up brush (base text) - brush.setColor(m_text_color); - brush.setStyle(Qt::SolidPattern); + if (alignment() & Qt::AlignLeft) + { + x = rect.left() + l_indent - std::min(metrics.leftBearing(text()[0]), 0); + } + else if (alignment() & Qt::AlignRight) + { + x = rect.x() + rect.width() - l_indent - tr.width(); + } + else + { + x = (rect.width() - tr.width()) / 2; + } - // Set up outline - pen.setColor(m_outline_color); - pen.setWidthF(m_outline_width); + if (alignment() & Qt::AlignTop) + { + y = rect.top() + l_indent + metrics.ascent(); + } + else if (alignment() & Qt::AlignBottom) + { + y = rect.y() + rect.height() - l_indent - metrics.descent(); + } + else + { + y = (rect.height() + metrics.ascent() - metrics.descent()) / 2; + } + m_pen.setWidth(w * 2); QPainterPath path; - path.addText(baseline, font(), text()); + path.addText(x, y, 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); + painter.strokePath(path, m_pen); + if (1 < m_brush.style() && m_brush.style() < 15) + painter.fillPath(path, palette().window()); + painter.fillPath(path, m_brush); } else { |
