MainWindow.hpp 4.4 KB

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