From a86ab92bbe7d67a3485aca1cb8f2dcdfad8c3af3 Mon Sep 17 00:00:00 2001 From: Dheeraj Shenoy Date: Fri, 9 Aug 2024 11:40:52 +0530 Subject: [PATCH] open sessions from manage session dialog --- README.md | 7 +++--- src/ImageWidget.cpp | 1 + src/ManageSessionsDialog.cpp | 24 +++++++++++++++---- src/ManageSessionsDialog.hpp | 7 +++++- src/StatusBar.cpp | 1 + src/imgv.cpp | 5 +++- src/utils.cpp | 45 ++++++++++++++++++++++++++++++++++++ src/utils.hpp | 8 +++++++ 8 files changed, 88 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e345c4f..419f4a0 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,6 @@ Only for **Linux**. ![image](https://github.com/user-attachments/assets/c5f42acb-0760-45e7-a41d-11fac2570c41) - - # Introduction @@ -176,6 +174,10 @@ Note that if the `keybindings` table is present in the `Defaults` table, then de # Changelogs and Bug Fixes +- 09 Aug 2024 + + - Open sessions from Manage Session Dialog + - 08 Aug 2024 - Remove & Rename session files @@ -192,7 +194,6 @@ Note that if the `keybindings` table is present in the `Defaults` table, then de ![image](https://github.com/user-attachments/assets/1c8f2e7d-7efd-420e-8ec0-dd3cf78a3409) - - 07 Aug 2024 - EXIF Metadata support (JPEG metadata) diff --git a/src/ImageWidget.cpp b/src/ImageWidget.cpp index 5a19abf..a0e98c6 100644 --- a/src/ImageWidget.cpp +++ b/src/ImageWidget.cpp @@ -6,6 +6,7 @@ ImageWidget::ImageWidget(QWidget *parent) m_scene = new QGraphicsScene(this); setScene(m_scene); + m_pixmapItem = new QGraphicsPixmapItem; m_movieItem = new MovieItem; m_scene->addItem(m_pixmapItem); diff --git a/src/ManageSessionsDialog.cpp b/src/ManageSessionsDialog.cpp index b254a03..85bdd2d 100644 --- a/src/ManageSessionsDialog.cpp +++ b/src/ManageSessionsDialog.cpp @@ -3,8 +3,8 @@ ManageSessionsDialog::ManageSessionsDialog(QString &sessionDirPath, QWidget *parent) : QDialog(parent), session_path(sessionDirPath) { - table->setColumnCount(2); - table->setHorizontalHeaderLabels({ "Session Name", "Images" }); + table->setColumnCount(3); + table->setHorizontalHeaderLabels({ "Session Name", "Date Modified", "Images" }); auto files = QDir(sessionDirPath).entryList(QStringList() << "*.imgv" << "*.IMGV", QDir::Files); table->setRowCount(files.size()); @@ -17,10 +17,14 @@ ManageSessionsDialog::ManageSessionsDialog(QString &sessionDirPath, QWidget *par for(int i=0; i < files.size(); i++) { QTableWidgetItem *session_file = new QTableWidgetItem(QFileInfo(files[i]).baseName()); - QStringList imgfiles = utils::getImagesFromSessionFile(QString("%1%2%3").arg(sessionDirPath).arg(QDir::separator()).arg(files[i])); + Custom date_and_files = utils::getDateandImagesFromSessionFile(QString("%1%2%3").arg(sessionDirPath).arg(QDir::separator()).arg(files[i])); + auto imgfiles = date_and_files.files; QTableWidgetItem *img_count = new QTableWidgetItem(QString::number(imgfiles.size())); + QTableWidgetItem *date = new QTableWidgetItem(date_and_files.date); + img_count->setToolTip(imgfiles.join("\n")); table->setItem(i, 0, session_file); - table->setItem(i, 1, img_count); + table->setItem(i, 1, date); + table->setItem(i, 2, img_count); } layout->addWidget(table); @@ -33,15 +37,25 @@ ManageSessionsDialog::ManageSessionsDialog(QString &sessionDirPath, QWidget *par contextMenu->addAction(renameSession); contextMenu->addAction(deleteSession); contextMenu->addAction(openInExplorer); + contextMenu->addAction(_openSession); table->setContextMenuPolicy(Qt::CustomContextMenu); connect(renameSession, &QAction::triggered, this, &ManageSessionsDialog::RenameSession); connect(deleteSession, &QAction::triggered, this, &ManageSessionsDialog::DeleteSession); connect(openInExplorer, &QAction::triggered, this, &ManageSessionsDialog::OpenInExplorer); + connect(_openSession, &QAction::triggered, this, &ManageSessionsDialog::OpenSession); connect(table, &QTableWidget::customContextMenuRequested, this, &ManageSessionsDialog::showContextMenu); } +void ManageSessionsDialog::OpenSession() noexcept +{ + auto sessions = table->selectedItems(); + + for(int i=0; i < sessions.count() / 2; i += 2) + emit openSession(session_path + QDir::separator() + sessions[i]->text() + ".imgv"); +} + void ManageSessionsDialog::showContextMenu(const QPointF loc) noexcept { contextMenu->exec(mapToGlobal(loc.toPoint())); @@ -59,7 +73,7 @@ void ManageSessionsDialog::DeleteSession() noexcept msgbox.setStandardButtons(QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No); msgbox.setWindowTitle("Deleting Session"); bool check = true; - for(int i=0; i < sessions.count(); i += 2) + for(int i=0; i < sessions.count() / 2; i += 2) { auto session = sessions[i]; auto filepath = QString("%1%2%3").arg(session_path).arg(QDir::separator()).arg(session->text() + ".imgv"); diff --git a/src/ManageSessionsDialog.hpp b/src/ManageSessionsDialog.hpp index f7f21cd..51c5076 100644 --- a/src/ManageSessionsDialog.hpp +++ b/src/ManageSessionsDialog.hpp @@ -16,10 +16,14 @@ class ManageSessionsDialog : public QDialog { + Q_OBJECT public: ManageSessionsDialog(QString &sessionDirPath, QWidget *parent = nullptr); ~ManageSessionsDialog() {} +signals: + void openSession(QString); + private: QVBoxLayout *layout = new QVBoxLayout(); QTableWidget *table = new QTableWidget(); @@ -27,15 +31,16 @@ class ManageSessionsDialog : public QDialog QAction *renameSession = new QAction("Rename Session"); QAction *deleteSession = new QAction("Delete Session"); QAction *openInExplorer = new QAction("Open in Explorer"); + QAction *_openSession = new QAction("Open Session"); QPushButton *done_btn = new QPushButton("Done"); + void OpenSession() noexcept; void RenameSession() noexcept; void OpenInExplorer() noexcept; void DeleteSession() noexcept; void showContextMenu(const QPointF loc) noexcept; QStringList getSessions() noexcept; - QString session_path; }; diff --git a/src/StatusBar.cpp b/src/StatusBar.cpp index dacfa75..665c940 100644 --- a/src/StatusBar.cpp +++ b/src/StatusBar.cpp @@ -19,6 +19,7 @@ StatusBar::StatusBar(QWidget *parent) noteModifiedLabel->setToolTip("Note has unsaved changes. Switching to other image will delete the unsaved changes"); sessionLabel->setToolTip("Current session"); + layout->setContentsMargins(2, 2, 2, 2); this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); diff --git a/src/imgv.cpp b/src/imgv.cpp index fb6d949..601d249 100644 --- a/src/imgv.cpp +++ b/src/imgv.cpp @@ -28,6 +28,8 @@ IMGV::IMGV(argparse::ArgumentParser &parser, QWidget *parent) splitter->addWidget(m_thumbnail_view); m_right_pane->setLayout(m_right_pane_layout); + m_right_pane_layout->setContentsMargins(0, 0, 0, 0); + m_right_pane_splitter->addWidget(m_img_widget); m_right_pane_splitter->addWidget(m_note_holder); @@ -53,7 +55,7 @@ IMGV::IMGV(argparse::ArgumentParser &parser, QWidget *parent) layout->addWidget(m_statusbar); setCentralWidget(centralWidget); - layout->setContentsMargins(0, 0, 0, 0); + layout->setContentsMargins(5, 5, 5, 5); centralWidget->setContentsMargins(0, 0, 0, 0); this->setContentsMargins(0, 0, 0, 0); @@ -284,6 +286,7 @@ void IMGV::initMenu() connect(tools__manage_sessions, &QAction::triggered, this, [&]() { ManageSessionsDialog *md = new ManageSessionsDialog(m_sessions_dir_path, this); + connect(md, &ManageSessionsDialog::openSession, this, [&](QString name) { openSession(name); }); md->open(); }); diff --git a/src/utils.cpp b/src/utils.cpp index 0a5f707..abf2d0e 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -142,3 +142,48 @@ QStringList utils::getImagesFromSessionFile(const QString &sessionfilepath) noex ifs.close(); return imgfiles; } + +Custom utils::getDateandImagesFromSessionFile(const QString &sessionfilepath) noexcept +{ + using namespace rapidjson; + std::ifstream ifs(sessionfilepath.toStdString()); + + if (!ifs.is_open()) { + return {}; + } + + IStreamWrapper isw(ifs); + + Document doc; + doc.ParseStream(isw); + + if (doc.HasParseError()) + { + return {}; + } + + QStringList imgfiles; + if (doc.HasMember("files") && doc["files"].IsArray()) + { + const Value& files_arr = doc["files"]; + for(SizeType i=0; i < files_arr.Size(); i++) + { + if (files_arr[i].IsObject()) + { + auto file = files_arr[i].GetObject(); + if (file.HasMember("path") && file["path"].IsString() && file.HasMember("note") && file["note"].IsString()) + { + imgfiles << file["path"].GetString(); + } + } + } + } + + QString date; + if (doc.HasMember("date") && doc["date"].IsString()) + date = doc["date"].GetString(); + else + date = "N/A"; + ifs.close(); + return Custom{ imgfiles, date }; +} diff --git a/src/utils.hpp b/src/utils.hpp index cc58cda..61212a7 100644 --- a/src/utils.hpp +++ b/src/utils.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -21,6 +22,12 @@ struct Dimension int height; }; +struct Custom +{ + QStringList files; + QString date; +}; + class utils { @@ -33,6 +40,7 @@ class utils static QImage decodeWebPToImage(const QString &filePath) noexcept; static QString imageFormatToString(const QImage::Format format) noexcept; static QStringList getImagesFromSessionFile(const QString &session_file) noexcept; + static Custom getDateandImagesFromSessionFile(const QString &session_file) noexcept; }; #endif