/* ============================================================ * * 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 * * 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 // TQt includes. #include #include #include #include // 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(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