From a6bb80933c2984cf9a703e6dae6f1f18851c19b6 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Mon, 19 Jun 2023 13:50:44 +0300 Subject: UM_FindUserFromIndex: another major useless crutch died --- src/core/stdmsg/src/chat_window.cpp | 9 ------- src/core/stdmsg/src/msgs.h | 1 - src/mir_app/src/chat.h | 1 - src/mir_app/src/chat_manager.cpp | 15 ------------ src/mir_app/src/mir_app.def | 2 +- src/mir_app/src/mir_app64.def | 2 +- src/mir_app/src/srmm_base.cpp | 47 +++++++++++++++++++++++++++---------- 7 files changed, 37 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/src/core/stdmsg/src/chat_window.cpp b/src/core/stdmsg/src/chat_window.cpp index c78e3d1d0e..5513da517d 100644 --- a/src/core/stdmsg/src/chat_window.cpp +++ b/src/core/stdmsg/src/chat_window.cpp @@ -50,15 +50,6 @@ void CMsgDialog::UpdateFilterButton() m_btnNickList.SendMsg(BM_SETIMAGE, IMAGE_ICON, (LPARAM)g_plugin.getIcon(m_bNicklistEnabled ? IDI_NICKLIST : IDI_NICKLIST2, FALSE)); } -void CMsgDialog::UpdateNickList() -{ - int i = m_nickList.SendMsg(LB_GETTOPINDEX, 0, 0); - m_nickList.SendMsg(LB_SETCOUNT, m_si->getUserList().getCount(), 0); - m_nickList.SendMsg(LB_SETTOPINDEX, i, 0); - - UpdateTitle(); -} - void CMsgDialog::UpdateOptions() { UpdateFilterButton(); diff --git a/src/core/stdmsg/src/msgs.h b/src/core/stdmsg/src/msgs.h index edad576c2e..79140be1b0 100644 --- a/src/core/stdmsg/src/msgs.h +++ b/src/core/stdmsg/src/msgs.h @@ -146,7 +146,6 @@ public: void SetStatusText(const wchar_t *, HICON) override; void ShowFilterMenu() override; void UpdateFilterButton() override; - void UpdateNickList() override; void UpdateOptions() override; void UpdateStatusBar() override; void UpdateTitle() override; diff --git a/src/mir_app/src/chat.h b/src/mir_app/src/chat.h index 1c50e3ac4a..d1082c802e 100644 --- a/src/mir_app/src/chat.h +++ b/src/mir_app/src/chat.h @@ -87,7 +87,6 @@ STATUSINFO* TM_AddStatus(STATUSINFO **ppStatusList, const wchar_t *pszStatus, uint16_t TM_StringToWord(STATUSINFO *pStatusList, const wchar_t *pszStatus); USERINFO* UM_AddUser(SESSION_INFO *si, const wchar_t *pszUID, const wchar_t *pszNick, uint16_t wStatus); -USERINFO* UM_FindUserFromIndex(SESSION_INFO *si, int index); BOOL UM_RemoveAll(SESSION_INFO *si); BOOL UM_SetStatusEx(SESSION_INFO *si, const wchar_t* pszText, int flags); void UM_SortKeys(SESSION_INFO *si); diff --git a/src/mir_app/src/chat_manager.cpp b/src/mir_app/src/chat_manager.cpp index f8ceb299cf..0474d942bb 100644 --- a/src/mir_app/src/chat_manager.cpp +++ b/src/mir_app/src/chat_manager.cpp @@ -651,20 +651,6 @@ static int UM_CompareItem(const USERINFO *u1, const USERINFO *u2) return mir_wstrcmpi(u1->pszNick, u2->pszNick); } -USERINFO* UM_FindUserFromIndex(SESSION_INFO *si, int index) -{ - if (!si) - return nullptr; - - int i = 0; - for (auto &ui : si->getUserList()) { - if (i == index) - return ui; - i++; - } - return nullptr; -} - static USERINFO* UM_GiveStatus(SESSION_INFO *si, const wchar_t *pszUID, uint16_t status) { USERINFO *ui = UM_FindUser(si, pszUID); @@ -794,7 +780,6 @@ static void ResetApi() g_chatApi.UM_AddUser = ::UM_AddUser; g_chatApi.UM_CompareItem = ::UM_CompareItem; g_chatApi.UM_FindUser = ::UM_FindUser; - g_chatApi.UM_FindUserFromIndex = ::UM_FindUserFromIndex; g_chatApi.UM_GiveStatus = ::UM_GiveStatus; g_chatApi.UM_SetContactStatus = ::UM_SetContactStatus; g_chatApi.UM_TakeStatus = ::UM_TakeStatus; diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index 0f02928081..161aad88ce 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -327,7 +327,7 @@ Chat_UpdateOptions @418 NONAME ?ShowFilterMenu@CSrmmBaseDialog@@UAEXXZ @422 NONAME ?OnInitDialog@CSrmmBaseDialog@@MAE_NXZ @423 NONAME ?AddLog@CSrmmBaseDialog@@UAEXABULOGINFO@@@Z @425 NONAME -?UpdateNickList@CSrmmBaseDialog@@UAEXXZ @428 NONAME +?UpdateNickList@CSrmmBaseDialog@@QAEXXZ @426 NONAME ?onClick_BIU@CSrmmBaseDialog@@IAEXPAVCCtrlButton@@@Z @430 NONAME ?onClick_BkColor@CSrmmBaseDialog@@IAEXPAVCCtrlButton@@@Z @431 NONAME ?onClick_Color@CSrmmBaseDialog@@IAEXPAVCCtrlButton@@@Z @432 NONAME diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index 9fe2e92c6a..55a7147c2c 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -327,7 +327,7 @@ Chat_UpdateOptions @418 NONAME ?ShowFilterMenu@CSrmmBaseDialog@@UEAAXXZ @422 NONAME ?OnInitDialog@CSrmmBaseDialog@@MEAA_NXZ @423 NONAME ?AddLog@CSrmmBaseDialog@@UEAAXAEBULOGINFO@@@Z @425 NONAME -?UpdateNickList@CSrmmBaseDialog@@UEAAXXZ @428 NONAME +?UpdateNickList@CSrmmBaseDialog@@QEAAXXZ @426 NONAME ?onClick_BIU@CSrmmBaseDialog@@IEAAXPEAVCCtrlButton@@@Z @430 NONAME ?onClick_BkColor@CSrmmBaseDialog@@IEAAXPEAVCCtrlButton@@@Z @431 NONAME ?onClick_Color@CSrmmBaseDialog@@IEAAXPEAVCCtrlButton@@@Z @432 NONAME diff --git a/src/mir_app/src/srmm_base.cpp b/src/mir_app/src/srmm_base.cpp index 99eea7065d..e2a0912349 100644 --- a/src/mir_app/src/srmm_base.cpp +++ b/src/mir_app/src/srmm_base.cpp @@ -239,7 +239,7 @@ LRESULT CSrmmBaseDialog::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) // process mouse - hovering for the nickname list.fires events so the protocol can // show the userinfo - tooltip. -static void ProcessNickListHovering(HWND hwnd, int hoveredItem, SESSION_INFO *parentdat) +static void ProcessNickListHovering(const CCtrlListBox &listBox, int hoveredItem, SESSION_INFO *parentdat) { static int currentHovered = -1; static HWND hwndToolTip = nullptr; @@ -250,6 +250,7 @@ static void ProcessNickListHovering(HWND hwnd, int hoveredItem, SESSION_INFO *pa currentHovered = hoveredItem; + MWindow hwnd = listBox.GetHwnd(); if (oldParent != hwnd && hwndToolTip) { SendMessage(hwndToolTip, TTM_DELTOOL, 0, 0); DestroyWindow(hwndToolTip); @@ -281,9 +282,7 @@ static void ProcessNickListHovering(HWND hwnd, int hoveredItem, SESSION_INFO *pa ti.rect = clientRect; CMStringW wszBuf; - - USERINFO *ui1 = g_chatApi.UM_FindUserFromIndex(parentdat, currentHovered); - if (ui1) { + if (auto *ui1 = (USERINFO *)listBox.GetItemData(currentHovered)) { if (ProtoServiceExists(parentdat->pszModule, MS_GC_PROTO_GETTOOLTIPTEXT)) { wchar_t *p = (wchar_t*)CallProtoService(parentdat->pszModule, MS_GC_PROTO_GETTOOLTIPTEXT, (WPARAM)parentdat->ptszID, (LPARAM)ui1->pszUID); if (p != nullptr) { @@ -323,8 +322,7 @@ static void CALLBACK ChatTimerProc(HWND hwnd, UINT, UINT_PTR idEvent, DWORD) return; } - USERINFO *ui1 = g_chatApi.UM_FindUserFromIndex(si, si->currentHovered); - if (ui1) { + if (auto *ui1 = (USERINFO *)SendMessage(hwnd, LB_GETITEMDATA, 0, 0)) { CMStringW wszBuf; if (ProtoServiceExists(si->pszModule, MS_GC_PROTO_GETTOOLTIPTEXT)) { wchar_t *p = (wchar_t*)CallProtoService(si->pszModule, MS_GC_PROTO_GETTOOLTIPTEXT, (WPARAM)si->ptszID, (LPARAM)ui1->pszUID); @@ -406,7 +404,7 @@ LRESULT CSrmmBaseDialog::WndProc_Nicklist(UINT msg, WPARAM wParam, LPARAM lParam if (nItemUnderMouse != -1) SetTimer(m_nickList.GetHwnd(), (UINT_PTR)m_si, 450, ChatTimerProc); } - else ProcessNickListHovering(m_nickList.GetHwnd(), (int)nItemUnderMouse, m_si); + else ProcessNickListHovering(m_nickList, (int)nItemUnderMouse, m_si); } else { if (bTooltipExists) { @@ -416,7 +414,7 @@ LRESULT CSrmmBaseDialog::WndProc_Nicklist(UINT msg, WPARAM wParam, LPARAM lParam m_si->bHasToolTip = false; } } - else ProcessNickListHovering(m_nickList.GetHwnd(), -1, nullptr); + else ProcessNickListHovering(m_nickList, -1, nullptr); } } break; @@ -466,7 +464,7 @@ LRESULT CSrmmBaseDialog::WndProc_Nicklist(UINT msg, WPARAM wParam, LPARAM lParam if (HIWORD(item) != 0) // clicked outside the client area break; - if (USERINFO *ui = g_chatApi.UM_FindUserFromIndex(m_si, item)) { + if (auto *ui = (USERINFO *)m_nickList.GetItemData(item)) { if (pt.x == -1 && pt.y == -1) pt.y += height - 4; ClientToScreen(m_nickList.GetHwnd(), &pt); @@ -476,6 +474,15 @@ LRESULT CSrmmBaseDialog::WndProc_Nicklist(UINT msg, WPARAM wParam, LPARAM lParam } } break; + + case WM_KEYDOWN: + if (wParam == VK_RETURN) { + int index = m_nickList.GetCurSel(); + if (index != LB_ERR) + if (auto *ui = (USERINFO *)m_nickList.GetItemData(index)) + Chat_DoEventHook(m_si, GC_USER_PRIVMESS, ui, nullptr, 0); + } + break; } return mir_callNextSubclass(m_nickList.GetHwnd(), stubNicklistProc, msg, wParam, lParam); @@ -557,8 +564,7 @@ INT_PTR CSrmmBaseDialog::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) { DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lParam; if (dis->CtlID == IDC_SRMM_NICKLIST) { - USERINFO *ui = UM_FindUserFromIndex(m_si, dis->itemID); - if (ui != nullptr) + if (auto *ui = (USERINFO *)m_nickList.GetItemData(dis->itemID)) DrawNickList(ui, dis); return TRUE; } @@ -669,6 +675,23 @@ void CSrmmBaseDialog::UpdateFilterButton() m_btnFilter.SendMsg(BUTTONADDTOOLTIP, (WPARAM)(m_bFilterEnabled ? TranslateT("Disable the event filter (Ctrl+F)") : TranslateT("Enable the event filter (Ctrl+F)")), BATF_UNICODE); } +void CSrmmBaseDialog::UpdateNickList() +{ + int idx = m_nickList.SendMsg(LB_GETTOPINDEX, 0, 0); + + m_nickList.SetDraw(false); + m_nickList.ResetContent(); + for (auto &ui : m_si->getUserList()) + m_nickList.AddString(ui->pszNick, LPARAM(ui)); + + m_nickList.SendMsg(LB_SETTOPINDEX, idx, 0); + m_nickList.SetDraw(true); + InvalidateRect(m_nickList.GetHwnd(), nullptr, FALSE); + UpdateWindow(m_nickList.GetHwnd()); + + UpdateTitle(); +} + ///////////////////////////////////////////////////////////////////////////////////////// void CSrmmBaseDialog::onClick_Color(CCtrlButton *pButton) @@ -761,7 +784,7 @@ void CSrmmBaseDialog::onDblClick_List(CCtrlListBox *pList) ScreenToClient(pList->GetHwnd(), &hti.pt); int item = LOWORD(pList->SendMsg(LB_ITEMFROMPOINT, 0, MAKELPARAM(hti.pt.x, hti.pt.y))); - USERINFO *ui = UM_FindUserFromIndex(m_si, item); + auto *ui = (USERINFO *)m_nickList.GetItemData(item); if (ui == nullptr) return; -- cgit v1.2.3