summaryrefslogtreecommitdiffstats
path: root/kipi-plugins/jpeglossless/plugin_jpeglossless.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kipi-plugins/jpeglossless/plugin_jpeglossless.cpp')
-rw-r--r--kipi-plugins/jpeglossless/plugin_jpeglossless.cpp503
1 files changed, 503 insertions, 0 deletions
diff --git a/kipi-plugins/jpeglossless/plugin_jpeglossless.cpp b/kipi-plugins/jpeglossless/plugin_jpeglossless.cpp
new file mode 100644
index 0000000..71fd86e
--- /dev/null
+++ b/kipi-plugins/jpeglossless/plugin_jpeglossless.cpp
@@ -0,0 +1,503 @@
+/* ============================================================
+ *
+ * This file is a part of kipi-plugins project
+ * http://www.kipi-plugins.org
+ *
+ * Date : 2003-09-26
+ * Description : loss less images transformations plugin.
+ *
+ * Copyright (C) 2003-2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
+ * Copyright (C) 2004-2007 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
+ * Copyright (C) 2006-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ *
+ * 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, 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.
+ *
+ * ============================================================ */
+
+// C++ includes.
+
+#include <iostream>
+
+// Qt includes.
+
+#include <qdir.h>
+
+// KDE includes.
+
+#include <klocale.h>
+#include <kaction.h>
+#include <kgenericfactory.h>
+#include <klibloader.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kurl.h>
+#include <kmessagebox.h>
+#include <kapplication.h>
+
+// LibKipi includes.
+
+#include <libkipi/batchprogressdialog.h>
+#include <libkipi/interface.h>
+
+// Local includes.
+
+#include "actions.h"
+#include "actionthread.h"
+#include "plugin_jpeglossless.h"
+#include "plugin_jpeglossless.moc"
+
+typedef KGenericFactory<Plugin_JPEGLossless> Factory;
+
+K_EXPORT_COMPONENT_FACTORY( kipiplugin_jpeglossless,
+ Factory("kipiplugin_jpeglossless"))
+
+Plugin_JPEGLossless::Plugin_JPEGLossless(QObject *parent, const char*, const QStringList &)
+ : KIPI::Plugin( Factory::instance(), parent, "JPEGLossless")
+{
+ m_total = 0;
+ m_current = 0;
+ m_action_Convert2GrayScale = 0;
+ m_action_AutoExif = 0;
+ m_action_RotateImage = 0;
+ m_action_FlipImage = 0;
+ m_progressDlg = 0;
+ m_thread = 0;
+ m_failed = false;
+
+ kdDebug( 51001 ) << "Plugin_JPEGLossless plugin loaded" << endl;
+}
+
+void Plugin_JPEGLossless::setup( QWidget* widget )
+{
+ KIPI::Plugin::setup( widget );
+
+ m_action_AutoExif = new KAction(i18n("Auto Rotate/Flip Using Exif Information"),
+ 0, 0,
+ this,
+ SLOT(slotRotate()),
+ actionCollection(),
+ "rotate_exif");
+
+ m_action_RotateImage = new KActionMenu(i18n("Rotate"),
+ "rotate_cw",
+ actionCollection(),
+ "jpeglossless_rotate");
+
+ m_action_RotateImage->insert( new KAction(i18n("Left"),
+ "rotate_ccw",
+ SHIFT+CTRL+Key_Left,
+ this,
+ SLOT(slotRotate()),
+ actionCollection(),
+ "rotate_ccw") );
+ m_action_RotateImage->insert( new KAction(i18n("Right"),
+ "rotate_cw",
+ SHIFT+CTRL+Key_Right,
+ this,
+ SLOT(slotRotate()),
+ actionCollection(),
+ "rotate_cw") );
+
+ m_action_FlipImage = new KActionMenu(i18n("Flip"),
+ "flip",
+ actionCollection(),
+ "jpeglossless_flip");
+
+ m_action_FlipImage->insert( new KAction(i18n("Horizontally"),
+ 0,
+ CTRL+Key_Asterisk,
+ this,
+ SLOT(slotFlip()),
+ actionCollection(),
+ "flip_horizontal") );
+
+ m_action_FlipImage->insert( new KAction(i18n("Vertically"),
+ 0,
+ CTRL+Key_Slash,
+ this,
+ SLOT(slotFlip()),
+ actionCollection(),
+ "flip_vertical") );
+
+ m_action_Convert2GrayScale = new KAction(i18n("Convert to Black && White"),
+ "grayscaleconvert",
+ 0,
+ this,
+ SLOT(slotConvert2GrayScale()),
+ actionCollection(),
+ "jpeglossless_convert2grayscale");
+
+ addAction( m_action_AutoExif );
+ addAction( m_action_RotateImage );
+ addAction( m_action_FlipImage );
+ addAction( m_action_Convert2GrayScale );
+
+ KIPI::Interface* interface = dynamic_cast<KIPI::Interface*>( parent() );
+
+ if ( !interface )
+ {
+ kdError( 51000 ) << "Kipi interface is null!" << endl;
+ return;
+ }
+
+ m_action_AutoExif->setEnabled( false );
+ m_action_RotateImage->setEnabled( false );
+ m_action_FlipImage->setEnabled( false );
+ m_action_Convert2GrayScale->setEnabled( false );
+
+ m_thread = new KIPIJPEGLossLessPlugin::ActionThread(interface, this);
+
+ connect( interface, SIGNAL( selectionChanged( bool ) ),
+ m_action_AutoExif, SLOT( setEnabled( bool ) ) );
+
+ connect( interface, SIGNAL( selectionChanged( bool ) ),
+ m_action_RotateImage, SLOT( setEnabled( bool ) ) );
+
+ connect( interface, SIGNAL( selectionChanged( bool ) ),
+ m_action_FlipImage, SLOT( setEnabled( bool ) ) );
+
+ connect( interface, SIGNAL( selectionChanged( bool ) ),
+ m_action_Convert2GrayScale, SLOT( setEnabled( bool ) ) );
+}
+
+Plugin_JPEGLossless::~Plugin_JPEGLossless()
+{
+ delete m_thread;
+ delete m_progressDlg;
+}
+
+void Plugin_JPEGLossless::slotFlip()
+{
+ KURL::List items = images();
+ if (items.count() <= 0) return;
+
+ QString from(sender()->name());
+ QString title;
+ bool proceed = false;
+
+ if (from == "flip_horizontal")
+ {
+ m_thread->flip(items, KIPIJPEGLossLessPlugin::FlipHorizontal);
+ title = i18n("horizontaly");
+ proceed = true;
+ }
+ else if (from == "flip_vertical")
+ {
+ m_thread->flip(items, KIPIJPEGLossLessPlugin::FlipVertical);
+ title = i18n("vertically");
+ proceed = true;
+ }
+ else
+ {
+ kdWarning( 51000 ) << "The impossible happened... unknown flip specified" << endl;
+ return;
+ }
+
+ if (!proceed) return;
+ m_total = items.count();
+ m_current = 0;
+ m_failed = false;
+
+ if (m_progressDlg)
+ {
+ delete m_progressDlg;
+ m_progressDlg = 0;
+ }
+
+ m_progressDlg = new KIPI::BatchProgressDialog(kapp->activeWindow(),
+ i18n("Flip images %1").arg(title));
+
+ connect(m_progressDlg, SIGNAL(cancelClicked()),
+ this, SLOT(slotCancel()));
+
+ m_progressDlg->show();
+
+ if (!m_thread->running())
+ m_thread->start();
+}
+
+void Plugin_JPEGLossless::slotRotate()
+{
+ KURL::List items = images();
+ if (items.count() <= 0) return;
+
+ QString from(sender()->name());
+ QString title;
+ bool proceed = false;
+
+ if (from == "rotate_cw")
+ {
+ m_thread->rotate(items, KIPIJPEGLossLessPlugin::Rot90);
+ title = i18n("right (clockwise)");
+ proceed = true;
+ }
+ else if (from == "rotate_ccw")
+ {
+ m_thread->rotate(items, KIPIJPEGLossLessPlugin::Rot270);
+ title = i18n("left (counterclockwise)");
+ proceed = true;
+ }
+ else if (from == "rotate_exif")
+ {
+ m_thread->rotate(items, KIPIJPEGLossLessPlugin::Rot0);
+ title = i18n("using Exif orientation tag");
+ proceed = true;
+ }
+ else
+ {
+ kdWarning( 51000 ) << "The impossible happened... unknown rotation angle specified" << endl;
+ return;
+ }
+
+ if (!proceed) return;
+ m_total = items.count();
+ m_current = 0;
+ m_failed = false;
+
+ if (m_progressDlg)
+ {
+ delete m_progressDlg;
+ m_progressDlg = 0;
+ }
+
+ m_progressDlg = new KIPI::BatchProgressDialog(kapp->activeWindow(),
+ i18n("Rotate images %1").arg(title));
+
+ connect(m_progressDlg, SIGNAL(cancelClicked()),
+ this, SLOT(slotCancel()));
+
+ m_progressDlg->show();
+
+ if (!m_thread->running())
+ m_thread->start();
+}
+
+void Plugin_JPEGLossless::slotConvert2GrayScale()
+{
+ KURL::List items = images();
+ if (items.count() <= 0 ||
+ KMessageBox::No==KMessageBox::warningYesNo(kapp->activeWindow(),
+ i18n("<p>Are you sure you wish to convert the selected image(s) to "
+ "black and white? This operation <b>cannot</b> be undone.</p>")))
+ return;
+
+ QString from(sender()->name());
+
+ m_total = items.count();
+ m_current = 0;
+ m_failed = false;
+
+ if (m_progressDlg)
+ {
+ delete m_progressDlg;
+ m_progressDlg = 0;
+ }
+
+ m_progressDlg = new KIPI::BatchProgressDialog(kapp->activeWindow(),
+ i18n("Convert images to black & white"));
+
+ connect(m_progressDlg, SIGNAL(cancelClicked()),
+ this, SLOT(slotCancel()));
+
+ m_progressDlg->show();
+
+ m_thread->convert2grayscale(items);
+ if (!m_thread->running())
+ m_thread->start();
+}
+
+void Plugin_JPEGLossless::slotCancel()
+{
+ m_thread->cancel();
+
+ KIPI::Interface* interface = dynamic_cast<KIPI::Interface*>( parent() );
+
+ if ( !interface )
+ {
+ kdError( 51000 ) << "Kipi interface is null!" << endl;
+ return;
+ }
+
+ interface->refreshImages( m_images );
+}
+
+void Plugin_JPEGLossless::customEvent(QCustomEvent *event)
+{
+ if (!event) return;
+
+ KIPIJPEGLossLessPlugin::EventData *d = (KIPIJPEGLossLessPlugin::EventData*) event->data();
+ if (!d) return;
+
+ QString text;
+
+ if (d->starting)
+ {
+ switch (d->action)
+ {
+ case(KIPIJPEGLossLessPlugin::Rotate):
+ {
+ text = i18n("Rotating Image \"%1\"").arg(d->fileName.section('/', -1));
+ break;
+ }
+ case(KIPIJPEGLossLessPlugin::Flip):
+ {
+ text = i18n("Flipping Image \"%1\"").arg(d->fileName.section('/', -1));
+ break;
+ }
+ case(KIPIJPEGLossLessPlugin::GrayScale):
+ {
+ text = i18n("Converting to Black & White \"%1\"").arg(d->fileName.section('/', -1));
+ break;
+ }
+ default:
+ {
+ kdWarning( 51000 ) << "KIPIJPEGLossLessPlugin: Unknown event" << endl;
+ }
+ }
+
+ m_progressDlg->addedAction(text, KIPI::StartingMessage);
+ }
+ else
+ {
+ if (!d->success)
+ {
+ m_failed = true;
+
+ switch (d->action)
+ {
+ case(KIPIJPEGLossLessPlugin::Rotate):
+ {
+ text = i18n("Failed to Rotate image");
+ break;
+ }
+ case(KIPIJPEGLossLessPlugin::Flip):
+ {
+ text = i18n("Failed to Flip image");
+ break;
+ }
+ case(KIPIJPEGLossLessPlugin::GrayScale):
+ {
+ text = i18n("Failed to convert image to Black & White");
+ break;
+ }
+ default:
+ {
+ kdWarning( 51000 ) << "KIPIJPEGLossLessPlugin: Unknown event" << endl;
+ }
+ }
+
+ m_progressDlg->addedAction(text, KIPI::WarningMessage);
+
+ if (!d->errString.isEmpty())
+ m_progressDlg->addedAction(d->errString, KIPI::WarningMessage);
+ }
+ else
+ {
+ switch (d->action)
+ {
+ case(KIPIJPEGLossLessPlugin::Rotate):
+ {
+ text = i18n("Rotate image complete");
+ break;
+ }
+ case(KIPIJPEGLossLessPlugin::Flip):
+ {
+ text = i18n("Flip image complete");
+ break;
+ }
+ case(KIPIJPEGLossLessPlugin::GrayScale):
+ {
+ text = i18n("Convert to Black & White complete");
+ break;
+ }
+ default:
+ {
+ kdWarning( 51000 ) << "KIPIJPEGLossLessPlugin: Unknown event" << endl;
+ }
+ }
+
+ m_progressDlg->addedAction(text, KIPI::SuccessMessage);
+ }
+
+ m_current++;
+ m_progressDlg->setProgress(m_current, m_total);
+ }
+
+ delete d;
+
+ if (m_current >= m_total)
+ {
+ m_current = 0;
+
+ if (m_failed)
+ {
+#if KDE_VERSION >= 0x30200
+ m_progressDlg->setButtonCancel( KStdGuiItem::close() );
+#else
+ m_progressDlg->setButtonCancelText( i18n("&Close") );
+#endif
+
+ disconnect(m_progressDlg, SIGNAL(cancelClicked()),
+ this, SLOT(slotCancel()));
+ }
+ else
+ {
+ slotCancel();
+ m_progressDlg->close();
+ m_progressDlg = 0;
+ }
+
+ KIPI::Interface* interface = dynamic_cast<KIPI::Interface*>( parent() );
+
+ if ( !interface )
+ {
+ kdError( 51000 ) << "Kipi interface is null!" << endl;
+ return;
+ }
+
+ interface->refreshImages( m_images );
+ }
+}
+
+KIPI::Category Plugin_JPEGLossless::category( KAction* action ) const
+{
+ if (action == m_action_AutoExif)
+ return KIPI::IMAGESPLUGIN;
+ else if ( action == m_action_RotateImage )
+ return KIPI::IMAGESPLUGIN;
+ else if ( action == m_action_FlipImage )
+ return KIPI::IMAGESPLUGIN;
+ else if ( action == m_action_Convert2GrayScale )
+ return KIPI::IMAGESPLUGIN;
+
+ kdWarning( 51000 ) << "Unrecognized action for plugin category identification" << endl;
+ return KIPI::IMAGESPLUGIN; // no warning from compiler, please
+}
+
+KURL::List Plugin_JPEGLossless::images()
+{
+ KIPI::Interface* interface = dynamic_cast<KIPI::Interface*>( parent() );
+
+ if ( !interface )
+ {
+ kdError( 51000 ) << "Kipi interface is null!" << endl;
+ return KURL::List();
+ }
+
+ KIPI::ImageCollection images = interface->currentSelection();
+ if ( !images.isValid() )
+ return KURL::List();
+
+ // We don't want the set of images to change before we are done
+ // and tells the host app to refresh the images.
+ m_images = images.images();
+ return images.images();
+}