summaryrefslogtreecommitdiffstats
path: root/kolourpaint/kpmainwindow_image.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kolourpaint/kpmainwindow_image.cpp')
-rw-r--r--kolourpaint/kpmainwindow_image.cpp474
1 files changed, 474 insertions, 0 deletions
diff --git a/kolourpaint/kpmainwindow_image.cpp b/kolourpaint/kpmainwindow_image.cpp
new file mode 100644
index 00000000..7f662af7
--- /dev/null
+++ b/kolourpaint/kpmainwindow_image.cpp
@@ -0,0 +1,474 @@
+
+/*
+ Copyright (c) 2003,2004,2005 Clarence Dang <dang@kde.org>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <kpmainwindow.h>
+#include <kpmainwindow_p.h>
+
+#include <qcolor.h>
+#include <qsize.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmenubar.h>
+
+#include <kpcolor.h>
+#include <kpdefs.h>
+#include <kpcoloreffect.h>
+#include <kpcolortoolbar.h>
+#include <kpcommandhistory.h>
+#include <kpdocument.h>
+#include <kpeffectinvert.h>
+#include <kpeffectreducecolors.h>
+#include <kpeffectsdialog.h>
+#include <kpselection.h>
+#include <kptool.h>
+#include <kptoolautocrop.h>
+#include <kptoolclear.h>
+#include <kptoolconverttograyscale.h>
+#include <kptoolcrop.h>
+#include <kptoolflip.h>
+#include <kptoolresizescale.h>
+#include <kptoolrotate.h>
+#include <kptoolselection.h>
+#include <kptoolskew.h>
+#include <kpviewmanager.h>
+
+
+// private
+bool kpMainWindow::isSelectionActive () const
+{
+ return (m_document ? bool (m_document->selection ()) : false);
+}
+
+// private
+bool kpMainWindow::isTextSelection () const
+{
+ return (m_document && m_document->selection () &&
+ m_document->selection ()->isText ());
+}
+
+
+// private
+QString kpMainWindow::autoCropText () const
+{
+ return kpToolAutoCropCommand::name (isSelectionActive (),
+ kpToolAutoCropCommand::ShowAccel);
+}
+
+
+// private
+void kpMainWindow::setupImageMenuActions ()
+{
+ KActionCollection *ac = actionCollection ();
+
+ m_actionResizeScale = new KAction (i18n ("R&esize / Scale..."), Qt::CTRL + Qt::Key_E,
+ this, SLOT (slotResizeScale ()), ac, "image_resize_scale");
+
+ m_actionCrop = new KAction (i18n ("Se&t as Image (Crop)"), Qt::CTRL + Qt::Key_T,
+ this, SLOT (slotCrop ()), ac, "image_crop");
+
+ m_actionAutoCrop = new KAction (autoCropText (), Qt::CTRL + Qt::Key_U,
+ this, SLOT (slotAutoCrop ()), ac, "image_auto_crop");
+
+ m_actionFlip = new KAction (i18n ("&Flip..."), Qt::CTRL + Qt::Key_F,
+ this, SLOT (slotFlip ()), ac, "image_flip");
+
+ m_actionRotate = new KAction (i18n ("&Rotate..."), Qt::CTRL + Qt::Key_R,
+ this, SLOT (slotRotate ()), ac, "image_rotate");
+
+ m_actionSkew = new KAction (i18n ("S&kew..."), Qt::CTRL + Qt::Key_K,
+ this, SLOT (slotSkew ()), ac, "image_skew");
+
+ m_actionConvertToBlackAndWhite = new KAction (i18n ("Reduce to Mo&nochrome (Dithered)"), 0,
+ this, SLOT (slotConvertToBlackAndWhite ()), ac, "image_convert_to_black_and_white");
+
+ m_actionConvertToGrayscale = new KAction (i18n ("Reduce to &Grayscale"), 0,
+ this, SLOT (slotConvertToGrayscale ()), ac, "image_convert_to_grayscale");
+
+ m_actionInvertColors = new KAction (i18n ("&Invert Colors"), Qt::CTRL + Qt::Key_I,
+ this, SLOT (slotInvertColors ()), ac, "image_invert_colors");
+
+ m_actionClear = new KAction (i18n ("C&lear"), Qt::CTRL + Qt::SHIFT + Qt::Key_N,
+ this, SLOT (slotClear ()), ac, "image_clear");
+
+ m_actionMoreEffects = new KAction (i18n ("&More Effects..."), Qt::CTRL + Qt::Key_M,
+ this, SLOT (slotMoreEffects ()), ac, "image_more_effects");
+
+ enableImageMenuDocumentActions (false);
+}
+
+// private
+void kpMainWindow::enableImageMenuDocumentActions (bool enable)
+{
+ m_actionResizeScale->setEnabled (enable);
+ m_actionCrop->setEnabled (enable);
+ m_actionAutoCrop->setEnabled (enable);
+ m_actionFlip->setEnabled (enable);
+ m_actionRotate->setEnabled (enable);
+ m_actionSkew->setEnabled (enable);
+ m_actionConvertToBlackAndWhite->setEnabled (enable);
+ m_actionConvertToGrayscale->setEnabled (enable);
+ m_actionInvertColors->setEnabled (enable);
+ m_actionClear->setEnabled (enable);
+ m_actionMoreEffects->setEnabled (enable);
+
+ m_imageMenuDocumentActionsEnabled = enable;
+}
+
+
+// private slot
+void kpMainWindow::slotImageMenuUpdateDueToSelection ()
+{
+ KMenuBar *mBar = menuBar ();
+ if (!mBar) // just in case
+ return;
+
+ int mBarNumItems = (int) mBar->count ();
+ for (int index = 0; index < mBarNumItems; index++)
+ {
+ int id = mBar->idAt (index);
+
+ // SYNC: kolourpaintui.rc
+ QString menuBarItemTextImage = i18n ("&Image");
+ QString menuBarItemTextSelection = i18n ("Select&ion");
+
+ const QString menuBarItemText = mBar->text (id);
+ if (menuBarItemText == menuBarItemTextImage ||
+ menuBarItemText == menuBarItemTextSelection)
+ {
+ if (isSelectionActive ())
+ mBar->changeItem (id, menuBarItemTextSelection);
+ else
+ mBar->changeItem (id, menuBarItemTextImage);
+
+ break;
+ }
+ }
+
+
+ m_actionResizeScale->setEnabled (m_imageMenuDocumentActionsEnabled);
+ m_actionCrop->setEnabled (m_imageMenuDocumentActionsEnabled &&
+ isSelectionActive ());
+
+ const bool enable = (m_imageMenuDocumentActionsEnabled && !isTextSelection ());
+ m_actionAutoCrop->setText (autoCropText ());
+ m_actionAutoCrop->setEnabled (enable);
+ m_actionFlip->setEnabled (enable);
+ m_actionRotate->setEnabled (enable);
+ m_actionSkew->setEnabled (enable);
+ m_actionConvertToBlackAndWhite->setEnabled (enable);
+ m_actionConvertToGrayscale->setEnabled (enable);
+ m_actionInvertColors->setEnabled (enable);
+ m_actionClear->setEnabled (enable);
+ m_actionMoreEffects->setEnabled (enable);
+}
+
+
+// public
+kpColor kpMainWindow::backgroundColor (bool ofSelection) const
+{
+ if (ofSelection)
+ return kpColor::transparent;
+ else
+ {
+ if (m_colorToolBar)
+ return m_colorToolBar->backgroundColor ();
+ else
+ {
+ kdError () << "kpMainWindow::backgroundColor() without colorToolBar" << endl;
+ return kpColor::invalid;
+ }
+ }
+}
+
+
+// public
+void kpMainWindow::addImageOrSelectionCommand (kpCommand *cmd,
+ bool addSelCreateCmdIfSelAvail,
+ bool addSelPullCmdIfSelAvail)
+{
+#if DEBUG_KP_MAIN_WINDOW && 1
+ kdDebug () << "kpMainWindow::addImageOrSelectionCommand()"
+ << " addSelCreateCmdIfSelAvail=" << addSelCreateCmdIfSelAvail
+ << " addSelPullCmdIfSelAvail=" << addSelPullCmdIfSelAvail
+ << endl;
+#endif
+
+ if (!m_document)
+ {
+ kdError () << "kpMainWindow::addImageOrSelectionCommand() without doc" << endl;
+ return;
+ }
+
+
+ if (m_viewManager)
+ m_viewManager->setQueueUpdates ();
+
+
+ kpSelection *sel = m_document->selection ();
+#if DEBUG_KP_MAIN_WINDOW && 1
+ kdDebug () << "\tsel=" << sel
+ << " sel->pixmap=" << (sel ? sel->pixmap () : 0)
+ << endl;
+#endif
+ if (addSelCreateCmdIfSelAvail && sel && !sel->pixmap ())
+ {
+ // create selection region
+ kpCommand *createCommand = new kpToolSelectionCreateCommand (
+ i18n ("Selection: Create"),
+ *sel,
+ this);
+
+ if (kpToolSelectionCreateCommand::nextUndoCommandIsCreateBorder (commandHistory ()))
+ commandHistory ()->setNextUndoCommand (createCommand);
+ else
+ commandHistory ()->addCommand (createCommand,
+ false/*no exec - user already dragged out sel*/);
+ }
+
+
+ if (addSelPullCmdIfSelAvail && sel && !sel->pixmap ())
+ {
+ kpMacroCommand *macroCmd = new kpMacroCommand (cmd->name (), this);
+
+ macroCmd->addCommand (new kpToolSelectionPullFromDocumentCommand (
+ QString::null/*uninteresting child of macro cmd*/,
+ this));
+
+ macroCmd->addCommand (cmd);
+
+ m_commandHistory->addCommand (macroCmd);
+ }
+ else
+ {
+ m_commandHistory->addCommand (cmd);
+ }
+
+
+ if (m_viewManager)
+ m_viewManager->restoreQueueUpdates ();
+}
+
+// private slot
+void kpMainWindow::slotResizeScale ()
+{
+ if (toolHasBegunShape ())
+ tool ()->endShapeInternal ();
+
+ kpToolResizeScaleDialog dialog (this);
+ dialog.setKeepAspectRatio (d->m_resizeScaleDialogLastKeepAspect);
+
+ if (dialog.exec () && !dialog.isNoOp ())
+ {
+ kpToolResizeScaleCommand *cmd = new kpToolResizeScaleCommand (
+ dialog.actOnSelection (),
+ dialog.imageWidth (), dialog.imageHeight (),
+ dialog.type (),
+ this);
+
+ bool addSelCreateCommand = (dialog.actOnSelection () ||
+ cmd->scaleSelectionWithImage ());
+ bool addSelPullCommand = dialog.actOnSelection ();
+
+ addImageOrSelectionCommand (
+ cmd,
+ addSelCreateCommand,
+ addSelPullCommand);
+
+ // Resized document?
+ if (!dialog.actOnSelection () &&
+ dialog.type () == kpToolResizeScaleCommand::Resize)
+ {
+ // TODO: this should be the responsibility of kpDocument
+ saveDefaultDocSize (QSize (dialog.imageWidth (), dialog.imageHeight ()));
+ }
+ }
+
+
+ if (d->m_resizeScaleDialogLastKeepAspect != dialog.keepAspectRatio ())
+ {
+ d->m_resizeScaleDialogLastKeepAspect = dialog.keepAspectRatio ();
+
+ KConfigGroupSaver cfgGroupSaver (kapp->config (), kpSettingsGroupGeneral);
+ KConfigBase *cfg = cfgGroupSaver.config ();
+
+ cfg->writeEntry (kpSettingResizeScaleLastKeepAspect,
+ d->m_resizeScaleDialogLastKeepAspect);
+ cfg->sync ();
+ }
+}
+
+// public slot
+void kpMainWindow::slotCrop ()
+{
+ if (toolHasBegunShape ())
+ tool ()->endShapeInternal ();
+
+ if (!m_document || !m_document->selection ())
+ {
+ kdError () << "kpMainWindow::slotCrop() doc=" << m_document
+ << " sel=" << (m_document ? m_document->selection () : 0)
+ << endl;
+ return;
+ }
+
+
+ ::kpToolCrop (this);
+}
+
+// private slot
+void kpMainWindow::slotAutoCrop ()
+{
+ if (toolHasBegunShape ())
+ tool ()->endShapeInternal ();
+
+ ::kpToolAutoCrop (this);
+}
+
+// private slot
+void kpMainWindow::slotFlip ()
+{
+ if (toolHasBegunShape ())
+ tool ()->endShapeInternal ();
+
+ kpToolFlipDialog dialog ((bool) m_document->selection (), this);
+
+ if (dialog.exec () && !dialog.isNoOp ())
+ {
+ addImageOrSelectionCommand (
+ new kpToolFlipCommand (m_document->selection (),
+ dialog.getHorizontalFlip (), dialog.getVerticalFlip (),
+ this));
+ }
+}
+
+// private slot
+void kpMainWindow::slotRotate ()
+{
+ if (toolHasBegunShape ())
+ tool ()->endShapeInternal ();
+
+ kpToolRotateDialog dialog ((bool) m_document->selection (), this);
+
+ if (dialog.exec () && !dialog.isNoOp ())
+ {
+ addImageOrSelectionCommand (
+ new kpToolRotateCommand (m_document->selection (),
+ dialog.angle (),
+ this));
+ }
+}
+
+// private slot
+void kpMainWindow::slotSkew ()
+{
+ if (toolHasBegunShape ())
+ tool ()->endShapeInternal ();
+
+ kpToolSkewDialog dialog ((bool) m_document->selection (), this);
+
+ if (dialog.exec () && !dialog.isNoOp ())
+ {
+ addImageOrSelectionCommand (
+ new kpToolSkewCommand (m_document->selection (),
+ dialog.horizontalAngle (), dialog.verticalAngle (),
+ this));
+ }
+}
+
+// private slot
+void kpMainWindow::slotConvertToBlackAndWhite ()
+{
+ if (toolHasBegunShape ())
+ tool ()->endShapeInternal ();
+
+ addImageOrSelectionCommand (
+ new kpEffectReduceColorsCommand (1/*depth*/, true/*dither*/,
+ m_document->selection (), this));
+}
+
+// private slot
+void kpMainWindow::slotConvertToGrayscale ()
+{
+ if (toolHasBegunShape ())
+ tool ()->endShapeInternal ();
+
+ addImageOrSelectionCommand (
+ new kpToolConvertToGrayscaleCommand (m_document->selection (), this));
+}
+
+// private slot
+void kpMainWindow::slotInvertColors ()
+{
+ if (toolHasBegunShape ())
+ tool ()->endShapeInternal ();
+
+ addImageOrSelectionCommand (
+ new kpEffectInvertCommand (m_document->selection (), this));
+}
+
+// private slot
+void kpMainWindow::slotClear ()
+{
+ if (toolHasBegunShape ())
+ tool ()->endShapeInternal ();
+
+ addImageOrSelectionCommand (
+ new kpToolClearCommand (m_document->selection (), this));
+}
+
+// private slot
+void kpMainWindow::slotMoreEffects ()
+{
+ if (toolHasBegunShape ())
+ tool ()->endShapeInternal ();
+
+ kpEffectsDialog dialog ((bool) m_document->selection (), this);
+ dialog.selectEffect (d->m_moreEffectsDialogLastEffect);
+
+ if (dialog.exec () && !dialog.isNoOp ())
+ {
+ addImageOrSelectionCommand (dialog.createCommand ());
+ }
+
+
+ if (d->m_moreEffectsDialogLastEffect != dialog.selectedEffect ())
+ {
+ d->m_moreEffectsDialogLastEffect = dialog.selectedEffect ();
+
+ KConfigGroupSaver cfgGroupSaver (kapp->config (), kpSettingsGroupGeneral);
+ KConfigBase *cfg = cfgGroupSaver.config ();
+
+ cfg->writeEntry (kpSettingMoreEffectsLastEffect,
+ d->m_moreEffectsDialogLastEffect);
+ cfg->sync ();
+ }
+}