9#include <QDesktopServices>
15#include <QApplication>
42 setObjectName(
"ToolReferenceImages");
59 if (referenceImageLayer) {
80 if (referenceImagesLayer) {
105 dialog.setCaption(i18n(
"Select a Reference Image"));
107 QStringList locations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
108 if (!locations.isEmpty()) {
109 dialog.setDefaultDir(locations.first());
112 QString filename = dialog.filename();
113 if (filename.isEmpty())
return;
114 if (!QFileInfo(filename).exists())
return;
118 if (
document()->referenceImagesLayer()) {
119 reference->setZIndex(
document()->referenceImagesLayer()->shapes().size());
146 if (
document()->referenceImagesLayer()) {
151 if (
canvas()->canvasWidget()) {
152 QMessageBox::critical(
canvas()->canvasWidget(), i18nc(
"@title:window",
"Krita"), i18n(
"Could not load reference image from clipboard"));
162 if (
koSelection()->selectedEditableShapes().isEmpty())
return;
172 canvas()->
addCommand(layer->removeReferenceImages(document(), layer->shapes()));
181 dialog.setMimeTypeFilters(
QStringList() <<
"application/x-krita-reference-images");
182 dialog.setCaption(i18n(
"Load Reference Images"));
184 QStringList locations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
185 if (!locations.isEmpty()) {
186 dialog.setDefaultDir(locations.first());
189 QString filename = dialog.filename();
190 if (filename.isEmpty())
return;
191 if (!QFileInfo(filename).exists())
return;
193 QFile file(filename);
194 if (!file.open(QIODevice::ReadOnly)) {
195 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"), i18n(
"Could not open '%1'.", filename));
201 int currentZIndex = 0;
202 if (
document()->referenceImagesLayer()) {
206 if (collection.
load(&file)) {
209 reference->setZIndex(currentZIndex);
210 shapes.append(reference);
216 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"), i18n(
"Could not load reference images from '%1'.", filename));
223 KisCursorOverrideLock cursorLock(Qt::BusyCursor);
226 if (!layer || layer->shapeCount() == 0)
return;
232 QString mimetype =
"application/x-krita-reference-images";
233 dialog.setMimeTypeFilters(
QStringList() << mimetype, mimetype);
234 dialog.setCaption(i18n(
"Save Reference Images"));
236 QStringList locations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
237 if (!locations.isEmpty()) {
238 dialog.setDefaultDir(locations.first());
241 QString filename = dialog.filename();
242 if (filename.isEmpty())
return;
245 if (fileMime !=
"application/x-krita-reference-images") {
246 filename.append(filename.endsWith(
".") ?
"krf" :
".krf");
249 QFile file(filename);
250 if (!file.open(QIODevice::WriteOnly)) {
251 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"), i18n(
"Could not open '%1' for saving.", filename));
256 bool ok = collection.
save(&file);
260 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"), i18n(
"Failed to save reference images."));
285 specialSpacer->setObjectName(
"SpecialSpacer");
286 specialSpacer->setFixedSize(0, 0);
306 return manager ? manager->selection() :
nullptr;
311 action(
"object_group")->setEnabled(
false);
312 action(
"object_unite")->setEnabled(
false);
313 action(
"object_intersect")->setEnabled(
false);
314 action(
"object_subtract")->setEnabled(
false);
315 action(
"object_split")->setEnabled(
false);
316 action(
"object_ungroup")->setEnabled(
false);
326 if (!shapes.empty()) {
338 QMenu *transform =
m_contextMenu->addMenu(i18n(
"Transform"));
340 transform->addAction(
action(
"object_transform_rotate_90_cw"));
341 transform->addAction(
action(
"object_transform_rotate_90_ccw"));
342 transform->addAction(
action(
"object_transform_rotate_180"));
343 transform->addSeparator();
344 transform->addAction(
action(
"object_transform_mirror_horizontally"));
345 transform->addAction(
action(
"object_transform_mirror_vertically"));
346 transform->addSeparator();
347 transform->addAction(
action(
"object_transform_reset"));
375 if (!shapes.isEmpty()) {
379 QClipboard *cb = QApplication::clipboard();
380 cb->setImage(reference->
getImage());
411 return kisCanvas->imageView()->document();
420 actionNames <<
"object_order_front"
421 <<
"object_order_raise"
422 <<
"object_order_lower"
423 <<
"object_order_back"
424 <<
"object_transform_rotate_90_cw"
425 <<
"object_transform_rotate_90_ccw"
426 <<
"object_transform_rotate_180"
427 <<
"object_transform_mirror_horizontally"
428 <<
"object_transform_mirror_vertically"
429 <<
"object_transform_reset";
431 Q_FOREACH(QAction *action, defaultActions) {
432 if (actionNames.contains(action->objectName())) {
QList< QString > QStringList
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisCoordinatesConverter * coordinatesConverter
KisViewManager * viewManager() const
KisSharedPtr< KisReferenceImagesLayer > referenceImagesLayer() const
void sigReferenceImagesLayerChanged(KisSharedPtr< KisReferenceImagesLayer > layer)
static QString mimeTypeForFile(const QString &file, bool checkExistingFiles=true)
Find the mimetype for the given filename. The filename must include a suffix.
void createReferenceImageFromVisible()
void createReferenceImageFromLayer()
const QVector< KisReferenceImage * > & referenceImages() const
The KisReferenceImage class represents a single reference image.
static KisReferenceImage * fromFile(const QString &filename, const KisCoordinatesConverter &converter, QWidget *parent)
static KisReferenceImage * fromClipboard(const KisCoordinatesConverter &converter)
static KUndo2Command * addReferenceImages(KisDocument *document, QList< KoShape * > referenceImages)
KoShapeManager * shapeManager() const
KisNodeManager * nodeManager() const
The node manager handles everything about nodes.
KisSharedPtr< T > toStrongRef() const
toStrongRef returns a KisSharedPtr which may be dereferenced.
virtual void addCommand(KUndo2Command *command)=0
void deselectAll()
clear the selections list
void select(KoShape *shape)
int count() const
return the selection count, i.e. the number of all selected shapes
const QList< KoShape * > selectedShapes() const
QList< KoShape * > shapes() const
void setZIndex(qint16 zIndex)
bool isSelectable() const
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_ASSERT_RECOVER_RETURN(cond)