24#include <QTabletEvent>
29#include <klocalizedstring.h>
30#include <ktoggleaction.h>
32#include <QApplication>
34#include <QPainterPath>
90 d->m_viewManager = viewManager;
96 connect(
button, &QAbstractButton::clicked,
d->m_selectionManager, buttonData.slot);
111 if (!selection || !
d->m_enabled || !
d->m_visible) {
120 d->m_handleWidget->draw(painter);
125 QWidget *canvasWidget =
dynamic_cast<QWidget *
>(
d->m_viewManager->canvas());
130 p_visible &=
d->m_enabled;
132 const bool VISIBILITY_CHANGED =
d->m_visible != p_visible;
133 if (!VISIBILITY_CHANGED) {
137 if (
d->m_viewManager->selection() && p_visible) {
138 d->m_handleWidget->installEventFilter(
this);
140 if (!
d->m_dragHandle) {
146 d->m_handleWidget->removeEventFilter(
this);
151 d->m_handleWidget->hide();
153 d->m_pressed =
false;
154 d->m_dragHandle.reset();
157 d->m_visible = p_visible;
162 bool configurationChanged = enabled !=
d->m_enabled;
163 d->m_enabled = enabled;
164 if (configurationChanged) {
172 switch (event->type()) {
173 case QEvent::MouseButtonPress: {
174 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>(event);
177 case QEvent::TabletPress: {
178 const QTabletEvent *tabletEvent =
static_cast<QTabletEvent *
>(event);
181 case QEvent::TouchBegin: {
182 const QTouchEvent *touchEvent =
static_cast<QTouchEvent *
>(event);
190 case QEvent::MouseMove:
192 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>(event);
196 case QEvent::TabletMove:
198 const QTabletEvent *tabletEvent =
static_cast<QTabletEvent *
>(event);
202 case QEvent::TouchUpdate:
204 const QTouchEvent *touchEvent =
static_cast<QTouchEvent *
>(event);
212 case QEvent::MouseButtonRelease:
213 case QEvent::TabletRelease:
214 case QEvent::TouchEnd:
215 case QEvent::TouchCancel:
217 d->m_handleWidget->set_held(
false);
218 d->m_pressed =
false;
234 Q_FOREACH(QWidget* btn,
d->m_buttons) {
235 btn->setParent(canvas->
widget());
239 d->m_handleWidget->setParent(canvas->
widget());
240 d->m_handleWidget->show();
245 QRect canvasBounds = canvasWidget->rect();
247 const int ACTION_BAR_WIDTH =
d->m_actionBarWidth;
251 int pos_x_max = canvasBounds.right() - ACTION_BAR_WIDTH -
BUFFER_SPACE;
254 int pos_y_max = canvasBounds.bottom() - ACTION_BAR_HEIGHT -
BUFFER_SPACE;
258 if (pos_x_max < pos_x_min) {
259 pos_x_max = pos_x_min;
263 if (pos_y_max < pos_y_min) {
264 pos_y_max = pos_y_min;
267 position.setX(qBound(pos_x_min, position.x(), pos_x_max));
268 position.setY(qBound(pos_y_min, position.y(), pos_y_max));
281 int selectionBottom = selectionBounds.bottom();
282 QPointF selectionCenter = selectionBounds.center();
283 QPointF bottomCenter(selectionCenter.x(), selectionBottom);
287 widgetBottomCenter.setX(widgetBottomCenter.x() - (
d->m_actionBarWidth / 2));
288 widgetBottomCenter.setY(widgetBottomCenter.y() +
BUFFER_SPACE);
295 const int cornerRadius = 4;
296 QColor outlineColor = Qt::darkGray;
297 const QColor bgColor = qApp->palette().window().color();
298 QColor bgColorTrans = bgColor;
299 bgColorTrans.setAlpha(80);
300 const int outline_width = 4;
303 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);
304 QRectF midOutline(
d->m_dragHandle->position - QPoint(outline_width,outline_width), QSize(
d->m_actionBarWidth,
BUTTON_SIZE) +QSize(outline_width,outline_width) * 2);
306 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));
308 QPainterPath outlinePath;
309 QPainterPath contrastOutlinePath;
311 bgPath.addRoundedRect(centerBackground, cornerRadius, cornerRadius);
312 outlinePath.addRoundedRect(midOutline, cornerRadius, cornerRadius);
313 contrastOutlinePath.addRoundedRect(contrastOutline, cornerRadius, cornerRadius);
315 painter.fillPath(contrastOutlinePath, bgColorTrans);
316 painter.fillPath(outlinePath, outlineColor);
317 painter.fillPath(bgPath, bgColor);
327 if (
button == Qt::LeftButton) {
329 d->m_dragHandle->dragOrigin = pos -
d->m_dragHandle->position;
330 d->m_handleWidget->set_held(
true);
341 QWidget *canvasWidget =
d->m_viewManager->canvas();
342 QPoint newPos = pos -
d->m_dragHandle->dragOrigin;
345 canvasWidget->update();
352 d->m_handleWidget->move(
d->m_dragHandle->position.x() +
d->m_buttons.size() *
BUTTON_SIZE,
d->m_dragHandle->position.y());
353 d->m_handleWidget->show();
358 button->move(
d->m_dragHandle->position.x() + buttonPosition,
d->m_dragHandle->position.y());
366#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
375#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
384#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
385 if (touchEvent->pointCount() < 1) {
393 if (touchPoints.isEmpty()) {
403 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
constexpr QPoint transformHandleCoords(QPoint pos)
bool eventFilter(QObject *obj, QEvent *event) override
void draw(QPainter &painter)
KisSelectionActionsPanel()=delete
QPoint tabletEventPos(const QTabletEvent *tabletEvent)
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)
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