| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #pragma once
- #include "DatabaseManager.hpp"
- #include "ResultListModel.hpp"
- #include "ResultItemDelegate.hpp"
- #include "ResultFilterProxyModel.hpp"
- #include <QLineEdit>
- #include <unordered_set>
- #include <QCheckBox>
- #include <QCloseEvent>
- #include <QEvent>
- #include <QFutureWatcher>
- #include <QLabel>
- #include <QListView>
- #include <QListWidget>
- #include <QMainWindow>
- #include <QObject>
- #include <QProgressBar>
- #include <QPushButton>
- #include <QSlider>
- #include <QTimer>
- #include <memory>
- #include <vector>
- // アプリケーションのメインウィンドウ(GUI)を管理するクラス
- class MainWindow : public QMainWindow {
- Q_OBJECT
- public:
- MainWindow(QWidget *parent = nullptr);
- ~MainWindow();
- private slots:
- // イベントに応答するスロット関数群
- void onAddDirectory(); // 検索対象ディレクトリ追加ボタン押下
- void onRemoveDirectory(); // リストからディレクトリ除外ボタン押下
- void onStartScan(); // 重複検索スキャン開始ボタン押下
- void onDeleteSelected(); // チェックされた重複画像を削除するボタン押下
- void onThresholdChanged(int value); // 類似度しきい値スライダー変更時
- void onStrictChanged(int state); // Strictモードチェックボックス変更時
- void onScanFinished(); // ディレクトリの一括スキャン完了時
- void performAsyncSearch(); // 非同期での類似画像群の抽出実行
- void onSearchFinished(); // 類似画像の検索完了時
- void onClearResults(); // 結果表示のクリア
- void removeGroupFromView(int groupId); // 指定したグループをリストから除外
- void onContextMenuRequested(const std::string& path, int groupId, const QPoint& globalPos);
- void onFileDoubleClicked(const std::string& path);
- void onSearchTextChanged(const QString &text);
- private:
- // 内部処理・初期化メソッド
- void setupUi(); // UIのレイアウトと初期化
- void loadSettings(); // INIファイルからの設定値復元
- void saveSettings(); // INIファイルへの設定値保存
- void updateResultGrid(const std::vector<DuplicateGroup>
- &groups, bool preserveState = false); // 結果グリッドへサムネイルを並べる
- std::vector<ImageData>
- getFilteredImages(); // 現在リストにあるディレクトリの画像のみ抽出
- bool
- eventFilter(QObject *obj,
- QEvent *event) override; // 右クリックメニュー等のイベントフィルタ
- void
- closeEvent(QCloseEvent *event) override; // ウィンドウ終了時の保存処理など
- // データベースマネージャーのインスタンス
- std::unique_ptr<DatabaseManager> m_dbManager;
- // UI要素
- QListWidget *m_dirList; // 追加済みディレクトリのリスト
- QPushButton *m_addDirBtn;
- QPushButton *m_removeDirBtn;
- QPushButton *m_startScanBtn;
- QPushButton *m_deselectBtn; // チェック状態を全クリアするボタン
- QProgressBar *m_progressBar; // スキャン・検索時のプログレスバー
- QListView *m_resultView; // 検索結果表示用リストビュー
- QPushButton *m_deleteBtn;
- QPushButton *m_clearBtn;
- // 類似判定コントロール要素
- QSlider *m_thresholdSlider; // ハミング距離しきい値の設定スライダー
- QLabel *m_thresholdLabel; // しきい値の現在数値ラベル
- QCheckBox *m_strictCheckBox; // pHash, dHash両方を厳密チェックするか
- int m_currentThreshold = 5;
- bool m_strictMode = false;
- ResultListModel *m_model;
- ResultItemDelegate *m_delegate;
- ResultFilterProxyModel *m_proxyModel;
- QLineEdit *m_searchBox;
- // 非同期(バックグラウンド)処理用オブジェクト
- QFutureWatcher<void> *m_scanWatcher; // 画像スキャンの進捗監視
- QFutureWatcher<std::vector<DuplicateGroup>>
- *m_searchWatcher; // 類似検索の進捗監視
- QTimer
- *m_searchTimer; // 頻繁なスライダ操作をまとめる(デバウンス)ためのタイマ
- // キャッシュ
- std::vector<ImageData>
- m_lastScannedImages; // 各ディレクトリから抽出した画像キャッシュ
- QStringList m_loadedDirs; // 起動時にロードされたディレクトリ群
- std::vector<DuplicateGroup> m_currentGroups; // 現在表示中のグループ一覧
- std::unordered_set<std::string> m_ignoredPaths; // セッション中に除外した画像のパス
- };
|