diff --git a/HACKING.md b/HACKING.md index 2097cb1af..83a78df6e 100644 --- a/HACKING.md +++ b/HACKING.md @@ -1,7 +1,7 @@ # Compiler Requirements MSVC: Visual Studio 2013 Update 5 or newer. -gcc/llvm: C++11 support is required. +gcc/llvm: C++17 support is required. # Coding Conventions diff --git a/YUViewLib/src/playlistitem/playlistItemRawFile.cpp b/YUViewLib/src/playlistitem/playlistItemRawFile.cpp index 0d586e683..10e96bcfd 100644 --- a/YUViewLib/src/playlistitem/playlistItemRawFile.cpp +++ b/YUViewLib/src/playlistitem/playlistItemRawFile.cpp @@ -92,9 +92,8 @@ playlistItemRawFile::playlistItemRawFile(const QString &rawFilePath, frameSize = Size(qFrameSize.width(), qFrameSize.height()); // Create a new videoHandler instance depending on the input format - QFileInfo fi(rawFilePath); - QString ext = fi.suffix(); - ext = ext.toLower(); + QFileInfo fi(rawFilePath); + const auto ext = fi.suffix().toLower(); if (isInExtensions(ext, YUV_EXTENSIONS) || fmt.toLower() == "yuv") { this->video = std::make_unique(); diff --git a/YUViewLib/src/playlistitem/playlistItems.cpp b/YUViewLib/src/playlistitem/playlistItems.cpp index 00851d7b2..12b219471 100644 --- a/YUViewLib/src/playlistitem/playlistItems.cpp +++ b/YUViewLib/src/playlistitem/playlistItems.cpp @@ -46,8 +46,109 @@ #include #include +namespace +{ + +playlistItem *openImageFileOrSequence(QWidget *parent, const QString &fileName) +{ + bool openAsImageSequence = false; + if (playlistItemImageFileSequence::isImageSequence(fileName)) + { + // This is not only one image, but a sequence of images. Ask the user how to open it. + QMessageBox::StandardButton choice = QMessageBox::question( + parent, + "Open image sequence", + "This image can be opened as an image sequence. Do you want to open it as an image " + "sequence (Yes) or as a single static image (No)?\n", + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, + QMessageBox::Yes); + if (choice == QMessageBox::Yes) + openAsImageSequence = true; + else if (choice == QMessageBox::No) + openAsImageSequence = false; + else + return nullptr; + } + + if (openAsImageSequence) + return new playlistItemImageFileSequence(fileName); + else + return new playlistItemImageFile(fileName); +} + +playlistItem *guessFileTypeFromFileAndCreatePlaylistItem(QWidget *parent, const QString &fileName) +{ + QFileInfo fi(fileName); + const auto extension = fi.suffix().toLower(); + + auto checkForExtension = [&extension](auto getSupportedFileExtensions) { + QStringList allExtensions, filtersList; + getSupportedFileExtensions(allExtensions, filtersList); + return allExtensions.contains(extension); + }; + + if (checkForExtension(playlistItemRawFile::getSupportedFileExtensions)) + return new playlistItemRawFile(fileName); + if (checkForExtension(playlistItemCompressedVideo::getSupportedFileExtensions)) + return new playlistItemCompressedVideo(fileName); + if (checkForExtension(playlistItemImageFile::getSupportedFileExtensions)) + return openImageFileOrSequence(parent, fileName); + if (checkForExtension(playlistItemStatisticsFile::getSupportedFileExtensions)) + return new playlistItemStatisticsFile(fileName); + + return {}; +} + +playlistItem *askUserForFileTypeAndCreatePlalistItem(QWidget * parent, + QString fileName, + const bool determineFileTypeAutomatically) +{ + const auto types = QStringList() << "Raw YUV File" + << "Raw RGB File" + << "Compressed file" + << "Image file" + << "Statistics File CSV" + << "Statistics File VTMBMS"; + bool ok{}; + QString message = "Unable to detect file type from file extension."; + if (!determineFileTypeAutomatically) + message = "File type detection from extension is disabled (see Settings -> General)."; + const auto asType = QInputDialog::getItem(parent, + "Select file type", + message + " Please select how to open the file.", + types, + 0, + false, + &ok); + if (ok && !asType.isEmpty()) + { + if (asType == types[0] || asType == types[1]) + { + const QString fmt = (asType == types[0]) ? "yuv" : "rgb"; + return new playlistItemRawFile(fileName, QSize(-1, -1), QString(), fmt); + } + else if (asType == types[2]) + { + return new playlistItemCompressedVideo(fileName); + } + else if (asType == types[3]) + { + return openImageFileOrSequence(parent, fileName); + } + else if (asType == types[4] || asType == types[5]) + { + auto openMode = (asType == types[3] ? playlistItemStatisticsFile::OpenMode::CSVFile + : playlistItemStatisticsFile::OpenMode::VTMBMSFile); + return new playlistItemStatisticsFile(fileName, openMode); + } + } +} + +} // namespace + namespace playlistItems { + QStringList getSupportedFormatsFilters() { QStringList allExtensions, filtersList; @@ -64,9 +165,7 @@ QStringList getSupportedFormatsFilters() // Now build the list of filters. First append the all files filter QString allFiles = "All supported file formats ("; for (auto const &ext : allExtensions) - { allFiles += "*." + ext + " "; - } if (allFiles.endsWith(' ')) allFiles.chop(1); allFiles += ")"; @@ -94,139 +193,26 @@ QStringList getSupportedNameFilters() // Now build the list of name filters QStringList nameFilters; for (auto extension : allExtensions) - { nameFilters.append(QString("*.") + extension); - } return nameFilters; } playlistItem *createPlaylistItemFromFile(QWidget *parent, const QString &fileName) { - QFileInfo fi(fileName); - QString ext = fi.suffix().toLower(); - - // Check playlistItemRawFile - { - QStringList allExtensions, filtersList; - playlistItemRawFile::getSupportedFileExtensions(allExtensions, filtersList); + QSettings settings; + const auto determineFileTypeAutomatically = settings.value("AutodetectFileType", true).toBool(); - if (allExtensions.contains(ext)) - { - playlistItemRawFile *newRawFile = new playlistItemRawFile(fileName); - return newRawFile; - } - } - - // Check playlistItemCompressedVideo - { - QStringList allExtensions, filtersList; - playlistItemCompressedVideo::getSupportedFileExtensions(allExtensions, filtersList); - - if (allExtensions.contains(ext)) - { - playlistItemCompressedVideo *newRawCodedVideo = new playlistItemCompressedVideo(fileName, 0); - return newRawCodedVideo; - } - } - - // Check playlistItemImageFile / playlistItemImageFileSequence - { - QStringList allExtensions, filtersList; - playlistItemImageFile::getSupportedFileExtensions(allExtensions, filtersList); - - if (allExtensions.contains(ext)) - { - // This is definitely an image file. But could it also be an image file sequence? - bool openAsImageSequence = false; - if (playlistItemImageFileSequence::isImageSequence(fileName)) - { - // This is not only one image, but a sequence of images. Ask the user how to open it. - QMessageBox::StandardButton choice = QMessageBox::question( - parent, - "Open image sequence", - "This image can be opened as an image sequence. Do you want to open it as an image " - "sequence (Yes) or as a single static image (No)?\n", - QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, - QMessageBox::Yes); - if (choice == QMessageBox::Yes) - openAsImageSequence = true; - else if (choice == QMessageBox::No) - openAsImageSequence = false; - else - return nullptr; - } - - if (openAsImageSequence) - { - // Open it as a file sequence - playlistItemImageFileSequence *newSequence = new playlistItemImageFileSequence(fileName); - return newSequence; - } - else - { - playlistItemImageFile *newImageFile = new playlistItemImageFile(fileName); - return newImageFile; - } - } - } - - // Check playlistItemStatisticsFile - { - QStringList allExtensions, filtersList; - playlistItemStatisticsFile::getSupportedFileExtensions(allExtensions, filtersList); - - if (allExtensions.contains(ext)) - { - playlistItemStatisticsFile *newStatFile = new playlistItemStatisticsFile(fileName); - return newStatFile; - } - } + playlistItem *newPlaylistItem{}; + if (determineFileTypeAutomatically) + newPlaylistItem = guessFileTypeFromFileAndCreatePlaylistItem(parent, fileName); + if (!newPlaylistItem) + newPlaylistItem = + askUserForFileTypeAndCreatePlalistItem(parent, fileName, determineFileTypeAutomatically); - // Unknown file type extension. Ask the user as what file type he wants to open this file. - QStringList types = QStringList() << "Raw YUV File" - << "Raw RGB File" - << "Compressed file" - << "Statistics File CSV" - << "Statistics File VTMBMS"; - bool ok; - QString asType = QInputDialog::getItem(parent, - "Select file type", - "The file type could not be determined from the file " - "extension. Please select the type of the file.", - types, - 0, - false, - &ok); - if (ok && !asType.isEmpty()) - { - if (asType == types[0] || asType == types[1]) - { - // Raw YUV/RGB File - QString fmt = (asType == types[0]) ? "yuv" : "rgb"; - auto newRawFile = new playlistItemRawFile(fileName, QSize(-1, -1), QString(), fmt); - return newRawFile; - } - else if (asType == types[2]) - { - // Compressed video - auto newRawCodedVideo = new playlistItemCompressedVideo(fileName, 0); - return newRawCodedVideo; - } - else if (asType == types[3] || asType == types[4]) - { - // Statistics File - auto openMode = (asType == types[3] ? playlistItemStatisticsFile::OpenMode::CSVFile : playlistItemStatisticsFile::OpenMode::VTMBMSFile); - auto newStatFile = new playlistItemStatisticsFile(fileName, openMode); - return newStatFile; - } - } - - return nullptr; + return newPlaylistItem; } -// Load one playlist item. Load it and return it. This function is separate so it can be called -// recursively if an item has children. playlistItem *loadPlaylistItem(const QDomElement &elem, const QString &filePath) { playlistItem *newItem = nullptr; @@ -245,7 +231,8 @@ playlistItem *loadPlaylistItem(const QDomElement &elem, const QString &filePath) { newItem = playlistItemCompressedVideo::newPlaylistItemCompressedVideo(elem, filePath); } - else if (tag == "playlistItemStatisticsFile" || tag == "playlistItemStatisticsCSVFile" || tag == "playlistItemStatisticsVTMBMSFile") + else if (tag == "playlistItemStatisticsFile" || tag == "playlistItemStatisticsCSVFile" || + tag == "playlistItemStatisticsVTMBMSFile") { auto openMode = playlistItemStatisticsFile::OpenMode::Extension; if (tag == "playlistItemStatisticsCSVFile") @@ -283,26 +270,22 @@ playlistItem *loadPlaylistItem(const QDomElement &elem, const QString &filePath) parseChildren = true; } - if (newItem != nullptr && parseChildren) + if (newItem && parseChildren) { - // The playlistItem can have children. Parse them. - auto children = elem.childNodes(); + const auto children = elem.childNodes(); for (int i = 0; i < children.length(); i++) { - // Parse the child items - auto childElem = children.item(i).toElement(); - auto childItem = loadPlaylistItem(childElem, filePath); - - if (childItem) + const auto childElement = children.item(i).toElement(); + if (const auto childItem = loadPlaylistItem(childElement, filePath)) newItem->addChild(childItem); } - auto container = dynamic_cast(newItem); - if (container) + if (const auto container = dynamic_cast(newItem)) container->updateChildItems(); } return newItem; } + } // namespace playlistItems diff --git a/YUViewLib/src/playlistitem/playlistItems.h b/YUViewLib/src/playlistitem/playlistItems.h index 5be270770..ead7c0ed3 100644 --- a/YUViewLib/src/playlistitem/playlistItems.h +++ b/YUViewLib/src/playlistitem/playlistItems.h @@ -1,60 +1,60 @@ /* This file is part of YUView - The YUV player with advanced analytics toolset -* -* Copyright (C) 2015 Institut für Nachrichtentechnik, RWTH Aachen University, GERMANY -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 3 of the License, or -* (at your option) any later version. -* -* In addition, as a special exception, the copyright holders give -* permission to link the code of portions of this program with the -* OpenSSL library under certain conditions as described in each -* individual source file, and distribute linked combinations including -* the two. -* -* You must obey the GNU General Public License in all respects for all -* of the code used other than OpenSSL. If you modify file(s) with this -* exception, you may extend this exception to your version of the -* file(s), but you are not obligated to do so. If you do not wish to do -* so, delete this exception statement from your version. If you delete -* this exception statement from all source files in the program, then -* also delete it here. -* -* This program 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 General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ + * + * Copyright (C) 2015 Institut für Nachrichtentechnik, RWTH Aachen University, GERMANY + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * In addition, as a special exception, the copyright holders give + * permission to link the code of portions of this program with the + * OpenSSL library under certain conditions as described in each + * individual source file, and distribute linked combinations including + * the two. + * + * You must obey the GNU General Public License in all respects for all + * of the code used other than OpenSSL. If you modify file(s) with this + * exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do + * so, delete this exception statement from your version. If you delete + * this exception statement from all source files in the program, then + * also delete it here. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #pragma once -#include #include #include #include +#include #include "playlistItem.h" -/* This namespace contains all functions that are needed for creation of playlist Items. This way, no other - function must know, what types of item's there are. If you implement a new playlistItem, it only has to - be added here (and in the functions). +/* This namespace contains all functions that are needed for creation of playlist Items. This way, + no other function must know, what types of item's there are. If you implement a new playlistItem, + it only has to be added here (and in the functions). */ namespace playlistItems { - // Get a list of all supported file format filets and the extensions. This can be used in a file open dialog. - QStringList getSupportedFormatsFilters(); - - // Get a list of all supported file extensions (["*.csv", "*.yuv" ...]) - QStringList getSupportedNameFilters(); +// Get a list of all supported file format filets and the extensions. This can be used in a file +// open dialog. +QStringList getSupportedFormatsFilters(); + +// Get a list of all supported file extensions (["*.csv", "*.yuv" ...]) +QStringList getSupportedNameFilters(); - // When given a file, this function will create the correct playlist item (depending on the file extension) - playlistItem *createPlaylistItemFromFile(QWidget *parent, const QString &fileName); +// When given a file, this function will create the correct playlist item +playlistItem *createPlaylistItemFromFile(QWidget *parent, const QString &fileName); - // Load a playlist item (and all of it's children) from the playlist - // Append all loaded playlist items to the list plItemAndIDList (alongside the IDs that were saved in the playlist file) - playlistItem *loadPlaylistItem(const QDomElement &elem, const QString &filePath); -} +// Load a playlist item (and all of it's children) from the playlist. +playlistItem *loadPlaylistItem(const QDomElement &elem, const QString &filePath); +} // namespace playlistItems diff --git a/YUViewLib/src/ui/Mainwindow.cpp b/YUViewLib/src/ui/Mainwindow.cpp index 8a8042301..9ce45ca16 100644 --- a/YUViewLib/src/ui/Mainwindow.cpp +++ b/YUViewLib/src/ui/Mainwindow.cpp @@ -413,7 +413,7 @@ void MainWindow::createMenusAndActions() &PlaybackController::previousFrame, Qt::Key_Left); - auto addLambdaActionToMenu = [](QMenu *menu, const QString name, auto lambda) { + auto addLambdaActionToMenu = [this](QMenu *menu, const QString name, auto lambda) { auto action = new QAction(name, menu); QObject::connect(action, &QAction::triggered, lambda); menu->addAction(action); diff --git a/YUViewLib/src/ui/SettingsDialog.cpp b/YUViewLib/src/ui/SettingsDialog.cpp index 1c27ca33f..d836480b7 100644 --- a/YUViewLib/src/ui/SettingsDialog.cpp +++ b/YUViewLib/src/ui/SettingsDialog.cpp @@ -67,6 +67,27 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) settings.value("ContinuePlaybackOnSequenceSelection", false).toBool()); ui.checkBoxSavePositionPerItem->setChecked( settings.value("SavePositionAndZoomPerItem", false).toBool()); + ui.checkBoxAutodetectFileType->setChecked(settings.value("AutodetectFileType", true).toBool()); + + settings.beginGroup("updates"); + const auto checkForUpdates = settings.value("checkForUpdates", true).toBool(); + ui.groupBoxUpdates->setChecked(checkForUpdates); + if (UPDATE_FEATURE_ENABLE) + { + const auto updateBehavior = settings.value("updateBehavior", "ask").toString(); + if (updateBehavior == "ask") + ui.comboBoxUpdateSettings->setCurrentIndex(1); + else if (updateBehavior == "auto") + ui.comboBoxUpdateSettings->setCurrentIndex(0); + } + else + { + // Updating is not supported. Disable the update strategy combo box. + ui.comboBoxUpdateSettings->setEnabled(false); + ui.labelUpdateSettings->setEnabled(false); + } + settings.endGroup(); + // UI const auto theme = settings.value("Theme", "Default").toString(); int themeIdx = functions::getThemeNameList().indexOf(theme); @@ -93,25 +114,6 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) ui.checkBoxShowFilePathSplitMode->setChecked( settings.value("ShowFilePathInSplitMode", true).toBool()); ui.checkBoxPixelValuesHex->setChecked(settings.value("ShowPixelValuesHex", false).toBool()); - // Updates settings - settings.beginGroup("updates"); - const auto checkForUpdates = settings.value("checkForUpdates", true).toBool(); - ui.groupBoxUpdates->setChecked(checkForUpdates); - if (UPDATE_FEATURE_ENABLE) - { - const auto updateBehavior = settings.value("updateBehavior", "ask").toString(); - if (updateBehavior == "ask") - ui.comboBoxUpdateSettings->setCurrentIndex(1); - else if (updateBehavior == "auto") - ui.comboBoxUpdateSettings->setCurrentIndex(0); - } - else - { - // Updating is not supported. Disable the update strategy combo box. - ui.comboBoxUpdateSettings->setEnabled(false); - ui.labelUpdateSettings->setEnabled(false); - } - settings.endGroup(); // "Caching" tab settings.beginGroup("VideoCache"); @@ -430,6 +432,19 @@ void SettingsDialog::on_pushButtonSave_clicked() settings.setValue("ContinuePlaybackOnSequenceSelection", ui.checkBoxContinuePlaybackNewSelection->isChecked()); settings.setValue("SavePositionAndZoomPerItem", ui.checkBoxSavePositionPerItem->isChecked()); + settings.setValue("AutodetectFileType", ui.checkBoxAutodetectFileType->isChecked()); + + settings.beginGroup("updates"); + settings.setValue("checkForUpdates", ui.groupBoxUpdates->isChecked()); + if (UPDATE_FEATURE_ENABLE) + { + QString updateBehavior = "ask"; + if (ui.comboBoxUpdateSettings->currentIndex() == 0) + updateBehavior = "auto"; + settings.setValue("updateBehavior", updateBehavior); + } + settings.endGroup(); + // UI settings.setValue("Theme", ui.comboBoxTheme->currentText()); settings.setValue("SplitViewLineStyle", ui.comboBoxSplitLineStyle->currentText()); @@ -441,17 +456,6 @@ void SettingsDialog::on_pushButtonSave_clicked() ui.checkBoxPlaybackControlFullScreen->isChecked()); settings.setValue("ShowFilePathInSplitMode", ui.checkBoxShowFilePathSplitMode->isChecked()); settings.setValue("ShowPixelValuesHex", ui.checkBoxPixelValuesHex->isChecked()); - // Update settings - settings.beginGroup("updates"); - settings.setValue("checkForUpdates", ui.groupBoxUpdates->isChecked()); - if (UPDATE_FEATURE_ENABLE) - { - QString updateBehavior = "ask"; - if (ui.comboBoxUpdateSettings->currentIndex() == 0) - updateBehavior = "auto"; - settings.setValue("updateBehavior", updateBehavior); - } - settings.endGroup(); // "Caching" tab settings.beginGroup("VideoCache"); diff --git a/YUViewLib/ui/settingsDialog.ui b/YUViewLib/ui/settingsDialog.ui index 4d6545017..0dae25f99 100644 --- a/YUViewLib/ui/settingsDialog.ui +++ b/YUViewLib/ui/settingsDialog.ui @@ -25,476 +25,65 @@ - - - General + + + If active, all open files will be watched for changes. If a file is changed, YUV will ask you if you want to reload the file now. + + + If active, all open files will be watched for changes. If a file is changed, YUV will ask you if you want to reload the file now. + + + Watch open files for changes + + + true - - - - - Should playback continue if a new sequence is selected from the playlist? - - - Should playback continue if a new sequence is selected from the playlist? - - - Continue playback when a new sequence is selected - - - - - - - Ask to save playlist on exit - - - true - - - - - - - If active, all open files will be watched for changes. If a file is changed, YUV will ask you if you want to reload the file now. - - - If active, all open files will be watched for changes. If a file is changed, YUV will ask you if you want to reload the file now. - - - Watch open files for changes - - - true - - - - - - - Restore position and zoom factor for each item in the playlist - - - - - - - - 0 - 0 - + + + Ask to save playlist on exit - - UI + + true + + + + + + + Should playback continue if a new sequence is selected from the playlist? + + + Should playback continue if a new sequence is selected from the playlist? + + + Continue playback when a new sequence is selected + + + + + + + Restore position and zoom factor for each item in the playlist + + + + + + + Autodetect the file type (yuv, rgb, compressed) from the file extension. If disabled, you will be asked for every file you open that is unknown. + + + Autodetect the file type (yuv, rgb, compressed) from the file extension. If disabled, you will be asked for every file you open that is unknown. + + + Autodetect filetype from file extension + + + true - - - - - Which of the two mouse buttons is to be used for moving and which for zooming the view? - - - Which of the two mouse buttons is to be used for moving and which for zooming the view? - - - - Left Zoom, Right Move - - - - - Left Move, Right Zoom - - - - - - - - Theme - - - - - - - <html><head/><body><p>When the split- and comparison view is activated, this defines how the position of the split line is indicated:</p><p><span style=" font-weight:600;">Solid Line</span>: A solid white line</p><p><span style=" font-weight:600;">Handlers: </span>Only show small triangular handlers at the top and bottom</p></body></html> - - - <html><head/><body><p>When the split- and comparison view is activated, this defines how the position of the split line is indicated:</p><p><span style=" font-weight:600;">Solid Line</span>: A solid white line</p><p><span style=" font-weight:600;">Handlers: </span>Only show small triangular handlers at the top and bottom</p></body></html> - - - Split line style - - - - - - - 0 - - - - - Set the background color of the central view widget. - - - Set the background color of the central view widget. - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - Set the background color of the central view widget. - - - Set the background color of the central view widget. - - - - - - - :/img_edit.png:/img_edit.png - - - - - - - - - Set the background color of the central view widget. - - - Set the background color of the central view widget. - - - View Background Color - - - - - - - - - - - - 191 - 64 - 64 - - - - - - - - - 191 - 64 - 64 - - - - - - - - - 190 - 190 - 190 - - - - - - - - Show the playback control (the navigation panel at the bottom) also in full screen mode. - - - Show the playback control (the navigation panel at the bottom) also in full screen mode. - - - invisibleText - - - - - - - <html><head/><body><p>When the split- and comparison view is activated, this defines how the position of the split line is indicated:</p><p><span style=" font-weight:600;">Solid Line</span>: A solid white line</p><p><span style=" font-weight:600;">Handlers: </span>Only show small triangular handlers at the top and bottom</p></body></html> - - - <html><head/><body><p>When the split- and comparison view is activated, this defines how the position of the split line is indicated:</p><p><span style=" font-weight:600;">Solid Line</span>: A solid white line</p><p><span style=" font-weight:600;">Handlers: </span>Only show small triangular handlers at the top and bottom</p></body></html> - - - - Solid Line - - - - - Handlers - - - - - - - - Which of the two mouse buttons is to be used for moving and which for zooming the view? - - - Which of the two mouse buttons is to be used for moving and which for zooming the view? - - - Mouse button behavior - - - - - - - - - - - - 191 - 64 - 64 - - - - - - - - - 191 - 64 - 64 - - - - - - - - - 190 - 190 - 190 - - - - - - - - Show the file path of each item at the top when two items are selected - - - Show the file path of each item at the top when two items are selected - - - invisibleText - - - - - - - - - - - - 191 - 64 - 64 - - - - - - - - - 191 - 64 - 64 - - - - - - - - - 190 - 190 - 190 - - - - - - - - Show pixel vales in hex instead of decimal - - - Show pixel vales in hex instead of decimal - - - invisibleText - - - - - - - Show the file path of each item at the top when two items are selected - - - Show the file path of each item at the top when two items are selected - - - Show file path in split view - - - - - - - Show the playback control (the navigation panel at the bottom) also in full screen mode. - - - Show the playback control (the navigation panel at the bottom) also in full screen mode. - - - Show playback control in full screen - - - - - - - - - - Show pixel values as Hex values - - - - - - - Plot Background Color - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - Set the background color of the plot widgets. - - - Set the background color of the plot widgets. - - - - - - - :/img_edit.png:/img_edit.png - - - - - - - - - Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. - - - Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. - - - View Grid Line Color - - - - - - - 0 - - - - - Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. - - - Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. - - - Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. - - - - - - - :/img_edit.png:/img_edit.png - - - - - - @@ -549,7 +138,434 @@ - + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + UI + + + + + + + + + + + + + 191 + 64 + 64 + + + + + + + + + 191 + 64 + 64 + + + + + + + + + 190 + 190 + 190 + + + + + + + + Show the playback control (the navigation panel at the bottom) also in full screen mode. + + + Show the playback control (the navigation panel at the bottom) also in full screen mode. + + + invisibleText + + + + + + + Set the background color of the central view widget. + + + Set the background color of the central view widget. + + + View Background Color + + + + + + + <html><head/><body><p>When the split- and comparison view is activated, this defines how the position of the split line is indicated:</p><p><span style=" font-weight:600;">Solid Line</span>: A solid white line</p><p><span style=" font-weight:600;">Handlers: </span>Only show small triangular handlers at the top and bottom</p></body></html> + + + <html><head/><body><p>When the split- and comparison view is activated, this defines how the position of the split line is indicated:</p><p><span style=" font-weight:600;">Solid Line</span>: A solid white line</p><p><span style=" font-weight:600;">Handlers: </span>Only show small triangular handlers at the top and bottom</p></body></html> + + + + Solid Line + + + + + Handlers + + + + + + + + + + + + + 191 + 64 + 64 + + + + + + + + + 191 + 64 + 64 + + + + + + + + + 190 + 190 + 190 + + + + + + + + Show the file path of each item at the top when two items are selected + + + Show the file path of each item at the top when two items are selected + + + invisibleText + + + + + + + Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. + + + Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. + + + View Grid Line Color + + + + + + + Show the file path of each item at the top when two items are selected + + + Show the file path of each item at the top when two items are selected + + + Show file path in split view + + + + + + + Plot Background Color + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + Set the background color of the plot widgets. + + + Set the background color of the plot widgets. + + + + + + + :/img_edit.png:/img_edit.png + + + + + + + + + Which of the two mouse buttons is to be used for moving and which for zooming the view? + + + Which of the two mouse buttons is to be used for moving and which for zooming the view? + + + Mouse button behavior + + + + + + + <html><head/><body><p>When the split- and comparison view is activated, this defines how the position of the split line is indicated:</p><p><span style=" font-weight:600;">Solid Line</span>: A solid white line</p><p><span style=" font-weight:600;">Handlers: </span>Only show small triangular handlers at the top and bottom</p></body></html> + + + <html><head/><body><p>When the split- and comparison view is activated, this defines how the position of the split line is indicated:</p><p><span style=" font-weight:600;">Solid Line</span>: A solid white line</p><p><span style=" font-weight:600;">Handlers: </span>Only show small triangular handlers at the top and bottom</p></body></html> + + + Split line style + + + + + + + Which of the two mouse buttons is to be used for moving and which for zooming the view? + + + Which of the two mouse buttons is to be used for moving and which for zooming the view? + + + + Left Zoom, Right Move + + + + + Left Move, Right Zoom + + + + + + + + 0 + + + + + Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. + + + Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. + + + Set the line color of the Grid which can be activated using the "Draw Gird" option in the "View Options" panel. + + + + + + + :/img_edit.png:/img_edit.png + + + + + + + + + Theme + + + + + + + 0 + + + + + Set the background color of the central view widget. + + + Set the background color of the central view widget. + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + Set the background color of the central view widget. + + + Set the background color of the central view widget. + + + + + + + :/img_edit.png:/img_edit.png + + + + + + + + + Show the playback control (the navigation panel at the bottom) also in full screen mode. + + + Show the playback control (the navigation panel at the bottom) also in full screen mode. + + + Show playback control in full screen + + + + + + + + + + Show pixel values as Hex values + + + + + + + + + + + + 191 + 64 + 64 + + + + + + + + + 191 + 64 + 64 + + + + + + + + + 190 + 190 + 190 + + + + + + + + Show pixel vales in hex instead of decimal + + + Show pixel vales in hex instead of decimal + + + invisibleText + + + + + + + Qt::Vertical @@ -563,7 +579,7 @@ - + Caching @@ -756,7 +772,7 @@ - + Qt::Vertical @@ -776,7 +792,7 @@ - + @@ -837,7 +853,7 @@ - + h.265/HEVC @@ -983,7 +999,7 @@ - + Specify individual decoder libraries to use for HEVC files. These will always be tried first. @@ -1339,7 +1355,7 @@ - + Qt::Vertical @@ -1398,12 +1414,6 @@ tabWidget - comboBoxTheme - comboBoxSplitLineStyle - comboBoxMouseMode - pushButtonEditViewBackgroundColor - pushButtonEditViewGridLineColor - checkBoxPlaybackControlFullScreen groupBoxUpdates comboBoxUpdateSettings groupBoxCaching