From 0b777c4558dfc4fa01004f4423c6462a453dc010 Mon Sep 17 00:00:00 2001 From: borgmanJeremy <46930769+borgmanJeremy@users.noreply.github.com> Date: Wed, 6 Oct 2021 13:23:54 -0500 Subject: [PATCH] Added text alignment (#1892) --- data/graphics.qrc | 146 ++++++++++++------------ data/img/material/black/centeralign.svg | 29 +++++ data/img/material/black/leftalign.svg | 29 +++++ data/img/material/black/rightalign.svg | 29 +++++ data/img/material/white/centeralign.svg | 29 +++++ data/img/material/white/leftalign.svg | 29 +++++ data/img/material/white/rightalign.svg | 29 +++++ src/tools/text/textconfig.cpp | 58 ++++++++++ src/tools/text/textconfig.h | 7 +- src/tools/text/texttool.cpp | 28 ++++- src/tools/text/texttool.h | 4 +- src/tools/text/textwidget.cpp | 13 +-- src/tools/text/textwidget.h | 3 +- 13 files changed, 348 insertions(+), 85 deletions(-) create mode 100644 data/img/material/black/centeralign.svg create mode 100644 data/img/material/black/leftalign.svg create mode 100644 data/img/material/black/rightalign.svg create mode 100644 data/img/material/white/centeralign.svg create mode 100644 data/img/material/white/leftalign.svg create mode 100644 data/img/material/white/rightalign.svg diff --git a/data/graphics.qrc b/data/graphics.qrc index 10d7007c..4cc272b4 100644 --- a/data/graphics.qrc +++ b/data/graphics.qrc @@ -5,80 +5,86 @@ img/app/org.flameshot.Flameshot.png img/app/flameshot.png img/app/keyboard.svg - img/material/black/delete.svg - img/material/black/undo-variant.svg - img/material/black/text.svg - img/material/black/square.svg - img/material/black/square-outline.svg - img/material/black/size_indicator.svg - img/material/black/redo-variant.svg - img/material/black/pin.svg - img/material/black/pencil.svg - img/material/black/open_with.svg - img/material/black/name_edition.svg - img/material/black/mouse.svg - img/material/black/mouse-off.svg - img/material/black/marker.svg - img/material/black/line.svg - img/material/black/graphics.svg - img/material/black/format-text.svg - img/material/black/format_underlined.svg - img/material/black/format_strikethrough.svg - img/material/black/format_italic.svg - img/material/black/format_bold.svg - img/material/black/exit-to-app.svg - img/material/black/cursor-move.svg - img/material/black/content-save.svg - img/material/black/content-copy.svg - img/material/black/config.svg - img/material/black/colorize.svg - img/material/black/cloud-upload.svg - img/material/black/close.svg - img/material/black/circle-outline.svg - img/material/black/pixelate.svg img/material/black/arrow-bottom-left.svg - img/material/white/undo-variant.svg - img/material/white/text.svg - img/material/white/square.svg - img/material/white/square-outline.svg - img/material/white/size_indicator.svg - img/material/white/redo-variant.svg - img/material/white/pin.svg - img/material/white/pencil.svg - img/material/white/open_with.svg - img/material/white/name_edition.svg - img/material/white/mouse.svg - img/material/white/mouse-off.svg - img/material/white/marker.svg - img/material/white/line.svg - img/material/white/graphics.svg - img/material/white/format-text.svg - img/material/white/format_underlined.svg - img/material/white/format_strikethrough.svg - img/material/white/format_italic.svg - img/material/white/format_bold.svg - img/material/white/exit-to-app.svg - img/material/white/cursor-move.svg - img/material/white/content-save.svg - img/material/white/content-copy.svg - img/material/white/config.svg - img/material/white/colorize.svg - img/material/white/cloud-upload.svg - img/material/white/close.svg - img/material/white/circle-outline.svg - img/material/white/pixelate.svg - img/material/white/arrow-bottom-left.svg + img/material/black/centeralign.svg + img/material/black/circle-outline.svg + img/material/black/close.svg + img/material/black/cloud-upload.svg + img/material/black/colorize.svg + img/material/black/config.svg + img/material/black/content-copy.svg + img/material/black/content-save.svg + img/material/black/cursor-move.svg + img/material/black/delete.svg + img/material/black/exit-to-app.svg + img/material/black/format-text.svg + img/material/black/format_bold.svg + img/material/black/format_italic.svg + img/material/black/format_strikethrough.svg + img/material/black/format_underlined.svg + img/material/black/graphics.svg + img/material/black/leftalign.svg + img/material/black/line.svg + img/material/black/marker.svg + img/material/black/mouse-off.svg + img/material/black/mouse.svg + img/material/black/name_edition.svg + img/material/black/open_with.svg + img/material/black/pencil.svg + img/material/black/pin.svg + img/material/black/pixelate.svg + img/material/black/redo-variant.svg + img/material/black/rightalign.svg + img/material/black/size_indicator.svg + img/material/black/square-outline.svg + img/material/black/square.svg + img/material/black/text.svg + img/material/black/undo-variant.svg img/material/black/circlecount-outline.svg - img/material/white/circlecount-outline.svg - img/material/black/shortcut.svg - img/material/white/shortcut.svg img/material/black/filepath.svg - img/material/white/filepath.svg - img/material/black/plus.svg - img/material/white/plus.svg - img/material/black/minus.svg - img/material/white/minus.svg img/material/black/invert.svg + img/material/black/minus.svg + img/material/black/plus.svg + img/material/black/shortcut.svg + img/material/white/arrow-bottom-left.svg + img/material/white/centeralign.svg + img/material/white/circle-outline.svg + img/material/white/circlecount-outline.svg + img/material/white/close.svg + img/material/white/cloud-upload.svg + img/material/white/colorize.svg + img/material/white/config.svg + img/material/white/content-copy.svg + img/material/white/content-save.svg + img/material/white/cursor-move.svg + img/material/white/exit-to-app.svg + img/material/white/filepath.svg + img/material/white/format-text.svg + img/material/white/format_bold.svg + img/material/white/format_italic.svg + img/material/white/format_strikethrough.svg + img/material/white/format_underlined.svg + img/material/white/graphics.svg img/material/white/invert.svg + img/material/white/leftalign.svg + img/material/white/line.svg + img/material/white/marker.svg + img/material/white/minus.svg + img/material/white/mouse-off.svg + img/material/white/mouse.svg + img/material/white/name_edition.svg + img/material/white/open_with.svg + img/material/white/pencil.svg + img/material/white/pin.svg + img/material/white/pixelate.svg + img/material/white/plus.svg + img/material/white/redo-variant.svg + img/material/white/rightalign.svg + img/material/white/shortcut.svg + img/material/white/size_indicator.svg + img/material/white/square-outline.svg + img/material/white/square.svg + img/material/white/text.svg + img/material/white/undo-variant.svg diff --git a/data/img/material/black/centeralign.svg b/data/img/material/black/centeralign.svg new file mode 100644 index 00000000..c7c798e0 --- /dev/null +++ b/data/img/material/black/centeralign.svg @@ -0,0 +1,29 @@ + + + + + + + diff --git a/data/img/material/black/leftalign.svg b/data/img/material/black/leftalign.svg new file mode 100644 index 00000000..4dc2d506 --- /dev/null +++ b/data/img/material/black/leftalign.svg @@ -0,0 +1,29 @@ + + + + + + + diff --git a/data/img/material/black/rightalign.svg b/data/img/material/black/rightalign.svg new file mode 100644 index 00000000..89eb93a4 --- /dev/null +++ b/data/img/material/black/rightalign.svg @@ -0,0 +1,29 @@ + + + + + + + diff --git a/data/img/material/white/centeralign.svg b/data/img/material/white/centeralign.svg new file mode 100644 index 00000000..2ae020e0 --- /dev/null +++ b/data/img/material/white/centeralign.svg @@ -0,0 +1,29 @@ + + + + + + + diff --git a/data/img/material/white/leftalign.svg b/data/img/material/white/leftalign.svg new file mode 100644 index 00000000..10724500 --- /dev/null +++ b/data/img/material/white/leftalign.svg @@ -0,0 +1,29 @@ + + + + + + + diff --git a/data/img/material/white/rightalign.svg b/data/img/material/white/rightalign.svg new file mode 100644 index 00000000..df2a3e79 --- /dev/null +++ b/data/img/material/white/rightalign.svg @@ -0,0 +1,29 @@ + + + + + + + diff --git a/src/tools/text/textconfig.cpp b/src/tools/text/textconfig.cpp index fc7e4525..dfbd0990 100644 --- a/src/tools/text/textconfig.cpp +++ b/src/tools/text/textconfig.cpp @@ -18,6 +18,9 @@ TextConfig::TextConfig(QWidget* parent) , m_underlineButton(nullptr) , m_weightButton(nullptr) , m_italicButton(nullptr) + , m_leftAlignButton(nullptr) + , m_centerAlignButton(nullptr) + , m_rightAlignButton(nullptr) { m_layout = new QVBoxLayout(this); @@ -71,12 +74,42 @@ TextConfig::TextConfig(QWidget* parent) m_italicButton->setToolTip(tr("Italic")); QHBoxLayout* modifiersLayout = new QHBoxLayout(); + m_leftAlignButton = + new QPushButton(QIcon(iconPrefix + "leftalign.svg"), QLatin1String("")); + m_leftAlignButton->setCheckable(true); + connect(m_leftAlignButton, &QPushButton::clicked, this, [this] { + alignmentChanged(Qt::AlignLeft); + }); + m_leftAlignButton->setToolTip(tr("Left Align")); + + m_centerAlignButton = + new QPushButton(QIcon(iconPrefix + "centeralign.svg"), QLatin1String("")); + m_centerAlignButton->setCheckable(true); + connect(m_centerAlignButton, &QPushButton::clicked, this, [this] { + alignmentChanged(Qt::AlignCenter); + }); + m_centerAlignButton->setToolTip(tr("Center Align")); + + m_rightAlignButton = + new QPushButton(QIcon(iconPrefix + "rightalign.svg"), QLatin1String("")); + m_rightAlignButton->setCheckable(true); + connect(m_rightAlignButton, &QPushButton::clicked, this, [this] { + alignmentChanged(Qt::AlignRight); + }); + m_rightAlignButton->setToolTip(tr("Right Align")); + + QHBoxLayout* alignmentLayout = new QHBoxLayout(); + alignmentLayout->addWidget(m_leftAlignButton); + alignmentLayout->addWidget(m_centerAlignButton); + alignmentLayout->addWidget(m_rightAlignButton); + m_layout->addWidget(m_fontsCB); modifiersLayout->addWidget(m_strikeOutButton); modifiersLayout->addWidget(m_underlineButton); modifiersLayout->addWidget(m_weightButton); modifiersLayout->addWidget(m_italicButton); m_layout->addLayout(modifiersLayout); + m_layout->addLayout(alignmentLayout); } void TextConfig::setFontFamily(const QString& fontFamily) @@ -113,3 +146,28 @@ void TextConfig::weightButtonPressed(const bool w) emit fontWeightChanged(QFont::Normal); } } + +void TextConfig::setTextAlignment(Qt::AlignmentFlag alignment) +{ + + switch (alignment) { + case (Qt::AlignLeft): + m_leftAlignButton->setChecked(true); + m_centerAlignButton->setChecked(false); + m_rightAlignButton->setChecked(false); + break; + + case (Qt::AlignCenter): + m_leftAlignButton->setChecked(false); + m_centerAlignButton->setChecked(true); + m_rightAlignButton->setChecked(false); + break; + + case (Qt::AlignRight): + m_leftAlignButton->setChecked(false); + m_centerAlignButton->setChecked(false); + m_rightAlignButton->setChecked(true); + break; + } + emit alignmentChanged(alignment); +} diff --git a/src/tools/text/textconfig.h b/src/tools/text/textconfig.h index 841e573e..f66a385d 100644 --- a/src/tools/text/textconfig.h +++ b/src/tools/text/textconfig.h @@ -20,6 +20,7 @@ public: void setStrikeOut(const bool s); void setWeight(const int w); void setItalic(const bool i); + void setTextAlignment(Qt::AlignmentFlag alignment); signals: void fontFamilyChanged(const QString& f); @@ -27,7 +28,7 @@ signals: void fontStrikeOutChanged(const bool dashed); void fontWeightChanged(const QFont::Weight w); void fontItalicChanged(const bool italic); - + void alignmentChanged(Qt::AlignmentFlag alignment); public slots: private slots: @@ -40,4 +41,8 @@ private: QPushButton* m_underlineButton; QPushButton* m_weightButton; QPushButton* m_italicButton; + + QPushButton* m_leftAlignButton; + QPushButton* m_centerAlignButton; + QPushButton* m_rightAlignButton; }; diff --git a/src/tools/text/texttool.cpp b/src/tools/text/texttool.cpp index f87d5d74..ca45bacb 100644 --- a/src/tools/text/texttool.cpp +++ b/src/tools/text/texttool.cpp @@ -17,6 +17,7 @@ TextTool::TextTool(QObject* parent) if (!fontFamily.isEmpty()) { m_font.setFamily(ConfigHandler().fontFamily()); } + m_alignment = Qt::AlignRight; } TextTool::~TextTool() @@ -28,6 +29,7 @@ void TextTool::copyParams(const TextTool* from, TextTool* to) { CaptureTool::copyParams(from, to); to->m_font = from->m_font; + to->m_alignment = from->m_alignment; to->m_text = from->m_text; to->m_size = from->m_size; to->m_color = from->m_color; @@ -97,6 +99,7 @@ QWidget* TextTool::widget() m_widget->setTextColor(m_color); m_font.setPointSize(m_size + BASE_POINT_SIZE); m_widget->setFont(m_font); + m_widget->setAlignment(m_alignment); m_widget->setText(m_text); m_widget->selectAll(); connect(m_widget, &TextWidget::textUpdated, this, &TextTool::updateText); @@ -138,11 +141,16 @@ QWidget* TextTool::configurationWidget() &TextConfig::fontWeightChanged, this, &TextTool::updateFontWeight); + + connect( + m_confW, &TextConfig::alignmentChanged, this, &TextTool::updateAlignment); + m_confW->setFontFamily(m_font.family()); m_confW->setItalic(m_font.italic()); m_confW->setUnderline(m_font.underline()); m_confW->setStrikeOut(m_font.strikeOut()); m_confW->setWeight(m_font.weight()); + m_confW->setTextAlignment(m_alignment); return m_confW; } @@ -168,6 +176,11 @@ CaptureTool* TextTool::copy(QObject* parent) &TextConfig::fontWeightChanged, tt, &TextTool::updateFontWeight); + + connect(m_confW, + &TextConfig::alignmentChanged, + tt, + &TextTool::updateAlignment); } copyParams(this, tt); return tt; @@ -191,10 +204,15 @@ void TextTool::process(QPainter& painter, const QPixmap& pixmap) painter.setFont(m_font); painter.setPen(m_color); if (!editMode()) { - painter.drawText(m_textArea + QMargins(-val, -val, val, val), m_text); + painter.drawText( + m_textArea + QMargins(-val, -val, val, val), m_alignment, m_text); } painter.setFont(orig_font); painter.setPen(orig_pen); + + if (m_widget) { + m_widget->setAlignment(m_alignment); + } } void TextTool::drawObjectSelection(QPainter& painter) @@ -304,6 +322,14 @@ void TextTool::move(const QPoint& pos) m_textArea.moveTo(pos); } +void TextTool::updateAlignment(Qt::AlignmentFlag alignment) +{ + m_alignment = alignment; + if (m_widget) { + m_widget->setAlignment(m_alignment); + } +} + const QPoint* TextTool::pos() { m_currentPos = m_textArea.topLeft(); diff --git a/src/tools/text/texttool.h b/src/tools/text/texttool.h index b547d71b..272191ec 100644 --- a/src/tools/text/texttool.h +++ b/src/tools/text/texttool.h @@ -4,9 +4,9 @@ #pragma once #include "src/tools/capturetool.h" +#include "textconfig.h" #include #include - class TextWidget; class TextConfig; @@ -61,11 +61,13 @@ private slots: void updateFontStrikeOut(const bool s); void updateFontWeight(const QFont::Weight w); void updateFontItalic(const bool italic); + void updateAlignment(Qt::AlignmentFlag alignment); private: void closeEditor(); QFont m_font; + Qt::AlignmentFlag m_alignment; QString m_text; QString m_textOld; int m_size; diff --git a/src/tools/text/textwidget.cpp b/src/tools/text/textwidget.cpp index bec6d0f5..bbc6a115 100644 --- a/src/tools/text/textwidget.cpp +++ b/src/tools/text/textwidget.cpp @@ -39,18 +39,11 @@ void TextWidget::setFont(const QFont& f) adjustSize(); } -void TextWidget::updateFont(const QFont& f) +void TextWidget::setAlignment(Qt::AlignmentFlag alignment) { - setFont(f); + QTextEdit::setAlignment(alignment); + adjustSize(); } - -void TextWidget::setFontPointSize(qreal s) -{ - QFont f = font(); - f.setPointSize(s); - setFont(f); -} - void TextWidget::setTextColor(const QColor& c) { QString s( diff --git a/src/tools/text/textwidget.h b/src/tools/text/textwidget.h index c4b31f5a..c6d4323a 100644 --- a/src/tools/text/textwidget.h +++ b/src/tools/text/textwidget.h @@ -22,9 +22,8 @@ signals: void textUpdated(const QString& s); public slots: - void updateFont(const QFont& f); void setTextColor(const QColor& c); - void setFontPointSize(qreal s); + void setAlignment(Qt::AlignmentFlag alignment); private slots: void emitTextUpdated();