diff options
author | George Hazan <ghazan@miranda.im> | 2018-03-06 16:17:32 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2018-03-06 16:17:32 +0300 |
commit | 7071e88fdeeaa146c8e72894c6eae58f438f2690 (patch) | |
tree | 5befaa1f5dc66da5b1b907eb9894880b28f8b2ac /src | |
parent | 909c090503ce1021a69e7793c550b857ef025e77 (diff) |
PSN_WIZFINISH: new WM_NOTIFY event to be called when one of the options tabs is changed
Diffstat (limited to 'src')
-rw-r--r-- | src/mir_app/src/options.cpp | 35 | ||||
-rw-r--r-- | src/mir_core/src/CCtrlHyperlink.cpp | 2 | ||||
-rw-r--r-- | src/mir_core/src/CDlgBase.cpp | 13 |
3 files changed, 43 insertions, 7 deletions
diff --git a/src/mir_app/src/options.cpp b/src/mir_app/src/options.cpp index 62a549b9bc..a9fe26c40a 100644 --- a/src/mir_app/src/options.cpp +++ b/src/mir_app/src/options.cpp @@ -289,6 +289,16 @@ struct OptionsPageData : public MZeroedObject }
};
+static int CompareOPD(const OptionsPageData *p1, const OptionsPageData *p2)
+{
+ int res = mir_wstrcmp(p1->ptszGroup, p2->ptszGroup);
+ if (!res)
+ res = mir_wstrcmp(p1->ptszTitle, p2->ptszTitle);
+ if (!res)
+ res = mir_wstrcmp(p1->ptszTab, p2->ptszTab);
+ return res;
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
// Options dialog
@@ -812,13 +822,12 @@ public: virtual void OnApply() override
{
- PSHNOTIFY pshn;
m_btnApply.Disable();
SetFocus(m_pageTree.GetHwnd());
OptionsPageData *opd = getCurrent();
if (opd != nullptr) {
- pshn.hdr.idFrom = 0;
+ PSHNOTIFY pshn = {};
pshn.lParam = IDC_APPLY;
pshn.hdr.code = PSN_KILLACTIVE;
pshn.hdr.hwndFrom = opd->getHwnd();
@@ -826,10 +835,16 @@ public: return;
}
+ LIST<OptionsPageData> arChanged(10, CompareOPD);
+
+ PSHNOTIFY pshn = {};
pshn.hdr.code = PSN_APPLY;
for (int i = 0; i < m_arOpd.getCount(); i++) {
OptionsPageData *p = m_arOpd[i];
- if (p->getHwnd() == nullptr || !p->changed) continue;
+ if (p->getHwnd() == nullptr || !p->changed)
+ continue;
+
+ arChanged.insert(p);
p->changed = 0;
pshn.hdr.hwndFrom = p->getHwnd();
if (SendMessage(p->getHwnd(), WM_NOTIFY, 0, (LPARAM)&pshn) == PSNRET_INVALID_NOCHANGEPAGE) {
@@ -843,6 +858,20 @@ public: return;
}
}
+
+ pshn.hdr.code = PSN_WIZFINISH;
+ for (int i = 0; i < arChanged.getCount(); i++) {
+ OptionsPageData *p = arChanged[i];
+ if (p->ptszTab == nullptr)
+ continue;
+
+ // calculate last changed tab
+ OptionsPageData *p2 = arChanged[i+1];
+ if (p2 != nullptr && !mir_wstrcmp(p->ptszTitle, p2->ptszTitle) && !mir_wstrcmp(p->ptszGroup, p2->ptszGroup))
+ continue;
+
+ SendMessage(p->pDialog->GetHwnd(), WM_NOTIFY, 0, (LPARAM)&pshn);
+ }
}
void btnApply_Click(CCtrlButton*)
diff --git a/src/mir_core/src/CCtrlHyperlink.cpp b/src/mir_core/src/CCtrlHyperlink.cpp index fb0ab7f7ae..4b0499479d 100644 --- a/src/mir_core/src/CCtrlHyperlink.cpp +++ b/src/mir_core/src/CCtrlHyperlink.cpp @@ -32,7 +32,7 @@ CCtrlHyperlink::CCtrlHyperlink(CDlgBase* wnd, int idCtrl, const char* url) OnClick = Callback(this, &CCtrlHyperlink::Default_OnClick); } -BOOL CCtrlHyperlink::OnCommand(HWND, WORD, WORD idCode) +BOOL CCtrlHyperlink::OnCommand(HWND, WORD, WORD) { OnClick(this); return FALSE; diff --git a/src/mir_core/src/CDlgBase.cpp b/src/mir_core/src/CDlgBase.cpp index dc938f1fc4..3fb76249bc 100644 --- a/src/mir_core/src/CDlgBase.cpp +++ b/src/mir_core/src/CDlgBase.cpp @@ -247,7 +247,8 @@ INT_PTR CDlgBase::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) int idCtrl = wParam; NMHDR *pnmh = (NMHDR *)lParam; if (pnmh->idFrom == 0) { - if (pnmh->code == PSN_APPLY) { + switch (pnmh->code) { + case PSN_APPLY: if (LPPSHNOTIFY(lParam)->lParam != 3) // IDC_APPLY m_bExiting = true; @@ -255,10 +256,16 @@ INT_PTR CDlgBase::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) NotifyControls(&CCtrlBase::OnApply); if (m_lresult) OnApply(); - } - else if (pnmh->code == PSN_RESET) { + break; + + case PSN_RESET: NotifyControls(&CCtrlBase::OnReset); OnReset(); + break; + + case PSN_WIZFINISH: + m_OnFinishWizard(this); + break; } } |