Skip to content

Commit f79ca0b

Browse files
committed
Finished Marker implementation
1 parent 26f3382 commit f79ca0b

File tree

8 files changed

+94
-30
lines changed

8 files changed

+94
-30
lines changed

dock/markerwidget.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@ MarkerWidget::MarkerWidget(QWidget *parent)
2222
vlayout->addSpacing(8);
2323

2424
// undo button
25-
QPushButton* undoButton = new QPushButton(tr("Undo"));
26-
undoButton->setIcon(AwesomeService::awesome()->icon(fa::undo));
27-
undoButton->setMaximumWidth(100);
28-
connect(undoButton, &QPushButton::clicked, this, &MarkerWidget::signalUndo);
25+
_undoButton = new QPushButton(tr("Undo"));
26+
_undoButton->setIcon(AwesomeService::awesome()->icon(fa::undo));
27+
_undoButton->setMaximumWidth(100);
28+
_undoButton->setEnabled(false);
29+
connect(_undoButton, &QPushButton::clicked, this, &MarkerWidget::signalUndo);
2930

30-
vlayout->addWidget(undoButton);
31+
vlayout->addWidget(_undoButton);
3132
vlayout->addSpacing(8);
3233

3334
// marker shape
@@ -74,6 +75,11 @@ MarkerWidget::MarkerWidget(QWidget *parent)
7475
vlayout->addStretch();
7576
}
7677

78+
void MarkerWidget::setUndoEnabled(bool enabled)
79+
{
80+
_undoButton->setEnabled(enabled);
81+
}
82+
7783
void MarkerWidget::slotColorButtonToggled(QColor color)
7884
{
7985
QToolButton* button = static_cast<QToolButton*>(sender());

dock/markerwidget.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
class ColorActionWidget;
77
class QToolButton;
8+
class QPushButton;
89

910

1011
class MarkerWidget : public QWidget
@@ -29,6 +30,8 @@ class MarkerWidget : public QWidget
2930
return _currentShape;
3031
}
3132

33+
void setUndoEnabled(bool enabled);
34+
3235
signals:
3336
void signalUndo();
3437
void signalMarkerChanged();
@@ -41,6 +44,7 @@ private slots:
4144
QToolButton* createColorSwitch(const QColor& color);
4245

4346
QList<QToolButton*> _colorButtons;
47+
QPushButton* _undoButton;
4448
QColor _currentColor;
4549
MarkerShape _currentShape;
4650
};

mainwindow.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ void MainWindow::slotActionPaste()
8686
void MainWindow::slotActionCopy()
8787
{
8888
QClipboard *clipboard = QApplication::clipboard();
89-
clipboard->setImage(_currentImage);
89+
clipboard->setImage(_rsview->renderToPixmap().toImage());
9090

9191
_statusbar->showMessage(tr("Copied to the clipboard."));
9292
}
@@ -140,6 +140,12 @@ void MainWindow::slotSelectionFinished()
140140
if (_state == ColorState) {
141141
_colorsWidget->setSelectedColor();
142142
}
143+
else if (_state == MarkerState) {
144+
_markers.push(_rsview->selectionDrawing());
145+
_markerWidget->setUndoEnabled(true);
146+
_rsview->clearSelection();
147+
_rsview->setCustomSelectionDrawings(_markers.toList());
148+
}
143149

144150
slotSelectionChanged();
145151
}
@@ -154,13 +160,20 @@ void MainWindow::slotMouseMove(const QPoint &pos)
154160

155161
void MainWindow::slotMarkerUndo()
156162
{
157-
// TODO: implement me
158-
qWarning() << "MainWindow::slotMarkerUndo()";
163+
if (_markers.size() > 0) {
164+
_markers.pop();
165+
_rsview->setCustomSelectionDrawings(_markers.toList());
166+
}
167+
168+
if (_markers.size() == 0) {
169+
_markerWidget->setUndoEnabled(false);
170+
}
159171
}
160172

161173
void MainWindow::slotMarkerChanged()
162174
{
163175
_rsview->setSelectionAccentPainter(createMarkerAccentPainter());
176+
_rsview->setCustomSelectionDrawings(_markers.toList());
164177
}
165178

166179
void MainWindow::slotBuildCompleted(QSharedPointer<CvModel> model)
@@ -207,7 +220,7 @@ QSharedPointer<AccentPainter> MainWindow::createMarkerAccentPainter()
207220
bool MainWindow::saveImage(const QString &fileName)
208221
{
209222
QImageWriter writer(fileName);
210-
if (!writer.write(_currentImage)) {
223+
if (!writer.write(_rsview->renderToPixmap().toImage())) {
211224
QMessageBox::information(this, QGuiApplication::applicationDisplayName(),
212225
tr("Cannot save %1: %2")
213226
.arg(QDir::toNativeSeparators(fileName)), writer.errorString());
@@ -278,25 +291,18 @@ void MainWindow::updateImage(const QImage& image)
278291
_currentImage = image;
279292
}
280293

294+
_markers.clear();
295+
_markerWidget->setUndoEnabled(false);
296+
_colorsWidget->clearColors();
297+
281298
_rsview->setImage(_currentImage);
282299
_modelBuilder->buildAsync(_currentImage, CvModelBuilderOptions());
283300
}
284301

285302
void MainWindow::updateImage(const QRect& selection)
286303
{
287-
setCursor(Qt::WaitCursor);
288-
289304
QImage image = _currentImage.copy(selection);
290-
if (image.format() != QImage::Format_RGBA8888) {
291-
_currentImage = image.convertToFormat(QImage::Format_RGBA8888);
292-
} else {
293-
_currentImage = image;
294-
}
295-
296-
_rsview->setImage(_currentImage);
297-
298-
_colorsWidget->clearColors();
299-
_modelBuilder->buildAsync(_currentImage, CvModelBuilderOptions());
305+
updateImage(image);
300306
}
301307

302308
void MainWindow::setupUi()

mainwindow.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include <QScrollArea>
99
#include <QDockWidget>
1010
#include <QLabel>
11+
#include <QStack>
12+
#include <QPainterPath>
1113

1214
class QtAwesome;
1315
class RsView;
@@ -74,6 +76,7 @@ private slots:
7476
CvModelBuilder* _modelBuilder;
7577
QSharedPointer<CvModel> _model;
7678
State _state;
79+
QStack<QPainterPath> _markers;
7780

7881
QtAwesome* _awesome;
7982
RsView* _rsview;

params.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ int Params::ShadeAlpha = 150;
55
QColor Params::SelectionAccentColor = Qt::red;
66
int Params::MarkerFrameWidth = 3;
77
int Params::MarkerAlpha = 100;
8-
int Params::MarkerRoundCornerSize = 8;
8+
int Params::MarkerRoundCornerSize = 4;
99
int Params::SelectionMarginSize = 8;

rsview.cpp

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
RsView::RsView(QWidget *parent)
1717
: QWidget(parent)
1818
, _userSelection(new UserSelection(this))
19-
, _selector(0)
2019
, _addMargins(true)
20+
, _selector(0)
2121
{
2222
setAutoFillBackground(false);
2323
setMouseTracking(true);
@@ -35,7 +35,9 @@ void RsView::setImage(const QImage& image){
3535
_cinemaSelector = QSharedPointer<Selector>(new CinemaSelector(_image.rect()));
3636
_userSelection->clear();
3737
_selectionDrawing = QPainterPath();
38+
_customDrawings = QPainterPath();
3839
_preferredSelection = QRect();
40+
_customDrawingsAccentPainter.clear();
3941

4042
resize(image.size());
4143
update();
@@ -59,6 +61,38 @@ void RsView::setShadeMode(RsView::ShadeMode shadeMode)
5961
update();
6062
}
6163

64+
void RsView::setCustomSelectionDrawings(const QList<QPainterPath> &drawings)
65+
{
66+
_customDrawingsAccentPainter = _selectionAccentPainter;
67+
68+
QPainterPath united;
69+
foreach (const QPainterPath& pp, drawings) {
70+
united = united.united(pp);
71+
}
72+
_customDrawings = united;
73+
74+
update();
75+
}
76+
77+
void RsView::clearSelection()
78+
{
79+
_userSelection->clear();
80+
emit signalSelectionCancelled();
81+
update();
82+
}
83+
84+
QPixmap RsView::renderToPixmap()
85+
{
86+
QPixmap pixmap = QPixmap::fromImage(_image);
87+
QPainter painter(&pixmap);
88+
89+
if (!_customDrawingsAccentPainter.isNull()) {
90+
_customDrawingsAccentPainter->paint(&painter, _customDrawings);
91+
}
92+
93+
return pixmap;
94+
}
95+
6296
void RsView::paintEvent(QPaintEvent *event){
6397
Q_UNUSED(event);
6498

@@ -79,6 +113,10 @@ void RsView::paintEvent(QPaintEvent *event){
79113
}
80114
}
81115

116+
if (!_customDrawingsAccentPainter.isNull()) {
117+
_customDrawingsAccentPainter->paint(&painter, _customDrawings);
118+
}
119+
82120
if (hasSelection && !_selectionAccentPainter.isNull()) {
83121
_selectionAccentPainter->paint(&painter, _selectionDrawing);
84122
}
@@ -126,12 +164,9 @@ bool RsView::eventFilter(QObject *obj, QEvent *event) {
126164

127165
bool RsView::processingKeyPressEvents(QKeyEvent* keyEvent) {
128166
switch (keyEvent->key()) {
129-
case Qt::Key_Escape: {
130-
_userSelection->clear();
131-
emit signalSelectionCancelled();
132-
update();
167+
case Qt::Key_Escape:
168+
clearSelection();
133169
return true;
134-
}
135170
case Qt::Key_Space:
136171
_addMargins = !_addMargins;
137172
case Qt::Key_Control:

rsview.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class RsView : public QWidget
3131
void setSelectionAccentPainter(const QSharedPointer<AccentPainter>& accentPainter);
3232
void setSelectionRenderer(const QSharedPointer<Selector>& selectionRenderer);
3333
void setShadeMode(ShadeMode shadeMode);
34+
void setCustomSelectionDrawings(const QList<QPainterPath>& drawings);
3435

3536
const UserSelection* userSelection() const {
3637
return _userSelection;
@@ -40,6 +41,14 @@ class RsView : public QWidget
4041
return _preferredSelection;
4142
}
4243

44+
QPainterPath selectionDrawing() const {
45+
return _selectionDrawing;
46+
}
47+
48+
void clearSelection();
49+
50+
QPixmap renderToPixmap();
51+
4352
signals:
4453
void signalMouseMove(const QPoint& point);
4554
void signalSelectionChanged();
@@ -66,12 +75,14 @@ private slots:
6675
QRect _preferredSelection;
6776
bool _addMargins;
6877

78+
QPainterPath _customDrawings;
6979
QPainterPath _cinemaDrawing;
7080
QPainterPath _selectionDrawing;
7181

7282
QSharedPointer<Selector> _selector;
7383
QSharedPointer<Selector> _cinemaSelector;
7484

7585
QSharedPointer<AccentPainter> _selectionAccentPainter;
86+
QSharedPointer<AccentPainter> _customDrawingsAccentPainter;
7687
QSharedPointer<AccentPainter> _cinemaAccentPainter;
7788
};

selector/markerselector.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ QPainterPath MarkerSelector::render(const QRect &selection)
2222
QPainterPath path;
2323

2424
if (!selection.isNull()) {
25-
QRect rect = selection.adjusted(-Params::MarkerRoundCornerSize, -Params::MarkerRoundCornerSize, Params::MarkerRoundCornerSize, Params::MarkerRoundCornerSize);
26-
path.addRoundedRect(rect, Params::MarkerRoundCornerSize, Params::MarkerRoundCornerSize);
25+
path.addRoundedRect(selection, Params::MarkerRoundCornerSize, Params::MarkerRoundCornerSize);
2726
}
2827

2928
return path;

0 commit comments

Comments
 (0)