MainWindow.hpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #pragma once
  2. #include "DatabaseManager.hpp"
  3. #include "ResultListModel.hpp"
  4. #include "ResultItemDelegate.hpp"
  5. #include <unordered_set>
  6. #include <QCheckBox>
  7. #include <QCloseEvent>
  8. #include <QEvent>
  9. #include <QFutureWatcher>
  10. #include <QLabel>
  11. #include <QListView>
  12. #include <QListWidget>
  13. #include <QMainWindow>
  14. #include <QObject>
  15. #include <QProgressBar>
  16. #include <QPushButton>
  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. void onContextMenuRequested(const std::string& path, int groupId, const QPoint& globalPos);
  41. void onFileDoubleClicked(const std::string& path);
  42. private:
  43. // 内部処理・初期化メソッド
  44. void setupUi(); // UIのレイアウトと初期化
  45. void loadSettings(); // INIファイルからの設定値復元
  46. void saveSettings(); // INIファイルへの設定値保存
  47. void updateResultGrid(const std::vector<DuplicateGroup>
  48. &groups, bool preserveState = false); // 結果グリッドへサムネイルを並べる
  49. std::vector<ImageData>
  50. getFilteredImages(); // 現在リストにあるディレクトリの画像のみ抽出
  51. bool
  52. eventFilter(QObject *obj,
  53. QEvent *event) override; // 右クリックメニュー等のイベントフィルタ
  54. void
  55. closeEvent(QCloseEvent *event) override; // ウィンドウ終了時の保存処理など
  56. // データベースマネージャーのインスタンス
  57. std::unique_ptr<DatabaseManager> m_dbManager;
  58. // UI要素
  59. QListWidget *m_dirList; // 追加済みディレクトリのリスト
  60. QPushButton *m_addDirBtn;
  61. QPushButton *m_removeDirBtn;
  62. QPushButton *m_startScanBtn;
  63. QPushButton *m_deselectBtn; // チェック状態を全クリアするボタン
  64. QProgressBar *m_progressBar; // スキャン・検索時のプログレスバー
  65. QListView *m_resultView; // 検索結果表示用リストビュー
  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 = 5;
  73. bool m_strictMode = false;
  74. ResultListModel *m_model;
  75. ResultItemDelegate *m_delegate;
  76. // 非同期(バックグラウンド)処理用オブジェクト
  77. QFutureWatcher<void> *m_scanWatcher; // 画像スキャンの進捗監視
  78. QFutureWatcher<std::vector<DuplicateGroup>>
  79. *m_searchWatcher; // 類似検索の進捗監視
  80. QTimer
  81. *m_searchTimer; // 頻繁なスライダ操作をまとめる(デバウンス)ためのタイマ
  82. // キャッシュ
  83. std::vector<ImageData>
  84. m_lastScannedImages; // 各ディレクトリから抽出した画像キャッシュ
  85. QStringList m_loadedDirs; // 起動時にロードされたディレクトリ群
  86. std::vector<DuplicateGroup> m_currentGroups; // 現在表示中のグループ一覧
  87. std::unordered_set<std::string> m_ignoredPaths; // セッション中に除外した画像のパス
  88. };