
/*
 * Copyright 2012 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#ifndef SKINSPECTORWIDGET_H_
#define SKINSPECTORWIDGET_H_

#include "SkMatrix.h"

#include <QWidget>
#include <QTabWidget>
#include <QTextEdit>
#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>

/** \class SkInspectorWidget

    The InspectorWidget contains the overview and details tab. These contain
    information about the whole picture and details about each draw command.
 */
class SkInspectorWidget : public QWidget {
    Q_OBJECT

public:
    enum TabType {
        kOverview_TabType,
        kDetail_TabType,
        kClipStack_TabType,
        kTotalTabCount,
    };

    /**
        Constructs a widget with the specified parent for layout purposes.
        @param parent  The parent container of this widget
     */
    SkInspectorWidget();

    void setDisabled(bool isDisabled) {
        fMatrixAndClipWidget.setDisabled(isDisabled);
    }

    /**
        Sets the text in tab at the specified index.
        @param text
     */
    void setText(QString text, TabType type);

    /**
        Sets the text in the current matrix.
        @param matrixValues
     */
    void setMatrix(const SkMatrix& matrix);

    /**
        Sets the text in the current clip.
        @param clipValues
     */
    void setClip(const SkIRect& clip);

    class Tab : public QWidget {
        QWidget fTab;
        QHBoxLayout fTabLayout;
        QTextEdit fTabText;
        QString fName;

        Tab(const char* name) {
            fTabText.setReadOnly(true);
            fTabLayout.setSpacing(6);
            fTabLayout.setContentsMargins(11, 11, 11, 11);
            fTabLayout.addWidget(&fTabText);
            fTab.setLayout(&fTabLayout);
            fName = QString(name);
        }
    };

private:
    QHBoxLayout fHorizontalLayout;
    QTabWidget fTabWidget;

    QWidget fTabs[kTotalTabCount];
    QHBoxLayout fTabLayouts[kTotalTabCount];
    QTextEdit fTabTexts[kTotalTabCount];

    QWidget fMatrixAndClipWidget;
    QVBoxLayout fVerticalLayout;

    QLabel fMatrixLabel;
    QVBoxLayout fMatrixLayout;
    QHBoxLayout fMatrixRow[3];
    QLineEdit fMatrixEntry[9];

    QLabel fClipLabel;
    QVBoxLayout fClipLayout;
    QHBoxLayout fClipRow[2];
    QLineEdit fClipEntry[4];

    QVBoxLayout* setupMatrix();
    QVBoxLayout* setupClip();
};

#endif
