124 QWidget *canvasWidget =
dynamic_cast<QWidget *
>(
d->m_viewManager->canvas());
129 p_visible &=
d->m_enabled;
131 const bool VISIBILITY_CHANGED =
d->m_visible != p_visible;
132 if (!VISIBILITY_CHANGED) {
136 if (
d->m_viewManager->selection() && p_visible) {
137 canvasWidget->installEventFilter(
this);
139 if (!
d->m_dragHandle) {
144 for (QPushButton *
button :
d->m_buttons) {
145 button->setParent(canvasWidget);
148 canvasWidget->removeEventFilter(
this);
150 for (QPushButton *
button :
d->m_buttons) {
154 d->m_dragHandle.reset();
157 d->m_visible = p_visible;
172 bool eventHandled =
false;
174 bool focusInEvent =
event->type() == QEvent::FocusIn;
175 if (focusInEvent && !eventHandled) {
180 bool clickEvent =
event->type() == QEvent::MouseButtonPress ||
event->type() == QEvent::TabletPress ||
event->type() == QEvent::TouchBegin;
181 if (clickEvent && !eventHandled ) {
182 QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>(event);
183 QRect dragHandleRect(
d->m_dragHandle->position, QSize(25 * (
d->m_buttonCount), 25));
184 if (dragHandleRect.contains(mouseEvent->pos())) {
185 d->m_dragging =
true;
186 d->m_dragHandle->dragOrigin = mouseEvent->pos() -
d->m_dragHandle->position;
193 bool dragEvent =
d->m_dragging && (
event->type() == QEvent::MouseMove ||
event->type() == QEvent::TouchUpdate);
195 if (dragEvent && !eventHandled) {
196 QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>(event);
197 QPoint newPos = mouseEvent->pos() -
d->m_dragHandle->dragOrigin;
200 QWidget *canvasWidget =
dynamic_cast<QWidget *
>(
d->m_viewManager->canvas());
202 if (obj == canvasWidget) {
204 canvasWidget->update();
210 bool releaseEvent =
d->m_dragging && (
event->type() == QEvent::MouseButtonRelease ||
event->type() == QEvent::TabletRelease ||
event->type() == QEvent::TouchEnd);
212 if (releaseEvent &&
d->m_dragging) {
213 d->m_dragging =
false;
222 QRect canvasBounds = canvasWidget->rect();
224 const int ACTION_BAR_WIDTH =
d->m_actionBarWidth;
227 position.setX(qBound(canvasBounds.left() +
BUFFER_SPACE,
229 canvasBounds.right() - ACTION_BAR_WIDTH -
BUFFER_SPACE));
233 canvasBounds.bottom() - ACTION_BAR_HEIGHT -
BUFFER_SPACE));
246 int selectionBottom = selectionBounds.bottom();
247 QPointF selectionCenter = selectionBounds.center();
248 QPointF bottomCenter(selectionCenter.x(), selectionBottom);
252 widgetBottomCenter.setX(widgetBottomCenter.x() - (
d->m_actionBarWidth / 2));
253 widgetBottomCenter.setY(widgetBottomCenter.y() +
BUFFER_SPACE);
269 const int CORNER_RADIUS = 4;
270 const int PEN_WIDTH = 5;
271 const QColor BACKGROUND_COLOR = Qt::darkGray;
272 const QColor OUTLINE_COLOR(60, 60, 60, 80);
273 const QColor DOT_COLOR = Qt::lightGray;
274 const int DOT_SIZE = 4;
275 const int DOT_SPACING = 5;
276 const QPoint DRAG_HANDLE_RECT_DOTS_OFFSET(10, 10);
278 QRectF actionBarRect(
d->m_dragHandle->position, QSize(
d->m_actionBarWidth,
BUTTON_SIZE));
280 bgPath.addRoundedRect(actionBarRect, CORNER_RADIUS, CORNER_RADIUS);
281 painter.fillPath(bgPath, BACKGROUND_COLOR);
283 QPen pen(OUTLINE_COLOR);
284 pen.setWidth(PEN_WIDTH);
286 painter.drawPath(bgPath);
288 QRectF dragHandleRect(
289 QPoint(
d->m_dragHandle->position.x() +
d->m_actionBarWidth -
BUTTON_SIZE,
d->m_dragHandle->position.y()),
291 QPainterPath dragHandlePath;
292 dragHandlePath.addRect(dragHandleRect);
293 painter.fillPath(dragHandlePath, BACKGROUND_COLOR);
295 const std::list<std::pair<int, int>> DOT_OFFSETS = {{0, 0},
300 {DOT_SPACING, DOT_SPACING},
301 {DOT_SPACING, -DOT_SPACING},
302 {-DOT_SPACING, DOT_SPACING},
303 {-DOT_SPACING, -DOT_SPACING}};
305 QPainterPath dragHandleRectDots;
306 for (
const std::pair<int, int> &offset : DOT_OFFSETS) {
307 dragHandleRectDots.addEllipse(offset.first, offset.second, DOT_SIZE, DOT_SIZE);
310 dragHandleRectDots.translate(dragHandleRect.topLeft() + DRAG_HANDLE_RECT_DOTS_OFFSET);
311 painter.fillPath(dragHandleRectDots, DOT_COLOR);