From 68827c97e131401e97ff772167acf9ab80fe8ef4 Mon Sep 17 00:00:00 2001
From: George Hazan <ghazan@miranda.im>
Date: Thu, 10 Feb 2022 22:33:57 +0300
Subject: two extensions for CCtrlTreeOpts for memory variables

---
 src/mir_core/src/Windows/CCtrlTreeOpts.cpp | 53 ++++++++++++++++++++++++++++--
 src/mir_core/src/mir_core.def              |  1 +
 src/mir_core/src/mir_core64.def            |  1 +
 3 files changed, 52 insertions(+), 3 deletions(-)

(limited to 'src/mir_core')

diff --git a/src/mir_core/src/Windows/CCtrlTreeOpts.cpp b/src/mir_core/src/Windows/CCtrlTreeOpts.cpp
index f5fe27a854..13a6b79bd3 100644
--- a/src/mir_core/src/Windows/CCtrlTreeOpts.cpp
+++ b/src/mir_core/src/Windows/CCtrlTreeOpts.cpp
@@ -36,7 +36,24 @@ CCtrlTreeOpts::~CCtrlTreeOpts()
 
 void CCtrlTreeOpts::AddOption(const wchar_t *pwszSection, const wchar_t *pwszName, CMOption<bool> &option)
 {
-	m_options.insert(new COptionsItem(pwszSection, pwszName, option), m_options.getCount());
+	auto *p = new COptionsItem(pwszSection, pwszName, COptionsItem::CMOPTION);
+	p->m_option = &option;
+	m_options.insert(p, m_options.getCount());
+}
+
+void CCtrlTreeOpts::AddOption(const wchar_t *pwszSection, const wchar_t *pwszName, bool &option)
+{
+	auto *p = new COptionsItem(pwszSection, pwszName, COptionsItem::BOOL);
+	p->m_pBool = &option;
+	m_options.insert(p, m_options.getCount());
+}
+
+void CCtrlTreeOpts::AddOption(const wchar_t *pwszSection, const wchar_t *pwszName, uint32_t &option, uint32_t mask)
+{
+	auto *p = new COptionsItem(pwszSection, pwszName, COptionsItem::MASK);
+	p->m_pDword = &option;
+	p->m_mask = mask;
+	m_options.insert(p, m_options.getCount());
 }
 
 BOOL CCtrlTreeOpts::OnNotify(int idCtrl, NMHDR *pnmh)
@@ -104,6 +121,21 @@ void CCtrlTreeOpts::OnInit()
 				hSection = InsertItem(&tvis);
 			}
 
+			bool bValue;
+			switch (it->m_type) {
+			case COptionsItem::CMOPTION:
+				bValue = *it->m_option;
+				break;
+			case COptionsItem::BOOL:
+				bValue = *it->m_pBool;
+				break;
+			case COptionsItem::MASK:
+				bValue = (*it->m_pDword & it->m_mask) != 0;
+				break;
+			default:
+				continue;
+			}
+
 			TVINSERTSTRUCT tvis = {};
 			tvis.hParent = hSection;
 			tvis.hInsertAfter = TVI_LAST;
@@ -111,7 +143,7 @@ void CCtrlTreeOpts::OnInit()
 			tvis.item.pszText = (LPWSTR)it->m_pwszName;
 			tvis.item.state = tvis.item.stateMask = TVIS_EXPANDED;
 			tvis.item.lParam = m_options.indexOf(&it);
-			tvis.item.iImage = tvis.item.iSelectedImage = (*it->m_option) ? IMG_CHECK : IMG_NOCHECK;
+			tvis.item.iImage = tvis.item.iSelectedImage = (bValue) ? IMG_CHECK : IMG_NOCHECK;
 
 			it->m_hItem = InsertItem(&tvis);
 		}
@@ -134,7 +166,22 @@ bool CCtrlTreeOpts::OnApply()
 	for (auto &it : m_options) {
 		TVITEMEX tvi;
 		GetItem(it->m_hItem, &tvi);
-		*it->m_option = (tvi.iImage == IMG_CHECK) ? 1 : 0;
+		
+		bool bValue = (tvi.iImage == IMG_CHECK);
+		switch (it->m_type) {
+		case COptionsItem::CMOPTION:
+			*it->m_option = bValue;
+			break;
+		case COptionsItem::BOOL:
+			*it->m_pBool = bValue;
+			break;
+		case COptionsItem::MASK:
+			if (bValue)
+				*it->m_pDword |= it->m_mask;
+			else
+				*it->m_pDword &= ~it->m_mask;
+			break;
+		}
 	}
 	return true;
 }
diff --git a/src/mir_core/src/mir_core.def b/src/mir_core/src/mir_core.def
index 70f0dcd951..bcfad9a713 100644
--- a/src/mir_core/src/mir_core.def
+++ b/src/mir_core/src/mir_core.def
@@ -1513,3 +1513,4 @@ TimeZone_GetSystemTime @1692
 ?QueryAttribute@XMLElement@tinyxml2@@QBE?AW4XMLError@2@PBDPAPBD@Z @1735 NONAME
 db_copy_module @1736
 ?db_is_module_empty@@YG_NIPBD@Z @1737 NONAME
+?AddOption@CCtrlTreeOpts@@QAEXPB_W0AA_N@Z @1738 NONAME
diff --git a/src/mir_core/src/mir_core64.def b/src/mir_core/src/mir_core64.def
index 0fd20a620b..030e27b5c1 100644
--- a/src/mir_core/src/mir_core64.def
+++ b/src/mir_core/src/mir_core64.def
@@ -1513,3 +1513,4 @@ TimeZone_GetSystemTime @1692
 ?QueryAttribute@XMLElement@tinyxml2@@QEBA?AW4XMLError@2@PEBDPEAPEBD@Z @1735 NONAME
 db_copy_module @1736
 ?db_is_module_empty@@YA_NIPEBD@Z @1737 NONAME
+?AddOption@CCtrlTreeOpts@@QEAAXPEB_W0AEA_N@Z @1738 NONAME
-- 
cgit v1.2.3