From be6e4720814c5ca341bb332ad42a93327a9c85ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Mon, 10 Oct 2022 10:19:55 +0200 Subject: [PATCH] Settings dialog --- CMakeLists.txt | 1 + imageringlist.cpp | 3 +- imagescrollareagl.cpp | 1 + mainwindow.cpp | 15 ++++++++- mainwindow.h | 1 + rawimage.cpp | 4 +++ rawimage.h | 6 ++-- settingsdialog.cpp | 77 +++++++++++++++++++++++++++++++++++++++++++ settingsdialog.h | 20 +++++++++++ shaders/thumb.vert | 5 +-- 10 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 settingsdialog.cpp create mode 100644 settingsdialog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8399d2a..e55cc4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ set(TENMON_SRC mainwindow.cpp markedfiles.cpp rawimage.cpp + settingsdialog.cpp starfit.cpp statusbar.cpp stfslider.cpp diff --git a/imageringlist.cpp b/imageringlist.cpp index e2e3e2d..4331945 100644 --- a/imageringlist.cpp +++ b/imageringlist.cpp @@ -7,7 +7,7 @@ using namespace std; -const int DEFAULT_WIDTH = 2; +int DEFAULT_WIDTH = 2; Image::Image(const QString name, int number, ImageRingList *ringList) : m_loading(false), @@ -260,6 +260,7 @@ void ImageRingList::loadThumbnails() void ImageRingList::stopLoading() { m_thumbPool->clear(); + m_thumbPool->waitForDone(); } int ImageRingList::imageCount() const diff --git a/imagescrollareagl.cpp b/imagescrollareagl.cpp index 860c980..63328df 100644 --- a/imagescrollareagl.cpp +++ b/imagescrollareagl.cpp @@ -249,6 +249,7 @@ void ImageWidget::paintGL() } m_thumbnailProgram->bind(); f->glUniform3i(m_thumbnailProgram->uniformLocation("viewport_row"), width(), height(), width()/THUMB_SIZE_BORDER); + f->glUniform3i(m_thumbnailProgram->uniformLocation("thumb_size"), THUMB_SIZE_BORDER/2, THUMB_SIZE_BORDER, THUMB_SIZE_BORDER_Y); m_thumbnailProgram->setUniformValue("mtf_param", m_low, m_mid, m_high); m_thumbnailProgram->setUniformValue("invert", m_invert); m_thumbnailProgram->setUniformValue("offset", 0, m_dy); diff --git a/mainwindow.cpp b/mainwindow.cpp index 8ff548d..27120d1 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -20,6 +20,7 @@ #include "markedfiles.h" #include "about.h" #include "statusbar.h" +#include "settingsdialog.h" #ifdef __linux__ #include @@ -34,6 +35,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) qRegisterMetaType("ImageInfoData"); qRegisterMetaType("RawImage"); + SettingsDialog::loadSettings(); + m_info = new ImageInfo(this); QDockWidget *infoDock = new QDockWidget(tr("Image info"), this); infoDock->setWidget(m_info); @@ -117,6 +120,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) exitAction->setShortcut(QKeySequence::Quit); menuBar()->addMenu(fileMenu); + QMenu *editMenu = new QMenu(tr("Edit"), this); + editMenu->addAction(tr("Settings"), this, &MainWindow::showSettingsDialog); + menuBar()->addMenu(editMenu); + QMenu *viewMenu = new QMenu(tr("View"), this); viewMenu->addAction(tr("Zoom In"), m_imageGL, SLOT(zoomIn()), QKeySequence::ZoomIn); viewMenu->addAction(tr("Zoom Out"), m_imageGL, SLOT(zoomOut()), QKeySequence::ZoomOut); @@ -533,10 +540,16 @@ void MainWindow::starFinder(bool findStars) void MainWindow::showMarkFilesDialog() { - MarkedFiles markedFiles; + MarkedFiles markedFiles(this); markedFiles.exec(); } +void MainWindow::showSettingsDialog() +{ + SettingsDialog settingsDialog(this); + settingsDialog.exec(); +} + void MainWindow::updateWindowTitle() { ImagePtr ptr = m_ringList->currentImage(); diff --git a/mainwindow.h b/mainwindow.h index 9f70a01..7d53bdc 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -63,6 +63,7 @@ protected slots: void peakFinder(bool findPeaks); void starFinder(bool findStars); void showMarkFilesDialog(); + void showSettingsDialog(); }; #endif // MAINWINDOW_H diff --git a/rawimage.cpp b/rawimage.cpp index 3aa0292..b64a1f2 100644 --- a/rawimage.cpp +++ b/rawimage.cpp @@ -1,5 +1,9 @@ #include "rawimage.h" +int THUMB_SIZE = 128; +int THUMB_SIZE_BORDER = 138; +int THUMB_SIZE_BORDER_Y = 158; + RawImage::ImgType CV2Type(int cvtype) { switch (cvtype) diff --git a/rawimage.h b/rawimage.h index 0f58a71..7670386 100644 --- a/rawimage.h +++ b/rawimage.h @@ -10,9 +10,9 @@ #include #include -const int THUMB_SIZE = 128; -const int THUMB_SIZE_BORDER = 138; -const int THUMB_SIZE_BORDER_Y = 158; +extern int THUMB_SIZE; +extern int THUMB_SIZE_BORDER; +extern int THUMB_SIZE_BORDER_Y; class Peak { diff --git a/settingsdialog.cpp b/settingsdialog.cpp new file mode 100644 index 0000000..4367800 --- /dev/null +++ b/settingsdialog.cpp @@ -0,0 +1,77 @@ +#include "settingsdialog.h" +#include +#include +#include +#include +#include "rawimage.h" + +extern int DEFAULT_WIDTH; + +class EvenNumber : public QSpinBox +{ +public: + explicit EvenNumber(QWidget *parent) : QSpinBox(parent){} +protected: + QValidator::State validate(QString &text, int &) const + { + bool ok; + int val = text.toInt(&ok); + if(ok && (val & 1) == 0)return QValidator::Acceptable; + if(ok)return QValidator::Intermediate; + return QValidator::Invalid; + } + void fixup(QString &input) const + { + bool ok; + int val = input.toInt(&ok); + val -= val & 1; + input = QString::number(val); + } +}; + +SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) +{ + QFormLayout *layout = new QFormLayout(this); + setWindowTitle(tr("Settings")); + + QSettings settings; + + m_preloadImages = new QSpinBox(this); + m_preloadImages->setRange(0, 8); + m_preloadImages->setValue(settings.value("settings/preloadimagecount", DEFAULT_WIDTH).toInt()); + m_preloadImages->setToolTip(tr("How many images are preloaded before and after current image.")); + + m_thumSize = new EvenNumber(this); + m_thumSize->setRange(64, 512); + m_thumSize->setSingleStep(2); + m_thumSize->setValue(settings.value("settings/thumnailsize", THUMB_SIZE).toInt()); + m_thumSize->setToolTip(tr("Thumbnail size in pixels")); + + layout->addRow(tr("Image preload count"), m_preloadImages); + layout->addRow(tr("Thumbnails size"), m_thumSize); + layout->addRow(new QLabel(tr("Changes in settings will take effect after program restart."))); + + QDialogButtonBox *buttonBox = new QDialogButtonBox(this); + buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); + connect(this, &QDialog::accepted, this, &SettingsDialog::saveSettings); + + layout->addRow(buttonBox); +} + +void SettingsDialog::loadSettings() +{ + QSettings settings; + THUMB_SIZE = settings.value("settings/thumbnailsize", THUMB_SIZE).toInt(); + THUMB_SIZE_BORDER = THUMB_SIZE + 10; + THUMB_SIZE_BORDER_Y = THUMB_SIZE + 30; + DEFAULT_WIDTH = settings.value("settings/preloadimagecount", DEFAULT_WIDTH).toInt(); +} + +void SettingsDialog::saveSettings() +{ + QSettings settings; + settings.setValue("settings/thumbnailsize", m_thumSize->value()); + settings.setValue("settings/preloadimagecount", m_preloadImages->value()); +} diff --git a/settingsdialog.h b/settingsdialog.h new file mode 100644 index 0000000..cd0e1c1 --- /dev/null +++ b/settingsdialog.h @@ -0,0 +1,20 @@ +#ifndef SETTINGSDIALOG_H +#define SETTINGSDIALOG_H + +#include +#include + +class SettingsDialog : public QDialog +{ + Q_OBJECT +public: + explicit SettingsDialog(QWidget *parent = nullptr); + static void loadSettings(); +private: + void saveSettings(); + + QSpinBox *m_preloadImages; + QSpinBox *m_thumSize; +}; + +#endif // SETTINGSDIALOG_H diff --git a/shaders/thumb.vert b/shaders/thumb.vert index b026072..9afdce2 100644 --- a/shaders/thumb.vert +++ b/shaders/thumb.vert @@ -7,13 +7,14 @@ out vec3 qt_TexCoord0; uniform ivec3 viewport_row; uniform mat4 mvp; uniform vec2 offset; +uniform ivec3 thumb_size; void main(void) { vec2 pos = qt_Vertex * 0.5; pos.y *= -1.0; - pos = pos * imageSize_num.xy + 69; - ivec2 off = ivec2(imageSize_num.z % viewport_row.z, imageSize_num.z / viewport_row.z) * ivec2(138, 158); + pos = pos * imageSize_num.xy + thumb_size.x; + ivec2 off = ivec2(imageSize_num.z % viewport_row.z, imageSize_num.z / viewport_row.z) * thumb_size.yz; gl_Position = mvp * vec4(pos - offset + off, 0.0, 1.0); qt_TexCoord0 = vec3(qt_MultiTexCoord0, imageSize_num.z + 0.1);