// Copyright (C) 2021 Jakub Melka // // This file is part of PDF4QT. // // PDF4QT is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // with the written consent of the copyright owner, any later version. // // PDF4QT is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with PDF4QT. If not, see . #include "objectinspectordialog.h" #include "ui_objectinspectordialog.h" #include "pdfwidgetutils.h" #include "pdfobjectinspectortreeitemmodel.h" #include namespace pdfplugin { ObjectInspectorDialog::ObjectInspectorDialog(const pdf::PDFCMS* cms, const pdf::PDFDocument* document, QWidget* parent) : QDialog(parent, Qt::Dialog | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint), ui(new Ui::ObjectInspectorDialog), m_cms(cms), m_document(document), m_model(nullptr) { ui->setupUi(this); m_objectClassifier.classify(document); ui->currentObjectWidget->setCms(cms); ui->currentObjectWidget->setDocument(document); ui->modeComboBox->addItem(tr("Document"), int(PDFObjectInspectorTreeItemModel::Document)); ui->modeComboBox->addItem(tr("Pages"), int(PDFObjectInspectorTreeItemModel::Page)); if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::ContentStream)) { ui->modeComboBox->addItem(tr("Content streams"), int(PDFObjectInspectorTreeItemModel::ContentStream)); } if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::GraphicState)) { ui->modeComboBox->addItem(tr("Graphic states"), int(PDFObjectInspectorTreeItemModel::GraphicState)); } if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::ColorSpace)) { ui->modeComboBox->addItem(tr("Color spaces"), int(PDFObjectInspectorTreeItemModel::ColorSpace)); } if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Pattern)) { ui->modeComboBox->addItem(tr("Patterns"), int(PDFObjectInspectorTreeItemModel::Pattern)); } if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Shading)) { ui->modeComboBox->addItem(tr("Shadings"), int(PDFObjectInspectorTreeItemModel::Shading)); } if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Image)) { ui->modeComboBox->addItem(tr("Images"), int(PDFObjectInspectorTreeItemModel::Image)); } if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Form)) { ui->modeComboBox->addItem(tr("Forms"), int(PDFObjectInspectorTreeItemModel::Form)); } if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Font)) { ui->modeComboBox->addItem(tr("Fonts"), int(PDFObjectInspectorTreeItemModel::Font)); } if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Action)) { ui->modeComboBox->addItem(tr("Actions"), int(PDFObjectInspectorTreeItemModel::Action)); } if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Annotation)) { ui->modeComboBox->addItem(tr("Annotations"), int(PDFObjectInspectorTreeItemModel::Annotation)); } ui->modeComboBox->addItem(tr("Object List"), int(PDFObjectInspectorTreeItemModel::List)); ui->modeComboBox->setCurrentIndex(ui->modeComboBox->findData(int(PDFObjectInspectorTreeItemModel::Document))); connect(ui->modeComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, &ObjectInspectorDialog::onModeChanged); m_model = new PDFObjectInspectorTreeItemModel(&m_objectClassifier, this); onModeChanged(); m_model->setDocument(pdf::PDFModifiedDocument(const_cast(document), nullptr, pdf::PDFModifiedDocument::Reset)); ui->objectTreeView->setRootIsDecorated(true); ui->objectTreeView->setModel(m_model); ui->splitter->setStretchFactor(0, 0); ui->splitter->setStretchFactor(1, 1); ui->splitter->setCollapsible(0, true); ui->splitter->setCollapsible(1, true); ui->splitter->setSizes(QList() << pdf::PDFWidgetUtils::scaleDPI_x(this, 300) << pdf::PDFWidgetUtils::scaleDPI_x(this, 200)); connect(ui->objectTreeView->selectionModel(), &QItemSelectionModel::currentChanged, this, &ObjectInspectorDialog::onCurrentIndexChanged); connect(ui->currentObjectWidget, &ObjectViewerWidget::pinRequest, this, &ObjectInspectorDialog::onPinRequest); connect(ui->currentObjectWidget, &ObjectViewerWidget::unpinRequest, this, &ObjectInspectorDialog::onUnpinRequest); ui->objectTreeView->setMinimumWidth(pdf::PDFWidgetUtils::scaleDPI_x(this, 200)); setMinimumSize(pdf::PDFWidgetUtils::scaleDPI(this, QSize(800, 600))); pdf::PDFWidgetUtils::style(this); } ObjectInspectorDialog::~ObjectInspectorDialog() { delete ui; } void ObjectInspectorDialog::onModeChanged() { const PDFObjectInspectorTreeItemModel::Mode mode = static_cast(ui->modeComboBox->currentData().toInt()); m_model->setMode(mode); } void ObjectInspectorDialog::onPinRequest() { ObjectViewerWidget* source = qobject_cast(sender()); if (!source || source != ui->currentObjectWidget) { return; } ObjectViewerWidget* cloned = ui->currentObjectWidget->clone(true, this); connect(cloned, &ObjectViewerWidget::pinRequest, this, &ObjectInspectorDialog::onPinRequest); connect(cloned, &ObjectViewerWidget::unpinRequest, this, &ObjectInspectorDialog::onUnpinRequest); ui->tabWidget->addTab(cloned, cloned->getTitleText()); } void ObjectInspectorDialog::onUnpinRequest() { ObjectViewerWidget* source = qobject_cast(sender()); if (!source || source == ui->currentObjectWidget) { return; } ui->tabWidget->removeTab(ui->tabWidget->indexOf(source)); source->deleteLater(); } void ObjectInspectorDialog::onCurrentIndexChanged(const QModelIndex& current, const QModelIndex& previous) { Q_UNUSED(previous); pdf::PDFObject object = m_model->getObjectFromIndex(current); pdf::PDFObjectReference reference = m_model->getObjectReferenceFromIndex(current); bool isRoot = m_model->isRootObject(current); if (!isRoot && object.isReference()) { reference = object.getReference(); object = m_document->getObjectByReference(reference); isRoot = true; } ui->currentObjectWidget->setData(reference, qMove(object), isRoot); } } // namespace pdfplugin