Skip to content

Commit

Permalink
🩹 #46 フラグを正常に管理できていなかった問題を修正しました
Browse files Browse the repository at this point in the history
♻️ AviUtlウィンドウをTools::Windowでサブクラス化するように変更しました
  • Loading branch information
hebiiro committed Feb 4, 2024
1 parent 08ce495 commit 4a464f1
Showing 1 changed file with 70 additions and 42 deletions.
112 changes: 70 additions & 42 deletions DirtyCheck/auls_confirmclose.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,61 +89,67 @@ namespace fgo::dirty_check
}

//
// ダーティーフラグをチェックします。
// ダーティーな場合はtrueを返します。
// ダーティーフラグを更新します。
//
bool check()
void update()
{
if (*g_undo_id_ptr == g_undo_id_prev) return false;
g_undo_id_prev = *g_undo_id_ptr;
g_dirty_flag = true;
return true;
// 現在のアンドゥIDと前回のアンドゥIDが異なる場合は
if (!g_dirty_flag && *g_undo_id_ptr != g_undo_id_prev)
g_dirty_flag = true; // ダーティーフラグをセットします。
}

//
// ダーティーフラグを初期値に戻します。
//
void clear()
{
g_undo_id_prev = 0;
g_undo_id_prev = *g_undo_id_ptr;
g_dirty_flag = false;
}
} dirty_flag;

inline struct AviUtlWindow
inline struct AviUtlWindow : Tools::Window
{
HWND hwnd = 0;
WNDPROC orig = 0;

//
// AviUtlウィンドウのウィンドウプロシージャをフックします
// 初期化を行います
//
static LRESULT CALLBACK hook(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
BOOL init(AviUtl::FilterPlugin* fp)
{
if (dirty_flag.is_trigger_message(msg, wp)) {
int id = MessageBoxA(hwnd, "変更された編集データがあります。保存しますか?",
FILTER_NAME, MB_YESNOCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1);
if (id == IDYES) {
SendMessage(hwnd, WM_COMMAND, 1024, 0); // 編集プロジェクトの上書き
if (dirty_flag.get()) return 0; // 保存がキャンセルされたら終了しない
}
else if (id == IDCANCEL) return 0;
}
return CallWindowProc(aviutl_window.orig, hwnd, msg, wp, lp);
// AviUtlウィンドウをサブクラス化します。
return subclass(fp->hwnd_parent);
}

//
// 初期化処理を行います
// AviUtlウィンドウのウィンドウプロシージャをフックします
//
BOOL init(AviUtl::FilterPlugin* fp)
LRESULT onWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) override
{
// AviUtlウィンドウを取得します。
hwnd = GetWindow(fp->hwnd, GW_OWNER);
// 終了確認のトリガーかチェックします。
if (dirty_flag.is_trigger_message(message, wParam))
{
// メッセージボックスを表示します。
int id = ::MessageBoxA(hwnd, "変更された編集データがあります。保存しますか?",
FILTER_NAME, MB_YESNOCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1);

// AviUtlウィンドウをサブクラス化します。
orig = (WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG)hook);
// ユーザーが「はい」を選択した場合は
if (id == IDYES)
{
// 編集プロジェクトの上書き保存を試みます。
::SendMessage(hwnd, WM_COMMAND, 1024, 0);

return TRUE;
// 保存がキャンセルされた場合は
if (dirty_flag.get())
return 0; // デフォルト処理をスキップします。
}
// ユーザーが「キャンセル」を選択した場合は
else if (id == IDCANCEL)
{
// デフォルト処理をスキップします。
return 0;
}
}

return __super::onWndProc(hwnd, message, wParam, lParam);
}
} aviutl_window;

Expand All @@ -160,35 +166,57 @@ namespace fgo::dirty_check
return TRUE;
}

BOOL func_wndproc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, AviUtl::EditHandle* editp, AviUtl::FilterPlugin* fp)
BOOL func_wndproc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, AviUtl::EditHandle* editp, AviUtl::FilterPlugin* fp)
{
switch (msg) {
switch (message)
{
case AviUtl::FilterPlugin::WindowMessage::Update:
if (!fp->exfunc->is_editing(editp)) break;
// プロジェクトが変更されたかもしれないのでダーティーフラグをチェックします。
dirty_flag.check();
break;
{
if (!fp->exfunc->is_editing(editp)) break;

// プロジェクトが変更されたかもしれないのでダーティーフラグを更新します。
dirty_flag.update();

break;
}
case AviUtl::FilterPlugin::WindowMessage::FileClose:
// プロジェクトが閉じられたのでダーティーフラグをクリアします。
dirty_flag.clear();
break;
{
// プロジェクトが閉じられたのでダーティーフラグをクリアします。
dirty_flag.clear();

break;
}
}

return FALSE;
}

BOOL func_project_save(AviUtl::FilterPlugin* fp, AviUtl::EditHandle* editp, void*, int*)
{
// プロジェクトが保存されたのでダーティーフラグをクリアします。
dirty_flag.clear();

// フラグをクリアしてもタイトルは変わらないので手動で元に戻します。
char title[MAX_PATH] = {};
::GetWindowTextA(fp->hwnd_parent, title, std::size(title));
if (title[0] == '*' && title[1] == ' ')
::SetWindowTextA(fp->hwnd_parent, title + 2);

return FALSE;
}

BOOL func_modify_title(AviUtl::FilterPlugin* fp, AviUtl::EditHandle* editp, int frame, LPSTR title, int max_title)
{
// プロジェクトが変更されたかもしれないのでダーティーフラグをチェックします。
if (!dirty_flag.check()) return FALSE;
// プロジェクトが変更されたかもしれないのでダーティーフラグを更新します。
dirty_flag.update();

// ダーティーフラグが立っていない場合は何もしません。
if (!dirty_flag.get()) return FALSE;

// タイトルにダーティーマークを付けます。
std::string str(title);
sprintf_s(title, max_title, "* %s", str.c_str());

return TRUE;
}
}

0 comments on commit 4a464f1

Please sign in to comment.