mirror of
https://github.com/fergalmoran/flameshot.git
synced 2025-12-26 03:39:34 +00:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user