// ---------------------------------------------------------------------------
// 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();

        }

    }
acDockWidgetTitlebar::acDockWidgetTitlebar(QWidget *parent) : parent(parent)
{
    QString PushButtonStyle("QPushButton {border:none; margin: 0px; padding: 0px } QPushButton:hover {border:1px solid black}");

    QPalette Pal(palette());
    Pal.setColor(QPalette::Background, Qt::lightGray);
    setAutoFillBackground(true);
    setPalette(Pal);
    setMaximumHeight(20);
    m_close = false;

    m_parent = parent;

    // Create a close button and set its icon to that of the OS 
    m_ToolBarIcon = new QIcon(":/CompressonatorGUI/Images/settings.png");

    m_buttonToolBar = new QPushButton(this);
    m_buttonToolBar->setIcon(*m_ToolBarIcon);
    m_buttonToolBar->setStyleSheet(PushButtonStyle);
    m_buttonToolBar->setToolTip("Show Tool Bar");
    m_buttonToolBarEnabled = true;


    // Get the OS close button icon
    QStyle*style = qApp->style();

    QIcon minimizeIcon = style->standardIcon(QStyle::SP_TitleBarMinButton);
    // Create a maximize button and set its icon to that of the OS 
    m_buttonMinimize = new QPushButton(this);
    m_buttonMinimize->setIcon(minimizeIcon);
    m_buttonMinimize->setStyleSheet(PushButtonStyle);
    m_buttonMinimize->setToolTip("Minimize Window");

    QIcon maximizeIcon = style->standardIcon(QStyle::SP_TitleBarMaxButton);
    // Create a maximize button and set its icon to that of the OS 
    m_buttonMaximize = new QPushButton(this);
    m_buttonMaximize->setIcon(maximizeIcon);
    m_buttonMaximize->setStyleSheet(PushButtonStyle);
    m_buttonMaximize->setToolTip("Maximize Window");

    QIcon normalIcon = style->standardIcon(QStyle::SP_TitleBarNormalButton);
    // Create a maximize button and set its icon to that of the OS 
    m_buttonNormal = new QPushButton(this);
    m_buttonNormal->setIcon(normalIcon);
    m_buttonNormal->setStyleSheet(PushButtonStyle);
    m_buttonNormal->setToolTip("Normal Window");
    m_buttonNormal->hide();

    QIcon closeIcon = style->standardIcon(QStyle::SP_TitleBarCloseButton);
    
    // Create a close button and set its icon to that of the OS 
    m_buttonClose = new QPushButton(this);
    //m_buttonClose->setIcon(QIcon(":/CompressonatorGUI/Images/cxClose.png"));
    m_buttonClose->setIcon(closeIcon);
    m_buttonClose->setStyleSheet(PushButtonStyle);
    m_buttonClose->setToolTip("Close Window");
    m_ButtonCloseEnabled = true;

    // Reserve a label for the Titlebar
    m_label = new QLabel("",this);

    // Set a layout for the new label and pushbutton
    m_layout = new QHBoxLayout(this);
    m_layout->addWidget(m_label,Qt::AlignLeading);
    m_layout->addWidget(m_buttonToolBar);
    m_layout->addWidget(m_buttonMinimize);
    m_layout->addWidget(m_buttonNormal);
    m_layout->addWidget(m_buttonMaximize);
    m_layout->addWidget(m_buttonClose);

    m_layout->setSpacing(0);
    m_layout->setMargin(0);
    m_layout->setContentsMargins(0, 0, 0, 0);

    setLayout(m_layout);

    connect(m_buttonMinimize, SIGNAL(clicked()), this, SLOT(onMinimize()));
    connect(m_buttonNormal, SIGNAL(clicked()), this, SLOT(onNormal()));
    connect(m_buttonMaximize, SIGNAL(clicked()), this, SLOT(onMaximize()));
    connect(m_buttonClose, SIGNAL(clicked()), this, SLOT(onClose()));
    connect(m_buttonToolBar, SIGNAL(clicked()), this, SLOT(OnToolBarClicked()));

    setButtonMinMaxEnabled(false);
    
}