87 ApplyToPixelSelection(
KisView *view,
91 m_selection(selection),
110 bool hasSelection = !pixelSelection->
isEmpty();
135 pixelSelection->
setDirty(dirtyRect);
150 savedCommand = deselectCommand;
165 shapes.append(shape);
175 i18n(
"Shape selection does not fully "
176 "support wraparound mode. Please "
177 "use pixel selection instead"),
190 ClearPixelSelection(
KisView *view) : m_view(view) {}
199 pixelSelection->
clear();
225 if (shapeSelection ||
231 if (shapeSelection) {
232 existingShapes = shapeSelection->
shapes();
234 path1.setFillRule(Qt::WindingFill);
235 Q_FOREACH(
KoShape *shape, existingShapes) {
244 path2.setFillRule(Qt::WindingFill);
245 Q_FOREACH(
KoShape *shape, m_shapes) {
249 const QTransform booleanWorkaroundTransform =
252 path1 = booleanWorkaroundTransform.map(path1);
253 path2 = booleanWorkaroundTransform.map(path2);
255 QPainterPath path = path2;
264 path = path1 & path2;
268 path = path1 | path2;
272 path = path1 - path2;
275 path = (path1 | path2) - (path1 & path2);
279 path = booleanWorkaroundTransform.inverted().map(path);
286 if (!existingShapes.isEmpty()) {
291 if (path.isEmpty()) {
298 resultCommand = parentCommand;
305 if (!resultCommand) {
309 Q_FOREACH(
KoShape *shape, m_shapes) {
317 return resultCommand;
344 QTimer::singleShot(0,
m_canvas->viewManager()->selectionManager(), SLOT(deselect()));
354 QMenu *m_contextMenu =
new QMenu();
358 m_contextMenu->addSection(i18n(
"Selection Actions"));
359 m_contextMenu->addSeparator();
361 m_contextMenu->addAction(actionCollection->
action(
"select_all"));
362 m_contextMenu->addAction(actionCollection->
action(
"deselect"));
363 m_contextMenu->addAction(actionCollection->
action(
"reselect"));
364 m_contextMenu->addAction(actionCollection->
action(
"invert_selection"));
367 m_contextMenu->addSeparator();
369 m_contextMenu->addAction(actionCollection->
action(
"cut_selection_to_new_layer"));
370 m_contextMenu->addAction(actionCollection->
action(
"copy_selection_to_new_layer"));
372 m_contextMenu->addSeparator();
376 m_contextMenu->addAction(actionCollection->
action(
"edit_selection"));
379 m_contextMenu->addAction(actionCollection->
action(
"convert_to_vector_selection"));
381 m_contextMenu->addAction(actionCollection->
action(
"convert_to_raster_selection"));
384 m_contextMenu->addAction(actionCollection->
action(
"convert_selection_to_shape"));
386 QMenu *transformMenu = m_contextMenu->addMenu(i18n(
"Transform"));
387 transformMenu->addAction(actionCollection->
action(
"KisToolTransform"));
388 transformMenu->addAction(actionCollection->
action(
"selectionscale"));
389 transformMenu->addAction(actionCollection->
action(
"growselection"));
390 transformMenu->addAction(actionCollection->
action(
"shrinkselection"));
391 transformMenu->addAction(actionCollection->
action(
"borderselection"));
392 transformMenu->addAction(actionCollection->
action(
"smoothselection"));
393 transformMenu->addAction(actionCollection->
action(
"featherselection"));
394 transformMenu->addAction(actionCollection->
action(
"stroke_selection"));
396 m_contextMenu->addSeparator();
399 m_contextMenu->addAction(actionCollection->
action(
"resizeimagetoselection"));
401 m_contextMenu->addSeparator();
403 m_contextMenu->addAction(actionCollection->
action(
"toggle_display_selection"));
404 m_contextMenu->addAction(actionCollection->
action(
"show-global-selection-mask"));
406 return m_contextMenu;
412 if (activeSelection) {
KisViewManager * viewManager() const
QRectF imageRectInDocumentPixels() const
QRect bounds() const override
bool wrapAroundModePermitted() const
A container for a set of QAction objects.
QAction * action(int index) const
void setDirty(const QRect &rc)
@ SUPPORTS_WRAPAROUND_MODE
void applyCommand(KUndo2Command *command, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
KUndo2Command * endAndTake()
KisSelectionSP selection()
virtual KisKActionCollection * actionCollection() const
bool selectionEditable()
Checks if the current global or local selection is editable.
KisCanvas2 * canvasBase() const
KisCoordinatesConverter viewConverter
KisImageWSP image() const
KisSelectionSP selection()
QPointer< KoShapeController > shapeController
static KoPathShape * createShapeFromPainterPath(const QPainterPath &path)
Creates path shape from given QPainterPath.
QList< KoShape * > shapes() const
KoShapeUserData * userData() const
virtual QPainterPath outline() const
QTransform absoluteTransformation() const
void setUserData(KoShapeUserData *userData)
#define KIS_ASSERT_RECOVER(cond)
#define KIS_SAFE_ASSERT_RECOVER(cond)
auto maxDimension(Size size) -> decltype(size.width())
QIcon loadIcon(const QString &name)
QTransform pathShapeBooleanSpaceWorkaround(KisImageSP image)
QPainterPath tryCloseTornSubpathsAfterIntersection(QPainterPath path)
void addCommand(KUndo2Command *cmd)
bool isEmpty() const override
void clear(const QRect &r)
QRect selectedExactRect() const
QRect selectedRect() const
void applySelection(KisPixelSelectionSP selection, SelectionAction action)
void updateProjection(const QRect &rect)
KisPixelSelectionSP pixelSelection
KisSelectionComponent * shapeSelection
bool hasShapeSelection() const
QRect selectedExactRect() const
Slow, but exact way of determining the rectangle that encloses the selection.
KUndo2Command * paint() override
LazyInitGlobalSelection(KisView *view)