Namecheap - Basic objects editing (move, remove, change color, change thickness) (#1539)

* Code refactoring - rename deleteToolwidgetOrClose to deleteToolWidgetOrClose

(cherry picked from commit cc9d71c660fd335e484b8c2c5a4c9ac939a5b643)

* Code refactoring - move part of code from CaptureWidget::paintEvent function into showInitialMessage

(cherry picked from commit 377b716dc4cdc460e385e9a953850c377283db73)

* Code refactoring - move part of code from CaptureWidget::paintEvent function into showInitialMessage

(cherry picked from commit 377b716dc4cdc460e385e9a953850c377283db73)

* Code refactoring - move part of code from CaptureWidget::paintEvent function into drawInactiveRegion, rename showInitialMessage -> drawInitialMessage

(cherry picked from commit 39bf83588db52b9e5b40fddb2b7a9939a64bd19b)

* Re-implement undo/redo feature with a future ability to work with it as with history with access by index (remove/edit not just for a last item)

(cherry picked from commit d6c6cf51c38b8dd8f51f443f3dcb162e96796a66)

* fix - No bubble border for CircleCountTool

(cherry picked from commit 6ef81efd91d9d8d169c1dafd2801fffd2a722ee8)

* fix - Restore Pen and Brush after the rectangle tool (effects Circle tool without it)

(cherry picked from commit 5239925fa5cf69b6755004f3ab8443d091d731c1)

* Tool objects history (undo) list on Utility Panel - added icon to the items

(cherry picked from commit 4181990f2677a9c8b62c844546f4ac708ecac076)

* Update Ukrainian and Russian translations

(cherry picked from commit eae2fe0f5826eda4d44d1616bbd12ff53a9254dd)

* Feature - remove any created object on CaptureWidget

(cherry picked from commit ed2073fa7c2d4e9067668d5a262a067d3ccf9c9a)

* Search tool object on CaptureWidget on mouse click and select it in UtilityPanel

(cherry picked from commit 5a997dd5608d0bf72af1b50bcfa1779336b842ac)

* Optimize tool object search on CaptureWidget

(cherry picked from commit 7cd4872cb4adb29e847c5e3adfdb3a24a240982b)

* Move selection with Ctrl modificator key only, set correct mouse cursor for dragging and selecting tool objects

(cherry picked from commit bf8e47ccbef33bc765820fe64c12168587117ea6)

* Move tool objects based on AbstractTwoPointTool class

(cherry picked from commit 3f041b76d2da9326f099b7109984b75a4ce0df28)

* Move Text tool objects on CaptureWidget

(cherry picked from commit b71b6db9e1a4c64e19a045096bd7df0d5a3f4b8f)

* Move Pencil tool objects on CaptureWidget

(cherry picked from commit 3a269a57bb38bdfea0596f2a8310de6bd5bdb119)

* Code refactoring - clean up unused and some refactoring

(cherry picked from commit af667f1e25c7c363a42952b20580620c0e6d7925)

* Remove - duplicate 'at' class member with int and uint types

(cherry picked from commit 4b5b2f7a75ce568bd23d170b8d8731f630d1bf48)

* Search for an active object BLUR/PIXELATE and activate it on mouse click

(cherry picked from commit 04cbbdd352e41e23edb4ae596173a6d3971ecdb5)

* Increase search radius for text objects

(cherry picked from commit 4f189bc40b71b82d0e1e5d3ff06e6641616abb8c)

* Code refactoring - remove old unused undo/redo backupPixmap

(cherry picked from commit 1b15b9acf514fce854d5e0f467c10a6e14a333a0)

* Add object selection arownd the object on select for tools based on AbstractTwoPointTool

(cherry picked from commit 26fab8ff365ed0d7ff3eee1191d48248e8a05dcd)

* Add object selection arownd the object on select for tools based on AbstractPathTool

(cherry picked from commit bbf53e4c35a58d313d0cd94b24b86c15f5841483)

* Add object selection arownd the object on select for the TextTool

(cherry picked from commit ec5780b5c1ec59fd8924834f67563df36590c0a6)

* Edit color for any selected object

(cherry picked from commit 465a183978f8e8ff0df0e2c5cf77ec3d3115fccc)

* Code refactoring - fix some missprints in MacOS CI

(cherry picked from commit 99ef8a55d4ca812b6217bd15934c276a2ed5aa57)

* Text object selection has wrong size

(cherry picked from commit cd365060f1bc607ee53a77482af50f71d5ffe674)

* Make more noticeable object selection for TwoPoints and Path tools (except arrows)

(cherry picked from commit 67e304474fd116d95ae6138a50c719186b71bf9a)

* Make more noticeable object selection for Arrows

(cherry picked from commit 066ff0a425ebfc2c235ef756057c086cd75a863f)

* Make more noticeable object selection for Text

(cherry picked from commit e5e0afd5853ae2e8169209a0d9a3a6b1ce42f6e1)

* fix - Make more noticeable object selection for Arrow tool

(cherry picked from commit e1028c7c786d7d8b92b2bd7561193ed5be9066c8)

* fix - add '#include <cmath>' for round function

(cherry picked from commit a043036627587d78bbc916a4590e4e0cb9a6173d)

* Add hotkey for removing objects

(cherry picked from commit 13059461d550fbdd7f43d157c3a87fad43989742)

* Add hotkey for removing objects

(cherry picked from commit 13059461d550fbdd7f43d157c3a87fad43989742)

* Code refactoring - remove outdated parts of undo/redo, some optimisation

(cherry picked from commit 8e08cea690dcbadb61efbab4139b4bd43a9dd91a)

* Add operator = for tool objects to be able to implement undo/redo stack based on the concept of full state saving for each step (just objects, not generated images and layers)

(cherry picked from commit 7ffc850883ea97d807514a15d89ac5dd0e45c9f5)

* Implement basic Undo/Redo step based on QUndoStack (without move and change color steps), some other fixes

(cherry picked from commit 818f3d2939fbe5153787612824e40b3b1997297b)

* Add undo/redo stack for changing color

(cherry picked from commit 2b8a4ffc4f5e39d8531611f516a222288f54224b)

* fix - save objects state before color update for undo/redo stack and do not save state until mouse release event

(cherry picked from commit 4ba79d6b96d89a3010f14d0d9759ff98ae407fd1)

* Add object movement to the undo/redo stack

(cherry picked from commit 1eacc35a15487a815a68db6b7ad5daf8bac7adcf)

* fix - undo/redo from first to the latest item (still with a brutal hack)

(cherry picked from commit 421f43ff5361da1d215465e133b52b407829340c)

* Do not close CaptureWidget if some tool object or selection is active

(cherry picked from commit 17fc95e167dd7ac3c17c8ed39c4bbde03301ea9b)

* Don't change color if right click is not in the object selection area

(cherry picked from commit d8ecead647ca0804c5e7555c8ffa3117abc8f3d1)

* Edit thickness for the existing objects

(cherry picked from commit 9ab45497e60b1316bf50d67ca7d29b84cd70f515)

* fix - restore CaptureWidget thickness on object select

(cherry picked from commit 9ff9de5a915eec65bed66a74e3a5ec7f1bee2719)

* Code refactoring - move repeated code to the function 'activeToolObject'

(cherry picked from commit c388d8c8ec2844c2426148a437f6aaad2a1f7923)

* Code refactoring - remove unused lines and many fixes based on Clang-Tidy

(cherry picked from commit 7e19019dbaa185387b90fe9f45c8a65f057cd582)

* Code refactoring - remove unused lines and many fixes based on Clang-Tidy

(cherry picked from commit 7e19019dbaa185387b90fe9f45c8a65f057cd582)

* fix - Circle Counter Bubble numeration can skip some items if CPU is high loaded at that moment

(cherry picked from commit 6242fe8620bd5a46a7291de41ea8ce5465950664)

* Code refactoring - make m_thickness variable in tool objects private and work with it as get/set methods

(cherry picked from commit f36e823864c1af35aa94809515f786a45915e180)

* fix - CircleTool doesn't place on CaptureWidget without mouse move
Code refactoring - make number of variables private for AbstractTwoPointTool and work with them as get/set methods

(cherry picked from commit 874ebc3afd3da77fcb954e83429e88016518cbca)

* CircleCount - make circles more contrast and mouse preview opaque

(cherry picked from commit cebf3b831cf5751cb0b4b9b83f6f63d60b18dc8c)

* fix - CircleCount selection and changing color for existing object

(cherry picked from commit 477c230194b57af9223a3d68c4ac4f5c1bf3566c)

* fix - Move selection area tool cannot be selected

(cherry picked from commit 38662ff86e6a858c02050de1caa37295bb25d574)

* fix - Selection area disappears on click on existing tool out of area

(cherry picked from commit e98c60e226c9883558718f1278879339dc528973)

* Change MacOS hotkey Command+Backspace -> Backspace

(cherry picked from commit aa96b956348a0192179f03a43a0ce5712ce1a965)

* Make rectangle tool with rounded borders (not cut), Make selection tool without rounded edges

(cherry picked from commit 2fd9c2ad9f5d00dcb9204b09989a66309b43f472)

* fix - Thickness doesn't changed for existing object on changing it in side panel

(cherry picked from commit 271731c89185b982a86bb27e3a7bc441a2942c10)

* fix - Sync selection on CaptureWidget when clicking on tool in panel

(cherry picked from commit 9db0c75ec0e92d5fad5bc3856f46f5ed87c6aefd)

* Change selection on mouse down instead of mouse up event

(cherry picked from commit 3e09778b701498498c144c5e5516f746f1c9088a)

* Code refactoring - remove variable m_rightClick from CaptureWidget, use another existing trigger to detect it

(cherry picked from commit 1abc595ce352b8445a943504a7c359cd0830a640)

* fix - Rectangle preview and final objects are not the same

(cherry picked from commit b31905892a60228cae5c8bcde1f71699eca63447)

* fix - Doesn't save image if the 'use fixed path' checkbox is checked

(cherry picked from commit 1470859aa2c4f28f2c45581891534f3fa4bd6f0a)

* fix - Latest Uploads max size value doesn't restore after reset/import settings

(cherry picked from commit fa72bacfc0bb12313dd351ee246dd567dfc3f3c8)

* fix - impossible to disable the keyboard shortcut by clicking Delete button

(cherry picked from commit 74d36e4b3a333cb81ffb4ad93a2bd5465e79cb94)

* fix - MacOS - Increase and Decrease Size tool icon colors are not changed (dark/light) when changing main tool background color

(cherry picked from commit e48b685c900540a9cd353f71290be04491621fc7)

* fix - Selected region control points cannot be dragged on the screen corners

(cherry picked from commit 08bf02b5ee096c14d10c15853543749d58c51ef4)

* fix - Object selects if mouse pointer above any object when TextTool is active

(cherry picked from commit b7a6a7efc8c3a77c55039721ab0cf388973c25d5)

* fix - Test Tool doesn't close editor on next text item, you can see two editors and one of them will be never closed

(cherry picked from commit eb12f76fd7121d1917659485673305684de523c8)

* Code refactoring - remove function in the CaptureToolObjects class with the same functional

(cherry picked from commit 1a108f7be48d5b4d89960ac4a5f4e82c03762cbc)

* Code refactoring - CaptureWidget::mousePressEvent function is split into a few, code became more readable

(cherry picked from commit dc850b3daa00fa173126d86403c35f3c67c448e6)

* optimization - remove unnecessary calls of CaptureWidget::drawToolsData

(cherry picked from commit c2432bd5602657233ee9506e84a7806bafeb6f68)

* fix - Move tool doesn't work if any object is selected
fix - Active tool stays active if existing object is selected in the Tool Settings panel

(cherry picked from commit 6154feba575f79a06082f72b5c45a869c8d08f42)

* fix - App freezes for a while when changing thickness of the pixelate to the minimal value

(cherry picked from commit 3a1c519c8309b831e4cc4f11b9014b1a9599ba93)

* fix - Text Tool doubles on press ESC when text editing field is active

(cherry picked from commit 00bdebff75a0178a46f38606eec4921fdf2f5917)

* fix - Image is pinned/saved with object selection frame if there is one

(cherry picked from commit 81871860720fa0527f8dcabe1b274b3f03818b7c)

* fix - Object line thickness changes according to previously modified object when switching between objects via object list

(cherry picked from commit a4a367d30e18a743f0df849e7db1aa2dc20af2a6)

* fix - Configuration: Filename doesn't set default value on clear

(cherry picked from commit 289663c0c85f4bae98c1a19a7a05fb1029738c12)

* Update README.md - Global shortcut for Ubuntu 20.04

(cherry picked from commit 3bee0aa0ac937c00113f2bcca818a9a57e6c5530)

* fix - Saved screenshot has selection if some object is selected on Save

(cherry picked from commit e53bb33e804cc7de1102a1ab3069bfb849174b73)

* fix - Saved screenshot has selection if some object is selected on Upload

* fix - Rename "Reset" to "Restore" in file settings for restoring saved file name rules in the configuration widget

(cherry picked from commit d2ac5a330fca902b832fce163e4f5f138dbbcc6b)

* Update Ukrainian and Russian translations

* fix - Shapes are displayed as semi-empty at the very beginning of drawing if the line is thick

(cherry picked from commit d8b09c5d5233fefe3181a69f5200198815bc3ec1)

* fix - MacOS - Button "Tool Settings" is not visible on some displays if displays are vertically aligned

(cherry picked from commit 6af590a859b2708177c34c3ff37725905f4c3bec)

* fix - Incorrect selection border for Rectangle/Pixelate tool

(cherry picked from commit c908d3b67c5d8e2188d2699ac11951110493b756)

* Code refactoring - replace magic numbers

(cherry picked from commit c8e1ce345adb1646659e4e90d314916532d5e67a)

* fix merge conflicts for Internationalization files

* fix - thickness shouldn't be less than one

(cherry picked from commit d8ea8a0db7fffcec601dd3139c57198ba15b64b7)

* Update copyright info

Co-authored-by: Yuriy Puchkov <yuriy.puchkov@namecheap.com>
This commit is contained in:
Yurii Puchkov
2021-04-20 03:28:10 +03:00
committed by GitHub
parent 851aef3399
commit 55e61b8743
95 changed files with 6209 additions and 4539 deletions

View File

@@ -12,6 +12,22 @@ TextTool::TextTool(QObject* parent)
, m_size(1)
{}
TextTool::~TextTool()
{
closeEditor();
}
void TextTool::copyParams(const TextTool* from, TextTool* to)
{
CaptureTool::copyParams(from, to);
to->m_font = from->m_font;
to->m_text = from->m_text;
to->m_size = from->m_size;
to->m_color = from->m_color;
to->m_textArea = from->m_textArea;
to->m_currentPos = from->m_currentPos;
}
bool TextTool::isValid() const
{
return !m_text.isEmpty();
@@ -34,7 +50,7 @@ bool TextTool::showMousePreview() const
QIcon TextTool::icon(const QColor& background, bool inEditor) const
{
Q_UNUSED(inEditor);
Q_UNUSED(inEditor)
return QIcon(iconPath(background) + "text.svg");
}
@@ -55,13 +71,24 @@ QString TextTool::description() const
QWidget* TextTool::widget()
{
TextWidget* w = new TextWidget();
w->setTextColor(m_color);
closeEditor();
m_widget = new TextWidget();
m_widget->setTextColor(m_color);
m_font.setPointSize(m_size + BASE_POINT_SIZE);
w->setFont(m_font);
connect(w, &TextWidget::textUpdated, this, &TextTool::updateText);
m_widget = w;
return w;
m_widget->setFont(m_font);
connect(m_widget, &TextWidget::textUpdated, this, &TextTool::updateText);
return m_widget;
}
void TextTool::closeEditor()
{
if (!m_widget.isNull()) {
disconnect(
m_widget, &TextWidget::textUpdated, this, &TextTool::updateText);
m_widget->close();
delete m_widget;
m_widget = nullptr;
}
}
QWidget* TextTool::configurationWidget()
@@ -95,86 +122,66 @@ QWidget* TextTool::configurationWidget()
CaptureTool* TextTool::copy(QObject* parent)
{
TextTool* tt = new TextTool(parent);
connect(
m_confW, &TextConfig::fontFamilyChanged, tt, &TextTool::updateFamily);
connect(
m_confW, &TextConfig::fontItalicChanged, tt, &TextTool::updateFontItalic);
connect(m_confW,
&TextConfig::fontStrikeOutChanged,
tt,
&TextTool::updateFontStrikeOut);
connect(m_confW,
&TextConfig::fontUnderlineChanged,
tt,
&TextTool::updateFontUnderline);
connect(
m_confW, &TextConfig::fontWeightChanged, tt, &TextTool::updateFontWeight);
tt->m_font = m_font;
if (m_confW) {
connect(
m_confW, &TextConfig::fontFamilyChanged, tt, &TextTool::updateFamily);
connect(m_confW,
&TextConfig::fontItalicChanged,
tt,
&TextTool::updateFontItalic);
connect(m_confW,
&TextConfig::fontStrikeOutChanged,
tt,
&TextTool::updateFontStrikeOut);
connect(m_confW,
&TextConfig::fontUnderlineChanged,
tt,
&TextTool::updateFontUnderline);
connect(m_confW,
&TextConfig::fontWeightChanged,
tt,
&TextTool::updateFontWeight);
}
copyParams(this, tt);
return tt;
}
void TextTool::undo(QPixmap& pixmap)
void TextTool::process(QPainter& painter, const QPixmap& pixmap)
{
QPainter p(&pixmap);
#if defined(Q_OS_MACOS)
// Not sure how will it work on 4k and fullHd on Linux or Windows with a
// capture of different displays with different DPI, so let it be MacOS
// specific only.
const qreal pixelRatio = pixmap.devicePixelRatio();
p.drawPixmap(backupRect(pixmap).topLeft() / pixelRatio, m_pixmapBackup);
#else
p.drawPixmap(m_backupArea.topLeft(), m_pixmapBackup);
#endif
Q_UNUSED(pixmap)
if (m_text.isEmpty()) {
return;
}
const int val = 5;
QFontMetrics fm(m_font);
QSize size(fm.boundingRect(QRect(), 0, m_text).size());
size.setWidth(size.width() + val * 2);
size.setHeight(size.height() + val * 2);
m_textArea.setSize(size);
// draw text
painter.setFont(m_font);
painter.setPen(m_color);
painter.drawText(m_textArea + QMargins(-val, -val, val, val), m_text);
}
void TextTool::process(QPainter& painter,
const QPixmap& pixmap,
bool recordUndo)
void TextTool::drawObjectSelection(QPainter& painter)
{
if (m_text.isEmpty()) {
return;
}
QFontMetrics fm(m_font);
QSize size(fm.boundingRect(QRect(), 0, m_text).size());
m_backupArea.setSize(size);
if (recordUndo) {
m_pixmapBackup = pixmap.copy(backupRect(pixmap));
}
// draw text
painter.setFont(m_font);
painter.setPen(m_color);
const int val = 5;
painter.drawText(m_backupArea + QMargins(-val, -val, val, val), m_text);
}
QRect TextTool::backupRect(const QPixmap& pixmap) const
{
const QRect& limits = pixmap.rect();
QRect r = m_backupArea.normalized();
#if defined(Q_OS_MACOS)
const qreal pixelRatio = pixmap.devicePixelRatio();
const int val = 5 * pixelRatio;
if (1 != pixelRatio) {
r.moveTo(r.topLeft() * pixelRatio);
r.setSize(r.size() * pixelRatio);
}
#else
const int val = 5;
#endif
r += QMargins(0, 0, val, val);
return r.intersected(limits);
drawObjectSelectionRect(painter, m_textArea);
}
void TextTool::paintMousePreview(QPainter& painter,
const CaptureContext& context)
{
Q_UNUSED(painter);
Q_UNUSED(context);
Q_UNUSED(painter)
Q_UNUSED(context)
}
void TextTool::drawEnd(const QPoint& p)
{
m_backupArea.moveTo(p);
m_textArea.moveTo(p);
}
void TextTool::drawMove(const QPoint& p)
@@ -191,7 +198,7 @@ void TextTool::drawStart(const CaptureContext& context)
void TextTool::pressed(const CaptureContext& context)
{
Q_UNUSED(context);
Q_UNUSED(context)
}
void TextTool::colorChanged(const QColor& c)
@@ -202,7 +209,7 @@ void TextTool::colorChanged(const QColor& c)
}
}
void TextTool::thicknessChanged(const int th)
void TextTool::thicknessChanged(int th)
{
m_size = th;
m_font.setPointSize(m_size + BASE_POINT_SIZE);
@@ -216,14 +223,6 @@ void TextTool::updateText(const QString& s)
m_text = s;
}
void TextTool::setFont(const QFont& f)
{
m_font = f;
if (m_widget) {
m_widget->setFont(f);
}
}
void TextTool::updateFamily(const QString& s)
{
m_font.setFamily(s);
@@ -263,3 +262,14 @@ void TextTool::updateFontItalic(const bool italic)
m_widget->setFont(m_font);
}
}
void TextTool::move(const QPoint& pos)
{
m_textArea.moveTo(pos);
}
const QPoint* TextTool::pos()
{
m_currentPos = m_textArea.topLeft();
return &m_currentPos;
}