25#include <QTabletEvent>
30#include <klocalizedstring.h>
31#include <ktoggleaction.h>
33#include <QApplication>
35#include <QPainterPath>
91 d->m_viewManager = viewManager;
97 connect(
button, &QAbstractButton::clicked,
d->m_selectionManager, buttonData.slot);
112 if (!selection || !
d->m_enabled || !
d->m_visible) {
121 d->m_handleWidget->draw(painter);
126 QWidget *canvasWidget =
dynamic_cast<QWidget *
>(
d->m_viewManager->canvas());
131 p_visible &=
d->m_enabled;
133 const bool VISIBILITY_CHANGED =
d->m_visible != p_visible;
134 if (!VISIBILITY_CHANGED) {
138 if (
d->m_viewManager->selection() && p_visible) {
139 d->m_handleWidget->installEventFilter(
this);
141 if (!
d->m_dragHandle) {
147 d->m_handleWidget->removeEventFilter(
this);
152 d->m_handleWidget->hide();
154 d->m_pressed =
false;
155 d->m_dragHandle.reset();
158 d->m_visible = p_visible;
163 bool configurationChanged = enabled !=
d->m_enabled;
164 d->m_enabled = enabled;
165 if (configurationChanged) {
175 switch (event->type()) {
176 case QEvent::MouseButtonPress: {
177 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>(event);
180 case QEvent::TabletPress: {
181 const QTabletEvent *tabletEvent =
static_cast<QTabletEvent *
>(event);
184 case QEvent::TouchBegin: {
185 const QTouchEvent *touchEvent =
static_cast<QTouchEvent *
>(event);
193 case QEvent::MouseMove:
195 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>(event);
199 case QEvent::TabletMove:
201 const QTabletEvent *tabletEvent =
static_cast<QTabletEvent *
>(event);
205 case QEvent::TouchUpdate:
207 const QTouchEvent *touchEvent =
static_cast<QTouchEvent *
>(event);
215 case QEvent::MouseButtonRelease:
216 case QEvent::TabletRelease:
217 case QEvent::TouchEnd:
218 case QEvent::TouchCancel:
220 d->m_handleWidget->set_held(
false);
221 d->m_pressed =
false;
237 Q_FOREACH(QWidget* btn,
d->m_buttons) {
238 btn->setParent(canvas->
widget());
242 d->m_handleWidget->setParent(canvas->
widget());
243 d->m_handleWidget->show();
248 QRect canvasBounds = canvasWidget->rect();
250 const int ACTION_BAR_WIDTH =
d->m_actionBarWidth;
254 int pos_x_max = canvasBounds.right() - ACTION_BAR_WIDTH -
BUFFER_SPACE;
257 int pos_y_max = canvasBounds.bottom() - ACTION_BAR_HEIGHT -
BUFFER_SPACE;
261 if (pos_x_max < pos_x_min) {
262 pos_x_max = pos_x_min;
266 if (pos_y_max < pos_y_min) {
267 pos_y_max = pos_y_min;
270 position.setX(qBound(pos_x_min, position.x(), pos_x_max));
271 position.setY(qBound(pos_y_min, position.y(), pos_y_max));
284 int selectionBottom = selectionBounds.bottom();
285 QPointF selectionCenter = selectionBounds.center();
286 QPointF bottomCenter(selectionCenter.x(), selectionBottom);
290 widgetBottomCenter.setX(widgetBottomCenter.x() - (
d->m_actionBarWidth / 2));
291 widgetBottomCenter.setY(widgetBottomCenter.y() +
BUFFER_SPACE);
298 const int cornerRadius = 4;
299 QColor outlineColor = qApp->palette().window().color();
301 QColor bgColor = qApp->palette().window().color();
305 bgColor = bgColor.lighter(120);
310 QColor bgColorTrans = bgColor;
311 bgColorTrans.setAlpha(80);
312 const int outline_width = 4;
315 QRectF contrastOutline(
d->m_dragHandle->position - QPoint(outline_width + 1,outline_width + 1), QSize(
d->m_actionBarWidth,
BUTTON_SIZE) +QSize(outline_width + 1,outline_width + 1) * 2);
316 QRectF midOutline(
d->m_dragHandle->position - QPoint(outline_width,outline_width), QSize(
d->m_actionBarWidth,
BUTTON_SIZE) +QSize(outline_width,outline_width) * 2);
318 QRectF centerBackground(
d->m_dragHandle->position - QPoint(outline_width,outline_width) / 2, QSize(
d->m_actionBarWidth -
BUTTON_SIZE,
BUTTON_SIZE) +QSize(outline_width,outline_width));
320 QPainterPath outlinePath;
321 QPainterPath contrastOutlinePath;
323 bgPath.addRoundedRect(centerBackground, cornerRadius, cornerRadius);
324 outlinePath.addRoundedRect(midOutline, cornerRadius, cornerRadius);
325 contrastOutlinePath.addRoundedRect(contrastOutline, cornerRadius, cornerRadius);
327 painter.fillPath(contrastOutlinePath, bgColorTrans);
328 painter.fillPath(outlinePath, outlineColor);
329 painter.fillPath(bgPath, bgColor);
339 if (
button == Qt::LeftButton) {
341 d->m_dragHandle->dragOrigin = pos -
d->m_dragHandle->position;
342 d->m_handleWidget->set_held(
true);
353 QWidget *canvasWidget =
d->m_viewManager->canvas();
354 QPoint newPos = pos -
d->m_dragHandle->dragOrigin;
357 canvasWidget->update();
364 d->m_handleWidget->move(
d->m_dragHandle->position.x() +
d->m_buttons.size() *
BUTTON_SIZE,
d->m_dragHandle->position.y());
365 d->m_handleWidget->show();
370 button->move(
d->m_dragHandle->position.x() + buttonPosition,
d->m_dragHandle->position.y());
378#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
387#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
396#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
397 if (touchEvent->pointCount() < 1) {
405 if (touchPoints.isEmpty()) {
415 return d->m_dragHandle->position + pos;
_Private::Traits< T >::Result imageToWidget(const T &obj) const
void setVisible(bool visible)
bool handlePress(QEvent *event, const QPoint &pos, Qt::MouseButton button=Qt::LeftButton)
void movePanelWidgets()
Moves all the widgets that are a part of the panel.
QScopedPointer< Private > d
QPoint updateCanvasBoundaries(QPoint position, QWidget *canvasWidget) const
bool eventFilter(QObject *obj, QEvent *event) override
void draw(QPainter &painter)
KisSelectionActionsPanel()=delete
QPoint tabletEventPos(const QTabletEvent *tabletEvent)
QPoint transformHandleCoords(QPoint pos)
bool handleMove(QEvent *event, const QPoint &pos)
QPoint mouseEventPos(const QMouseEvent *mouseEvent)
void canvasWidgetChanged(KisCanvasWidgetBase *canvas)
bool touchEventPos(const QTouchEvent *touchEvent, QPoint &outPos)
void drawActionBarBackground(QPainter &gc) const
QPoint initialDragHandlePosition() const
void setEnabled(bool enabled)
~KisSelectionActionsPanel()
void imageResizeToSelection()
void fillForegroundColor()
void copySelectionToNewLayer()
QWidget * canvas() const
Return the actual widget that is displaying the current image.
KisSelectionManager * selectionManager()
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
static constexpr int BUFFER_SPACE
static constexpr int BUTTON_SIZE
QString button(const QWheelEvent &ev)
void dragColor(QColor *color, const QColor &baseColor, qreal threshold)
KisSelectionManager * m_selectionManager
QScopedPointer< DragHandle > m_dragHandle
KisSelectionActionsPanelHandle * m_handleWidget
QList< KisSelectionActionsPanelButton * > m_buttons
KisViewManager * m_viewManager
static const QVector< ActionButtonData > & buttonData()
QRect selectedRect() const