summaryrefslogtreecommitdiffstats
path: root/krita/ui/kis_doc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'krita/ui/kis_doc.cc')
-rw-r--r--krita/ui/kis_doc.cc1171
1 files changed, 0 insertions, 1171 deletions
diff --git a/krita/ui/kis_doc.cc b/krita/ui/kis_doc.cc
deleted file mode 100644
index 2a7d1300..00000000
--- a/krita/ui/kis_doc.cc
+++ /dev/null
@@ -1,1171 +0,0 @@
-/*
- * Copyright (c) 1999 Matthias Elter <me@kde.org>
- * Copyright (c) 2000 John Califf <jcaliff@compuzone.net>
- * Copyright (c) 2001 Toshitaka Fujioka <fujioka@kde.org>
- * Copyright (c) 2002, 2003 Patrick Julien <freak@codepimps.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-// TQt
-#include <tqapplication.h>
-#include <tqdom.h>
-#include <tqimage.h>
-#include <tqpainter.h>
-#include <tqtl.h>
-#include <tqstringlist.h>
-#include <tqwidget.h>
-#include <tqpaintdevicemetrics.h>
-
-// KDE
-#include <dcopobject.h>
-#include <kapplication.h>
-#include <kcommand.h>
-#include <kdebug.h>
-#include <kimageio.h>
-#include <kfiledialog.h>
-#include <kglobal.h>
-#include <kmimetype.h>
-#include <knotifyclient.h>
-#include <klocale.h>
-#include <kmessagebox.h>
-
-// KOffice
-#include <KoFilterManager.h>
-#include <KoMainWindow.h>
-#include <KoQueryTrader.h>
-#include <KoStore.h>
-#include <KoStoreDevice.h>
-#include <KoTemplateChooseDia.h>
-#include <KoApplication.h>
-#include <KoCommandHistory.h>
-
-// Local
-#include <kis_clipboard.h>
-#include <kis_meta_registry.h>
-#include "kis_annotation.h"
-#include "kis_types.h"
-#include "kis_config.h"
-#include "kis_debug_areas.h"
-#include "kis_doc.h"
-#include "kis_factory.h"
-#include "kis_image.h"
-#include "kis_layer.h"
-#include "kis_paint_layer.h"
-#include "kis_nameserver.h"
-#include "kis_painter.h"
-#include "kis_selection.h"
-#include "kis_fill_painter.h"
-#include "kis_command.h"
-#include "kis_view.h"
-#include "kis_colorspace.h"
-#include "kis_colorspace_factory_registry.h"
-#include "kis_profile.h"
-#include "kis_id.h"
-#include "kis_part_layer.h"
-#include "kis_doc_iface.h"
-#include "kis_paint_device_action.h"
-#include "kis_custom_image_widget.h"
-#include "kis_load_visitor.h"
-#include "kis_save_visitor.h"
-#include "kis_savexml_visitor.h"
-
-static const char *CURRENT_DTD_VERSION = "1.3";
-
-/**
- * Mime type for this app - not same as file type, but file types
- * can be associated with a mime type and are opened with applications
- * associated with the same mime type
- */
-#define APP_MIMETYPE "application/x-krita"
-
-/**
- * Mime type for native file format
- */
-#define NATIVE_MIMETYPE "application/x-kra"
-
-namespace {
- class KisCommandImageMv : public KisCommand {
- typedef KisCommand super;
-
- public:
- KisCommandImageMv(KisDoc *doc,
- KisUndoAdapter *adapter,
- const TQString& name,
- const TQString& oldName) : super(i18n("Rename Image"), adapter)
- {
- m_doc = doc;
- m_name = name;
- m_oldName = oldName;
- }
-
- virtual ~KisCommandImageMv()
- {
- }
-
- virtual void execute()
- {
- adapter()->setUndo(false);
- m_doc->renameImage(m_oldName, m_name);
- adapter()->setUndo(true);
- }
-
- virtual void unexecute()
- {
- adapter()->setUndo(false);
- m_doc->renameImage(m_name, m_oldName);
- adapter()->setUndo(true);
- }
-
- private:
- KisDoc *m_doc;
- TQString m_name;
- TQString m_oldName;
- };
-
-}
-
-KisDoc::KisDoc(TQWidget *tqparentWidget, const char *widgetName, TQObject *tqparent, const char *name, bool singleViewMode) :
- super(tqparentWidget, widgetName, tqparent, name, singleViewMode)
-{
-
- m_undo = false;
- m_dcop = 0;
- m_cmdHistory = 0;
- m_nserver = 0;
- m_currentImage = 0;
- m_currentMacro = 0;
- m_macroNestDepth = 0;
- m_ioProgressBase = 0;
- m_ioProgressTotalSteps = 0;
-
- setInstance( KisFactory::instance(), false );
- setTemplateType( "krita_template" );
-
- init();
-
- if (name)
- dcopObject();
-}
-
-KisDoc::~KisDoc()
-{
- delete m_cmdHistory;
- delete m_nserver;
- m_undoListeners.setAutoDelete(false);
- delete m_dcop;
-}
-
-TQCString KisDoc::mimeType() const
-{
- return APP_MIMETYPE;
-}
-
-DCOPObject *KisDoc::dcopObject()
-{
- if (!m_dcop) {
- m_dcop = new KisDocIface(this);
- Q_CHECK_PTR(m_dcop);
- }
- return m_dcop;
-}
-
-bool KisDoc::initDoc(InitDocFlags flags, TQWidget* tqparentWidget)
-{
- if (!init())
- return false;
-
- bool ok = false;
-
- TQString file;
- KoTemplateChooseDia::DialogType dlgtype;
-
- if (flags != KoDocument::InitDocFileNew) {
- dlgtype = KoTemplateChooseDia::Everything;
- } else {
- dlgtype = KoTemplateChooseDia::OnlyTemplates;
- }
-
- KoTemplateChooseDia::ReturnType ret =
- KoTemplateChooseDia::choose(KisFactory::instance(),
- file,
- dlgtype,
- "krita_template",
- tqparentWidget);
- setUndo(false);
-
- if (ret == KoTemplateChooseDia::Template) {
- resetURL();
- ok = loadNativeFormat( file );
- setEmpty();
- ok = true;
-
- } else if (ret == KoTemplateChooseDia::File) {
- KURL url( file );
- ok = openURL(url);
- } else if (ret == KoTemplateChooseDia::Empty) {
- setEmpty();
- ok = true;
- }
-
- setModified(false);
- KisConfig cfg;
- setUndo(cfg.undoEnabled());
-
- return ok;
-}
-
-void KisDoc::openExistingFile(const TQString& file)
-{
- setUndo(false);
-
- KoDocument::openExistingFile(file);
-
- setUndo(true);
-}
-
-void KisDoc::openTemplate(const TQString& file)
-{
- setUndo(false);
-
- KoDocument::openTemplate(file);
-
- setUndo(true);
-}
-
-bool KisDoc::init()
-{
- if (m_cmdHistory) {
- delete m_cmdHistory;
- m_cmdHistory = 0;
- }
-
- if (m_nserver) {
- delete m_nserver;
- m_nserver = 0;
- }
-
- m_cmdHistory = new KoCommandHistory(actionCollection(), true);
- Q_CHECK_PTR(m_cmdHistory);
-
- connect(m_cmdHistory, TQT_SIGNAL(documentRestored()), this, TQT_SLOT(slotDocumentRestored()));
- connect(m_cmdHistory, TQT_SIGNAL(commandExecuted(KCommand *)), this, TQT_SLOT(slotCommandExecuted(KCommand *)));
- setUndo(true);
-
- m_nserver = new KisNameServer(i18n("Image %1"), 1);
- Q_CHECK_PTR(m_nserver);
-
- if (!KisMetaRegistry::instance()->csRegistry()->exists(KisID("RGBA",""))) {
- KMessageBox::sorry(0, i18n("No colorspace modules loaded: cannot run Krita"));
- return false;
- }
-
- m_undoListeners.setAutoDelete(false);
-
- return true;
-}
-
-TQDomDocument KisDoc::saveXML()
-{
- TQDomDocument doc = createDomDocument("DOC", CURRENT_DTD_VERSION);
- TQDomElement root = doc.documentElement();
-
- root.setAttribute("editor", "Krita");
- root.setAttribute("depth", sizeof(TQ_UINT8));
- root.setAttribute("syntaxVersion", "1");
-
- root.appendChild(saveImage(doc, m_currentImage));
-
- return doc;
-}
-
-bool KisDoc::loadOasis( const TQDomDocument&, KoOasisStyles&, const TQDomDocument&, KoStore* )
-{
- //XXX: todo (and that includes defining an OASIS format for layered 2D raster data!)
- return false;
-}
-
-
-bool KisDoc::saveOasis( KoStore*, KoXmlWriter* )
-{
- //XXX: todo (and that includes defining an OASIS format for layered 2D raster data!)
- return false;
-}
-
-bool KisDoc::loadXML(TQIODevice *, const TQDomDocument& doc)
-{
- TQDomElement root;
- TQString attr;
- TQDomNode node;
- KisImageSP img;
-
- if (!init())
- return false;
- if (doc.doctype().name() != "DOC")
- return false;
- root = doc.documentElement();
- attr = root.attribute("syntaxVersion");
- if (attr.toInt() > 1)
- return false;
- if ((attr = root.attribute("depth")).isNull())
- return false;
- m_conversionDepth = attr.toInt();
-
- if (!root.hasChildNodes()) {
- return false; // XXX used to be: return slotNewImage();
- }
-
- setUndo(false);
-
- for (node = root.firstChild(); !node.isNull(); node = node.nextSibling()) {
- if (node.isElement()) {
- if (node.nodeName() == "IMAGE") {
- TQDomElement elem = node.toElement();
- if (!(img = loadImage(elem)))
- return false;
- m_currentImage = img;
- } else {
- return false;
- }
- }
- }
-
- emit loadingFinished();
- return true;
-}
-
-bool KisDoc::loadChildren(KoStore* store) {
- TQPtrListIterator<KoDocumentChild> it(tqchildren());
- for( ; it.current(); ++it ) {
- if (!it.current()->loadDocument(store)) {
- return false;
- }
- }
- return true;
-}
-
-TQDomElement KisDoc::saveImage(TQDomDocument& doc, KisImageSP img)
-{
- TQDomElement image = doc.createElement("IMAGE");
-
- Q_ASSERT(img);
- image.setAttribute("name", img->name());
- image.setAttribute("mime", "application/x-kra");
- image.setAttribute("width", img->width());
- image.setAttribute("height", img->height());
- image.setAttribute("colorspacename", img->colorSpace()->id().id());
- image.setAttribute("description", img->description());
- // XXX: Save profile as blob inside the image, instead of the product name.
- if (img->getProfile() && img->getProfile()-> valid())
- image.setAttribute("profile", img->getProfile()->productName());
- image.setAttribute("x-res", img->xRes());
- image.setAttribute("y-res", img->yRes());
-
- TQ_UINT32 count=0;
- KisSaveXmlVisitor visitor(doc, image, count, true);
-
- m_currentImage->rootLayer()->accept(visitor);
-
- return image;
-}
-
-KisImageSP KisDoc::loadImage(const TQDomElement& element)
-{
-
- KisConfig cfg;
- TQString attr;
- TQDomNode node;
- TQDomNode child;
- KisImageSP img;
- TQString name;
- TQ_INT32 width;
- TQ_INT32 height;
- TQString description;
- TQString profileProductName;
- double xres;
- double yres;
- TQString colorspacename;
- KisColorSpace * cs;
-
- if ((attr = element.attribute("mime")) == NATIVE_MIMETYPE) {
- if ((name = element.attribute("name")).isNull())
- return 0;
- if ((attr = element.attribute("width")).isNull())
- return 0;
- width = attr.toInt();
- if ((attr = element.attribute("height")).isNull())
- return 0;
- height = attr.toInt();
-
- description = element.attribute("description");
-
- if ((attr = element.attribute("x-res")).isNull())
- xres = 100.0;
- xres = attr.toDouble();
-
- if ((attr = element.attribute("y-res")).isNull())
- yres = 100.0;
- yres = attr.toDouble();
-
- if ((colorspacename = element.attribute("colorspacename")).isNull())
- {
- // An old file: take a reasonable default.
- // Krita didn't support anything else in those
- // days anyway.
- colorspacename = "RGBA";
- }
-
- // A hack for an old colorspacename
- if (colorspacename == "Grayscale + Alpha")
- colorspacename = "GRAYA";
-
- if ((profileProductName = element.attribute("profile")).isNull()) {
- // no mention of profile so get default profile
- cs = KisMetaRegistry::instance()->csRegistry()->getColorSpace(colorspacename,"");
- }
- else {
- cs = KisMetaRegistry::instance()->csRegistry()->getColorSpace(colorspacename, profileProductName);
- }
-
- if (cs == 0) {
- kdWarning(DBG_AREA_FILE) << "Could not open colorspace\n";
- return 0;
- }
-
- img = new KisImage(this, width, height, cs, name);
- img->blockSignals(true); // Don't send out signals while we're building the image
- Q_CHECK_PTR(img);
- connect( img, TQT_SIGNAL( sigImageModified() ), this, TQT_SLOT( slotImageUpdated() ));
- img->setDescription(description);
- img->setResolution(xres, yres);
-
- loadLayers(element, img, img->rootLayer().data());
-
- }
-
- img->notifyImageLoaded();
-
- return img;
-}
-
-void KisDoc::loadLayers(const TQDomElement& element, KisImageSP img, KisGroupLayerSP tqparent)
-{
- TQDomNode node = element.firstChild();
- TQDomNode child;
-
- if(!node.isNull())
- {
- if (node.isElement()) {
- if (node.nodeName() == "LAYERS") {
- for (child = node.firstChild(); !child.isNull(); child = child.nextSibling()) {
- KisLayerSP layer = loadLayer(child.toElement(), img);
-
- if (!layer) {
- kdWarning(DBG_AREA_FILE) << "Could not load layer\n";
- }
- else {
- img->nextLayerName(); // Make sure the nameserver is current with the number of layers.
- img->addLayer(layer, tqparent, 0);
- }
- }
- }
- }
- }
-}
-
-KisLayerSP KisDoc::loadLayer(const TQDomElement& element, KisImageSP img)
-{
- // Nota bene: If you add new properties to layers, you should
- // ALWAYS define a default value in case the property is not
- // present in the layer definition: this helps a LOT with backward
- // compatibilty.
- TQString attr;
- TQString name;
- TQ_INT32 x;
- TQ_INT32 y;
- TQ_INT32 opacity;
- bool visible;
- bool locked;
-
- if ((name = element.attribute("name")).isNull())
- return 0;
-
- if ((attr = element.attribute("x")).isNull())
- return 0;
- x = attr.toInt();
-
- if ((attr = element.attribute("y")).isNull())
- return 0;
-
- y = attr.toInt();
-
- if ((attr = element.attribute("opacity")).isNull())
- return 0;
-
- if ((opacity = attr.toInt()) < 0 || opacity > TQ_UINT8_MAX)
- opacity = OPACITY_OPAQUE;
-
-
- TQString compositeOpName = element.attribute("compositeop");
- KisCompositeOp compositeOp;
-
- if (compositeOpName.isNull()) {
- compositeOp = COMPOSITE_OVER;
- } else {
- compositeOp = KisCompositeOp(compositeOpName);
- }
-
- if (!compositeOp.isValid()) {
- return 0;
- }
-
- if ((attr = element.attribute("visible")).isNull())
- attr = "1";
-
- visible = attr == "0" ? false : true;
-
- if ((attr = element.attribute("locked")).isNull())
- attr = "0";
-
- locked = attr == "0" ? false : true;
-
- // Now find out the layer type and do specific handling
- if ((attr = element.attribute("layertype")).isNull())
- return loadPaintLayer(element, img, name, x, y, opacity, visible, locked, compositeOp) ;
-
- if(attr == "paintlayer")
- return loadPaintLayer(element, img, name, x, y, opacity, visible, locked, compositeOp);
-
- if(attr == "grouplayer")
- return loadGroupLayer(element, img, name, x, y, opacity, visible, locked, compositeOp).data();
-
- if(attr == "adjustmentlayer")
- return loadAdjustmentLayer(element, img, name, x, y, opacity, visible, locked, compositeOp).data();
-
- if(attr == "partlayer")
- return loadPartLayer(element, img, name, x, y, opacity, visible, locked, compositeOp).data();
-
- kdWarning(DBG_AREA_FILE) << "Specified layertype is not recognised\n";
- return 0;
-}
-
-
-KisLayerSP KisDoc::loadPaintLayer(const TQDomElement& element, KisImageSP img,
- TQString name, TQ_INT32 x, TQ_INT32 y,
- TQ_INT32 opacity, bool visible, bool locked, KisCompositeOp compositeOp)
-{
- TQString attr;
- KisPaintLayerSP layer;
- KisColorSpace * cs;
-
- TQString colorspacename;
- TQString profileProductName;
-
- if ((colorspacename = element.attribute("colorspacename")).isNull())
- cs = img->colorSpace();
- else
- // use default profile - it will be replaced later in completLoading
- cs = KisMetaRegistry::instance()->csRegistry()->getColorSpace(colorspacename,"");
-
- layer = new KisPaintLayer(img, name, opacity, cs);
- Q_CHECK_PTR(layer);
-
- layer->setCompositeOp(compositeOp);
- layer->setVisible(visible);
- layer->setLocked(locked);
- layer->setX(x);
- layer->setY(y);
-
- if ((element.attribute("filename")).isNull())
- m_layerFilenames[layer.data()] = name;
- else
- m_layerFilenames[layer.data()] = TQString(element.attribute("filename"));
-
- if ((attr = element.attribute("hastqmask")).isNull())
- attr = "0";
-
- if (attr == "1") {
- // We add a tqmask, but we'll fill in the actual tqmask later in completeLoading with the visitor
- layer->createMask();
- }
-
-
- // Load exif info
- for( TQDomNode node = element.firstChild(); !node.isNull(); node = node.nextSibling() )
- {
- TQDomElement e = node.toElement();
- if ( !e.isNull() && e.tagName() == "ExifInfo" )
- {
- layer->paintDevice()->exifInfo()->load(e);
- }
- }
- return layer.data();
-}
-
-KisGroupLayerSP KisDoc::loadGroupLayer(const TQDomElement& element, KisImageSP img,
- TQString name, TQ_INT32 x, TQ_INT32 y, TQ_INT32 opacity, bool visible, bool locked,
- KisCompositeOp compositeOp)
-{
- TQString attr;
- KisGroupLayerSP layer;
-
- layer = new KisGroupLayer(img, name, opacity);
- Q_CHECK_PTR(layer);
-
- layer->setCompositeOp(compositeOp);
- layer->setVisible(visible);
- layer->setLocked(locked);
- layer->setX(x);
- layer->setY(y);
-
- loadLayers(element, img, layer);
-
- return layer;
-}
-
-KisAdjustmentLayerSP KisDoc::loadAdjustmentLayer(const TQDomElement& element, KisImageSP img,
- TQString name, TQ_INT32 x, TQ_INT32 y, TQ_INT32 opacity, bool visible, bool locked,
- KisCompositeOp compositeOp)
-{
- TQString attr;
- KisAdjustmentLayerSP layer;
- TQString filtername;
-
- if ((filtername = element.attribute("filtername")).isNull()) {
- // XXX: Invalid adjustmentlayer! We should warn about it!
- kdWarning(DBG_AREA_FILE) << "No filter in adjustment layer" << endl;
- return 0;
- }
-
- KisFilter * f = KisFilterRegistry::instance()->get(filtername);
- if (!f) {
- kdWarning(DBG_AREA_FILE) << "No filter for filtername " << filtername << "\n";
- return 0; // XXX: We don't have this filter. We should warn about it!
- }
-
- KisFilterConfiguration * kfc = f->configuration();
-
- // We'll load the configuration and the selection later.
- layer = new KisAdjustmentLayer(img, name, kfc, 0);
- Q_CHECK_PTR(layer);
-
- layer->setCompositeOp(compositeOp);
- layer->setVisible(visible);
- layer->setLocked(locked);
- layer->setX(x);
- layer->setY(y);
- layer->setOpacity(opacity);
-
- if ((element.attribute("filename")).isNull())
- m_layerFilenames[layer.data()] = name;
- else
- m_layerFilenames[layer.data()] = TQString(element.attribute("filename"));
-
- return layer;
-}
-
-KisPartLayerSP KisDoc::loadPartLayer(const TQDomElement& element, KisImageSP img,
- TQString name, TQ_INT32 /*x*/, TQ_INT32 /*y*/, TQ_INT32 opacity,
- bool visible, bool locked,
- KisCompositeOp compositeOp) {
- KisChildDoc* child = new KisChildDoc(this);
- TQString filename(element.attribute("filename"));
- TQDomElement partElement = element.namedItem("object").toElement();
-
- if (partElement.isNull()) {
- kdWarning() << "loadPartLayer failed with partElement isNull" << endl;
- return 0;
- }
-
- child->load(partElement);
- insertChild(child);
-
- KisPartLayerSP layer = new KisPartLayerImpl(img, child);
- Q_CHECK_PTR(layer);
-
- layer->setCompositeOp(compositeOp);
- layer->setVisible(visible);
- layer->setLocked(locked);
- layer->setOpacity(opacity);
- layer->setName(name);
-
- return layer;
-}
-
-bool KisDoc::completeSaving(KoStore *store)
-{
- TQString uri = url().url();
- TQString location;
- bool external = isStoredExtern();
- TQ_INT32 totalSteps = 0;
-
- if (!m_currentImage) return false;
-
- totalSteps = (m_currentImage)->nlayers();
-
-
- setIOSteps(totalSteps + 1);
-
- // Save the layers data
- TQ_UINT32 count=0;
- KisSaveVisitor visitor(m_currentImage, store, count);
-
- if(external)
- visitor.setExternalUri(uri);
-
- m_currentImage->rootLayer()->accept(visitor);
-
- // saving annotations
- // XXX this only saves EXIF and ICC info. This would probably need
- // a redesign of the dtd of the krita file to do this more generally correct
- // e.g. have <ANNOTATION> tags or so.
- KisAnnotationSP annotation = (m_currentImage)->annotation("exif");
- if (annotation) {
- location = external ? TQString() : uri;
- location += (m_currentImage)->name() + "/annotations/exif";
- if (store->open(location)) {
- store->write(annotation->annotation());
- store->close();
- }
- }
- if (m_currentImage->getProfile()) {
- annotation = m_currentImage->getProfile()->annotation();
-
- if (annotation) {
- location = external ? TQString() : uri;
- location += m_currentImage->name() + "/annotations/icc";
- if (store->open(location)) {
- store->write(annotation->annotation());
- store->close();
- }
- }
- }
-
- IODone();
- return true;
-}
-
-bool KisDoc::completeLoading(KoStore *store)
-{
- TQString uri = url().url();
- TQString location;
- bool external = isStoredExtern();
- TQ_INT32 totalSteps = 0;
-
- totalSteps = (m_currentImage)->nlayers();
-
- setIOSteps(totalSteps);
-
- // Load the layers data
- KisLoadVisitor visitor(m_currentImage, store, m_layerFilenames);
-
- if(external)
- visitor.setExternalUri(uri);
-
- m_currentImage->rootLayer()->accept(visitor);
-
- // annotations
- // exif
- location = external ? TQString() : uri;
- location += (m_currentImage)->name() + "/annotations/exif";
- if (store->hasFile(location)) {
- TQByteArray data;
- store->open(location);
- data = store->read(store->size());
- store->close();
- (m_currentImage)->addAnnotation(new KisAnnotation("exif", "", data));
- }
- // icc profile
- location = external ? TQString() : uri;
- location += (m_currentImage)->name() + "/annotations/icc";
- if (store->hasFile(location)) {
- TQByteArray data;
- store->open(location);
- data = store->read(store->size());
- store->close();
- (m_currentImage)->setProfile(new KisProfile(data));
- }
-
- IODone();
-
- setModified( false );
- setUndo(true);
- return true;
-}
-
-TQWidget* KisDoc::createCustomDocumentWidget(TQWidget *tqparent)
-{
-
- KisConfig cfg;
-
- int w = cfg.defImgWidth();
- int h = cfg.defImgHeight();
-
- TQSize sz = KisClipboard::instance()->clipSize();
- if (sz.isValid() && sz.width() != 0 && sz.height() != 0) {
- w = sz.width();
- h = sz.height();
- }
- return new KisCustomImageWidget(tqparent, this, w, h, cfg.defImgResolution(), cfg.workingColorSpace(),"unnamed");
-}
-
-
-KoDocument* KisDoc::hitTest(const TQPoint &pos, const TQWMatrix& matrix) {
- KoDocument* doc = super::hitTest(pos, matrix);
- if (doc && doc != this) {
- // We hit a child document. We will only acknowledge we hit it, if the hit child
- // is the currently active parts layer.
- KisPartLayerImpl* partLayer
- = dynamic_cast<KisPartLayerImpl*>(currentImage()->activeLayer().data());
-
- if (!partLayer)
- return this;
-
- if (doc == partLayer->childDoc()->document()) {
- return doc;
- }
- return this;
- }
- return doc;
-}
-
-void KisDoc::renameImage(const TQString& oldName, const TQString& newName)
-{
- (m_currentImage)->setName(newName);
-
- if (undo())
- addCommand(new KisCommandImageMv(this, this, newName, oldName));
-}
-
-
-KisImageSP KisDoc::newImage(const TQString& name, TQ_INT32 width, TQ_INT32 height, KisColorSpace * colorstrategy)
-{
- if (!init())
- return 0;
-
- setUndo(false);
-
- KisImageSP img = new KisImage(this, width, height, colorstrategy, name);
- Q_CHECK_PTR(img);
- connect( img, TQT_SIGNAL( sigImageModified() ), this, TQT_SLOT( slotImageUpdated() ));
-
- KisPaintLayer *layer = new KisPaintLayer(img, img->nextLayerName(), OPACITY_OPAQUE,colorstrategy);
- Q_CHECK_PTR(layer);
-
- KisColorSpace * cs = KisMetaRegistry::instance()->csRegistry()->getRGB8();
- KisFillPainter painter;
-
- painter.begin(layer->paintDevice());
- painter.fillRect(0, 0, width, height, KisColor(TQt::white, cs), OPACITY_OPAQUE);
- painter.end();
-
- img->addLayer(layer, img->rootLayer(), 0);
- img->activate(layer);
-
- m_currentImage = img;
-
- setUndo(true);
-
- return img;
-}
-
-bool KisDoc::newImage(const TQString& name, TQ_INT32 width, TQ_INT32 height, KisColorSpace * cs, const KisColor &bgColor, const TQString &imgDescription, const double imgResolution)
-{
- if (!init())
- return false;
-
- KisConfig cfg;
-
- TQ_UINT8 opacity = OPACITY_OPAQUE;//bgColor.getAlpha();
- KisImageSP img;
- KisPaintLayer *layer;
-
- if (!cs) return false;
-
- setUndo(false);
-
- img = new KisImage(this, width, height, cs, name);
- Q_CHECK_PTR(img);
- connect( img, TQT_SIGNAL( sigImageModified() ), this, TQT_SLOT( slotImageUpdated() ));
- img->setResolution(imgResolution, imgResolution);
- img->setDescription(imgDescription);
- img->setProfile(cs->getProfile());
-
- layer = new KisPaintLayer(img, img->nextLayerName(), OPACITY_OPAQUE, cs);
- Q_CHECK_PTR(layer);
-
- KisFillPainter painter;
- painter.begin(layer->paintDevice());
- painter.fillRect(0, 0, width, height, bgColor, opacity);
- painter.end();
-
- TQValueVector<KisPaintDeviceAction *> actions = KisMetaRegistry::instance() ->
- csRegistry()->paintDeviceActionsFor(cs);
- for (uint i = 0; i < actions.count(); i++)
- actions.at(i)->act(layer->paintDevice(), img->width(), img->height());
-
- img->setBackgroundColor(bgColor);
- img->addLayer(layer, img->rootLayer(), 0);
- img->activate(layer);
-
- m_currentImage = img;
-
- cfg.defImgWidth(width);
- cfg.defImgHeight(height);
- cfg.defImgResolution(imgResolution);
-
- setUndo(true);
-
- return true;
-}
-
-KoView* KisDoc::createViewInstance(TQWidget* tqparent, const char *name)
-{
- KisView * v = new KisView(this, this, tqparent, name);
- Q_CHECK_PTR(v);
-
- return v;
-}
-
-void KisDoc::paintContent(TQPainter& painter, const TQRect& rc, bool transparent, double zoomX, double zoomY)
-{
- KisConfig cfg;
- TQString monitorProfileName = cfg.monitorProfile();
- KisProfile * profile = KisMetaRegistry::instance()->csRegistry()->getProfileByName(monitorProfileName);
- painter.scale(zoomX, zoomY);
- TQRect rect = rc & m_currentImage->bounds();
- KisImage::PaintFlags paintFlags;
- if (transparent) {
- paintFlags = KisImage::PAINT_SELECTION;
- } else {
- paintFlags = (KisImage::PaintFlags)(KisImage::PAINT_BACKGROUND|KisImage::PAINT_SELECTION);
- }
-
- paintFlags = (KisImage::PaintFlags)(paintFlags | KisImage::PAINT_EMBEDDED_RECT);
-
- m_currentImage->renderToPainter(rect.left(), rect.top(), rect.right(), rect.bottom(), painter, profile, paintFlags);
-}
-
-void KisDoc::slotImageUpdated()
-{
- emit docUpdated();
- setModified(true);
-}
-
-void KisDoc::slotImageUpdated(const TQRect& rect)
-{
- emit docUpdated(rect);
-}
-
-void KisDoc::beginMacro(const TQString& macroName)
-{
- if (m_undo) {
- if (m_macroNestDepth == 0) {
- Q_ASSERT(m_currentMacro == 0);
- m_currentMacro = new KMacroCommand(macroName);
- Q_CHECK_PTR(m_currentMacro);
- }
-
- m_macroNestDepth++;
- }
-}
-
-void KisDoc::endMacro()
-{
- if (m_undo) {
- Q_ASSERT(m_macroNestDepth > 0);
- if (m_macroNestDepth > 0) {
- m_macroNestDepth--;
-
- if (m_macroNestDepth == 0) {
- Q_ASSERT(m_currentMacro != 0);
-
- m_cmdHistory->addCommand(m_currentMacro, false);
- m_currentMacro = 0;
- emit sigCommandExecuted();
- }
- }
- }
-}
-
-void KisDoc::setCommandHistoryListener(const KisCommandHistoryListener * l)
-{
- // Never have more than one instance of a listener around. TQt should prove a Set class for this...
- m_undoListeners.removeRef(l);
- m_undoListeners.append(l);
-}
-
-void KisDoc::removeCommandHistoryListener(const KisCommandHistoryListener * l)
-{
- m_undoListeners.removeRef(l);
-}
-
-KCommand * KisDoc::presentCommand()
-{
- return m_cmdHistory->presentCommand();
-}
-
-void KisDoc::addCommand(KCommand *cmd)
-{
- Q_ASSERT(cmd);
-
- KisCommandHistoryListener* l = 0;
-
- for (l = m_undoListeners.first(); l; l = m_undoListeners.next()) {
- l->notifyCommandAdded(cmd);
- }
-
- setModified(true);
-
- if (m_undo) {
- if (m_currentMacro)
- m_currentMacro->addCommand(cmd);
- else {
- m_cmdHistory->addCommand(cmd, false);
- emit sigCommandExecuted();
- }
- } else {
- kdDebug() << "Deleting command\n";
- delete cmd;
- }
-}
-
-void KisDoc::setUndo(bool undo)
-{
- m_undo = undo;
- if (m_undo && m_cmdHistory->undoLimit() == 50 /*default*/) {
- KisConfig cfg;
- setUndoLimit( cfg.defUndoLimit() );
- }
-}
-
-TQ_INT32 KisDoc::undoLimit() const
-{
- return m_cmdHistory->undoLimit();
-}
-
-void KisDoc::setUndoLimit(TQ_INT32 limit)
-{
- m_cmdHistory->setUndoLimit(limit);
-}
-
-TQ_INT32 KisDoc::redoLimit() const
-{
- return m_cmdHistory->redoLimit();
-}
-
-void KisDoc::setRedoLimit(TQ_INT32 limit)
-{
- m_cmdHistory->setRedoLimit(limit);
-}
-
-void KisDoc::slotDocumentRestored()
-{
- setModified(false);
-}
-
-void KisDoc::slotCommandExecuted(KCommand *command)
-{
- setModified(true);
- emit sigCommandExecuted();
-
- KisCommandHistoryListener* l = 0;
-
- for (l = m_undoListeners.first(); l; l = m_undoListeners.next()) {
- l->notifyCommandExecuted(command);
- }
-
-}
-
-void KisDoc::slotUpdate(KisImageSP, TQ_UINT32 x, TQ_UINT32 y, TQ_UINT32 w, TQ_UINT32 h)
-{
- TQRect rc(x, y, w, h);
-
- emit docUpdated(rc);
-}
-
-bool KisDoc::undo() const
-{
- return m_undo;
-}
-
-void KisDoc::setIOSteps(TQ_INT32 nsteps)
-{
- m_ioProgressTotalSteps = nsteps * 100;
- m_ioProgressBase = 0;
- emitProgress(0);
-}
-
-void KisDoc::IOCompletedStep()
-{
- m_ioProgressBase += 100;
-}
-
-void KisDoc::IODone()
-{
- emitProgress(-1);
-}
-
-void KisDoc::slotIOProgress(TQ_INT8 percentage)
-{
- KApplication *app = KApplication::kApplication();
-
- Q_ASSERT(app);
-
- if (app->hasPendingEvents())
- app->processEvents();
-
- int totalPercentage = ((m_ioProgressBase + percentage) * 100) / m_ioProgressTotalSteps;
-
- emitProgress(totalPercentage);
-}
-
-KisChildDoc * KisDoc::createChildDoc( const TQRect & rect, KoDocument* childDoc )
-{
- KisChildDoc * ch = new KisChildDoc( this, rect, childDoc );
- insertChild( ch );
- ch->document()->setStoreInternal(true);
- return ch;
-}
-
-void KisDoc::prepareForImport()
-{
- if (m_nserver == 0)
- init();
- setUndo(false);
-}
-
-KisImageSP KisDoc::currentImage()
-{
- return m_currentImage;
-}
-
-void KisDoc::setCurrentImage(KisImageSP image)
-{
- m_currentImage = image;
- setUndo(true);
- image->notifyImageLoaded();
- emit loadingFinished();
-}
-
-void KisDoc::initEmpty()
-{
- KisConfig cfg;
- KisColorSpace * rgb = KisMetaRegistry::instance()->csRegistry()->getRGB8();
- newImage("", cfg.defImgWidth(), cfg.defImgHeight(), rgb);
-}
-
-#include "kis_doc.moc"
-