You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
6.3 KiB
199 lines
6.3 KiB
/* ============================================================
|
|
*
|
|
* This file is a part of digiKam project
|
|
* http://www.digikam.org
|
|
*
|
|
* Date : 2004-08-22
|
|
* Description : a widget to display a panel to choose
|
|
* a rectangular image area.
|
|
*
|
|
* Copyright (C) 2004-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.
|
|
*
|
|
* ============================================================ */
|
|
|
|
// C++ includes.
|
|
|
|
#include <cmath>
|
|
|
|
// TQt includes.
|
|
|
|
#include <tqpainter.h>
|
|
#include <tqpixmap.h>
|
|
#include <tqpen.h>
|
|
#include <tqtimer.h>
|
|
|
|
// Local includes.
|
|
|
|
#include "ddebug.h"
|
|
#include "imageiface.h"
|
|
#include "imageregionwidget.h"
|
|
#include "imagepaniconwidget.h"
|
|
#include "imagepaniconwidget.moc"
|
|
|
|
namespace Digikam
|
|
{
|
|
|
|
class ImagePanIconWidgetPriv
|
|
{
|
|
public:
|
|
|
|
ImagePanIconWidgetPriv()
|
|
{
|
|
iface = 0;
|
|
data = 0;
|
|
separateView = ImageRegionWidget::SeparateViewNone;
|
|
}
|
|
|
|
uchar *data;
|
|
|
|
int separateView;
|
|
|
|
TQPointArray hightlightPoints;
|
|
|
|
ImageIface *iface;
|
|
};
|
|
|
|
ImagePanIconWidget::ImagePanIconWidget(int w, int h, TQWidget *parent, WFlags flags)
|
|
: PanIconWidget(parent, flags)
|
|
{
|
|
d = new ImagePanIconWidgetPriv;
|
|
|
|
d->iface = new ImageIface(w, h);
|
|
d->data = d->iface->getPreviewImage();
|
|
m_width = d->iface->previewWidth();
|
|
m_height = d->iface->previewHeight();
|
|
m_orgWidth = d->iface->originalWidth();
|
|
m_orgHeight = d->iface->originalHeight();
|
|
m_zoomedOrgWidth = d->iface->originalWidth();
|
|
m_zoomedOrgHeight = d->iface->originalHeight();
|
|
m_pixmap = new TQPixmap(w, h);
|
|
|
|
setFixedSize(m_width, m_height);
|
|
|
|
m_rect = TQRect(width()/2-m_width/2, height()/2-m_height/2, m_width, m_height);
|
|
updatePixmap();
|
|
m_timerID = startTimer(800);
|
|
}
|
|
|
|
ImagePanIconWidget::~ImagePanIconWidget()
|
|
{
|
|
delete d->iface;
|
|
delete [] d->data;
|
|
delete d;
|
|
}
|
|
|
|
void ImagePanIconWidget::setHighLightPoints(const TQPointArray& pointsList)
|
|
{
|
|
d->hightlightPoints = pointsList;
|
|
updatePixmap();
|
|
repaint(false);
|
|
}
|
|
|
|
void ImagePanIconWidget::updatePixmap()
|
|
{
|
|
// Drawing background and image.
|
|
m_pixmap->fill(colorGroup().background());
|
|
d->iface->paint(TQT_TQPAINTDEVICE(m_pixmap), m_rect.x(), m_rect.y(), m_rect.width(), m_rect.height());
|
|
|
|
TQPainter p(m_pixmap);
|
|
|
|
// Drawing HighLighted points.
|
|
|
|
if (!d->hightlightPoints.isEmpty())
|
|
{
|
|
TQPoint pt;
|
|
|
|
for (int i = 0 ; i < d->hightlightPoints.count() ; i++)
|
|
{
|
|
pt = d->hightlightPoints.point(i);
|
|
pt.setX((int)(pt.x() * (float)(m_width) / (float)d->iface->originalWidth()));
|
|
pt.setY((int)(pt.y() * (float)(m_height) / (float)d->iface->originalHeight()));
|
|
p.setPen(TQPen(TQt::black, 1, TQt::SolidLine));
|
|
p.drawLine(pt.x(), pt.y()-1, pt.x(), pt.y()+1);
|
|
p.drawLine(pt.x()-1, pt.y(), pt.x()+1, pt.y());
|
|
p.setPen(TQPen(TQt::white, 1, TQt::SolidLine));
|
|
p.drawPoint(pt.x()-1, pt.y()-1);
|
|
p.drawPoint(pt.x()+1, pt.y()+1);
|
|
p.drawPoint(pt.x()-1, pt.y()+1);
|
|
p.drawPoint(pt.x()+1, pt.y()-1);
|
|
}
|
|
}
|
|
|
|
// Drawing selection border
|
|
|
|
if (m_flicker) p.setPen(TQPen(TQt::white, 1, TQt::SolidLine));
|
|
else p.setPen(TQPen(TQt::red, 1, TQt::SolidLine));
|
|
|
|
p.drawRect(m_localRegionSelection.x(),
|
|
m_localRegionSelection.y(),
|
|
m_localRegionSelection.width(),
|
|
m_localRegionSelection.height());
|
|
|
|
if (m_flicker) p.setPen(TQPen(TQt::red, 1, TQt::DotLine));
|
|
else p.setPen(TQPen(TQt::white, 1, TQt::DotLine));
|
|
|
|
p.drawRect(m_localRegionSelection.x(),
|
|
m_localRegionSelection.y(),
|
|
m_localRegionSelection.width(),
|
|
m_localRegionSelection.height());
|
|
|
|
if (d->separateView == ImageRegionWidget::SeparateViewVertical)
|
|
{
|
|
if (m_flicker) p.setPen(TQPen(TQt::white, 1, TQt::SolidLine));
|
|
else p.setPen(TQPen(TQt::red, 1, TQt::SolidLine));
|
|
|
|
p.drawLine(m_localRegionSelection.topLeft().x() + m_localRegionSelection.width()/2,
|
|
m_localRegionSelection.topLeft().y(),
|
|
m_localRegionSelection.bottomLeft().x() + m_localRegionSelection.width()/2,
|
|
m_localRegionSelection.bottomLeft().y());
|
|
|
|
if (m_flicker) p.setPen(TQPen(TQt::red, 1, TQt::DotLine));
|
|
else p.setPen(TQPen(TQt::white, 1, TQt::DotLine));
|
|
|
|
p.drawLine(m_localRegionSelection.topLeft().x() + m_localRegionSelection.width()/2,
|
|
m_localRegionSelection.topLeft().y() + 1,
|
|
m_localRegionSelection.bottomLeft().x() + m_localRegionSelection.width()/2,
|
|
m_localRegionSelection.bottomLeft().y() - 1);
|
|
}
|
|
else if (d->separateView == ImageRegionWidget::SeparateViewHorizontal)
|
|
{
|
|
if (m_flicker) p.setPen(TQPen(TQt::white, 1, TQt::SolidLine));
|
|
else p.setPen(TQPen(TQt::red, 1, TQt::SolidLine));
|
|
|
|
p.drawLine(m_localRegionSelection.topLeft().x(),
|
|
m_localRegionSelection.topLeft().y() + m_localRegionSelection.height()/2,
|
|
m_localRegionSelection.topRight().x(),
|
|
m_localRegionSelection.topRight().y() + m_localRegionSelection.height()/2);
|
|
|
|
if (m_flicker) p.setPen(TQPen(TQt::red, 1, TQt::DotLine));
|
|
else p.setPen(TQPen(TQt::white, 1, TQt::DotLine));
|
|
|
|
p.drawLine(m_localRegionSelection.topLeft().x() + 1,
|
|
m_localRegionSelection.topLeft().y() + m_localRegionSelection.height()/2,
|
|
m_localRegionSelection.topRight().x() - 1,
|
|
m_localRegionSelection.topRight().y() + m_localRegionSelection.height()/2);
|
|
}
|
|
|
|
p.end();
|
|
}
|
|
|
|
void ImagePanIconWidget::slotSeparateViewToggled(int t)
|
|
{
|
|
d->separateView = t;
|
|
updatePixmap();
|
|
repaint(false);
|
|
}
|
|
|
|
} // NameSpace Digikam
|