QuickInspectorWidget::QuickInspectorWidget(QWidget *parent)
  : QWidget(parent),
    ui(new Ui::QuickInspectorWidget)
{
  ui->setupUi(this);

  ObjectBroker::registerClientObjectFactoryCallback<QuickInspectorInterface*>(
    createQuickInspectorClient);

  m_interface = ObjectBroker::object<QuickInspectorInterface*>();

  ui->windowComboBox->setModel(ObjectBroker::model(QStringLiteral("com.kdab.GammaRay.QuickWindowModel")));
  connect(ui->windowComboBox, SIGNAL(currentIndexChanged(int)),
          m_interface, SLOT(selectWindow(int)));
  if (ui->windowComboBox->currentIndex() >= 0) {
    m_interface->selectWindow(ui->windowComboBox->currentIndex());
  }

  auto model = ObjectBroker::model(QStringLiteral("com.kdab.GammaRay.QuickItemModel"));
  auto proxy = new QuickClientItemModel(this);
  proxy->setSourceModel(model);
  ui->itemTreeView->setModel(proxy);
  new SearchLineController(ui->itemTreeSearchLine, model);
  QItemSelectionModel *selectionModel = ObjectBroker::selectionModel(proxy);
  ui->itemTreeView->setSelectionModel(selectionModel);
  ui->itemTreeView->setItemDelegate(new QuickItemDelegate(ui->itemTreeView));
  connect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
          this, SLOT(itemSelectionChanged(QItemSelection)));
  connect(proxy, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
          this, SLOT(itemModelDataChanged(QModelIndex,QModelIndex,QVector<int>)));

  model = ObjectBroker::model(QStringLiteral("com.kdab.GammaRay.QuickSceneGraphModel"));
  ui->sgTreeView->setModel(model);
  new SearchLineController(ui->sgTreeSearchLine, model);
  QItemSelectionModel *sgSelectionModel = ObjectBroker::selectionModel(model);
  ui->sgTreeView->setSelectionModel(sgSelectionModel);
  connect(sgSelectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
          this, SLOT(itemSelectionChanged(QItemSelection)));

  new QuickItemTreeWatcher(ui->itemTreeView, ui->sgTreeView, this);

  m_previewWidget = new QuickScenePreviewWidget(m_interface, this);

  ui->itemPropertyWidget->setObjectBaseName(QStringLiteral("com.kdab.GammaRay.QuickItem"));
  ui->sgPropertyWidget->setObjectBaseName(QStringLiteral("com.kdab.GammaRay.QuickSceneGraph"));

  ui->previewTreeSplitter->addWidget(m_previewWidget);

  connect(m_interface, SIGNAL(features(GammaRay::QuickInspectorInterface::Features)),
          this, SLOT(setFeatures(GammaRay::QuickInspectorInterface::Features)));

  connect(ui->itemTreeView, SIGNAL(customContextMenuRequested(QPoint)),
          this, SLOT(itemContextMenu(QPoint)));

  m_interface->checkFeatures();
}
QuickInspectorWidget::QuickInspectorWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::QuickInspectorWidget)
    , m_stateManager(this)
{
    ui->setupUi(this);

    ObjectBroker::registerClientObjectFactoryCallback<QuickInspectorInterface *>(
        createQuickInspectorClient);

    m_interface = ObjectBroker::object<QuickInspectorInterface *>();

    ui->windowComboBox->setModel(ObjectBroker::model(QStringLiteral(
                                                         "com.kdab.GammaRay.QuickWindowModel")));
    connect(ui->windowComboBox, SIGNAL(currentIndexChanged(int)),
            m_interface, SLOT(selectWindow(int)));
    if (ui->windowComboBox->currentIndex() >= 0)
        m_interface->selectWindow(ui->windowComboBox->currentIndex());

    auto model = ObjectBroker::model(QStringLiteral("com.kdab.GammaRay.QuickItemModel"));
    auto proxy = new QuickClientItemModel(this);
    proxy->setSourceModel(model);
    ui->itemTreeView->header()->setObjectName("quickItemTreeViewHeader");
    ui->itemTreeView->setDeferredResizeMode(0, QHeaderView::ResizeToContents);
    ui->itemTreeView->setModel(proxy);
    ui->itemTreeView->setItemDelegate(new QuickItemDelegate(ui->itemTreeView));
    new SearchLineController(ui->itemTreeSearchLine, model);
    QItemSelectionModel *selectionModel = ObjectBroker::selectionModel(proxy);
    ui->itemTreeView->setSelectionModel(selectionModel);
    connect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
            this, SLOT(itemSelectionChanged(QItemSelection)));
    connect(proxy, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
            this, SLOT(itemModelDataChanged(QModelIndex,QModelIndex,QVector<int>)));

    model = ObjectBroker::model(QStringLiteral("com.kdab.GammaRay.QuickSceneGraphModel"));
    ui->sgTreeView->header()->setObjectName("sceneGraphTreeViewHeader");
    ui->sgTreeView->setDeferredResizeMode(0, QHeaderView::ResizeToContents);
    ui->sgTreeView->setModel(model);
    new SearchLineController(ui->sgTreeSearchLine, model);
    QItemSelectionModel *sgSelectionModel = ObjectBroker::selectionModel(model);
    ui->sgTreeView->setSelectionModel(sgSelectionModel);
    connect(sgSelectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
            this, SLOT(itemSelectionChanged(QItemSelection)));

    new QuickItemTreeWatcher(ui->itemTreeView, ui->sgTreeView, this);

    m_previewWidget = new QuickScenePreviewWidget(m_interface, this);
    m_previewWidget->setPickSourceModel(proxy);
    m_previewWidget->setFlagRole(QuickItemModelRole::ItemFlags);
    m_previewWidget->setInvisibleMask(QuickItemModelRole::Invisible | QuickItemModelRole::ZeroSize);

    ui->itemPropertyWidget->setObjectBaseName(QStringLiteral("com.kdab.GammaRay.QuickItem"));
    ui->sgPropertyWidget->setObjectBaseName(QStringLiteral("com.kdab.GammaRay.QuickSceneGraph"));

    ui->previewTreeSplitter->addWidget(m_previewWidget);

    connect(m_interface, SIGNAL(features(GammaRay::QuickInspectorInterface::Features)),
            this, SLOT(setFeatures(GammaRay::QuickInspectorInterface::Features)));

    connect(ui->itemTreeView, SIGNAL(customContextMenuRequested(QPoint)),
            this, SLOT(itemContextMenu(QPoint)));

    m_interface->checkFeatures();

    m_stateManager.setDefaultSizes(ui->mainSplitter, UISizeVector() << "50%" << "50%");
    m_stateManager.setDefaultSizes(ui->previewTreeSplitter, UISizeVector() << "50%" << "50%");

    connect(ui->itemPropertyWidget, SIGNAL(tabsUpdated()), this, SLOT(propertyWidgetTabsChanged()));
    connect(ui->sgPropertyWidget, SIGNAL(tabsUpdated()), this, SLOT(propertyWidgetTabsChanged()));
}
QuickInspectorWidget::QuickInspectorWidget(QWidget *parent)
    : QWidget(parent),
      ui(new Ui::QuickInspectorWidget),
      m_renderTimer(new QTimer(this)),
      m_sceneChangedSinceLastRequest(false),
      m_waitingForImage(false),
      m_imageProvider(new QuickSceneImageProvider),
      m_preview(new QQuickView)
{
    ui->setupUi(this);

    ObjectBroker::registerClientObjectFactoryCallback<QuickInspectorInterface*>(
        createQuickInspectorClient);

    m_interface = ObjectBroker::object<QuickInspectorInterface*>();
    connect(m_interface, SIGNAL(sceneChanged()), this, SLOT(sceneChanged()));
    connect(m_interface, SIGNAL(sceneRendered(QVariantMap)),
            this, SLOT(sceneRendered(QVariantMap)));

    ui->windowComboBox->setModel(ObjectBroker::model("com.kdab.GammaRay.QuickWindowModel"));
    connect(ui->windowComboBox, SIGNAL(currentIndexChanged(int)),
            m_interface, SLOT(selectWindow(int)));
    if (ui->windowComboBox->currentIndex() >= 0) {
        m_interface->selectWindow(ui->windowComboBox->currentIndex());
    }

    QSortFilterProxyModel *proxy = new QuickClientItemModel(this);
    proxy->setSourceModel(ObjectBroker::model("com.kdab.GammaRay.QuickItemModel"));
    proxy->setDynamicSortFilter(true);
    ui->itemTreeView->setModel(proxy);
    ui->itemTreeSearchLine->setProxy(proxy);
    QItemSelectionModel *selectionModel = ObjectBroker::selectionModel(proxy);
    ui->itemTreeView->setSelectionModel(selectionModel);
    ui->itemTreeView->setItemDelegate(new QuickItemDelegate(ui->itemTreeView));
    connect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
            this, SLOT(itemSelectionChanged(QItemSelection)));
    connect(proxy, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
            this, SLOT(itemModelDataChanged(QModelIndex,QModelIndex)));

    QSortFilterProxyModel *sgProxy = new KRecursiveFilterProxyModel(this);
    sgProxy->setSourceModel(ObjectBroker::model("com.kdab.GammaRay.QuickSceneGraphModel"));
    sgProxy->setDynamicSortFilter(true);
    ui->sgTreeView->setModel(sgProxy);
    ui->sgTreeSearchLine->setProxy(sgProxy);
    QItemSelectionModel *sgSelectionModel = ObjectBroker::selectionModel(sgProxy);
    ui->sgTreeView->setSelectionModel(sgSelectionModel);
    connect(sgSelectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
            this, SLOT(itemSelectionChanged(QItemSelection)));

    new QuickItemTreeWatcher(ui->itemTreeView, ui->sgTreeView, this);
    new DeferredResizeModeSetter(ui->itemTreeView->header(), 0, QHeaderView::ResizeToContents);

    ui->itemPropertyWidget->setObjectBaseName("com.kdab.GammaRay.QuickItem");
    ui->sgPropertyWidget->setObjectBaseName("com.kdab.GammaRay.QuickSceneGraph");

    qmlRegisterType<AnnotatedScenePreview>("com.kdab.GammaRay", 1, 0, "AnnotatedScenePreview");

    QWidget *previewContainter = QWidget::createWindowContainer(m_preview, ui->previewTreeSplitter);
    previewContainter->setFocusPolicy(Qt::StrongFocus);
    m_preview->setResizeMode(QQuickView::SizeRootObjectToView);
    m_preview->engine()->addImageProvider("quicksceneprovider", m_imageProvider);
    m_preview->setSource(QUrl("qrc:/gammaray/plugins/quickinspector/quickpreview.qml"));
    m_rootItem = qobject_cast< QQuickItem *>(m_preview->rootObject());
    qmlRegisterUncreatableType<QuickInspectorInterface>(
        "com.kdab.GammaRay", 1, 0, "QuickInspectorInterface", "Can't create. Only for enums.");
    m_preview->engine()->rootContext()->setContextProperty("inspectorInterface", m_interface);
    QTimer::singleShot(0, this, SLOT(setSplitterSizes()));

    m_renderTimer->setInterval(100);
    m_renderTimer->setSingleShot(true);
    connect(m_renderTimer, SIGNAL(timeout()), this, SLOT(requestRender()));

    connect(m_interface, SIGNAL(features(GammaRay::QuickInspectorInterface::Features)),
            this, SLOT(setFeatures(GammaRay::QuickInspectorInterface::Features)));

    m_interface->checkFeatures();
}