summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2022-09-10 08:12:16 -0700
committerGeorge Hazan <ghazan@miranda.im>2022-09-10 08:12:16 -0700
commit42dfc34b0a700db3206ca4850af5a517f318a54c (patch)
treef8b3282e703eb980f7c18d6f4be02133316e6c4d
parenta929d4c862a60c9abc1b6e9fe507831326f232dc (diff)
fixes #3178 (StdUserInfo: page tree isn't rebuilt when info changes)
-rw-r--r--protocols/JabberG/src/jabber_userinfo.cpp45
-rw-r--r--src/core/stduserinfo/src/userinfo.cpp47
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);