30#include <QTabletEvent>
35#include <klocalizedstring.h>
36#include <ktoggleaction.h>
38#include <QApplication>
40#include <QPainterPath>
101 d->m_viewManager = viewManager;
107 connect(
button, &QAbstractButton::clicked,
d->m_selectionManager, buttonData.slot);
113 connect(
d->m_handleWidget, SIGNAL(customContextMenuRequested(QPoint)),
this, SLOT(
showContextMenu(QPoint)));
115 d->disable_action =
new KisAction(i18n(
"Disable selection actions bar"));
130 if (!selection || !
d->m_enabled || !
d->m_visible) {
136 button->draw(painter, displayRendererInterface);
139 d->m_handleWidget->draw(painter, displayRendererInterface);
144 d->configure_action->setVisible(p_visible &&
d->m_enabled);
146 QWidget *canvasWidget =
dynamic_cast<QWidget *
>(
d->m_viewManager->canvas());
151 p_visible &=
d->m_enabled;
153 const bool VISIBILITY_CHANGED =
d->m_visible != p_visible;
154 if (!VISIBILITY_CHANGED) {
158 if (
d->m_viewManager->selection() && p_visible) {
159 d->m_handleWidget->installEventFilter(
this);
161 if (!
d->m_dragHandle) {
167 d->m_handleWidget->removeEventFilter(
this);
172 d->m_handleWidget->hide();
174 d->m_pressed =
false;
175 d->m_dragHandle.reset();
178 d->m_visible = p_visible;
183 d->configure_action->setVisible(enabled);
185 bool configurationChanged = enabled !=
d->m_enabled;
186 d->m_enabled = enabled;
187 if (configurationChanged) {
197 switch (event->type()) {
198 case QEvent::MouseButtonPress: {
199 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>(event);
202 case QEvent::TabletPress: {
203 const QTabletEvent *tabletEvent =
static_cast<QTabletEvent *
>(event);
206 case QEvent::TouchBegin: {
207 const QTouchEvent *touchEvent =
static_cast<QTouchEvent *
>(event);
215 case QEvent::MouseMove:
217 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>(event);
221 case QEvent::TabletMove:
223 const QTabletEvent *tabletEvent =
static_cast<QTabletEvent *
>(event);
227 case QEvent::TouchUpdate:
229 const QTouchEvent *touchEvent =
static_cast<QTouchEvent *
>(event);
237 case QEvent::MouseButtonRelease:
238 case QEvent::TabletRelease:
239 case QEvent::TouchEnd:
240 case QEvent::TouchCancel:
242 d->m_handleWidget->set_held(
false);
243 d->m_pressed =
false;
259 Q_FOREACH(QWidget* btn,
d->m_buttons) {
260 btn->setParent(canvas->
widget());
264 d->m_handleWidget->setParent(canvas->
widget());
265 d->m_handleWidget->show();
270 QRect canvasBounds = canvasWidget->rect();
272 const int ACTION_BAR_WIDTH =
d->m_actionBarWidth;
276 int pos_x_max = canvasBounds.right() - ACTION_BAR_WIDTH -
BUFFER_SPACE;
279 int pos_y_max = canvasBounds.bottom() - ACTION_BAR_HEIGHT -
BUFFER_SPACE;
283 if (pos_x_max < pos_x_min) {
284 pos_x_max = pos_x_min;
288 if (pos_y_max < pos_y_min) {
289 pos_y_max = pos_y_min;
292 position.setX(qBound(pos_x_min, position.x(), pos_x_max));
293 position.setY(qBound(pos_y_min, position.y(), pos_y_max));
306 int selectionBottom = selectionBounds.bottom();
307 QPointF selectionCenter = selectionBounds.center();
308 QPointF bottomCenter(selectionCenter.x(), selectionBottom);
312 widgetBottomCenter.setX(widgetBottomCenter.x() - (
d->m_actionBarWidth / 2));
313 widgetBottomCenter.setY(widgetBottomCenter.y() +
BUFFER_SPACE);
320 const int cornerRadius = 4;
321 QColor outlineColor = qApp->palette().window().color();
323 QColor bgColor = qApp->palette().window().color();
327 bgColor = bgColor.lighter(120);
339 QColor bgColorTrans = bgColor;
340 bgColorTrans.setAlpha(80);
341 const int outline_width = 4;
344 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);
345 QRectF midOutline(
d->m_dragHandle->position - QPoint(outline_width,outline_width), QSize(
d->m_actionBarWidth,
BUTTON_SIZE) +QSize(outline_width,outline_width) * 2);
347 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));
349 QPainterPath outlinePath;
350 QPainterPath contrastOutlinePath;
352 bgPath.addRoundedRect(centerBackground, cornerRadius, cornerRadius);
353 outlinePath.addRoundedRect(midOutline, cornerRadius, cornerRadius);
354 contrastOutlinePath.addRoundedRect(contrastOutline, cornerRadius, cornerRadius);
356 painter.fillPath(contrastOutlinePath, bgColorTrans);
357 painter.fillPath(outlinePath, outlineColor);
358 painter.fillPath(bgPath, bgColor);
368 if (
button == Qt::LeftButton) {
370 d->m_dragHandle->dragOrigin = pos -
d->m_dragHandle->position;
371 d->m_handleWidget->set_held(
true);
382 QWidget *canvasWidget =
d->m_viewManager->canvas();
383 QPoint newPos = pos -
d->m_dragHandle->dragOrigin;
386 canvasWidget->update();
393 d->m_handleWidget->move(
d->m_dragHandle->position.x() +
d->m_buttons.size() *
BUTTON_SIZE,
d->m_dragHandle->position.y());
394 d->m_handleWidget->show();
399 button->move(
d->m_dragHandle->position.x() + buttonPosition,
d->m_dragHandle->position.y());
407#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
416#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
425#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
426 if (touchEvent->pointCount() < 1) {
434 if (touchPoints.isEmpty()) {
444 return d->m_dragHandle->position + pos;
449 QMenu menu = QMenu();
450 menu.addAction(
d->disable_action);
451 menu.addAction(
d->configure_action);
KisAction * actionByName(const QString &name) const
KisActionManager * actionManager
static KisConfigNotifier * instance()
void notifyConfigChanged(void)
void setSelectionActionBar(bool value)
_Private::Traits< T >::Result imageToWidget(const T &obj) const
void showContextMenu(const QPoint &pos)
void disableSelectionActionsPanel()
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 configureSelectionActionsPanel()
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)
void draw(QPainter &painter, const KoColorDisplayRendererInterface *displayRendererInterface)
bool touchEventPos(const QTouchEvent *touchEvent, QPoint &outPos)
void drawActionBarBackground(QPainter &gc, const KoColorDisplayRendererInterface *displayRendererInterface) const
QPoint initialDragHandlePosition() const
void setEnabled(bool enabled)
~KisSelectionActionsPanel()
void imageResizeToSelection()
void fillForegroundColor()
void copySelectionToNewLayer()
KisActionManager * actionManager() const
QWidget * canvas() const
Return the actual widget that is displaying the current image.
KisSelectionManager * selectionManager()
virtual QColor convertColorToDisplayColorSpace(const KoColor color) const =0
convertColorToDisplayColorSpace
void fromQColor(const QColor &c)
Convenient function for converting from a QColor.
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
KisAction * configure_action
KisViewManager * m_viewManager
KisAction * disable_action
static const QVector< ActionButtonData > & buttonData()
QRect selectedRect() const