diff options
author | George Hazan <ghazan@miranda.im> | 2022-09-10 08:12:16 -0700 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2022-09-10 08:12:16 -0700 |
commit | 42dfc34b0a700db3206ca4850af5a517f318a54c (patch) | |
tree | f8b3282e703eb980f7c18d6f4be02133316e6c4d | |
parent | a929d4c862a60c9abc1b6e9fe507831326f232dc (diff) |
fixes #3178 (StdUserInfo: page tree isn't rebuilt when info changes)
-rw-r--r-- | protocols/JabberG/src/jabber_userinfo.cpp | 45 | ||||
-rw-r--r-- | src/core/stduserinfo/src/userinfo.cpp | 47 |
2 files changed, 62 insertions, 30 deletions
diff --git a/protocols/JabberG/src/jabber_userinfo.cpp b/protocols/JabberG/src/jabber_userinfo.cpp index 46e52abc77..fc7ddf22c7 100644 --- a/protocols/JabberG/src/jabber_userinfo.cpp +++ b/protocols/JabberG/src/jabber_userinfo.cpp @@ -33,6 +33,28 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. static MWindowList hUserInfoList = nullptr; +class JabberBaseUserInfoDlg : public CUserInfoPageDlg +{ + INT_PTR DoRefresh(UINT, WPARAM, LPARAM) + { + OnRefresh(); + return 0; + } + +protected: + UI_MESSAGE_MAP(JabberBaseUserInfoDlg, CUserInfoPageDlg); + UI_MESSAGE(WM_PROTO_REFRESH, DoRefresh); + UI_MESSAGE(WM_JABBER_REFRESH_VCARD, DoRefresh); + UI_MESSAGE_MAP_END(); + + CJabberProto *ppro; + + JabberBaseUserInfoDlg(CJabberProto *_ppro, int dlgId) : + CUserInfoPageDlg(g_plugin, dlgId), + ppro(_ppro) + {} +}; + ///////////////////////////////////////////////////////////////////////////////////////// // JabberUserInfoDlgProc - main user info dialog @@ -69,15 +91,14 @@ __forceinline uint32_t sttInfoLineId(uint32_t res, uint32_t type, uint32_t line (line) & 0x00000fff; } -class JabberUserInfoDlg : public CUserInfoPageDlg +class JabberUserInfoDlg : public JabberBaseUserInfoDlg { - CJabberProto *ppro; JABBER_LIST_ITEM *item = nullptr; int resourcesCount = -1; CCtrlTreeView m_tree; - UI_MESSAGE_MAP(JabberUserInfoDlg, CUserInfoPageDlg); + UI_MESSAGE_MAP(JabberUserInfoDlg, JabberBaseUserInfoDlg); UI_MESSAGE(WM_PROTO_CHECK_ONLINE, OnCheckOnline); UI_MESSAGE_MAP_END(); @@ -379,8 +400,7 @@ class JabberUserInfoDlg : public CUserInfoPageDlg public: JabberUserInfoDlg(CJabberProto *_ppro) : - CUserInfoPageDlg(g_plugin, IDD_INFO_JABBER), - ppro(_ppro), + JabberBaseUserInfoDlg(_ppro, IDD_INFO_JABBER), m_tree(this, IDC_TV_INFO) { m_tree.OnBuildMenu = Callback(this, &JabberUserInfoDlg::onMenu_Tree); @@ -500,14 +520,13 @@ public: ///////////////////////////////////////////////////////////////////////////////////////// // JabberUserPhotoDlgProc - Jabber photo dialog -class JabberUserPhotoDlg : public CUserInfoPageDlg +class JabberUserPhotoDlg : public JabberBaseUserInfoDlg { HBITMAP hBitmap = nullptr; - CJabberProto *ppro; CCtrlButton btnSave; - UI_MESSAGE_MAP(JabberUserInfoDlg, CUserInfoPageDlg); + UI_MESSAGE_MAP(JabberUserInfoDlg, JabberBaseUserInfoDlg); UI_MESSAGE(WM_PAINT, OnPaint); UI_MESSAGE_MAP_END(); @@ -527,8 +546,7 @@ class JabberUserPhotoDlg : public CUserInfoPageDlg public: JabberUserPhotoDlg(CJabberProto *_ppro) : - CUserInfoPageDlg(g_plugin, IDD_VCARD_PHOTO), - ppro(_ppro), + JabberBaseUserInfoDlg(_ppro, IDD_VCARD_PHOTO), btnSave(this, IDC_SAVE) { btnSave.OnClick = Callback(this, &JabberUserPhotoDlg::onClick_Save); @@ -720,10 +738,8 @@ static int EnumOmemoSessions(const char *szSetting, void *param) return 0; } -class JabberUserOmemoDlg : public CUserInfoPageDlg +class JabberUserOmemoDlg : public JabberBaseUserInfoDlg { - CJabberProto *ppro; - CCtrlListView m_list; void AddListItem(const CMStringA &pszStr1, const wchar_t *pszStr2, const CMStringA &pszStr3) @@ -742,8 +758,7 @@ class JabberUserOmemoDlg : public CUserInfoPageDlg public: JabberUserOmemoDlg(CJabberProto *_ppro) : - CUserInfoPageDlg(g_plugin, IDD_INFO_OMEMO), - ppro(_ppro), + JabberBaseUserInfoDlg(_ppro, IDD_INFO_OMEMO), m_list(this, IDC_LIST) { } diff --git a/src/core/stduserinfo/src/userinfo.cpp b/src/core/stduserinfo/src/userinfo.cpp index bd81ec66d7..9448d5c96f 100644 --- a/src/core/stduserinfo/src/userinfo.cpp +++ b/src/core/stduserinfo/src/userinfo.cpp @@ -176,6 +176,15 @@ class CUserInfoDlg : public CDlgBase void BuildTree()
{
+ m_tree.SendMsg(WM_SETREDRAW, FALSE, 0);
+
+ if (m_pCurrent) {
+ SaveLocation();
+ m_tree.DeleteAllItems();
+ m_pages.destroy();
+ m_pCurrent = nullptr;
+ }
+
if (m_imageList)
ImageList_Destroy(m_imageList);
m_imageList = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 2, 1);
@@ -201,6 +210,10 @@ class CUserInfoDlg : public CDlgBase }
}
}
+
+ m_tree.SendMsg(WM_SETREDRAW, TRUE, 0);
+ m_tree.SelectItem(m_pCurrent->hItem);
+ SetFocus(m_tree.GetHwnd());
}
void CheckOnline()
@@ -246,6 +259,20 @@ class CUserInfoDlg : public CDlgBase SetWindowPos(m_pCurrent->hwnd, HWND_TOP, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, 0);
}
+ void SaveLocation()
+ {
+ if (m_pCurrent) {
+ wchar_t name[128];
+ TVITEMEX tvi;
+ tvi.mask = TVIF_TEXT;
+ tvi.hItem = m_pCurrent->hItem;
+ tvi.pszText = name;
+ tvi.cchTextMax = _countof(name);
+ m_tree.GetItem(&tvi);
+ g_plugin.setWString("LastTab", name);
+ }
+ }
+
CCtrlBase m_place;
CCtrlButton btnUpdate;
CCtrlTreeView m_tree;
@@ -295,10 +322,6 @@ public: BuildTree();
//////////////////////////////////////////////////////////////////////
-
- m_tree.SelectItem(m_pCurrent->hItem);
-
- //////////////////////////////////////////////////////////////////////
m_updateAnimFrame = 0;
GetDlgItemText(m_hwnd, IDC_UPDATING, m_szUpdating, _countof(m_szUpdating));
CheckOnline();
@@ -308,7 +331,6 @@ public: }
else ShowWindow(GetDlgItem(m_hwnd, IDC_UPDATING), SW_HIDE);
- SetFocus(m_tree.GetHwnd());
return true;
}
@@ -362,16 +384,7 @@ public: void OnDestroy() override
{
- if (m_pCurrent) {
- wchar_t name[128];
- TVITEMEX tvi;
- tvi.mask = TVIF_TEXT;
- tvi.hItem = m_pCurrent->hItem;
- tvi.pszText = name;
- tvi.cchTextMax = _countof(name);
- m_tree.GetItem(&tvi);
- g_plugin.setWString("LastTab", name);
- }
+ SaveLocation();
if (m_imageList)
ImageList_Destroy(m_imageList);
@@ -441,7 +454,11 @@ public: if (ack->hContact != m_hContact && !(m_bIsMeta && db_mc_getMeta(ack->hContact) == m_hContact))
break;
+ if (ack->result == ACKRESULT_SUCCESS)
+ BuildTree();
+
SendMessage(m_hwnd, PSM_FORCECHANGED, 0, 0);
+
/* if they're not gonna send any more ACK's don't let that mean we should crash */
if (!ack->hProcess && !ack->lParam) {
ShowWindow(GetDlgItem(m_hwnd, IDC_UPDATING), SW_HIDE);
|