MainWindow.hpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #pragma once
  2. #include "DatabaseManager.hpp"
  3. #include "SimilaritySearch.hpp"
  4. #include <unordered_set>
  5. #include <QCheckBox>
  6. #include <QCloseEvent>
  7. #include <QEvent>
  8. #include <QFutureWatcher>
  9. #include <QGridLayout>
  10. #include <QLabel>
  11. #include <QListWidget>
  12. #include <QMainWindow>
  13. #include <QObject>
  14. #include <QProgressBar>
  15. #include <QPushButton>
  16. #include <QScrollArea>
  17. #include <QSlider>
  18. #include <QTimer>
  19. #include <memory>
  20. #include <vector>
  21. // アプリケーションのメインウィンドウ(GUI)を管理するクラス
  22. class MainWindow : public QMainWindow {
  23. Q_OBJECT
  24. public:
  25. MainWindow(QWidget *parent = nullptr);
  26. ~MainWindow();
  27. private slots:
  28. // イベントに応答するスロット関数群
  29. void onAddDirectory(); // 検索対象ディレクトリ追加ボタン押下
  30. void onRemoveDirectory(); // リストからディレクトリ除外ボタン押下
  31. void onStartScan(); // 重複検索スキャン開始ボタン押下
  32. void onDeleteSelected(); // チェックされた重複画像を削除するボタン押下
  33. void onThresholdChanged(int value); // 類似度しきい値スライダー変更時
  34. void onStrictChanged(int state); // Strictモードチェックボックス変更時
  35. void onScanFinished(); // ディレクトリの一括スキャン完了時
  36. void performAsyncSearch(); // 非同期での類似画像群の抽出実行
  37. void onSearchFinished(); // 類似画像の検索完了時
  38. void onClearResults(); // 結果表示のクリア
  39. void removeGroupFromView(int groupId); // 指定したグループをリストから除外
  40. private:
  41. // 内部処理・初期化メソッド
  42. void setupUi(); // UIのレイアウトと初期化
  43. void loadSettings(); // INIファイルからの設定値復元
  44. void saveSettings(); // INIファイルへの設定値保存
  45. void updateResultGrid(const std::vector<DuplicateGroup>
  46. &groups, bool preserveState = false); // 結果グリッドへサムネイルを並べる
  47. std::vector<ImageData>
  48. getFilteredImages(); // 現在リストにあるディレクトリの画像のみ抽出
  49. bool
  50. eventFilter(QObject *obj,
  51. QEvent *event) override; // 右クリックメニュー等のイベントフィルタ
  52. void
  53. closeEvent(QCloseEvent *event) override; // ウィンドウ終了時の保存処理など
  54. // データベースマネージャーのインスタンス
  55. std::unique_ptr<DatabaseManager> m_dbManager;
  56. // UI要素
  57. QListWidget *m_dirList; // 追加済みディレクトリのリスト
  58. QPushButton *m_addDirBtn;
  59. QPushButton *m_removeDirBtn;
  60. QPushButton *m_startScanBtn;
  61. QPushButton *m_deselectBtn; // チェック状態を全クリアするボタン
  62. QProgressBar *m_progressBar; // スキャン・検索時のプログレスバー
  63. QScrollArea *m_scrollArea; // 検索結果表示用スクロールエリア
  64. QWidget *m_resultWidget;
  65. QGridLayout *m_resultLayout; // 検索結果をグリッドで配置するレイアウト
  66. QPushButton *m_deleteBtn;
  67. QPushButton *m_clearBtn;
  68. // 類似判定コントロール要素
  69. QSlider *m_thresholdSlider; // ハミング距離しきい値の設定スライダー
  70. QLabel *m_thresholdLabel; // しきい値の現在数値ラベル
  71. QCheckBox *m_strictCheckBox; // pHash, dHash両方を厳密チェックするか
  72. int m_currentThreshold = 10;
  73. bool m_strictMode = false;
  74. // 非同期(バックグラウンド)処理用オブジェクト
  75. QFutureWatcher<void> *m_scanWatcher; // 画像スキャンの進捗監視
  76. QFutureWatcher<std::vector<DuplicateGroup>>
  77. *m_searchWatcher; // 類似検索の進捗監視
  78. QTimer
  79. *m_searchTimer; // 頻繁なスライダ操作をまとめる(デバウンス)ためのタイマ
  80. // キャッシュ
  81. std::vector<ImageData>
  82. m_lastScannedImages; // 各ディレクトリから抽出した画像キャッシュ
  83. QStringList m_loadedDirs; // 起動時にロードされたディレクトリ群
  84. // 結果画面に追加された画像とチェックボックスを管理する構造体
  85. struct ResultItem {
  86. QCheckBox *checkbox; // 削除対象としてマークするチェックボックス
  87. std::string path; // チェックボックスに紐づく画像パス
  88. int groupId; // 属する重複グループのID(全削除警告用)
  89. };
  90. std::vector<ResultItem>
  91. m_resultItems; // 現在表示されている結果アイテムのリスト
  92. std::vector<DuplicateGroup> m_currentGroups; // 現在表示中のグループ一覧
  93. std::unordered_set<std::string> m_ignoredPaths; // セッション中に除外した画像のパス
  94. };