/** * @RDE_HEADER@ * The FileContentPreviewPlaybackWidget offers an UI to preview a FileContent * $Id$ * $HeadURL$ * $Author$ * Created by Iuliana Ojog, SLSE, 2017-06-02 */ #include "flm_preview_playback.h" #include "ui_flm_preview_playback.h" #include #include #include #include namespace FileManagement { static Poppler::Page::Rotation getRotationFromValue(int rotation); //------------------------------------------------------------------------------------ FileContentPreviewPlaybackWidget::FileContentPreviewPlaybackWidget(const std::shared_ptr &ftc, QWidget *parent) : QWidget(parent) , m_ui(new Ui::FileContentPreviewPlaybackWidget) , m_getContent(new FileManagement::GetFileContent(ftc, this)) , m_closeTimer(new QTimer(this)) , m_logger(getLogger("FileContentPreviewPlaybackWidget")) { m_ui->setupUi(this); m_ui->lblPixmap->setVisible(false); m_ui->teText->setVisible(false); // setup pdf widget m_pdfWidget = new NGL::PDFWidget(this); m_pdfWidget->setObjectName(QStringLiteral("pdfWidget")); m_pdfWidget->setSizePolicy(QSizePolicy::Policy::MinimumExpanding, QSizePolicy::Policy::MinimumExpanding); connect(m_pdfWidget, &NGL::PDFWidget::currentPageChanged, this, &FileContentPreviewPlaybackWidget::setPage); connect(m_pdfWidget, &NGL::PDFWidget::rotationChanged, this, [this](Poppler::Page::Rotation rot) { switch (rot) { case Poppler::Page::Rotate90: setRotation(90); break; case Poppler::Page::Rotate180: setRotation(180); break; case Poppler::Page::Rotate270: setRotation(270); break; case Poppler::Page::Rotate0: setRotation(0); break; } }); m_ui->horizontalLayout->addWidget(m_pdfWidget); } //------------------------------------------------------------------------------------ FileContentPreviewPlaybackWidget::~FileContentPreviewPlaybackWidget() { delete m_getContent; delete m_ui; } //------------------------------------------------------------------------------------ bool FileContentPreviewPlaybackWidget::init(const FileContent &data, int pageNo, double zoomFactor, int rotation, int duration, const QString &userText) { m_data = data; m_duration = (duration > 0) ? duration : 0; m_pageNo = pageNo; m_zoomFactor = (zoomFactor >= ZOOM_MIN && zoomFactor <= ZOOM_MAX) ? zoomFactor : ZOOM_DEFAULT; m_rotation = rotation; m_userText = userText; DEBUG_LOG(m_logger) << "FileContentPreviewPlaybackWidget::init - (fileId, pageNo, zoomFactor, rotation) = (" << m_data.id() << "," << m_pageNo << "," << m_zoomFactor << ", " << m_rotation << ")"; if (m_userText.isEmpty() && m_data.id() > 0) m_getContent->getContent(m_data.id(), m_content); DEBUG_LOG(m_logger) << "Content size: " << m_content.size() << ", " << m_pageNo; if (m_duration > 0) startTimer(); m_ui->lblPixmap->setVisible(false); m_ui->teText->setVisible(false); m_pdfWidget->setVisible(false); switch (data.fileType().underlying()) { case FileManagement::FileType_def::Png: case FileManagement::FileType_def::Jpg: { m_ui->lblPixmap->setPixmap(LtsUtils::getPixmap(m_content)); m_ui->lblPixmap->setVisible(true); break; } case FileManagement::FileType_def::Text: { if (!m_userText.isEmpty() && m_data.id() == 0) { m_ui->teText->setHtml(m_userText); m_ui->teText->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_ui->teText->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_ui->teText->setVisible(true); } break; } case FileManagement::FileType_def::Xml: case FileManagement::FileType_def::TacticalPlan: case FileManagement::FileType_def::OperatorFavourite: case FileManagement::FileType_def::EvaluationSchema: { m_ui->teText->setHtml(QString::fromUtf8(LtsUtils::toQByteArray(m_content))); m_ui->teText->setVisible(true); break; } case FileManagement::FileType_def::Pdf: { m_pdfWidget->setVisible(true); m_pdfWidget->setZoomFactor(m_zoomFactor); m_pdfWidget->setPage(m_pageNo); // before setRotation since there currentPageChanged is emitted m_pdfWidget->setRotation(getRotationFromValue(rotation)); m_pdfWidget->showPDF(LtsUtils::toQByteArray(m_content)); break; } case FileManagement::FileType_def::OperatorDefinedSymbol: case FileManagement::FileType_def::MSOfficeDocument: case FileManagement::FileType_def::MSOfficeDocument97: case FileManagement::FileType_def::MSOfficePresentation: case FileManagement::FileType_def::MSOfficePresentation97: case FileManagement::FileType_def::MSOfficeSpreadsheet: case FileManagement::FileType_def::MSOfficeSpreadsheet97: case FileManagement::FileType_def::OpenOfficeDocument: case FileManagement::FileType_def::OpenOfficePresentation: case FileManagement::FileType_def::OpenOfficeSpreadsheet: { new LtsWidgets::LtsMessageDialogNew(this, tr("Not yet implemented")); close(); break; } case FileManagement::FileType_def::Unknown: default: { if (!m_userText.isEmpty() && m_data.id() == 0) { m_ui->teText->setHtml(m_userText); m_ui->teText->setVisible(true); } else { new LtsWidgets::LtsMessageDialogNew(this, tr("Unknown file type! Playback not available.")); close(); } break; } } return true; } //----------------------------------------------------------------------------------------------------------- bool FileContentPreviewPlaybackWidget::pauseTimer() { m_closeTimer.stop(); DEBUG_LOG(m_logger) << "Timer stopped "; return true; } //----------------------------------------------------------------------------------------------------------- bool FileContentPreviewPlaybackWidget::startTimer() { m_closeTimer.setInterval(m_duration * 1000); // duration is in secs, timer interval in msecs connect(&m_closeTimer, &QTimer::timeout, this, &FileContentPreviewPlaybackWidget::close); m_closeTimer.start(); DEBUG_LOG(m_logger) << "Timer started interval = " << m_closeTimer.interval(); return true; } //----------------------------------------------------------------------------------------------------------- int FileContentPreviewPlaybackWidget::getNumPages() const { return m_pdfWidget->numPages(); } //----------------------------------------------------------------------------------------------------------- int FileContentPreviewPlaybackWidget::getCurPage() const { return m_pdfWidget->curPage(); } //----------------------------------------------------------------------------------------------------------- void FileContentPreviewPlaybackWidget::setPage(int pageNo) { if (m_pageNo == pageNo) return; DEBUG_LOG(m_logger) << "setPage = " << pageNo; m_pageNo = pageNo; m_pdfWidget->setPage(pageNo); emit currentPageChanged(m_pageNo); } //----------------------------------------------------------------------------------------------------------- void FileContentPreviewPlaybackWidget::setZoomFactor(double zoomFactor) { if (qFuzzyCompare(m_zoomFactor, zoomFactor)) return; DEBUG_LOG(m_logger) << "setZoomFactor = " << zoomFactor; m_zoomFactor = zoomFactor; m_pdfWidget->setZoomFactor(zoomFactor); } //----------------------------------------------------------------------------------------------------------- void FileContentPreviewPlaybackWidget::setRotation(int rotation) { if (m_rotation == rotation) return; DEBUG_LOG(m_logger) << "setRotation = " << rotation; m_rotation = rotation; m_pdfWidget->setRotation(getRotationFromValue(m_rotation)); emit rotationChanged(rotation); } //----------------------------------------------------------------------------------------------------------- void FileContentPreviewPlaybackWidget::ensureDataIsSet() { if (m_pdfWidget->isVisible() && m_pageNo > 0) { m_pdfWidget->setZoomFactor(m_zoomFactor); m_pdfWidget->setRotation(getRotationFromValue(m_rotation)); m_pdfWidget->setPage(m_pageNo); } } //----------------------------------------------------------------------------------------------------------- void FileContentPreviewPlaybackWidget::showEvent(QShowEvent *e) { QWidget::showEvent(e); ensureDataIsSet(); } //----------------------------------------------------------------------------------------------------------- Poppler::Page::Rotation getRotationFromValue(int rotation) { Poppler::Page::Rotation rot; switch (rotation) { case 90: rot = Poppler::Page::Rotate90; break; case 180: rot = Poppler::Page::Rotate180; break; case 270: rot = Poppler::Page::Rotate270; break; case 0: default: rot = Poppler::Page::Rotate0; break; } return rot; } } // namespace FileManagement