diff options
author | George Hazan <george.hazan@gmail.com> | 2023-07-25 13:11:06 +0300 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2023-07-25 13:11:06 +0300 |
commit | 69581b8648e0c2fe96f454455763359ebeeba46a (patch) | |
tree | 524a4088b16ad99993b4ca9994ccc55b554c49db /src | |
parent | 1acef408decb2450ce8cea52b37674f1972b9f82 (diff) |
SRMM: automatic RTF log redraw on event's change/removal
Diffstat (limited to 'src')
-rw-r--r-- | src/core/stdmsg/src/msgs.h | 2 | ||||
-rw-r--r-- | src/mir_app/mir_app.vcxproj | 1 | ||||
-rw-r--r-- | src/mir_app/mir_app.vcxproj.filters | 3 | ||||
-rw-r--r-- | src/mir_app/src/srmm_base.cpp | 20 | ||||
-rw-r--r-- | src/mir_app/src/srmm_main.cpp | 122 | ||||
-rw-r--r-- | src/mir_app/src/srmm_statusicon.cpp | 85 | ||||
-rw-r--r-- | src/mir_app/src/srmm_util.cpp | 2 |
7 files changed, 150 insertions, 85 deletions
diff --git a/src/core/stdmsg/src/msgs.h b/src/core/stdmsg/src/msgs.h index 79140be1b0..51662e669d 100644 --- a/src/core/stdmsg/src/msgs.h +++ b/src/core/stdmsg/src/msgs.h @@ -96,7 +96,6 @@ public: LRESULT WndProc_Nicklist(UINT msg, WPARAM wParam, LPARAM lParam) override;
void OnActivate();
- void RemakeLog();
void UpdateAvatar();
void UserTyping(int nSecs);
@@ -143,6 +142,7 @@ public: bool GetFirstEvent() override;
bool IsActive() const override;
void LoadSettings() override;
+ void RemakeLog() override;
void SetStatusText(const wchar_t *, HICON) override;
void ShowFilterMenu() override;
void UpdateFilterButton() override;
diff --git a/src/mir_app/mir_app.vcxproj b/src/mir_app/mir_app.vcxproj index c0855b8ea5..fa8e33adfb 100644 --- a/src/mir_app/mir_app.vcxproj +++ b/src/mir_app/mir_app.vcxproj @@ -160,6 +160,7 @@ <ClCompile Include="src\srmm_log.cpp" />
<ClCompile Include="src\srmm_log_hpp.cpp" />
<ClCompile Include="src\srmm_log_rtf.cpp" />
+ <ClCompile Include="src\srmm_main.cpp" />
<ClCompile Include="src\srmm_statusicon.cpp" />
<ClCompile Include="src\srmm_toolbar.cpp" />
<ClCompile Include="src\srmm_util.cpp" />
diff --git a/src/mir_app/mir_app.vcxproj.filters b/src/mir_app/mir_app.vcxproj.filters index 69928a983f..bcc2243516 100644 --- a/src/mir_app/mir_app.vcxproj.filters +++ b/src/mir_app/mir_app.vcxproj.filters @@ -428,6 +428,9 @@ <ClCompile Include="src\fileutils.cpp">
<Filter>Source Files\File</Filter>
</ClCompile>
+ <ClCompile Include="src\srmm_main.cpp">
+ <Filter>Source Files\SRMM</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\filter.h">
diff --git a/src/mir_app/src/srmm_base.cpp b/src/mir_app/src/srmm_base.cpp index 1fe703958a..34f57f0b16 100644 --- a/src/mir_app/src/srmm_base.cpp +++ b/src/mir_app/src/srmm_base.cpp @@ -31,6 +31,7 @@ CSrmmBaseDialog::CSrmmBaseDialog(CMPluginBase &pPlugin, int idDialog, SESSION_IN timerFlash(this, 1),
timerType(this, 2),
timerNickList(this, 3),
+ timerRedraw(this, 4),
m_message(this, IDC_SRMM_MESSAGE),
m_nickList(this, IDC_SRMM_NICKLIST),
@@ -61,6 +62,8 @@ CSrmmBaseDialog::CSrmmBaseDialog(CMPluginBase &pPlugin, int idDialog, SESSION_IN m_nickList.OnDblClick = Callback(this, &CSrmmBaseDialog::onDblClick_List);
+ timerRedraw.OnEvent = Callback(this, &CSrmmBaseDialog::OnRedrawTimer);
+
if (si) {
m_hContact = si->hContact;
@@ -652,6 +655,23 @@ void CSrmmBaseDialog::RedrawLog() ClearLog();
}
+void CSrmmBaseDialog::OnRedrawTimer(CTimer *pTimer)
+{
+ pTimer->Stop();
+
+ if (isChat())
+ RedrawLog();
+ else
+ RemakeLog();
+}
+
+void CSrmmBaseDialog::ScheduleRedrawLog()
+{
+ timerRedraw.Start(100);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
void CSrmmBaseDialog::UpdateChatLog()
{
if (!m_si->pMI->bDatabase || m_si->bHistoryInit)
diff --git a/src/mir_app/src/srmm_main.cpp b/src/mir_app/src/srmm_main.cpp new file mode 100644 index 0000000000..9de2c1bdb0 --- /dev/null +++ b/src/mir_app/src/srmm_main.cpp @@ -0,0 +1,122 @@ +/* + +Copyright (C) 2012-23 Miranda NG team (https://miranda-ng.org) + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 +of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "stdafx.h" + +HCURSOR g_hCurHyperlinkHand; +HANDLE hHookIconsChanged, hHookIconPressedEvt, hHookSrmmEvent; + +static HANDLE hHookEmptyHistory; +static HGENMENU hmiEmpty; + +void LoadSrmmToolbarModule(); +void UnloadSrmmToolbarModule(); + +///////////////////////////////////////////////////////////////////////////////////////// +// Empty history service for main menu + +static INT_PTR svcEmptyHistory(WPARAM hContact, LPARAM lParam) +{ + if (NotifyEventHooks(hHookEmptyHistory)) + return 2; + + if (lParam == 0) + if (IDYES != MessageBoxW(nullptr, TranslateT("Are you sure to remove all events from history?"), L"Miranda", MB_YESNO | MB_ICONQUESTION)) + return 1; + + DB::ECPTR pCursor(DB::Events(hContact)); + while (pCursor.FetchNext()) + pCursor.DeleteEvent(); + return 0; +} + +static int OnPrebuildContactMenu(WPARAM hContact, LPARAM) +{ + Menu_ShowItem(hmiEmpty, db_event_first(hContact) != 0); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Built-in hook to redraw RTF-based event logs on event's change/deletion + +static int OnRedrawLog(WPARAM hContact, LPARAM) +{ + if (auto *pDlg = Srmm_FindDialog(hContact)) + pDlg->ScheduleRedrawLog(); + + if (db_mc_isSub(hContact)) + if (auto *pDlg = Srmm_FindDialog(db_mc_getMeta(hContact))) + pDlg->ScheduleRedrawLog(); + + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +void SrmmModulesLoaded() +{ + // menu item + CMenuItem mi(&g_plugin); + SET_UID(mi, 0x0d4306aa, 0xe31e, 0x46ee, 0x89, 0x88, 0x3a, 0x2e, 0x05, 0xa6, 0xf3, 0xbc); + mi.pszService = MS_HISTORY_EMPTY; + mi.name.a = LPGEN("Empty history"); + mi.position = 1000090001; + mi.hIcon = Skin_LoadIcon(SKINICON_OTHER_DELETE); + hmiEmpty = Menu_AddContactMenuItem(&mi); + + // create menu item in main menu for empty system history + SET_UID(mi, 0x633AD23C, 0x24B5, 0x4914, 0xB2, 0x40, 0xAD, 0x9F, 0xAC, 0xB5, 0x64, 0xED); + mi.position = 500060002; + mi.name.a = LPGEN("Empty system history"); + mi.pszService = MS_HISTORY_EMPTY; + mi.hIcon = Skin_LoadIcon(SKINICON_OTHER_DELETE); + Menu_AddMainMenuItem(&mi); + + HookEvent(ME_CLIST_PREBUILDCONTACTMENU, OnPrebuildContactMenu); +} + +///////////////////////////////////////////////////////////////////////////////////////// + +int LoadSrmmModule() +{ + g_hCurHyperlinkHand = LoadCursor(nullptr, IDC_HAND); + + LoadSrmmToolbarModule(); + + CreateServiceFunction(MS_HISTORY_EMPTY, svcEmptyHistory); + hHookEmptyHistory = CreateHookableEvent(ME_HISTORY_EMPTY); + + hHookSrmmEvent = CreateHookableEvent(ME_MSG_WINDOWEVENT); + hHookIconsChanged = CreateHookableEvent(ME_MSG_ICONSCHANGED); + hHookIconPressedEvt = CreateHookableEvent(ME_MSG_ICONPRESSED); + + HookEvent(ME_DB_EVENT_EDITED, OnRedrawLog); + HookEvent(ME_DB_EVENT_DELETED, OnRedrawLog); + return 0; +} + +void UnloadSrmmModule() +{ + DestroyHookableEvent(hHookIconsChanged); + DestroyHookableEvent(hHookSrmmEvent); + DestroyHookableEvent(hHookIconPressedEvt); + + DestroyCursor(g_hCurHyperlinkHand); + + UnloadSrmmToolbarModule(); +} diff --git a/src/mir_app/src/srmm_statusicon.cpp b/src/mir_app/src/srmm_statusicon.cpp index 94de15aa2f..508a9a4ba8 100644 --- a/src/mir_app/src/srmm_statusicon.cpp +++ b/src/mir_app/src/srmm_statusicon.cpp @@ -23,15 +23,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "stdafx.h"
-HCURSOR g_hCurHyperlinkHand;
-HANDLE hHookSrmmEvent;
-
-static HANDLE hHookIconsChanged, hHookIconPressedEvt, hHookEmptyHistory;
+extern HANDLE hHookIconsChanged, hHookIconPressedEvt, hHookEmptyHistory;
static mir_cs csIcons;
-void LoadSrmmToolbarModule();
-void UnloadSrmmToolbarModule();
-
void SafeDestroyIcon(HICON hIcon)
{
if (hIcon != nullptr)
@@ -265,80 +259,3 @@ void KillModuleSrmmIcons(CMPluginBase *pPlugin) if (it->pPlugin == pPlugin)
arIcons.removeItem(&it);
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static HGENMENU hmiEmpty;
-
-static INT_PTR svcEmptyHistory(WPARAM hContact, LPARAM lParam)
-{
- if (NotifyEventHooks(hHookEmptyHistory))
- return 2;
-
- if (lParam == 0)
- if (IDYES != MessageBoxW(nullptr, TranslateT("Are you sure to remove all events from history?"), L"Miranda", MB_YESNO | MB_ICONQUESTION))
- return 1;
-
- DB::ECPTR pCursor(DB::Events(hContact));
- while (pCursor.FetchNext())
- pCursor.DeleteEvent();
- return 0;
-}
-
-static int OnPrebuildContactMenu(WPARAM hContact, LPARAM)
-{
- Menu_ShowItem(hmiEmpty, db_event_first(hContact) != 0);
- return 0;
-}
-
-void SrmmModulesLoaded()
-{
- // menu item
- CMenuItem mi(&g_plugin);
- SET_UID(mi, 0x0d4306aa, 0xe31e, 0x46ee, 0x89, 0x88, 0x3a, 0x2e, 0x05, 0xa6, 0xf3, 0xbc);
- mi.pszService = MS_HISTORY_EMPTY;
- mi.name.a = LPGEN("Empty history");
- mi.position = 1000090001;
- mi.hIcon = Skin_LoadIcon(SKINICON_OTHER_DELETE);
- hmiEmpty = Menu_AddContactMenuItem(&mi);
-
- // create menu item in main menu for empty system history
- SET_UID(mi, 0x633AD23C, 0x24B5, 0x4914, 0xB2, 0x40, 0xAD, 0x9F, 0xAC, 0xB5, 0x64, 0xED);
- mi.position = 500060002;
- mi.name.a = LPGEN("Empty system history");
- mi.pszService = MS_HISTORY_EMPTY;
- mi.hIcon = Skin_LoadIcon(SKINICON_OTHER_DELETE);
- Menu_AddMainMenuItem(&mi);
-
- HookEvent(ME_CLIST_PREBUILDCONTACTMENU, OnPrebuildContactMenu);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-int LoadSrmmModule()
-{
- g_hCurHyperlinkHand = LoadCursor(nullptr, IDC_HAND);
-
- LoadSrmmToolbarModule();
-
- CreateServiceFunction(MS_HISTORY_EMPTY, svcEmptyHistory);
- hHookEmptyHistory = CreateHookableEvent(ME_HISTORY_EMPTY);
-
- hHookSrmmEvent = CreateHookableEvent(ME_MSG_WINDOWEVENT);
- hHookIconsChanged = CreateHookableEvent(ME_MSG_ICONSCHANGED);
- hHookIconPressedEvt = CreateHookableEvent(ME_MSG_ICONPRESSED);
- return 0;
-}
-
-void UnloadSrmmModule()
-{
- arIcons.destroy();
-
- DestroyHookableEvent(hHookIconsChanged);
- DestroyHookableEvent(hHookSrmmEvent);
- DestroyHookableEvent(hHookIconPressedEvt);
-
- DestroyCursor(g_hCurHyperlinkHand);
-
- UnloadSrmmToolbarModule();
-}
diff --git a/src/mir_app/src/srmm_util.cpp b/src/mir_app/src/srmm_util.cpp index bd2897bef1..955eafa6c0 100644 --- a/src/mir_app/src/srmm_util.cpp +++ b/src/mir_app/src/srmm_util.cpp @@ -120,6 +120,8 @@ void OFDTHREAD::Finish() dbv.pwszVal = wszPath.GetBuffer();
db_event_setJson(hDbEvent, "lf", &dbv);
+ NotifyEventHooks(g_hevEventEdited, db_event_getContact(hDbEvent), hDbEvent);
+
if (bOpen)
ShellExecuteW(nullptr, L"open", wszPath, nullptr, nullptr, SW_SHOWDEFAULT);
}
|