Skip to content

Commit

Permalink
M Image Window: copy the image to clipboard when editing is finished.
Browse files Browse the repository at this point in the history
  • Loading branch information
ffiirree committed Mar 15, 2021
1 parent 0e0de33 commit 605309e
Show file tree
Hide file tree
Showing 7 changed files with 169 additions and 134 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.10)

project(capturer VERSION 1.2.3 LANGUAGES C CXX)
project(capturer VERSION 1.3.1 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
Expand Down
17 changes: 14 additions & 3 deletions src/core/canvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,25 @@
#include <QMouseEvent>
#include <QPainter>
#include <QGraphicsItem>
#include <QMimeData>
#include <QApplication>
#include <QClipboard>
#include "logging.h"

Canvas::Canvas(QWidget *parent)
Canvas::Canvas(ImageEditMenu* menu, QWidget *parent)
: QObject(parent)
{
menu_ = new ImageEditMenu(parent);
CHECK(menu);

menu_ = menu;
connect(menu_, &ImageEditMenu::fix, [this]() { focusOn(nullptr); emit closed(); });
connect(menu_, &ImageEditMenu::ok, [this]() { focusOn(nullptr); emit closed(); });
connect(menu_, &ImageEditMenu::ok, [this]() {
// copy to clipboard
QApplication::clipboard()->setPixmap(canvas_);

focusOn(nullptr);
emit closed();
});
connect(menu_, &ImageEditMenu::exit, [this]() { focusOn(nullptr); canvas_ = backup_.copy(); emit closed(); });

connect(menu_, &ImageEditMenu::undo, this, &Canvas::undo);
Expand Down
8 changes: 5 additions & 3 deletions src/core/canvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@ class Canvas : public QObject
GRAPH_MASK = 0x0000ffff
};
public:
Canvas(QWidget*parent = nullptr);
ImageEditMenu* menu_ = nullptr;
Canvas(ImageEditMenu * menu, QWidget*parent = nullptr);

ImageEditMenu* menu() const { return menu_; }

QCursor getCursorShape();
void mousePressEvent(QMouseEvent*);
Expand Down Expand Up @@ -99,10 +100,11 @@ public slots:
bool eventFilter(QObject* object, QEvent* event);
void focusOn(shared_ptr<PaintCommand>);


void updateHoverPos(const QPoint&);
QImage mosaic(const QImage& );

ImageEditMenu* menu_ = nullptr;

Resizer::PointPosition hover_position_ = Resizer::OUTSIDE;
QPoint move_begin_{ 0, 0 };
QPoint resize_begin_{ 0, 0 };
Expand Down
11 changes: 6 additions & 5 deletions src/core/imagewindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ ImageWindow::ImageWindow(QWidget *parent)
effect_->setColor(QColor("#409eff"));
setGraphicsEffect(effect_);

canvas_ = new Canvas(this);
menu_ = new ImageEditMenu(this, ImageEditMenu::ALL & ~ImageEditMenu::SAVE_GROUP);
canvas_ = new Canvas(menu_, this);
installEventFilter(canvas_);
menu_ = canvas_->menu_;

connect(menu_, &ImageEditMenu::save, this, &ImageWindow::saveAs);
connect(canvas_, &Canvas::closed, [this]() {
setMouseTracking(false);
Expand Down Expand Up @@ -385,9 +386,9 @@ void ImageWindow::moveEvent(QMoveEvent*)

void ImageWindow::moveMenu()
{
auto rect = geometry().adjusted(shadow_r_, shadow_r_, -shadow_r_ - canvas_->menu_->width(), -shadow_r_ + 5);
canvas_->menu_->move(rect.bottomRight());
canvas_->menu_->setSubMenuShowBelow();
auto rect = geometry().adjusted(shadow_r_, shadow_r_, -shadow_r_ - menu_->width(), -shadow_r_ + 5);
menu_->move(rect.bottomRight());
menu_->setSubMenuShowBelow();
}

void ImageWindow::keyPressEvent(QKeyEvent *event)
Expand Down
230 changes: 120 additions & 110 deletions src/menu/imageeditmenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,129 +25,139 @@
(height() + 3) * (sub_menu_show_pos_ ? -1 : 1));\
})

ImageEditMenu::ImageEditMenu(QWidget* parent)
ImageEditMenu::ImageEditMenu(QWidget* parent, uint32_t groups)
: EditMenu(parent)
{
group_ = new ButtonGroup(this);
connect(group_, &ButtonGroup::uncheckedAll, [this]() { graphChanged(Graph::NONE); });

const auto icon_size = QSize(HEIGHT, HEIGHT);

auto rectangle_btn = new IconButton(QPixmap(":/icon/res/rectangle"), icon_size, { ICON_W, ICON_W }, true);
rectangle_btn->setToolTip(tr("Rectangle"));
rectangle_menu_ = new GraphMenu(this);
connect(rectangle_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::RECTANGLE); });
CONNECT_BTN_MENU(Graph::RECTANGLE, rectangle_btn, rectangle_menu_);
group_->addButton(rectangle_btn);
addButton(rectangle_btn);
buttons_[Graph::RECTANGLE] = rectangle_btn;

auto circle_btn = new IconButton(QPixmap(":/icon/res/circle"), icon_size, { ICON_W, ICON_W }, true);
circle_btn->setToolTip(tr("Ellipse"));
circle_menu_ = new GraphMenu(this);
connect(circle_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::CIRCLE); });
CONNECT_BTN_MENU(Graph::CIRCLE, circle_btn, circle_menu_);
group_->addButton(circle_btn);
addButton(circle_btn);
buttons_[Graph::CIRCLE] = circle_btn;

auto arrow_btn = new IconButton(QPixmap(":/icon/res/arrow"), icon_size, { ICON_W, ICON_W }, true);
arrow_btn->setToolTip(tr("Arrow"));
arrow_menu_ = new ArrowEditMenu(this);
connect(arrow_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::ARROW); });
CONNECT_BTN_MENU(Graph::ARROW, arrow_btn, arrow_menu_);
group_->addButton(arrow_btn);
addButton(arrow_btn);
buttons_[Graph::ARROW] = arrow_btn;

auto line_btn = new IconButton(QPixmap(":/icon/res/line"), icon_size, { ICON_W, ICON_W }, true);
line_btn->setToolTip(tr("Line"));
line_menu_ = new LineEditMenu(this);
connect(line_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::LINE); });
CONNECT_BTN_MENU(Graph::LINE, line_btn, line_menu_);
group_->addButton(line_btn);
addButton(line_btn);
buttons_[Graph::LINE] = line_btn;

auto pen_btn = new IconButton(QPixmap(":/icon/res/feather"), icon_size, { ICON_W, ICON_W }, true);
pen_btn->setToolTip(tr("Pencil"));
curves_menu_ = new LineEditMenu(this);
connect(curves_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::CURVES); });
CONNECT_BTN_MENU(Graph::CURVES, pen_btn, curves_menu_);
group_->addButton(pen_btn);
addButton(pen_btn);
buttons_[Graph::CURVES] = pen_btn;

auto text_btn = new IconButton(QPixmap(":/icon/res/text"), icon_size, { ICON_W, ICON_W }, true);
text_btn->setToolTip(tr("Text"));
text_menu_ = new FontMenu(this);
connect(text_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::TEXT); });
CONNECT_BTN_MENU(Graph::TEXT, text_btn, text_menu_);
group_->addButton(text_btn);
addButton(text_btn);
buttons_[Graph::TEXT] = text_btn;

auto mosaic_btn = new IconButton(QPixmap(":/icon/res/mosaic"), icon_size, { ICON_W, ICON_W }, true);
mosaic_btn->setToolTip(tr("Mosaic"));
mosaic_menu_ = new EraseMenu(this);
connect(mosaic_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::MOSAIC); });
CONNECT_BTN_MENU(Graph::MOSAIC, mosaic_btn, mosaic_menu_);
group_->addButton(mosaic_btn);
addButton(mosaic_btn);
buttons_[Graph::MOSAIC] = mosaic_btn;

auto eraser_btn = new IconButton(QPixmap(":/icon/res/eraser"), icon_size, { ICON_W, ICON_W }, true);
eraser_btn->setToolTip(tr("Eraser"));
erase_menu_ = new EraseMenu(this);
connect(erase_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::ERASER); });
CONNECT_BTN_MENU(Graph::ERASER, eraser_btn, erase_menu_);
group_->addButton(eraser_btn);
addButton(eraser_btn);
buttons_[Graph::ERASER] = eraser_btn;
if (groups & GRAPH_GROUP) {
auto rectangle_btn = new IconButton(QPixmap(":/icon/res/rectangle"), icon_size, { ICON_W, ICON_W }, true);
rectangle_btn->setToolTip(tr("Rectangle"));
rectangle_menu_ = new GraphMenu(this);
connect(rectangle_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::RECTANGLE); });
CONNECT_BTN_MENU(Graph::RECTANGLE, rectangle_btn, rectangle_menu_);
group_->addButton(rectangle_btn);
addButton(rectangle_btn);
buttons_[Graph::RECTANGLE] = rectangle_btn;

auto circle_btn = new IconButton(QPixmap(":/icon/res/circle"), icon_size, { ICON_W, ICON_W }, true);
circle_btn->setToolTip(tr("Ellipse"));
circle_menu_ = new GraphMenu(this);
connect(circle_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::CIRCLE); });
CONNECT_BTN_MENU(Graph::CIRCLE, circle_btn, circle_menu_);
group_->addButton(circle_btn);
addButton(circle_btn);
buttons_[Graph::CIRCLE] = circle_btn;

auto arrow_btn = new IconButton(QPixmap(":/icon/res/arrow"), icon_size, { ICON_W, ICON_W }, true);
arrow_btn->setToolTip(tr("Arrow"));
arrow_menu_ = new ArrowEditMenu(this);
connect(arrow_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::ARROW); });
CONNECT_BTN_MENU(Graph::ARROW, arrow_btn, arrow_menu_);
group_->addButton(arrow_btn);
addButton(arrow_btn);
buttons_[Graph::ARROW] = arrow_btn;

auto line_btn = new IconButton(QPixmap(":/icon/res/line"), icon_size, { ICON_W, ICON_W }, true);
line_btn->setToolTip(tr("Line"));
line_menu_ = new LineEditMenu(this);
connect(line_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::LINE); });
CONNECT_BTN_MENU(Graph::LINE, line_btn, line_menu_);
group_->addButton(line_btn);
addButton(line_btn);
buttons_[Graph::LINE] = line_btn;

auto pen_btn = new IconButton(QPixmap(":/icon/res/feather"), icon_size, { ICON_W, ICON_W }, true);
pen_btn->setToolTip(tr("Pencil"));
curves_menu_ = new LineEditMenu(this);
connect(curves_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::CURVES); });
CONNECT_BTN_MENU(Graph::CURVES, pen_btn, curves_menu_);
group_->addButton(pen_btn);
addButton(pen_btn);
buttons_[Graph::CURVES] = pen_btn;

auto text_btn = new IconButton(QPixmap(":/icon/res/text"), icon_size, { ICON_W, ICON_W }, true);
text_btn->setToolTip(tr("Text"));
text_menu_ = new FontMenu(this);
connect(text_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::TEXT); });
CONNECT_BTN_MENU(Graph::TEXT, text_btn, text_menu_);
group_->addButton(text_btn);
addButton(text_btn);
buttons_[Graph::TEXT] = text_btn;

auto mosaic_btn = new IconButton(QPixmap(":/icon/res/mosaic"), icon_size, { ICON_W, ICON_W }, true);
mosaic_btn->setToolTip(tr("Mosaic"));
mosaic_menu_ = new EraseMenu(this);
connect(mosaic_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::MOSAIC); });
CONNECT_BTN_MENU(Graph::MOSAIC, mosaic_btn, mosaic_menu_);
group_->addButton(mosaic_btn);
addButton(mosaic_btn);
buttons_[Graph::MOSAIC] = mosaic_btn;

auto eraser_btn = new IconButton(QPixmap(":/icon/res/eraser"), icon_size, { ICON_W, ICON_W }, true);
eraser_btn->setToolTip(tr("Eraser"));
erase_menu_ = new EraseMenu(this);
connect(erase_menu_, &EditMenu::changed, [this]() { emit styleChanged(Graph::ERASER); });
CONNECT_BTN_MENU(Graph::ERASER, eraser_btn, erase_menu_);
group_->addButton(eraser_btn);
addButton(eraser_btn);
buttons_[Graph::ERASER] = eraser_btn;
}

/////////////////////////////////////////////////////////////////////////////////
if (groups & REDO_UNDO_GROUP) {
addSeparator();

undo_btn_ = new IconButton(QPixmap(":/icon/res/undo"), icon_size, { ICON_W, ICON_W });
undo_btn_->setDisabled(true);
connect(undo_btn_, &IconButton::clicked, this, &ImageEditMenu::undo);
addButton(undo_btn_);

redo_btn_ = new IconButton(QPixmap(":/icon/res/redo"), icon_size, { ICON_W, ICON_W });
redo_btn_->setDisabled(true);
connect(redo_btn_, &CustomButton::clicked, this, &ImageEditMenu::redo);
addButton(redo_btn_);
}

/////////////////////////////////////////////////////////////////////////////////
addSeparator();
if (groups & SAVE_GROUP) {
addSeparator();

undo_btn_ = new IconButton(QPixmap(":/icon/res/undo"), icon_size, { ICON_W, ICON_W });
undo_btn_->setDisabled(true);
connect(undo_btn_, &IconButton::clicked, this, &ImageEditMenu::undo);
addButton(undo_btn_);
auto fix_btn = new IconButton(QPixmap(":/icon/res/pin"), icon_size, { ICON_W, ICON_W });
connect(fix_btn, &IconButton::clicked, [this]() { fix(); hide(); });
connect(fix_btn, &IconButton::clicked, [=]() { group_->uncheckAll(); });
addButton(fix_btn);

redo_btn_ = new IconButton(QPixmap(":/icon/res/redo"), icon_size, { ICON_W, ICON_W });
redo_btn_->setDisabled(true);
connect(redo_btn_, &CustomButton::clicked, this, &ImageEditMenu::redo);
addButton(redo_btn_);
auto save_btn = new IconButton(QPixmap(":/icon/res/save"), icon_size, { ICON_W, ICON_W });
connect(save_btn, &IconButton::clicked, this, &ImageEditMenu::save);
connect(save_btn, &IconButton::clicked, [=]() { group_->uncheckAll(); });
addButton(save_btn);

}

/////////////////////////////////////////////////////////////////////////////////
addSeparator();

auto fix_btn = new IconButton(QPixmap(":/icon/res/pin"), icon_size, { ICON_W, ICON_W });
connect(fix_btn, &IconButton::clicked, [this]() { fix(); hide(); });
connect(fix_btn, &IconButton::clicked, [=]() { group_->uncheckAll(); });
addButton(fix_btn);

auto save_btn = new IconButton(QPixmap(":/icon/res/save"), icon_size, { ICON_W, ICON_W });
connect(save_btn, &IconButton::clicked, this, &ImageEditMenu::save);
connect(save_btn, &IconButton::clicked, [=]() { group_->uncheckAll(); });
addButton(save_btn);

addSeparator();

auto close_btn = new IconButton(QPixmap(":/icon/res/wrong"), icon_size, { ICON_W, ICON_W });
connect(close_btn, &IconButton::clicked, [this]() { exit(); hide(); });
connect(close_btn, &IconButton::clicked, [=]() { group_->uncheckAll(); });
close_btn->setIconColor(QColor("#ee0000"));
close_btn->setIconHoverColor(QColor("#ee0000"));
close_btn->setBackgroundHoverColor(QColor("#d0d0d5"));
addWidget(close_btn);

auto ok_btn = new IconButton(QPixmap(":/icon/res/right"), icon_size, { ICON_W, ICON_W });
connect(ok_btn, &IconButton::clicked, [this]() { ok(); hide(); });
connect(ok_btn, &IconButton::clicked, [=]() { group_->uncheckAll(); });
ok_btn->setIconColor(QColor("#07b913"));
ok_btn->setIconHoverColor(QColor("#07b913"));
ok_btn->setBackgroundHoverColor(QColor("#d0d0d5"));
addWidget(ok_btn);
if (groups & EXIT_GROUP) {
addSeparator();

auto close_btn = new IconButton(QPixmap(":/icon/res/wrong"), icon_size, { ICON_W, ICON_W });
connect(close_btn, &IconButton::clicked, [this]() { exit(); hide(); });
connect(close_btn, &IconButton::clicked, [=]() { group_->uncheckAll(); });
close_btn->setIconColor(QColor("#ee0000"));
close_btn->setIconHoverColor(QColor("#ee0000"));
close_btn->setBackgroundHoverColor(QColor("#d0d0d5"));
addWidget(close_btn);

auto ok_btn = new IconButton(QPixmap(":/icon/res/right"), icon_size, { ICON_W, ICON_W });
connect(ok_btn, &IconButton::clicked, [this]() { ok(); hide(); });
connect(ok_btn, &IconButton::clicked, [=]() { group_->uncheckAll(); });
ok_btn->setIconColor(QColor("#07b913"));
ok_btn->setIconHoverColor(QColor("#07b913"));
ok_btn->setBackgroundHoverColor(QColor("#d0d0d5"));
addWidget(ok_btn);
}
}

QPen ImageEditMenu::pen(Graph graph)
Expand Down
30 changes: 20 additions & 10 deletions src/menu/imageeditmenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,17 @@ class ImageEditMenu : public EditMenu
Q_OBJECT

public:
explicit ImageEditMenu(QWidget* parent = nullptr);
enum MenuGroups : int {
NONE = 0x00,
GRAPH_GROUP = 0x01,
REDO_UNDO_GROUP = 0x02,
SAVE_GROUP = 0x04,
EXIT_GROUP = 0x08,
ALL = 0xff
};

public:
explicit ImageEditMenu(QWidget* = nullptr, uint32_t = MenuGroups::ALL);

void reset();

Expand Down Expand Up @@ -52,16 +62,16 @@ public slots:
IconButton* undo_btn_ = nullptr;
IconButton* redo_btn_ = nullptr;

GraphMenu * rectangle_menu_ = nullptr;
GraphMenu * circle_menu_ = nullptr;
ArrowEditMenu *arrow_menu_ = nullptr;
LineEditMenu * line_menu_ = nullptr;
LineEditMenu * curves_menu_ = nullptr;
FontMenu * text_menu_ = nullptr;
EraseMenu *mosaic_menu_ = nullptr;
EraseMenu *erase_menu_ = nullptr;
GraphMenu* rectangle_menu_ = nullptr;
GraphMenu* circle_menu_ = nullptr;
ArrowEditMenu* arrow_menu_ = nullptr;
LineEditMenu* line_menu_ = nullptr;
LineEditMenu* curves_menu_ = nullptr;
FontMenu* text_menu_ = nullptr;
EraseMenu* mosaic_menu_ = nullptr;
EraseMenu* erase_menu_ = nullptr;

ButtonGroup * group_ = nullptr;
ButtonGroup* group_ = nullptr;
std::map<Graph, IconButton*> buttons_; // bind graph with buttons

bool sub_menu_show_pos_ = false;
Expand Down
5 changes: 3 additions & 2 deletions src/snip/screenshoter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@
ScreenShoter::ScreenShoter(QWidget *parent)
: Selector(parent)
{
canvas_ = new Canvas(this);
menu_ = canvas_->menu_;
menu_ = new ImageEditMenu(this);
canvas_ = new Canvas(menu_, this);

magnifier_ = new Magnifier(this);

connect(canvas_, &Canvas::changed, [this]() { update(); });
Expand Down

0 comments on commit 605309e

Please sign in to comment.