view src/mainwindow.cpp @ 38:26e1521b9afd

Add the possibility to detach the picture label on doubleclick
author Andre Heinecke <andre.heinecke@intevation.de>
date Wed, 06 May 2015 18:09:34 +0200
parents 40a683d1a318
children 2836b6ed430a
line wrap: on
line source
/* Copyright (C) 2015 by ETH Zürich
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU GPL (v>=2)
 * and comes with ABSOLUTELY NO WARRANTY!
 * See LICENSE.txt for details.
 */

/** @file See mainwindow.h */
#include "mainwindow.h"

#include "constants.h"
#include "metadataview.h"
#include "pngplayer.h"
#include "folderselectdialog.h"

#include <QDebug>
#include <QDialog>
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QDir>
#include <QFileDialog>
#include <QMessageBox>
#include <QApplication>
#include <QDragEnterEvent>
#include <QDragLeaveEvent>
#include <QDropEvent>
#include <QDragMoveEvent>
#include <QMimeData>
#include <QStandardPaths>
#include <QStyle>
#include <QStatusBar>
#include <QTabWidget>
#include <QVBoxLayout>
#include <QShortcut>
#include <QKeySequence>

MainWindow::MainWindow() :
    mDataView(NULL) {
    setStatusBar(new QStatusBar());

    setupGUI();
    readSettings();
    setAcceptDrops(true);
    setupShortcuts();
    //QIcon windowIcon = QIcon(":/icon-64.png");
    //setWindowIcon(windowIcon);

}

void MainWindow::setupGUI() {
    QTabWidget *tabWidget = new QTabWidget;
    mDataView = new MetaDataView(this);
    mPlayer = new PNGPlayer(this);

    tabWidget->addTab(mPlayer, tr("Player"));
    tabWidget->addTab(mDataView, tr("Filter/Details"));
    tabWidget->setMovable(true);

    setCentralWidget(tabWidget);

    connect (mPlayer, &PNGPlayer::error, this, &MainWindow::showErrorMessage);
    connect (mPlayer, &PNGPlayer::advance, mDataView, &MetaDataView::selectNextRow);
    connect (mPlayer, &PNGPlayer::back, mDataView, &MetaDataView::selectPrevRow);
    connect (mPlayer, &PNGPlayer::jumpToFrame, mDataView, &MetaDataView::selectRow);
    connect (mDataView, &MetaDataView::selectionChanged, mPlayer,
             &PNGPlayer::showPicture);
    connect (mDataView, &MetaDataView::selectionChanged, this,
             &MainWindow::showPictureNameStatus);
}

void MainWindow::showErrorMessage(const QString& errMsg) {
    QMessageBox::warning(this, tr("Error!"), errMsg);
    statusBar()->showMessage(errMsg);
}

void MainWindow::closeEvent(QCloseEvent *event) {
    mSettings.setValue("geometry", saveGeometry());
    mSettings.setValue("windowState", saveState());
    mPlayer->close();
    QMainWindow::closeEvent(event);
}

void MainWindow::readSettings() {
    if (mSettings.contains("geometry")) {
        restoreGeometry(mSettings.value("geometry").toByteArray());
        restoreState(mSettings.value("windowState").toByteArray());
    }
}
/*
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if (event->mimeData()->hasUrls()) {
        foreach (const QUrl & url, event->mimeData()->urls()) {
            if (url.isLocalFile()) {
                event->acceptProposedAction();
                return;
            }
        }
    }
}

void MainWindow::dragMoveEvent(QDragMoveEvent *event)
{
    if (event->mimeData()->hasUrls()) {
        foreach (const QUrl & url, event->mimeData()->urls()) {
            if (url.isLocalFile()) {
                event->acceptProposedAction();
                return;
            }
        }
    }
}

void MainWindow::dropEvent(QDropEvent *event)
{
    const QMimeData *mimeData = event->mimeData();

    if (mimeData->hasUrls()) {
        foreach (const QUrl & url, mimeData->urls()) {
            if (!url.isLocalFile()) {
                qDebug() << "Ignoring drop of " << url;
                continue;
            }
        }
    }
}

void MainWindow::dragLeaveEvent(QDragLeaveEvent *event)
{
    event->accept();
}
*/
void MainWindow::setFolder(const QString& folder)
{
    QFileInfo fi(folder);
    mSettings.setValue(SUB_FOLDER_KEY, folder);
    if (!fi.isDir() || !fi.isReadable()) {
        showErrorMessage(tr("Failed to access directory: '%1'").arg(folder));
    }
    QDir dir = QDir(folder);
    QFileInfo metaData = dir.absoluteFilePath("metadata.csv");
    if (!metaData.exists() || !metaData.isReadable()) {
        showErrorMessage(tr("Failed to access meta data file: '%1'").arg(
                    metaData.filePath()));

    }
    QString errorMsg = mDataView->parseMetaData(metaData.filePath());
    if (!errorMsg.isEmpty()) {
        showErrorMessage(errorMsg);
        return;
    }
    statusBar()->showMessage(tr("Parsed: '%1'").arg(metaData.filePath()));
    qDebug() << "Parsed: " << metaData.filePath();
    mCurFolder = folder;
    mPlayer->setBaseDir(folder);
    mDataView->selectNextRow();
    if (!mSettings.contains("geometry")) {
        qDebug() << "Showing maximized";
        show();
        showMaximized();
    } else {
        show();
    }
}

void MainWindow::showPictureNameStatus(const QString& fileName, int current,
            int max, const QDateTime& timestamp) {
    if (current != 0 && max != 0) {
        statusBar()->showMessage(tr("Showing: '%1'").arg(fileName));
    }
}

void MainWindow::setRootFolder(const QString &folder) {
    mRootFolder = folder;
    QDir dir(folder);
    dir.cdUp();
    mSettings.setValue(ROOT_FOLDER_KEY, dir.absolutePath());

    showSubFolderSelect();
}

void MainWindow::showSubFolderSelect() {
    const QString subPattern = mSettings.value(SUB_FOLDER_PATTERN_KEY,
                                               SUB_FOLDER_PATTERN).toString();
    FolderSelectDialog *fsDialog = new FolderSelectDialog(mRootFolder,
                                                          subPattern);
    fsDialog->setWindowTitle(tr("Persons"));
    connect(fsDialog, &FolderSelectDialog::folderSelected,
            this, &MainWindow::setFolder);

    fsDialog->show();
//    connect(fsDialog, &QDialog::closeEvent, fsDialog, &QObject::deleteLater);
}

void MainWindow::showWithFolderSelect() {
    const QString startFolder = mSettings.value(ROOT_FOLDER_KEY,
                                                QString()).toString();
    const QString rootPattern = mSettings.value(ROOT_FOLDER_PATTERN_KEY,
                                                DEFAULT_ROOT_PATTERN).toString();
    FolderSelectDialog *fsDialog = new FolderSelectDialog(startFolder,
                                                          rootPattern,
                                                          tr("Root-Path"));
    fsDialog->setWindowTitle(tr("Exams"));
    connect(fsDialog, &FolderSelectDialog::folderSelected,
            this, &MainWindow::setRootFolder);

    fsDialog->show();
   // connect(fsDialog, &QDialog::closeEvent, fsDialog, &QObject::deleteLater);
}

void MainWindow::setupShortcuts() {
    QShortcut *next = new QShortcut(Qt::Key_Right, this);
    QShortcut *prev = new QShortcut(Qt::Key_Left, this);
    QShortcut *pause = new QShortcut(Qt::Key_Space, this);

    connect(pause, &QShortcut::activated, mPlayer, &PNGPlayer::togglePlay);
    connect(next, &QShortcut::activated, mDataView, &MetaDataView::selectNextRow);
    connect(prev, &QShortcut::activated, mDataView, &MetaDataView::selectPrevRow);
}
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)