void DrawLineAndAreaTool::setDrawingSymbol(const Symbol* symbol) { // Avoid using deleted symbol if (map()->findSymbolIndex(drawing_symbol) == -1) symbol = NULL; // End current editing if (editingInProgress()) { if (symbol) finishDrawing(); else abortDrawing(); } // Handle new symbol if (!is_helper_tool) drawing_symbol = symbol; if (!symbol) deactivate(); else if (symbol->isHidden()) deactivate(); else if ((symbol->getType() & (Symbol::Line | Symbol::Area | Symbol::Combined)) == 0) switchToDefaultDrawTool(symbol); else createPreviewPoints(); }
bool DrawRectangleTool::mouseDoubleClickEvent(QMouseEvent* event, MapCoordF map_coord, MapWidget* widget) { Q_UNUSED(map_coord); Q_UNUSED(widget); if (event->button() != Qt::LeftButton) return false; if (editingInProgress()) { // Finish drawing by double click. // As the double click is also reported as two single clicks first // (in total: press - release - press - double - release), // need to undo two steps in general. if (angles.size() > 2 && !ctrl_pressed) { undoLastPoint(); updateHover(false); } if (angles.size() <= 1) { abortDrawing(); } else { constrained_pos_map = MapCoordF(preview_path->getCoordinate(angles.size() - 1)); undoLastPoint(); finishDrawing(); } no_more_effect_on_click = true; } return true; }
bool DrawCircleTool::mouseReleaseEvent(QMouseEvent* event, MapCoordF map_coord, MapWidget* widget) { Q_UNUSED(widget); if (!isDrawingButton(event->button())) { if (event->button() == Qt::RightButton) abortDrawing(); return false; } if (!editingInProgress()) return false; updateStatusText(); if (dragging || second_point_set) { cur_pos = event->pos(); cur_pos_map = map_coord; if (dragging && !second_point_set) opposite_pos_map = map_coord; updateCircle(); finishDrawing(); return true; } return false; }
bool DrawPathTool::keyPressEvent(QKeyEvent* event) { bool key_handled = false; if (editingInProgress()) { key_handled = true; if (event->key() == Qt::Key_Escape) abortDrawing(); else if (event->key() == Qt::Key_Backspace) undoLastPoint(); else if (event->key() == Qt::Key_Return && allow_closing_paths) { if (! (event->modifiers() & Qt::ControlModifier)) closeDrawing(); finishDrawing(); } else key_handled = false; } else if (event->key() == Qt::Key_Backspace && finished_path_is_selected) { key_handled = removeLastPointFromSelectedPath(); } if (event->key() == Qt::Key_Tab) deactivate(); else if (event->key() == Qt::Key_Space) { draw_dash_points = !draw_dash_points; updateStatusText(); } else if (event->key() == Qt::Key_Control) { ctrl_pressed = true; angle_helper->setActive(true); if (editingInProgress() && !dragging) updateDrawHover(); picked_angle = false; updateStatusText(); } else if (event->key() == Qt::Key_Shift) { shift_pressed = true; if (!dragging) { updateHover(); updateDirtyRect(); } updateStatusText(); } else return key_handled; return true; }
bool DrawCircleTool::keyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Escape) abortDrawing(); else if (event->key() == Qt::Key_Tab) { deactivate(); return true; } return false; }
bool DrawCircleTool::keyPressEvent(QKeyEvent* event) { switch (event->key()) { case Qt::Key_Escape: abortDrawing(); return true; case Qt::Key_Tab: deactivate(); return true; } return false; }
bool DrawCircleTool::mousePressEvent(QMouseEvent* event, MapCoordF map_coord, MapWidget* widget) { Q_UNUSED(widget); if (isDrawingButton(event->button())) { cur_pos = event->pos(); cur_pos_map = map_coord; if (!first_point_set && event->buttons() & Qt::LeftButton) { click_pos = event->pos(); circle_start_pos_map = map_coord; opposite_pos_map = map_coord; dragging = false; first_point_set = true; start_from_center = (event->modifiers() | (key_button_bar ? key_button_bar->activeModifiers() : 0)) & Qt::ControlModifier; if (!editingInProgress()) startDrawing(); } else if (first_point_set && !second_point_set) { click_pos = event->pos(); opposite_pos_map = map_coord; dragging = false; second_point_set = true; } else return false; hidePreviewPoints(); return true; } else if (event->button() == Qt::RightButton && editingInProgress()) { abortDrawing(); return true; } return false; }
void DrawRectangleTool::undoLastPoint() { if (angles.size() == 1) { abortDrawing(); return; } deleteClosePoint(); preview_path->deleteCoordinate(preview_path->getCoordinateCount() - 1, false); if (angles.size() == 2) preview_path->deleteCoordinate(preview_path->getCoordinateCount() - 1, false); angles.pop_back(); forward_vector = MapCoordF(1, 0); forward_vector.rotate(-angles[angles.size() - 1]); angle_helper->setCenter(MapCoordF(preview_path->getCoordinate(angles.size() - 1))); updateRectangle(); }
bool DrawFreehandTool::mouseReleaseEvent(QMouseEvent* event, MapCoordF map_coord, MapWidget* widget) { Q_UNUSED(widget); if (!editingInProgress()) return false; if (!dragging) { abortDrawing(); return true; } else if (dragging && event->button() == Qt::LeftButton) { cur_pos = event->pos(); cur_pos_map = map_coord; updatePath(); finishDrawing(); return true; } return false; }
void DrawPathTool::undoLastPoint() { Q_ASSERT(editingInProgress()); if (preview_path->getCoordinateCount() <= (preview_path->parts().front().isClosed() ? 3 : (path_has_preview_point ? 2 : 1))) { abortDrawing(); return; } auto& part = preview_path->parts().back(); auto last_index = part.last_index; auto prev_coord_index = part.prevCoordIndex(part.last_index); auto prev_coord = preview_path->getCoordinate(prev_coord_index); // Pre-undo preparation if (path_has_preview_point) { if (prev_coord.isCurveStart()) { // Undo just the preview point path_has_preview_point = false; } else { // Remove the preview point from a straight edge, preparing for re-adding. Q_ASSERT(!previous_point_is_curve_point); preview_path->deleteCoordinate(last_index, false); last_index = prev_coord_index; prev_coord_index = part.prevCoordIndex(part.last_index); prev_coord = preview_path->getCoordinate(prev_coord_index); path_has_preview_point = !prev_coord.isCurveStart(); } } if (prev_coord.isCurveStart()) { // Removing last point of a curve, no re-adding of preview point. MapCoord prev_drag = preview_path->getCoordinate(prev_coord_index+1); previous_point_direction = -atan2(prev_drag.x() - prev_coord.x(), prev_coord.y() - prev_drag.y()); previous_pos_map = MapCoordF(prev_coord); previous_drag_map = MapCoordF((prev_coord.x() + prev_drag.x()) / 2, (prev_coord.y() + prev_drag.y()) / 2); previous_point_is_curve_point = true; path_has_preview_point = false; } else if (!path_has_preview_point) { // Removing last point from a straight edge, no re-adding of preview point. previous_point_is_curve_point = false; } // Actually delete the last point of the edge. preview_path->deleteCoordinate(last_index, false); if (preview_path->getRawCoordinateVector().empty()) { // Re-add first point. prev_coord.setCurveStart(false); preview_path->addCoordinate(prev_coord); } // Post-undo if (path_has_preview_point) { // Re-add preview point. preview_path->addCoordinate(MapCoord(cur_pos_map)); } else if (previous_point_is_curve_point && dragging) { cur_pos = click_pos; cur_pos_map = click_pos_map; } dragging = false; updateHover(); updatePreviewPath(); updateAngleHelper(); updateDirtyRect(); }
bool DrawRectangleTool::keyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Return) { if (editingInProgress()) { if (angles.size() <= 1) abortDrawing(); else { constrained_pos_map = MapCoordF(preview_path->getCoordinate(angles.size() - 1)); undoLastPoint(); finishDrawing(); } } } else if (event->key() == Qt::Key_Escape) { if (editingInProgress()) abortDrawing(); } else if (event->key() == Qt::Key_Backspace) { if (editingInProgress()) { undoLastPoint(); updateHover(false); } } else if (event->key() == Qt::Key_Tab) { deactivate(); } else if (event->key() == Qt::Key_Space) { draw_dash_points = !draw_dash_points; updateStatusText(); } else if (event->key() == Qt::Key_Control) { ctrl_pressed = true; if (editingInProgress() && angles.size() == 1) { angle_helper->clearAngles(); angle_helper->addDefaultAnglesDeg(0); angle_helper->setActive(true, MapCoordF(preview_path->getCoordinate(0))); if (dragging) updateRectangle(); } else if (editingInProgress() && angles.size() > 2) { // Try to snap to existing lines updateRectangle(); } updateStatusText(); } else if (event->key() == Qt::Key_Shift) { shift_pressed = true; updateHover(false); updateStatusText(); } else return false; return true; }