andre@25: /* Copyright (C) 2015 by ETH Zürich andre@25: * Software engineering by Intevation GmbH andre@0: * andre@0: * This file is Free Software under the GNU GPL (v>=2) andre@0: * and comes with ABSOLUTELY NO WARRANTY! andre@0: * See LICENSE.txt for details. andre@0: */ andre@0: andre@0: /** @file See mainwindow.h */ andre@0: #include "mainwindow.h" andre@0: andre@0: #include "constants.h" andre@2: #include "metadataview.h" andre@2: #include "pngplayer.h" andre@9: #include "folderselectdialog.h" andre@0: andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@0: #include andre@2: #include andre@2: #include andre@32: #include andre@32: #include andre@0: andre@0: MainWindow::MainWindow() : andre@2: mDataView(NULL) { andre@0: setStatusBar(new QStatusBar()); andre@0: andre@0: setupGUI(); andre@0: readSettings(); andre@0: setAcceptDrops(true); andre@32: setupShortcuts(); andre@50: #ifndef Q_OS_WIN andre@50: QIcon windowIcon = QIcon(":/icon-64.png"); andre@50: setWindowIcon(windowIcon); andre@50: #endif andre@0: } andre@0: andre@2: void MainWindow::setupGUI() { andre@2: QTabWidget *tabWidget = new QTabWidget; andre@2: mDataView = new MetaDataView(this); andre@2: mPlayer = new PNGPlayer(this); andre@2: andre@2: tabWidget->addTab(mPlayer, tr("Player")); andre@2: tabWidget->addTab(mDataView, tr("Filter/Details")); andre@2: tabWidget->setMovable(true); andre@2: andre@2: setCentralWidget(tabWidget); andre@2: andre@83: QPushButton *backBtn = new QPushButton; andre@83: backBtn->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowBack)); andre@83: backBtn->setToolTip(tr("Back to exam selection.")); andre@83: tabWidget->setCornerWidget(backBtn, Qt::TopLeftCorner); andre@83: andre@87: QLabel *versionLabel = new QLabel("" + tr("Version: %1").arg(VERSION) + ""); andre@87: statusBar()->insertPermanentWidget(0, versionLabel); andre@87: andre@83: connect (backBtn, &QPushButton::clicked, this, &MainWindow::goBack); andre@2: connect (mPlayer, &PNGPlayer::error, this, &MainWindow::showErrorMessage); andre@2: connect (mPlayer, &PNGPlayer::advance, mDataView, &MetaDataView::selectNextRow); andre@3: connect (mPlayer, &PNGPlayer::back, mDataView, &MetaDataView::selectPrevRow); andre@3: connect (mPlayer, &PNGPlayer::jumpToFrame, mDataView, &MetaDataView::selectRow); andre@2: connect (mDataView, &MetaDataView::selectionChanged, mPlayer, andre@2: &PNGPlayer::showPicture); andre@5: connect (mDataView, &MetaDataView::selectionChanged, this, andre@5: &MainWindow::showPictureNameStatus); andre@0: } andre@0: andre@0: void MainWindow::showErrorMessage(const QString& errMsg) { andre@0: QMessageBox::warning(this, tr("Error!"), errMsg); andre@0: statusBar()->showMessage(errMsg); andre@0: } andre@0: andre@0: void MainWindow::closeEvent(QCloseEvent *event) { andre@0: mSettings.setValue("geometry", saveGeometry()); andre@0: mSettings.setValue("windowState", saveState()); andre@38: mPlayer->close(); andre@0: QMainWindow::closeEvent(event); andre@0: } andre@0: andre@0: void MainWindow::readSettings() { andre@33: if (mSettings.contains("geometry")) { andre@33: restoreGeometry(mSettings.value("geometry").toByteArray()); andre@33: restoreState(mSettings.value("windowState").toByteArray()); andre@33: } andre@0: } andre@0: andre@0: void MainWindow::setFolder(const QString& folder) andre@0: { andre@0: QFileInfo fi(folder); andre@16: mSettings.setValue(SUB_FOLDER_KEY, folder); andre@0: if (!fi.isDir() || !fi.isReadable()) { andre@0: showErrorMessage(tr("Failed to access directory: '%1'").arg(folder)); andre@0: } andre@0: QDir dir = QDir(folder); andre@2: QFileInfo metaData = dir.absoluteFilePath("metadata.csv"); andre@2: if (!metaData.exists() || !metaData.isReadable()) { andre@2: showErrorMessage(tr("Failed to access meta data file: '%1'").arg( andre@2: metaData.filePath())); andre@0: andre@2: } andre@2: QString errorMsg = mDataView->parseMetaData(metaData.filePath()); andre@2: if (!errorMsg.isEmpty()) { andre@2: showErrorMessage(errorMsg); andre@2: } andre@2: statusBar()->showMessage(tr("Parsed: '%1'").arg(metaData.filePath())); andre@2: qDebug() << "Parsed: " << metaData.filePath(); andre@2: mCurFolder = folder; andre@2: mPlayer->setBaseDir(folder); andre@3: mDataView->selectNextRow(); andre@33: if (!mSettings.contains("geometry")) { andre@33: qDebug() << "Showing maximized"; andre@33: show(); andre@33: showMaximized(); andre@33: } else { andre@33: show(); andre@33: } andre@0: } andre@5: andre@5: void MainWindow::showPictureNameStatus(const QString& fileName, int current, andre@44: int max, const QString& timestamp) { andre@5: if (current != 0 && max != 0) { andre@5: statusBar()->showMessage(tr("Showing: '%1'").arg(fileName)); andre@5: } andre@5: } andre@9: andre@9: void MainWindow::setRootFolder(const QString &folder) { andre@9: mRootFolder = folder; andre@16: QDir dir(folder); andre@16: dir.cdUp(); andre@16: mSettings.setValue(ROOT_FOLDER_KEY, dir.absolutePath()); andre@16: andre@9: showSubFolderSelect(); andre@9: } andre@9: andre@9: void MainWindow::showSubFolderSelect() { andre@9: const QString subPattern = mSettings.value(SUB_FOLDER_PATTERN_KEY, andre@9: SUB_FOLDER_PATTERN).toString(); andre@42: mSettings.setValue(SUB_FOLDER_PATTERN_KEY, subPattern); andre@9: FolderSelectDialog *fsDialog = new FolderSelectDialog(mRootFolder, andre@9: subPattern); andre@9: fsDialog->setWindowTitle(tr("Persons")); andre@9: connect(fsDialog, &FolderSelectDialog::folderSelected, andre@9: this, &MainWindow::setFolder); andre@9: andre@90: connect(fsDialog, &FolderSelectDialog::backClicked, andre@90: this, &MainWindow::showWithFolderSelect); andre@90: connect(fsDialog, &FolderSelectDialog::backClicked, andre@90: fsDialog, &QDialog::close); andre@9: fsDialog->show(); andre@9: } andre@9: andre@9: void MainWindow::showWithFolderSelect() { andre@9: const QString startFolder = mSettings.value(ROOT_FOLDER_KEY, andre@9: QString()).toString(); andre@9: const QString rootPattern = mSettings.value(ROOT_FOLDER_PATTERN_KEY, andre@9: DEFAULT_ROOT_PATTERN).toString(); andre@42: mSettings.setValue(ROOT_FOLDER_PATTERN_KEY, rootPattern); andre@9: FolderSelectDialog *fsDialog = new FolderSelectDialog(startFolder, andre@9: rootPattern, andre@9: tr("Root-Path")); andre@9: fsDialog->setWindowTitle(tr("Exams")); andre@9: connect(fsDialog, &FolderSelectDialog::folderSelected, andre@9: this, &MainWindow::setRootFolder); andre@9: andre@9: fsDialog->show(); andre@9: // connect(fsDialog, &QDialog::closeEvent, fsDialog, &QObject::deleteLater); andre@9: } andre@32: andre@32: void MainWindow::setupShortcuts() { andre@32: QShortcut *next = new QShortcut(Qt::Key_Right, this); andre@32: QShortcut *prev = new QShortcut(Qt::Key_Left, this); andre@32: QShortcut *pause = new QShortcut(Qt::Key_Space, this); andre@32: andre@32: connect(pause, &QShortcut::activated, mPlayer, &PNGPlayer::togglePlay); andre@32: connect(next, &QShortcut::activated, mDataView, &MetaDataView::selectNextRow); andre@32: connect(prev, &QShortcut::activated, mDataView, &MetaDataView::selectPrevRow); andre@32: } andre@83: andre@83: void MainWindow::goBack() { andre@83: hide(); andre@95: showSubFolderSelect(); andre@83: }