// ---------------------------------------------------------------------------
// Name:        acCustomGraphicsView::mousePressEvent
// Description: captures mouse press events on a view
//              checks if an image is under the mouse
//              and determins if user want to move an item
//              or send a message to reset a view
// Arguments:   QMouseEvent *event
// Return Val:  
// Date:        4/9/2015
// ---------------------------------------------------------------------------
void acCustomGraphicsView::mousePressEvent(QMouseEvent  *event)
{
    QGraphicsItem * itemPicked = itemAt(event->pos());
    // Found an item under the cursor
    if (itemPicked)
    {
        // Is the item our custome image 
        if (itemPicked->type() == (itemPicked->UserType + acCustomGraphicsTypes::IMAGE))
        {
            // User pressed the left mouse change its widget to Hand Cursor
            if (event->button() == Qt::LeftButton) {
                setCursor(Qt::ClosedHandCursor);
                mousechanged = true;
                emit OnMouseHandDown();
            }
        }

        // Item is Navigation and user selected Alt+left mouse Click
        // to resize the Image to fit current view window 
        if (itemPicked->type() == (itemPicked->UserType + acCustomGraphicsTypes::NAVIGATION_IMAGE))
        {
            if ((event->button() == Qt::LeftButton) && (event->modifiers() == Qt::ShiftModifier)) {
                emit resetImageView();
            }
        }

    }
    QGraphicsView::mousePressEvent(event);
}
// ---------------------------------------------------------------------------
// Name:        acImageView::acImageView
// Description: Constructor
//              builds a QGraphics based image viewer widget that contains
//              a navigation view default (lower right corner)
// Date:        13/8/2015
// ---------------------------------------------------------------------------
acImageView::acImageView(const QString filePathName, QWidget *parent, QImage** image, CMipImages *MipImages)
{
    Q_UNUSED(parent);
    Q_UNUSED(image);
    
    m_MipImages = MipImages;

    m_layout = new QGridLayout(this);
    m_layout->setSpacing(0);
    m_layout->setMargin(0);
    m_layout->setContentsMargins(0, 0, 0, 0);
    
    m_imageGraphicsView = NULL;
    m_graphicsScene     = NULL;
    m_imageItem         = NULL;
    m_imageItemNav      = NULL;
    //Reserved: GPUDecode

    m_navVisible        = false;
    m_imageOrientation  = 0;
    m_ImageScale        = 100;
    m_MouseHandDown     = false;
    
    // Display if we have images
    if (m_MipImages)
    {
            
        if (m_MipImages->Image_list.count() > 0) 
        {
            // The scene is at 0,0 and set to the size of this display widget
            m_graphicsScene = new acCustomGraphicsScene(this);

            QSize  size = this->size();

            m_graphicsScene->setSceneRect(0, 0, size.width(), size.height());
            m_graphicsScene->setBackgroundBrush(QBrush(Qt::black, Qt::SolidPattern));

            //==========================
            // Add a QImage to the scene
            // 
            // An image item this is been used for the main view
            // Note if a compressed image is loaded ie BCn DDS file
            // We will still have a default image file that is used as a temp
            // The temp file is loaded via resource file ie: ":/CompressonatorGUI/Images/CompressedImageError.png"
            //==========================

            m_ImageIndex = 0;
            QImage *image = m_MipImages->Image_list[m_ImageIndex];
            QPixmap pixmap = QPixmap::fromImage(*image);
            m_imageItem = new acCustomGraphicsImageItem(pixmap);
            m_imageItem->ID = m_graphicsScene->ID;
            m_imageItem->setFlags(QGraphicsItem::ItemIsSelectable);
            m_graphicsScene->addItem(m_imageItem);
            m_imageItem->setVisible(true);

#ifdef ENABLE_NAVIGATION
            // Copy of the image view item (ToDo->Scale down to fit a smalled size)
            // it will be positioned to bottom left corner of the graphics view
            // and hidden by default, the view toggles on or off based on when 
            // a navigateButton is clicked
            m_imageItemNav = new acCustomGraphicsNavImageItem(QPixmap::fromImage((*image)));
            m_imageItemNav->ID = m_graphicsScene->ID;
            m_imageItemNav->setVisible(false);
            m_imageItemNav->setFlags(QGraphicsItem::ItemIsSelectable);
            m_graphicsScene->addItem(m_imageItemNav);

            m_navigateButton = new QPushButton();
            if (m_MipImages->MIPS2QtFailed)
            {
                QString PushButtonStyle("QPushButton {background: red; border:none; margin: 0px; padding: 0px } QPushButton:hover {border:1px solid black}");
                m_navigateButton->setStyleSheet(PushButtonStyle);
            }

            QPixmap pixmap(qt_navigate_png);

            m_graphicsScene->addWidget(m_navigateButton);

            // a scalled transparent window that is a child of the navigation view
            // ToDo(s)
            //   1.  when its moved the view of the main image will pan to match the box area
            //   2.  scale the size of the box to that of acImageView widget size 
            //   3.  Keep the bounds of the move within the navigation window
            acCustomGraphicsNavWindow *m_navWindow = new acCustomGraphicsNavWindow(QRectF(0, 0, 50, 50), m_imageItemNav);
            m_navWindow->ID = m_graphicsScene->ID;
            m_navWindow->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable);
            m_navWindow->setOpacity(0.5);
            m_navWindow->setPen(QPen(Qt::black));
            m_navWindow->setBrush(Qt::white);
            m_navigateButton->hide();
#endif


            // The widget viewer for all of the items
            m_imageGraphicsView = new acCustomGraphicsView();
            m_imageGraphicsView->ID = m_graphicsScene->ID;
            m_imageGraphicsView->setVisible(false);
            m_imageGraphicsView->setScene(m_graphicsScene);
            m_imageGraphicsView->setFrameShadow(QFrame::Raised);
            m_imageGraphicsView->centerOn(0, 0);
            m_layout->addWidget(m_imageGraphicsView, 0, 0);
            m_imageGraphicsView->ensureVisible(m_imageItem);
            m_imageGraphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
            m_imageGraphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);

            m_xPos = m_imageGraphicsView->horizontalScrollBar();
            if (m_xPos)
            {
                // These values should be refreshed each time the acImageView is resized
                // for now we are obtaining the constructors defaults
                m_defaultXPos_minimum = m_xPos->minimum();
                m_defaultXPos_maximum = m_xPos->maximum();
            }

            m_yPos = m_imageGraphicsView->verticalScrollBar();
            if (m_yPos)
            {
                // These values should be refreshed each time the acImageView is resized
                // for now we are obtaining the constructors defaults
                m_defaultYPos_minimum = m_yPos->minimum();
                m_defaultYPos_maximum = m_yPos->maximum();
            }


            // Public : Events from acCustomGraphics 
            connect(m_graphicsScene, SIGNAL(sceneMousePosition(QPointF *, int)), this, SLOT(onacImageViewMousePosition(QPointF *, int)));
            connect(m_imageGraphicsView, SIGNAL(resetImageView()), this, SLOT(onResetImageView()));
            connect(m_imageGraphicsView, SIGNAL(OnMouseHandDown()), this, SLOT(onMouseHandDown()));
            connect(m_imageGraphicsView, SIGNAL(OnMouseHandD()), this, SLOT(onMouseHandD()));

            connect(m_imageGraphicsView, SIGNAL(OnWheelScaleUp(QPointF &))  , this, SLOT(onWheelScaleUp(QPointF &)));
            connect(m_imageGraphicsView, SIGNAL(OnWheelScaleDown(QPointF &)), this, SLOT(onWheelScaleDown(QPointF &)));

#ifdef ENABLE_NAVIGATION
            connect(m_navigateButton, SIGNAL(released()), this, SLOT(onNavigateClicked()));
#endif


            //===============================
            // Add a OpenGL Widget if needed
            // to the GraphicsView
            //===============================
            if (
                m_MipImages 
                && 
                (m_MipImages->m_MipImageFormat == MIPIMAGE_FORMAT::Format_OpenGL)
                )
            {
                if (m_MipImages->mipset)
                {
                    if (m_MipImages->mipset->m_compressed)
                    {
                        //Reserved: GPUDecode
                    }

                }
            }

            //==========================
            // Add a image data Table
            // to the GraphicsView
            //==========================

            if (m_MipImages->m_Error == MIPIMAGE_FORMAT_ERRORS::Format_NoErrors)
            {
                QRect ImageSize = image->rect();
                m_myModel = new acTableImageDataModel(ImageSize.height(), ImageSize.width(), this);

                m_tableView = new QTableView(this);
                m_tableView->setAutoScroll(true);
                m_tableView->setModel(m_myModel);

                QWidget *newWidget = new QWidget();
                QHBoxLayout *layout = new QHBoxLayout();
                layout->addWidget(m_tableView);
                newWidget->setLayout(layout);

                m_graphicsScene->addWidget(newWidget);
                m_tableViewitem = m_imageGraphicsView->itemAt(0, 0);
                if (m_tableViewitem)
                {
                    m_tableViewitem->setOpacity(0.75);
                    m_tableViewitem->hide();
                }
            }
            else
            {
                m_tableViewitem = NULL;
                m_tableView = NULL;
            }

            //===============================
            // TopMost Layer: Mouse
            //===============================
            m_linex = new QGraphicsLineItem();
            m_graphicsScene->addItem(m_linex);
            m_linex->setLine(0, 0, CURSOR_SIZE * 2, 0);

            m_liney = new QGraphicsLineItem();
            m_graphicsScene->addItem(m_liney);
            m_liney->setLine(0, 0, 0, CURSOR_SIZE * 2);

            QPen pen(Qt::white);
            m_linex->setPen(pen);
            m_liney->setPen(pen);

            m_linex->hide();
            m_liney->hide();

            //=============================
            // Set Visable items
            //=============================
            m_imageGraphicsView->setVisible(true);

            ManageScrollBars();

        }

    }