#pragma once #include "DatabaseManager.hpp" #include "ResultFilterProxyModel.hpp" #include "ResultItemDelegate.hpp" #include "ResultListModel.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // アプリケーションのメインウィンドウ(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); void onUrlDownloadFinished(QNetworkReply *reply); private: // 内部処理・初期化メソッド void setupUi(); // UIのレイアウトと初期化 void loadSettings(); // INIファイルからの設定値復元 void saveSettings(); // INIファイルへの設定値保存 void updateResultGrid( const std::vector &groups, bool preserveState = false); // 結果グリッドへサムネイルを並べる std::vector getFilteredImages(); // 現在リストにあるディレクトリの画像のみ抽出 bool eventFilter(QObject *obj, QEvent *event) override; // 右クリックメニュー等のイベントフィルタ void closeEvent(QCloseEvent *event) override; // ウィンドウ終了時の保存処理など void dropEvent(QDropEvent *e) override; // ドロップを受け付ける void dragEnterEvent(QDragEnterEvent *event) override; // ドロップを受け付ける // データベースマネージャーのインスタンス std::unique_ptr 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 *m_scanWatcher; // 画像スキャンの進捗監視 QFutureWatcher> *m_searchWatcher; // 類似検索の進捗監視 QTimer *m_searchTimer; // 頻繁なスライダ操作をまとめる(デバウンス)ためのタイマ // キャッシュ std::vector m_lastScannedImages; // 各ディレクトリから抽出した画像キャッシュ QStringList m_loadedDirs; // 起動時にロードされたディレクトリ群 std::vector m_currentGroups; // 現在表示中のグループ一覧 std::unordered_set m_ignoredPaths; // セッション中に除外した画像のパス QNetworkAccessManager *m_networkManager; };