From a9318910a6d21747d7f8d85bdb08ec78611ca904 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Sun, 25 Sep 2022 19:05:48 -0400 Subject: Add sorting. --- qdeduper/mingui.cpp | 129 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 104 insertions(+), 25 deletions(-) (limited to 'qdeduper/mingui.cpp') diff --git a/qdeduper/mingui.cpp b/qdeduper/mingui.cpp index 80a83dc..cbdc9b7 100644 --- a/qdeduper/mingui.cpp +++ b/qdeduper/mingui.cpp @@ -12,11 +12,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -73,8 +75,7 @@ Q_DECLARE_METATYPE(fs::path) DeduperMainWindow::DeduperMainWindow() { qRegisterMetaType(); - this->setFont(QFontDatabase::systemFont(QFontDatabase::SystemFont::FixedFont)); - this->setWindowTitle("deduper"); + this->setWindowTitle("QDeduper"); this->setup_menu(); this->update_actions(); sb = this->statusBar(); @@ -113,7 +114,6 @@ DeduperMainWindow::DeduperMainWindow() pd->setAutoReset(false); pd->setAutoClose(false); pd->setWindowTitle("Progress"); - pd->setFont(this->font()); QLabel *pdlb = new QLabel(pd); pdlb->setMaximumWidth(500); pdlb->setAlignment(Qt::AlignmentFlag::AlignLeft | Qt::AlignmentFlag::AlignVCenter); @@ -123,6 +123,10 @@ DeduperMainWindow::DeduperMainWindow() pd->setMaximumHeight(120); pd->setMinimumHeight(120); pd->close(); + QFont fnt = QFontDatabase::systemFont(QFontDatabase::SystemFont::FixedFont); + lv->setFont(fnt); + infopanel->setFont(fnt); + pd->setFont(fnt); for (size_t i = 0; i < keys.size(); ++i) { @@ -179,6 +183,8 @@ DeduperMainWindow::DeduperMainWindow() infopanel->setText("bleh"); infopanel->setSizePolicy(QSizePolicy::Policy::Minimum, QSizePolicy::Policy::Minimum); nohotkeywarn = false; + sort_role = ImageItem::ImageItemRoles::default_order_role; + sort_order = Qt::SortOrder::AscendingOrder; } void DeduperMainWindow::setup_menu() @@ -250,27 +256,11 @@ void DeduperMainWindow::setup_menu() file->addSeparator(); QAction *search_img = file->addAction("Search for Image..."); - QObject::connect(search_img, &QAction::triggered, [this]{ + QObject::connect(search_img, &QAction::triggered, [this] { QString fpath = QFileDialog::getOpenFileName(this, "Select Image", QString(), "Image file"); if (fpath.isNull()) return; - auto sim = this->sdb->search_file(qstring_to_path(fpath)); - if (sim.empty()) - { - this->sb->showMessage("No similar image found.", 2000); - return; - } - this->vm = ViewMode::view_searchresult; - std::vector ps; - std::map, double> dm; - for (auto &s : sim) - { - ps.push_back(s.first); - dm[std::make_pair(0, s.first)] = s.second; - } - this->show_images(ps); - this->update_distances(dm); - this->sb->showMessage("Use next group / previous group to go back."); - this->permamsg->setText("Viewing image search result"); + searched_image = qstring_to_path(fpath); + search_image(searched_image); }); menuact["search_image"] = search_img; file->addSeparator(); @@ -324,9 +314,62 @@ void DeduperMainWindow::setup_menu() view->addSeparator(); QMenu *sort = view->addMenu("Sort by"); - sort->addAction("File size"); - sort->addAction("Image dimension"); - sort->addAction("File path"); + QMenu *tbsort = new QMenu(this); + QAction *sfsz = new QAction("File size"); + QAction *simd = new QAction("Image dimension"); + QAction *sfpt = new QAction("File path"); + QAction *snon = new QAction("Default"); + QList skeya = {sfsz, simd, sfpt, snon}; + QList skeyr = { + ImageItem::ImageItemRoles::file_size_role, + ImageItem::ImageItemRoles::pixelcnt_role, + ImageItem::ImageItemRoles::path_role, + ImageItem::ImageItemRoles::database_id_role, + }; + QActionGroup *skeyg = new QActionGroup(sort); + for (int i = 0; i < skeya.size(); ++i) + { + auto a = skeya[i]; + sort->addAction(a); + tbsort->addAction(a); + skeyg->addAction(a); + a->setCheckable(true); + ImageItem::ImageItemRoles sr = skeyr[i]; + QObject::connect(a, &QAction::triggered, [this, sr] { + this->sort_role = sr; + if (this->vm == ViewMode::view_normal) + this->show_group(this->curgroup); + else + this->search_image(this->searched_image); + }); + } + snon->setChecked(true); + skeyg->setExclusionPolicy(QActionGroup::ExclusionPolicy::Exclusive); + sort->addSeparator(); + tbsort->addSeparator(); + QAction *sasc = new QAction("Ascending"); + QAction *sdec = new QAction("Descending"); + QActionGroup *sordg = new QActionGroup(sort); + QList sorda = {sasc, sdec}; + QList sordv = {Qt::SortOrder::AscendingOrder, Qt::SortOrder::DescendingOrder}; + for (int i = 0; i < sorda.size(); ++i) + { + auto a = sorda[i]; + sort->addAction(a); + tbsort->addAction(a); + sordg->addAction(a); + a->setCheckable(true); + Qt::SortOrder so = sordv[i]; + QObject::connect(a, &QAction::triggered, [this, so] { + this->sort_order = so; + if (this->vm == ViewMode::view_normal) + this->show_group(this->curgroup); + else + this->search_image(this->searched_image); + }); + } + sasc->setChecked(true); + sordg->setExclusionPolicy(QActionGroup::ExclusionPolicy::Exclusive); QAction *mall = mark->addAction("Mark All"); mall->setShortcut(QKeySequence(Qt::Key::Key_X)); @@ -356,6 +399,10 @@ void DeduperMainWindow::setup_menu() tb->addAction(prvgrp); tb->addAction(nxtgrp); tb->addAction(skip); + QAction *tbsorta = tb->addAction("Sort by"); + QToolButton *tbsortb = qobject_cast(tb->widgetForAction(tbsorta)); + tbsortb->setPopupMode(QToolButton::ToolButtonPopupMode::InstantPopup); + tbsorta->setMenu(tbsort); tb->setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextBesideIcon); } void DeduperMainWindow::update_actions() @@ -385,6 +432,29 @@ void DeduperMainWindow::update_actions() } } +void DeduperMainWindow::search_image(const fs::path &path) +{ + auto sim = this->sdb->search_file(path); + if (sim.empty()) + { + this->sb->showMessage("No similar image found.", 2000); + return; + } + this->vm = ViewMode::view_searchresult; + std::vector ps; + std::map, double> dm; + for (auto &s : sim) + { + ps.push_back(s.first); + dm[std::make_pair(0, s.first)] = s.second; + } + this->show_images(ps); + this->sort_reassign_hotkeys(); + this->update_distances(dm); + this->sb->showMessage("Use next group / previous group to go back."); + this->permamsg->setText("Viewing image search result"); +} + void DeduperMainWindow::show_images(const std::vector &ids) { im->clear(); @@ -572,11 +642,20 @@ void DeduperMainWindow::show_group(size_t gid) this->vm = ViewMode::view_normal; auto g = sdb->get_group(gid); this->show_images(g); + this->sort_reassign_hotkeys(); this->update_distances(sdb->group_distances(gid)); this->update_viewstatus(gid, sdb->num_groups()); this->update_actions(); } +void DeduperMainWindow::sort_reassign_hotkeys() +{ + im->setSortRole(this->sort_role); + im->sort(0, this->sort_order); + for (int i = 0; i < im->rowCount(); ++i) + static_cast(im->item(i))->set_hotkey(i < keys.size() ? keys[i] : QKeySequence()); +} + void DeduperMainWindow::mark_toggle(size_t x) { if (vm == ViewMode::view_searchresult) -- cgit v1.2.3