/***************************************************************************
            ImageView.h  -  simple widget class for displaying a QImage
                             -------------------
    begin                : 1999
    copyright            : (C) 1999 by Martin Wilz
    email                : Martin Wilz <mwilz@ernie.mi.uni-koeln.de>
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef IMAGEVIEW_H
#define IMAGEVIEW_H

#include "config.h"

#include <QtGlobal>
#include <QImage>
#include <QPainter>
#include <QWidget>

namespace Kwave
{
    /**
     * Simple widget class for displaying a QImage.
     */
    class Q_DECL_EXPORT ImageView: public QWidget
    {
        Q_OBJECT
    public:
        /**
         * Constructor.
         * @param parent pointer to the parent widget, can be 0
         * @param fit_width if set to true, the image will be scaled to fit
         *        horizontally into the widget; if false the image will be
         *        cut off at the edge and should be scrolled
         * @param fit_height if set to true, the image will be scaled to fit
         *        vertically into the widget; if false the image will be
         *        cut off at the edge and should be scrolled
         */
        explicit ImageView(QWidget *parent = Q_NULLPTR,
                           bool fit_width  = true,
                           bool fit_height = true);

        /**
         * Destructor
         */
        virtual ~ImageView() Q_DECL_OVERRIDE;

        /**
         * Returns the position and size of the current image, packed
         * into a QRect object.
         * @return rectangle with the image coordinates and size
         */
        QRect imageRect();

    public slots:

        /**
        * Sets a new QImage for displaying.
        * @param image a pointer to the image
        */
        void setImage(QImage image);

        /** sets a new horizontal offset, useful for scrolling */
        void setHorizOffset(int offset);

        /** sets a new vertical offset, useful for scrolling */
        void setVertOffset(int offset);

    signals:

        void viewInfo(int, int, int);
        void sigCursorPos(const QPoint pos);

    protected:

        virtual void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE;

        virtual void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE;

        virtual void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE;

    private:
        /**
         * offset of the image, in original unscaled coordinates
         * of the internal QImage
         */
        QPoint m_offset;

        /**
         * last displayed image rectangle. Note that the left and
         * top coordinates are unscaled, but the width and height
         * might be scaled to screen coordinates!
         */
        QRect m_last_rect;

        /** pointer to the QImage to be displayed */
        QImage m_image;

        /** if true, scale to fit horizontally */
        bool m_fit_width;

        /** if true, scale to fit vertically */
        bool m_fit_height;

        /**
         * scale factor in horizontal direction, will be
         * (width of the image / width of the widget) if m_fit_width
         * is true, or 1.0 else
         */
        double m_scale_x;

        /**
         * scale factor in vertical direction, will be
         * (height of the image / height of the widget) if m_fit_height
         * is true, or 1.0 else
         */
        double m_scale_y;

    };
}

#endif // _IMAGEVIEW_H_

//***************************************************************************
//***************************************************************************
