summaryrefslogtreecommitdiffstats
path: root/src/libs/widgets/imageplugins/imagepannelwidget.cpp
diff options
context:
space:
mode:
authorMichele Calgaro <[email protected]>2024-11-22 18:41:30 +0900
committerMichele Calgaro <[email protected]>2024-11-22 18:41:30 +0900
commitee0d99607c14cb63d3ebdb3a970b508949fa8219 (patch)
tree94ac1efedb94cb38bf6879ba0610fe75b554216b /src/libs/widgets/imageplugins/imagepannelwidget.cpp
parent4adff739380e4ae9f30e443ee95644f184456869 (diff)
downloaddigikam-ee0d99607c14cb63d3ebdb3a970b508949fa8219.tar.gz
digikam-ee0d99607c14cb63d3ebdb3a970b508949fa8219.zip
Rename 'digikam' folder to 'src'
Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'src/libs/widgets/imageplugins/imagepannelwidget.cpp')
-rw-r--r--src/libs/widgets/imageplugins/imagepannelwidget.cpp477
1 files changed, 477 insertions, 0 deletions
diff --git a/src/libs/widgets/imageplugins/imagepannelwidget.cpp b/src/libs/widgets/imageplugins/imagepannelwidget.cpp
new file mode 100644
index 00000000..cebf0f3c
--- /dev/null
+++ b/src/libs/widgets/imageplugins/imagepannelwidget.cpp
@@ -0,0 +1,477 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date : 2005-07-01
+ * Description : a widget to draw a control pannel image tool.
+ *
+ * Copyright (C) 2005-2008 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.
+ *
+ * ============================================================ */
+
+// TQt includes.
+
+#include <tqframe.h>
+#include <tqvgroupbox.h>
+#include <tqlabel.h>
+#include <tqpixmap.h>
+#include <tqtooltip.h>
+#include <tqwhatsthis.h>
+#include <tqtimer.h>
+#include <tqhbuttongroup.h>
+#include <tqpushbutton.h>
+#include <tqlayout.h>
+#include <tqpixmap.h>
+
+// KDE includes.
+
+#include <kdialog.h>
+#include <tdelocale.h>
+#include <kcursor.h>
+#include <kprogress.h>
+#include <tdeapplication.h>
+#include <kiconloader.h>
+#include <tdeconfig.h>
+#include <kstandarddirs.h>
+#include <kseparator.h>
+
+// Local includes.
+
+#include "ddebug.h"
+#include "sidebar.h"
+#include "statuszoombar.h"
+#include "thumbnailsize.h"
+#include "imageregionwidget.h"
+#include "imagepaniconwidget.h"
+#include "imagepannelwidget.h"
+#include "imagepannelwidget.moc"
+
+namespace Digikam
+{
+
+class ImagePannelWidgetPriv
+{
+public:
+
+ ImagePannelWidgetPriv()
+ {
+ imageRegionWidget = 0;
+ imagePanIconWidget = 0;
+ mainLayout = 0;
+ separateView = 0;
+ progressBar = 0;
+ settingsSideBar = 0;
+ splitter = 0;
+ settingsLayout = 0;
+ settings = 0;
+ previewWidget = 0;
+ zoomBar = 0;
+ }
+
+ TQGridLayout *mainLayout;
+
+ TQHButtonGroup *separateView;
+
+ TQString settingsSection;
+
+ TQWidget *settings;
+ TQWidget *previewWidget;
+
+ TQVBoxLayout *settingsLayout;
+
+ TQSplitter *splitter;
+
+ KProgress *progressBar;
+
+ ImageRegionWidget *imageRegionWidget;
+ ImagePanIconWidget *imagePanIconWidget;
+
+ Sidebar *settingsSideBar;
+
+ StatusZoomBar *zoomBar;
+};
+
+ImagePannelWidget::ImagePannelWidget(uint w, uint h, const TQString& settingsSection,
+ TQWidget *parent, int separateViewMode)
+ : TQHBox(parent, 0, TQt::WDestructiveClose)
+{
+ d = new ImagePannelWidgetPriv;
+ d->settingsSection = settingsSection;
+ d->splitter = new TQSplitter(this);
+ d->previewWidget = new TQWidget(d->splitter);
+ d->mainLayout = new TQGridLayout( d->previewWidget, 2, 3, 0, KDialog::spacingHint());
+
+ d->splitter->setFrameStyle( TQFrame::NoFrame );
+ d->splitter->setFrameShadow( TQFrame::Plain );
+ d->splitter->setFrameShape( TQFrame::NoFrame );
+ d->splitter->setOpaqueResize(false);
+
+ // -------------------------------------------------------------
+
+ TQFrame *preview = new TQFrame(d->previewWidget);
+ TQVBoxLayout* l1 = new TQVBoxLayout(preview, 5, 0);
+ d->imageRegionWidget = new ImageRegionWidget(w, h, preview, false);
+ d->imageRegionWidget->setFrameStyle(TQFrame::NoFrame);
+ preview->setFrameStyle(TQFrame::Panel|TQFrame::Sunken);
+ TQWhatsThis::add( d->imageRegionWidget, i18n("<p>Here you can see the original clip image "
+ "which will be used for the preview computation."
+ "<p>Click and drag the mouse cursor in the "
+ "image to change the clip focus."));
+ l1->addWidget(d->imageRegionWidget, 0);
+
+ TQSizePolicy rightSzPolicy(TQSizePolicy::Preferred, TQSizePolicy::Expanding, 2, 1);
+ d->previewWidget->setSizePolicy(rightSzPolicy);
+
+ // -------------------------------------------------------------
+
+ d->zoomBar = new StatusZoomBar(d->previewWidget);
+ TQWhatsThis::add( d->zoomBar, i18n("<p>Here set the zoom factor of the preview area.") );
+
+ // -------------------------------------------------------------
+
+ TQString directory;
+ d->separateView = new TQHButtonGroup(d->previewWidget);
+ d->separateView->setExclusive(true);
+ d->separateView->setInsideMargin( 0 );
+ d->separateView->setFrameShape(TQFrame::NoFrame);
+
+ if (separateViewMode == SeparateViewDuplicate ||
+ separateViewMode == SeparateViewAll)
+ {
+ TQPushButton *duplicateHorButton = new TQPushButton( d->separateView );
+ d->separateView->insert(duplicateHorButton, ImageRegionWidget::SeparateViewDuplicateHorz);
+ TDEGlobal::dirs()->addResourceType("duplicatebothhorz", TDEGlobal::dirs()->kde_default("data") + "digikam/data");
+ directory = TDEGlobal::dirs()->findResourceDir("duplicatebothhorz", "duplicatebothhorz.png");
+ duplicateHorButton->setPixmap( TQPixmap( directory + "duplicatebothhorz.png" ) );
+ duplicateHorButton->setToggleButton(true);
+ TQWhatsThis::add( duplicateHorButton, i18n("<p>If you enable this option, you will separate the preview area "
+ "horizontally, displaying the original and target image "
+ "at the same time. The target is duplicated from the original "
+ "below the red dashed line." ) );
+
+ TQPushButton *duplicateVerButton = new TQPushButton( d->separateView );
+ d->separateView->insert(duplicateVerButton, ImageRegionWidget::SeparateViewDuplicateVert);
+ TDEGlobal::dirs()->addResourceType("duplicatebothvert", TDEGlobal::dirs()->kde_default("data") + "digikam/data");
+ directory = TDEGlobal::dirs()->findResourceDir("duplicatebothvert", "duplicatebothvert.png");
+ duplicateVerButton->setPixmap( TQPixmap( directory + "duplicatebothvert.png" ) );
+ duplicateVerButton->setToggleButton(true);
+ TQWhatsThis::add( duplicateVerButton, i18n("<p>If you enable this option, you will separate the preview area "
+ "vertically, displaying the original and target image "
+ "at the same time. The target is duplicated from the original to "
+ "the right of the red dashed line." ) );
+ }
+
+ if (separateViewMode == SeparateViewNormal ||
+ separateViewMode == SeparateViewAll)
+ {
+ TQPushButton *separateHorButton = new TQPushButton( d->separateView );
+ d->separateView->insert(separateHorButton, ImageRegionWidget::SeparateViewHorizontal);
+ TDEGlobal::dirs()->addResourceType("bothhorz", TDEGlobal::dirs()->kde_default("data") + "digikam/data");
+ directory = TDEGlobal::dirs()->findResourceDir("bothhorz", "bothhorz.png");
+ separateHorButton->setPixmap( TQPixmap( directory + "bothhorz.png" ) );
+ separateHorButton->setToggleButton(true);
+ TQWhatsThis::add( separateHorButton, i18n( "<p>If you enable this option, you will separate the preview area "
+ "horizontally, displaying the original and target image "
+ "at the same time. The original is above the "
+ "red dashed line, the target below it." ) );
+
+ TQPushButton *separateVerButton = new TQPushButton( d->separateView );
+ d->separateView->insert(separateVerButton, ImageRegionWidget::SeparateViewVertical);
+ TDEGlobal::dirs()->addResourceType("bothvert", TDEGlobal::dirs()->kde_default("data") + "digikam/data");
+ directory = TDEGlobal::dirs()->findResourceDir("bothvert", "bothvert.png");
+ separateVerButton->setPixmap( TQPixmap( directory + "bothvert.png" ) );
+ separateVerButton->setToggleButton(true);
+ TQWhatsThis::add( separateVerButton, i18n( "<p>If you enable this option, you will separate the preview area "
+ "vertically, displaying the original and target image "
+ "at the same time. The original is to the left of the "
+ "red dashed line, the target to the right of it." ) );
+ }
+
+ TQPushButton *noSeparateButton = new TQPushButton( d->separateView );
+ d->separateView->insert(noSeparateButton, ImageRegionWidget::SeparateViewNone);
+ TDEGlobal::dirs()->addResourceType("target", TDEGlobal::dirs()->kde_default("data") + "digikam/data");
+ directory = TDEGlobal::dirs()->findResourceDir("target", "target.png");
+ noSeparateButton->setPixmap( TQPixmap( directory + "target.png" ) );
+ noSeparateButton->setToggleButton(true);
+ TQWhatsThis::add( noSeparateButton, i18n( "<p>If you enable this option, the preview area will not "
+ "be separated." ) );
+
+ // -------------------------------------------------------------
+
+ d->progressBar = new KProgress(100, d->previewWidget);
+ TQWhatsThis::add(d->progressBar ,i18n("<p>This is the percentage of the task which has been completed up to this point."));
+ d->progressBar->setProgress(0);
+ d->progressBar->setMaximumHeight( fontMetrics().height() );
+
+ // -------------------------------------------------------------
+
+ d->mainLayout->addMultiCellWidget(preview, 0, 1, 0, 3);
+ d->mainLayout->addMultiCellWidget(d->zoomBar, 2, 2, 0, 0);
+ d->mainLayout->addMultiCellWidget(d->progressBar, 2, 2, 2, 2);
+ d->mainLayout->addMultiCellWidget(d->separateView, 2, 2, 3, 3);
+
+ d->mainLayout->setRowStretch(1, 10);
+ d->mainLayout->setColStretch(1, 10);
+
+ // -------------------------------------------------------------
+
+ TQString sbName(d->settingsSection + TQString(" Image Plugin Sidebar"));
+ d->settingsSideBar = new Sidebar(this, sbName.ascii(), Sidebar::Right);
+ d->settingsSideBar->setSplitter(d->splitter);
+
+ d->settings = new TQWidget(d->settingsSideBar);
+ d->settingsLayout = new TQVBoxLayout(d->settings);
+
+ TQFrame *frame3 = new TQFrame(d->settings);
+ frame3->setFrameStyle(TQFrame::Panel|TQFrame::Sunken);
+ TQVBoxLayout* l3 = new TQVBoxLayout(frame3, 5, 0);
+ d->imagePanIconWidget = new ImagePanIconWidget(360, 240, frame3);
+ TQWhatsThis::add( d->imagePanIconWidget, i18n("<p>Here you can see the original image panel "
+ "which can help you to select the clip preview."
+ "<p>Click and drag the mouse cursor in the "
+ "red rectangle to change the clip focus."));
+ l3->addWidget(d->imagePanIconWidget, 0, TQt::AlignCenter);
+
+ d->settingsLayout->addWidget(frame3, 0, TQt::AlignHCenter);
+ d->settingsLayout->addSpacing(KDialog::spacingHint());
+
+ d->settingsSideBar->appendTab(d->settings, SmallIcon("configure"), i18n("Settings"));
+ d->settingsSideBar->loadViewState();
+
+ // -------------------------------------------------------------
+
+ setProgressVisible(false);
+ TQTimer::singleShot(0, this, TQ_SLOT(slotInitGui()));
+
+ // -------------------------------------------------------------
+
+ connect(d->imageRegionWidget, TQ_SIGNAL(signalContentsMovedEvent(bool)),
+ this, TQ_SLOT(slotOriginalImageRegionChanged(bool)));
+
+ connect(d->imagePanIconWidget, TQ_SIGNAL(signalSelectionMoved(const TQRect&, bool)),
+ this, TQ_SLOT(slotSetImageRegionPosition(const TQRect&, bool)));
+
+ connect(d->imagePanIconWidget, TQ_SIGNAL(signalSelectionTakeFocus()),
+ this, TQ_SLOT(slotPanIconTakeFocus()));
+
+ connect(d->separateView, TQ_SIGNAL(released(int)),
+ d->imageRegionWidget, TQ_SLOT(slotSeparateViewToggled(int)));
+
+ connect(d->separateView, TQ_SIGNAL(released(int)),
+ d->imagePanIconWidget, TQ_SLOT(slotSeparateViewToggled(int)));
+
+ connect(d->zoomBar, TQ_SIGNAL(signalZoomMinusClicked()),
+ d->imageRegionWidget, TQ_SLOT(slotDecreaseZoom()));
+
+ connect(d->zoomBar, TQ_SIGNAL(signalZoomPlusClicked()),
+ d->imageRegionWidget, TQ_SLOT(slotIncreaseZoom()));
+
+ connect(d->zoomBar, TQ_SIGNAL(signalZoomSliderReleased(int)),
+ this, TQ_SLOT(slotZoomSliderChanged(int)));
+}
+
+ImagePannelWidget::~ImagePannelWidget()
+{
+ writeSettings();
+ delete d->settingsSideBar;
+ delete d;
+}
+
+void ImagePannelWidget::readSettings()
+{
+ TDEConfig *config = kapp->config();
+ config->setGroup(d->settingsSection);
+ int mode = config->readNumEntry("Separate View", ImageRegionWidget::SeparateViewDuplicateVert);
+ mode = TQMAX(ImageRegionWidget::SeparateViewHorizontal, mode);
+ mode = TQMIN(ImageRegionWidget::SeparateViewDuplicateHorz, mode);
+
+ d->imageRegionWidget->blockSignals(true);
+ d->imagePanIconWidget->blockSignals(true);
+ d->separateView->blockSignals(true);
+ d->imageRegionWidget->slotSeparateViewToggled( mode );
+ d->imagePanIconWidget->slotSeparateViewToggled( mode );
+ d->separateView->setButton( mode );
+ d->imageRegionWidget->blockSignals(false);
+ d->imagePanIconWidget->blockSignals(false);
+ d->separateView->blockSignals(false);
+}
+
+void ImagePannelWidget::writeSettings()
+{
+ TDEConfig *config = kapp->config();
+ config->setGroup(d->settingsSection);
+ config->writeEntry( "Separate View", d->separateView->selectedId() );
+ config->sync();
+}
+
+void ImagePannelWidget::slotOriginalImageRegionChanged(bool target)
+{
+ slotZoomFactorChanged(d->imageRegionWidget->zoomFactor());
+ TQRect rect = getOriginalImageRegion();
+ d->imagePanIconWidget->setRegionSelection(rect);
+ updateSelectionInfo(rect);
+
+ if (target)
+ {
+ d->imageRegionWidget->backupPixmapRegion();
+ emit signalOriginalClipFocusChanged();
+ }
+}
+
+void ImagePannelWidget::slotZoomFactorChanged(double zoom)
+{
+ double h = (double)ThumbnailSize::Huge;
+ double s = (double)ThumbnailSize::Small;
+ double zmin = d->imageRegionWidget->zoomMin();
+ double zmax = d->imageRegionWidget->zoomMax();
+ double b = (zmin-(zmax*s/h))/(1-s/h);
+ double a = (zmax-b)/h;
+ int size = (int)((zoom - b) /a);
+
+ d->zoomBar->setZoomSliderValue(size);
+ d->zoomBar->setZoomTrackerText(i18n("zoom: %1%").arg((int)(zoom*100.0)));
+
+ d->zoomBar->setEnableZoomPlus(true);
+ d->zoomBar->setEnableZoomMinus(true);
+
+ if (d->imageRegionWidget->maxZoom())
+ d->zoomBar->setEnableZoomPlus(false);
+
+ if (d->imageRegionWidget->minZoom())
+ d->zoomBar->setEnableZoomMinus(false);
+
+ d->imagePanIconWidget->slotZoomFactorChanged(zoom);
+}
+
+void ImagePannelWidget::slotZoomSliderChanged(int size)
+{
+ double h = (double)ThumbnailSize::Huge;
+ double s = (double)ThumbnailSize::Small;
+ double zmin = d->imageRegionWidget->zoomMin();
+ double zmax = d->imageRegionWidget->zoomMax();
+ double b = (zmin-(zmax*s/h))/(1-s/h);
+ double a = (zmax-b)/h;
+ double z = a*size+b;
+
+ d->imageRegionWidget->setZoomFactorSnapped(z);
+}
+
+KProgress *ImagePannelWidget::progressBar()
+{
+ return d->progressBar;
+}
+
+void ImagePannelWidget::resizeEvent(TQResizeEvent *)
+{
+ emit signalResized();
+}
+
+void ImagePannelWidget::slotInitGui()
+{
+ readSettings();
+ setCenterImageRegionPosition();
+ slotOriginalImageRegionChanged(true);
+}
+
+void ImagePannelWidget::setPanIconHighLightPoints(const TQPointArray& pt)
+{
+ d->imageRegionWidget->setHighLightPoints(pt);
+ d->imagePanIconWidget->setHighLightPoints(pt);
+}
+
+void ImagePannelWidget::slotPanIconTakeFocus()
+{
+ d->imageRegionWidget->restorePixmapRegion();
+}
+
+void ImagePannelWidget::setUserAreaWidget(TQWidget *w)
+{
+ w->reparent( d->settings, TQPoint(0, 0) );
+ d->settingsLayout->addSpacing(KDialog::spacingHint());
+ d->settingsLayout->addWidget(w);
+ d->settingsLayout->addStretch();
+}
+
+void ImagePannelWidget::setEnable(bool b)
+{
+ d->imageRegionWidget->setEnabled(b);
+ d->imagePanIconWidget->setEnabled(b);
+ d->separateView->setEnabled(b);
+ d->zoomBar->setEnabled(b);
+}
+
+void ImagePannelWidget::setProgress(int val)
+{
+ d->progressBar->setValue(val);
+}
+
+void ImagePannelWidget::setProgressVisible(bool b)
+{
+ if (b) d->progressBar->show();
+ else d->progressBar->hide();
+}
+
+void ImagePannelWidget::setProgressWhatsThis(const TQString& desc)
+{
+ TQWhatsThis::add( d->progressBar, desc);
+}
+
+void ImagePannelWidget::setPreviewImageWaitCursor(bool enable)
+{
+ if ( enable )
+ d->imageRegionWidget->setCursor( KCursor::waitCursor() );
+ else
+ d->imageRegionWidget->unsetCursor();
+}
+
+TQRect ImagePannelWidget::getOriginalImageRegion()
+{
+ return ( d->imageRegionWidget->getImageRegion() );
+}
+
+TQRect ImagePannelWidget::getOriginalImageRegionToRender()
+{
+ return ( d->imageRegionWidget->getImageRegionToRender() );
+}
+
+DImg ImagePannelWidget::getOriginalRegionImage()
+{
+ return ( d->imageRegionWidget->getImageRegionImage() );
+}
+
+void ImagePannelWidget::setPreviewImage(DImg img)
+{
+ d->imageRegionWidget->updatePreviewImage(&img);
+}
+
+void ImagePannelWidget::setCenterImageRegionPosition()
+{
+ d->imageRegionWidget->setCenterContentsPosition();
+}
+
+void ImagePannelWidget::slotSetImageRegionPosition(const TQRect& rect, bool targetDone)
+{
+ d->imageRegionWidget->setContentsPosition(rect.x(), rect.y(), targetDone);
+}
+
+void ImagePannelWidget::updateSelectionInfo(const TQRect& rect)
+{
+ TQToolTip::add( d->imagePanIconWidget,
+ i18n("<nobr>(%1,%2)(%3x%4)</nobr>")
+ .arg(rect.left()).arg(rect.top())
+ .arg(rect.width()).arg(rect.height()));
+}
+
+} // NameSpace Digikam