From 1c937f6b2db4795df7eaa24347cd16d48f538c37 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 27 Apr 2023 16:49:10 +0300 Subject: Clist_modern: - fixes #3512 (Clist: "Hide empty groups" in "Setup view mode"); - fixes #3511 (Clist: "Show groups folded/unfolded" in "Setup view mode") --- plugins/Clist_modern/res/resource.rc | 44 +-- plugins/Clist_modern/src/modern_clc.cpp | 8 +- plugins/Clist_modern/src/modern_clist.h | 42 ++- plugins/Clist_modern/src/modern_clui.cpp | 11 +- plugins/Clist_modern/src/modern_global_structure.h | 22 +- plugins/Clist_modern/src/modern_viewmodebar.cpp | 403 +++++++++++---------- plugins/Clist_modern/src/resource.h | 6 +- 7 files changed, 298 insertions(+), 238 deletions(-) (limited to 'plugins/Clist_modern') diff --git a/plugins/Clist_modern/res/resource.rc b/plugins/Clist_modern/res/resource.rc index 397b1f2593..fca73ca0c9 100644 --- a/plugins/Clist_modern/res/resource.rc +++ b/plugins/Clist_modern/res/resource.rc @@ -167,33 +167,35 @@ STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD EXSTYLE WS_EX_CONTROLPARENT FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - GROUPBOX "Available view modes",IDC_STATIC,7,2,158,85 - LISTBOX IDC_VIEWMODES,10,12,123,71,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP,WS_EX_CLIENTEDGE + GROUPBOX "Available view modes",IDC_STATIC,7,2,158,52 GROUPBOX "Include protocols",IDC_STATIC,169,2,130,85 - CONTROL "",IDC_PROTOCOLS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,175,10,121,72 - CONTROL "",IDC_ADDVIEWMODE,"MButtonClass",WS_TABSTOP,140,22,18,16 - CONTROL "",IDC_RENAMEVIEWMODE,"MButtonClass",WS_TABSTOP,140,42,18,16 - CONTROL "",IDC_DELETEVIEWMODE,"MButtonClass",WS_TABSTOP,140,62,18,16 - GROUPBOX "Include groups",IDC_STATIC,6,87,159,89,0,WS_EX_TRANSPARENT - CONTROL "",IDC_GROUPS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,10,98,122,57 - CONTROL "Show contacts in groups",IDC_USEGROUPS,"Button",BS_AUTO3STATE | WS_TABSTOP,10,160,122,11 - GROUPBOX "Include status modes",IDC_STATIC,171,87,130,89,0,WS_EX_TRANSPARENT - CONTROL "",IDC_STATUSMODES,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,173,98,121,73 - LTEXT "Protocol",IDC_STATIC,31,187,49,12 - COMBOBOX IDC_PROTOGROUPOP,85,185,37,56,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - CTEXT "Group",IDC_STATIC,129,187,44,12 - COMBOBOX IDC_GROUPSTATUSOP,177,185,37,56,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "Status mode",IDC_STATIC,221,187,54,12 + CONTROL "",IDC_PROTOCOLS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,176,12,117,70 + CONTROL "",IDC_ADDVIEWMODE,"MButtonClass",WS_TABSTOP,43,32,18,16 + CONTROL "",IDC_RENAMEVIEWMODE,"MButtonClass",WS_TABSTOP,73,32,18,16 + CONTROL "",IDC_DELETEVIEWMODE,"MButtonClass",WS_TABSTOP,102,32,18,16 + GROUPBOX "Include groups",IDC_STATIC,6,54,159,121,0,WS_EX_TRANSPARENT + CONTROL "",IDC_GROUPS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,12,66,146,57 + CONTROL "Show contacts in groups",IDC_USEGROUPS,"Button",BS_AUTO3STATE | WS_TABSTOP,15,130,143,11 + CONTROL "Hide empty groups",IDC_HIDEEMPTYGROUPS,"Button",BS_AUTO3STATE | WS_TABSTOP,24,144,132,11 + CONTROL "Show groups folded",IDC_FOLD_GROUPS,"Button",BS_AUTO3STATE | WS_TABSTOP,24,158,132,11 + GROUPBOX "Include status modes",IDC_STATIC,169,87,130,89,0,WS_EX_TRANSPARENT + CONTROL "",IDC_STATUSMODES,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,176,98,117,73 + LTEXT "Protocol",IDC_STATIC,31,189,49,9 + COMBOBOX IDC_PROTOGROUPOP,85,187,37,56,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CTEXT "Group",IDC_STATIC,129,189,44,9 + COMBOBOX IDC_GROUPSTATUSOP,177,187,37,56,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + RTEXT "Status mode",IDC_STATIC,221,189,54,9 CONTROL "Automatically clear this view mode after",IDC_AUTOCLEAR, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,225,172,11 - EDITTEXT IDC_AUTOCLEARVAL,222,224,29,12,ES_AUTOHSCROLL - CONTROL "",IDC_AUTOCLEARSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,246,224,8,13 - LTEXT "seconds",IDC_STATIC,262,225,28,12 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,227,172,11 + EDITTEXT IDC_AUTOCLEARVAL,222,226,29,12,ES_AUTOHSCROLL + CONTROL "",IDC_AUTOCLEARSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,248,225,8,13 + LTEXT "seconds",IDC_STATIC,262,227,28,11 GROUPBOX "View mode options",IDC_STATIC,8,176,293,68 CONTROL "Last message",IDC_LASTMSG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,208,86,11 COMBOBOX IDC_LASTMESSAGEOP,106,208,81,56,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_LASTMSGVALUE,193,208,31,13,ES_AUTOHSCROLL + EDITTEXT IDC_LASTMSGVALUE,193,208,31,12,ES_AUTOHSCROLL COMBOBOX IDC_LASTMESSAGEUNIT,229,208,68,56,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_VIEWMODES,15,14,144,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP END IDD_OPT_VIEWMODES2 DIALOGEX 0, 0, 309, 244 diff --git a/plugins/Clist_modern/src/modern_clc.cpp b/plugins/Clist_modern/src/modern_clc.cpp index d89b70b541..2749972689 100644 --- a/plugins/Clist_modern/src/modern_clc.cpp +++ b/plugins/Clist_modern/src/modern_clc.cpp @@ -1643,10 +1643,12 @@ HRESULT ClcLoadModule() int ClcUnloadModule() { - if (g_CluiData.bOldUseGroups != (uint8_t)-1) + if (g_CluiData.bOldUseGroups != -1) Clist::UseGroups = g_CluiData.bOldUseGroups; - if (g_CluiData.boldHideOffline != (uint8_t)-1) - Clist::HideOffline = g_CluiData.boldHideOffline; + if (g_CluiData.bOldHideOffline != -1) + Clist::HideOffline = g_CluiData.bOldHideOffline; + if (g_CluiData.bOldHideEmptyGroups != -1) + Clist::HideEmptyGroups = g_CluiData.bOldHideEmptyGroups; return 0; } diff --git a/plugins/Clist_modern/src/modern_clist.h b/plugins/Clist_modern/src/modern_clist.h index 79d9ca48cf..c04ab2562b 100644 --- a/plugins/Clist_modern/src/modern_clist.h +++ b/plugins/Clist_modern/src/modern_clist.h @@ -101,24 +101,30 @@ struct ClcCacheEntry : public ClcCacheEntryBase /////////////////////////////////////////////////////////////////////////////// -#define CLVM_FILTER_PROTOS 1 -#define CLVM_FILTER_GROUPS 2 -#define CLVM_FILTER_STATUS 4 -#define CLVM_FILTER_VARIABLES 8 -#define CLVM_STICKY_CONTACTS 16 -#define CLVM_FILTER_STICKYSTATUS 32 -#define CLVM_FILTER_LASTMSG 64 -#define CLVM_FILTER_LASTMSG_OLDERTHAN 128 -#define CLVM_FILTER_LASTMSG_NEWERTHAN 256 - -#define CLVM_PROTOGROUP_OP 1 -#define CLVM_GROUPSTATUS_OP 2 -#define CLVM_AUTOCLEAR 4 -#define CLVM_INCLUDED_UNGROUPED 8 -#define CLVM_USELASTMSG 16 - -#define CLVM_USEGROUPS 32 -#define CLVM_DONOTUSEGROUPS 64 +#define CLVM_FILTER_PROTOS 0x0001 +#define CLVM_FILTER_GROUPS 0x0002 +#define CLVM_FILTER_STATUS 0x0004 +#define CLVM_FILTER_VARIABLES 0x0008 +#define CLVM_STICKY_CONTACTS 0x0010 +#define CLVM_FILTER_STICKYSTATUS 0x0020 +#define CLVM_FILTER_LASTMSG 0x0040 +#define CLVM_FILTER_LASTMSG_OLDERTHAN 0x0080 +#define CLVM_FILTER_LASTMSG_NEWERTHAN 0x0100 + +#define CLVM_PROTOGROUP_OP 0x0001 +#define CLVM_GROUPSTATUS_OP 0x0002 +#define CLVM_AUTOCLEAR 0x0004 +#define CLVM_INCLUDED_UNGROUPED 0x0008 +#define CLVM_USELASTMSG 0x0010 + +#define CLVM_USEGROUPS 0x0020 +#define CLVM_DONOTUSEGROUPS 0x0040 + +#define CLVM_FOLDGROUPS 0x0080 +#define CLVM_UNFOLDGROUPS 0x0100 + +#define CLVM_HIDEEMPTYGROUPS 0x0200 +#define CLVM_SHOWEMPTYGROUPS 0x0400 //changes the 'use groups' flag and call CLUI v0.8.0.16+ //wParam=newValue diff --git a/plugins/Clist_modern/src/modern_clui.cpp b/plugins/Clist_modern/src/modern_clui.cpp index 0b801cc16b..d61609f4c5 100644 --- a/plugins/Clist_modern/src/modern_clui.cpp +++ b/plugins/Clist_modern/src/modern_clui.cpp @@ -72,7 +72,9 @@ RECT g_rcEdgeSizingRect = { 0 }; static uint8_t bAlphaEnd; static int bOldHideOffline; +static int bOldHideEmptyGroups; static int bOldUseGroups; +static int bOldFoldGroups; static uint16_t wBehindEdgeShowDelay, wBehindEdgeHideDelay, @@ -301,11 +303,17 @@ CLUI::CLUI() : LoadCLUIFramesModule(); - g_CluiData.boldHideOffline = -1; + g_CluiData.bOldHideEmptyGroups = -1; + bOldHideEmptyGroups = Clist::HideEmptyGroups; + + g_CluiData.bOldHideOffline = -1; bOldHideOffline = Clist::HideOffline; g_CluiData.bOldUseGroups = -1; bOldUseGroups = Clist::UseGroups; + + g_CluiData.bOldFoldGroups = -1; + bOldFoldGroups = -1; } CLUI::~CLUI() @@ -441,6 +449,7 @@ HRESULT CLUI::CreateCLC() if (g_CluiData.current_viewmode[0] == '\0') { g_clistApi.pfnSetHideOffline((bOldHideOffline == -1) ? false : bOldHideOffline); CallService(MS_CLIST_SETUSEGROUPS, (bOldUseGroups == -1) ? false : bOldUseGroups, 0); + SendMessage(g_clistApi.hwndContactTree, CLM_SETHIDEEMPTYGROUPS, (bOldHideEmptyGroups == -1) ? false : bOldHideEmptyGroups, 0); } nLastRequiredHeight = 0; mutex_bDisableAutoUpdate = 0; diff --git a/plugins/Clist_modern/src/modern_global_structure.h b/plugins/Clist_modern/src/modern_global_structure.h index 6012cb61fe..689d06b7de 100644 --- a/plugins/Clist_modern/src/modern_global_structure.h +++ b/plugins/Clist_modern/src/modern_global_structure.h @@ -11,9 +11,9 @@ struct CLUIDATA // NotifyArea menu HMENU hMenuNotify; - uint16_t wNextMenuID; + uint16_t wNextMenuID; int iIconNotify; - uint32_t dwFlags; + uint32_t dwFlags; int hIconNotify; MCONTACT hUpdateContact; @@ -21,15 +21,17 @@ struct CLUIDATA wchar_t groupFilter[2048]; char protoFilter[2048]; char varFilter[2048]; - uint32_t lastMsgFilter; + uint32_t lastMsgFilter; char current_viewmode[256], old_viewmode[256]; - uint8_t boldHideOffline; - uint8_t bOldUseGroups; - uint32_t statusMaskFilter; - uint32_t stickyMaskFilter; - uint32_t filterFlags; - uint32_t bFilterEffective; - uint32_t t_now; + int bOldHideOffline; + int bOldHideEmptyGroups; + int bOldUseGroups; + int bOldFoldGroups; + uint32_t statusMaskFilter; + uint32_t stickyMaskFilter; + uint32_t filterFlags; + uint32_t bFilterEffective; + uint32_t t_now; // Modern Global Variables int fDocked; diff --git a/plugins/Clist_modern/src/modern_viewmodebar.cpp b/plugins/Clist_modern/src/modern_viewmodebar.cpp index c80af4e9f8..8fe23159dc 100644 --- a/plugins/Clist_modern/src/modern_viewmodebar.cpp +++ b/plugins/Clist_modern/src/modern_viewmodebar.cpp @@ -117,8 +117,7 @@ void DeleteViewMode(char *szName) } for (auto &hContact : Contacts()) - if (db_get_dw(hContact, CLVM_MODULE, szName, -1) != -1) - db_set_dw(hContact, CLVM_MODULE, szName, 0); + db_unset(hContact, CLVM_MODULE, szName); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -188,37 +187,60 @@ public: //////////////////////////////////////////////////////////////////////////////////////// +static int __cdecl FillModes(const char *szsetting, void *param) +{ + if (uint8_t(szsetting[0]) == 246) + return 1; + if (szsetting[0] == 13) + return 1; + + ptrW temp(mir_utf8decodeW(szsetting)); + if (temp != nullptr) { + auto *modes = (CCtrlCombo *)param; + modes->AddString(temp); + } + return 1; +} + class CViewModeSetupDlg1 : public CViewModePage { int m_iCurrItem = -1; - CCtrlCheck chkLastMsg; - CCtrlCombo cmbProtoGroup, cmbGroupStatus, cmbLastMsgOp, cmbcmbLastMsgUnit; + CCtrlCheck chkLastMsg, chkUseGroups; + CCtrlCombo cmbModes, cmbProtoGroup, cmbGroupStatus, cmbLastMsgOp, cmbcmbLastMsgUnit; CCtrlMButton btnAdd, btnRename, btnDelete; - CCtrlListBox modes; CCtrlListView protocols, groups, statuses; - static int __cdecl FillModes(const char *szsetting, void *param) +public: + CViewModeSetupDlg1(CViewModeSetupDlg *_1) : + CViewModePage(IDD_OPT_VIEWMODES1, _1), + groups(this, IDC_GROUPS), + statuses(this, IDC_STATUSMODES), + protocols(this, IDC_PROTOCOLS), + btnAdd(this, IDC_ADDVIEWMODE, SKINICON_OTHER_ADDCONTACT, LPGEN("Add view mode")), + btnRename(this, IDC_RENAMEVIEWMODE, SKINICON_OTHER_RENAME, LPGEN("Rename view mode")), + btnDelete(this, IDC_DELETEVIEWMODE, SKINICON_OTHER_DELETE, LPGEN("Remove view mode")), + cmbModes(this, IDC_VIEWMODES), + chkLastMsg(this, IDC_LASTMSG), + chkUseGroups(this, IDC_USEGROUPS), + cmbProtoGroup(this, IDC_PROTOGROUPOP), + cmbGroupStatus(this, IDC_GROUPSTATUSOP), + cmbLastMsgOp(this, IDC_LASTMESSAGEOP), + cmbcmbLastMsgUnit(this, IDC_LASTMESSAGEUNIT) { - if (uint8_t(szsetting[0]) == 246) - return 1; - if (szsetting[0] == 13) - return 1; - - ptrW temp(mir_utf8decodeW(szsetting)); - if (temp != nullptr) { - CCtrlListBox *modes = (CCtrlListBox *)param; - modes->AddString(temp); - } - return 1; - } + btnAdd.OnClick = Callback(this, &CViewModeSetupDlg1::onClick_Add); + btnRename.OnClick = Callback(this, &CViewModeSetupDlg1::onClick_Rename); + btnDelete.OnClick = Callback(this, &CViewModeSetupDlg1::onClick_Delete); - //////////////////////////////////////////////////////////////////////////////////////// - // fills dialog with data + chkLastMsg.OnChange = Callback(this, &CViewModeSetupDlg1::onChange_LastMsg); + chkUseGroups.OnChange = Callback(this, &CViewModeSetupDlg1::onChange_UseGroups); + + cmbModes.OnSelChanged = Callback(this, &CViewModeSetupDlg1::onSelChanged_Mode); + } - void FillDialog() + bool OnInitDialog() override { - db_enum_settings(0, FillModes, CLVM_MODULE, &modes); + db_enum_settings(0, FillModes, CLVM_MODULE, &cmbModes); // fill protocols... protocols.SetExtendedListViewStyle(LVS_EX_CHECKBOXES); @@ -280,7 +302,7 @@ class CViewModeSetupDlg1 : public CViewModePage cmbProtoGroup.AddString(TranslateT("And")); cmbProtoGroup.AddString(TranslateT("Or")); - + cmbGroupStatus.AddString(TranslateT("And")); cmbGroupStatus.AddString(TranslateT("Or")); @@ -294,11 +316,128 @@ class CViewModeSetupDlg1 : public CViewModePage cmbcmbLastMsgUnit.SetCurSel(0); SetDlgItemInt(m_hwnd, IDC_LASTMSGVALUE, 0, 0); + + int index = 0; + + if (g_CluiData.current_viewmode[0] != '\0') { + wchar_t *temp = mir_utf8decodeW(g_CluiData.current_viewmode); + if (temp) { + index = cmbModes.FindString(temp); + mir_free(temp); + } + if (index == -1) + index = 0; + } + + if (cmbModes.SetCurSel(0) != LB_ERR) { + m_iCurrItem = index; + pOwner->UpdateFilters(); + } + else m_iCurrItem = -1; + + SendDlgItemMessage(m_hwnd, IDC_AUTOCLEARSPIN, UDM_SETRANGE, 0, MAKELONG(1000, 0)); + return true; + } + + void onChange_LastMsg(CCtrlCheck *) + { + bool bUseLastMsg = chkLastMsg.GetState(); + cmbLastMsgOp.Enable(bUseLastMsg); + cmbcmbLastMsgUnit.Enable(bUseLastMsg); + EnableWindow(GetDlgItem(m_hwnd, IDC_LASTMSGVALUE), bUseLastMsg); + } + + void onChange_UseGroups(CCtrlCheck *) + { + bool bEnabled = chkUseGroups.IsChecked(); + EnableWindow(GetDlgItem(m_hwnd, IDC_FOLD_GROUPS), bEnabled); + EnableWindow(GetDlgItem(m_hwnd, IDC_HIDEEMPTYGROUPS), bEnabled); + } + + void onClick_Add(CCtrlButton *) + { + ENTER_STRING es = {}; + es.caption = LPGENW("Enter view mode name"); + if (!EnterString(&es)) + return; + + T2Utf szUTF8Buf(es.ptszResult); + + if (db_get_dw(0, CLVM_MODULE, szUTF8Buf, -1) != -1) + MessageBox(nullptr, TranslateT("A view mode with this name does already exist"), TranslateT("Duplicate name"), MB_OK); + else { + int iNewItem = cmbModes.AddString(es.ptszResult); + if (iNewItem != LB_ERR) { + cmbModes.SetCurSel(iNewItem); + SaveViewMode(szUTF8Buf, L"", "", 0, -1, 0, 0, 0); + m_iCurrItem = iNewItem; + cmbProtoGroup.SetCurSel(0); + cmbGroupStatus.SetCurSel(0); + } + } + + pOwner->UpdateFilters(); + } + + void onClick_Rename(CCtrlButton *) + { + ENTER_STRING es = {}; + es.caption = LPGENW("Enter new view mode name"); + if (!EnterString(&es)) + return; + + int idx = cmbModes.GetCurSel(); + ptrW szTempBuf(cmbModes.GetItemText(idx)); + if (!mir_wstrlen(szTempBuf)) + return; + + DeleteViewMode(T2Utf(szTempBuf)); + cmbModes.DeleteString(idx); + cmbModes.InsertString(es.ptszResult, idx); + cmbModes.SetCurSel(idx); + SaveState(); + } + + void onClick_Delete(CCtrlButton *) + { + if (IDYES != MessageBox(nullptr, TranslateT("Really delete this view mode? This cannot be undone"), TranslateT("Delete a view mode"), MB_YESNO | MB_ICONQUESTION)) + return; + + int idx = cmbModes.GetCurSel(); + ptrW szTempBuf(cmbModes.GetItemText(idx)); + if (!mir_wstrlen(szTempBuf)) + return; + + DeleteViewMode(T2Utf(szTempBuf)); + + cmbModes.DeleteString(idx); + if (cmbModes.SetCurSel(0) != LB_ERR) { + m_iCurrItem = 0; + pOwner->UpdateFilters(); + } + else m_iCurrItem = -1; + } + + void onSelChanged_Mode(CCtrlCombo *) + { + SaveState(); + m_iCurrItem = cmbModes.GetCurSel(); + pOwner->UpdateFilters(); } //////////////////////////////////////////////////////////////////////////////////////// // saves the state of the filter definitions for the current item + uint32_t SaveTriState(int iCtrlId, uint32_t ifChecked, uint32_t ifUnchecked) + { + switch (IsDlgButtonChecked(m_hwnd, iCtrlId)) { + case BST_CHECKED: return ifChecked; + case BST_UNCHECKED: return ifUnchecked; + default: + return 0; + } + } + void SaveState() override { if (m_iCurrItem == -1) { @@ -306,7 +445,7 @@ class CViewModeSetupDlg1 : public CViewModePage return; } - ptrW szTempModeName(modes.GetItemText(m_iCurrItem)); + ptrW szTempModeName(cmbModes.GetItemText(m_iCurrItem)); if (!szTempModeName) { pOwner->szModeName.Empty(); return; @@ -353,8 +492,9 @@ class CViewModeSetupDlg1 : public CViewModePage (cmbGroupStatus.GetCurSel() == 1 ? CLVM_GROUPSTATUS_OP : 0) | (IsDlgButtonChecked(m_hwnd, IDC_AUTOCLEAR) ? CLVM_AUTOCLEAR : 0) | (chkLastMsg.GetState() ? CLVM_USELASTMSG : 0) | - (IsDlgButtonChecked(m_hwnd, IDC_USEGROUPS) == BST_CHECKED ? CLVM_USEGROUPS : 0) | - (IsDlgButtonChecked(m_hwnd, IDC_USEGROUPS) == BST_UNCHECKED ? CLVM_DONOTUSEGROUPS : 0)); + SaveTriState(IDC_USEGROUPS, CLVM_USEGROUPS, CLVM_DONOTUSEGROUPS) | + SaveTriState(IDC_HIDEEMPTYGROUPS, CLVM_HIDEEMPTYGROUPS, CLVM_SHOWEMPTYGROUPS) | + SaveTriState(IDC_FOLD_GROUPS, CLVM_FOLDGROUPS, CLVM_UNFOLDGROUPS)); pOwner->options = SendDlgItemMessage(m_hwnd, IDC_AUTOCLEARSPIN, UDM_GETPOS, 0, 0); @@ -366,7 +506,13 @@ class CViewModeSetupDlg1 : public CViewModePage //////////////////////////////////////////////////////////////////////////////////////// // updates the filter list boxes with the data taken from the filtering string - void UpdateFilters() + void UpdateTriState(int iCtrlId, uint32_t ifChecked, uint32_t ifUnchecked) + { + int iStatus = ifChecked ? BST_CHECKED : (ifUnchecked ? BST_UNCHECKED : BST_INDETERMINATE); + CheckDlgButton(m_hwnd, iCtrlId, iStatus); + } + + void UpdateFilters() override { char szSetting[128]; uint32_t dwFlags; @@ -375,7 +521,7 @@ class CViewModeSetupDlg1 : public CViewModePage if (m_iCurrItem == LB_ERR) return; - ptrW szTempBuf(modes.GetItemText(m_iCurrItem)); + ptrW szTempBuf(cmbModes.GetItemText(m_iCurrItem)); T2Utf szBuf(szTempBuf); pOwner->szModeName = szBuf.get(); { @@ -451,12 +597,12 @@ class CViewModeSetupDlg1 : public CViewModePage cmbGroupStatus.SetCurSel(dwFlags & CLVM_GROUPSTATUS_OP ? 1 : 0); CheckDlgButton(m_hwnd, IDC_AUTOCLEAR, dwFlags & CLVM_AUTOCLEAR ? BST_CHECKED : BST_UNCHECKED); - int useLastMsg = dwFlags & CLVM_USELASTMSG; - int useGroupsState = (dwFlags & CLVM_USEGROUPS) ? BST_CHECKED : (dwFlags & CLVM_DONOTUSEGROUPS) ? BST_UNCHECKED : BST_INDETERMINATE; + UpdateTriState(IDC_USEGROUPS, dwFlags & CLVM_USEGROUPS, dwFlags & CLVM_DONOTUSEGROUPS); + UpdateTriState(IDC_FOLD_GROUPS, dwFlags & CLVM_FOLDGROUPS, dwFlags & CLVM_UNFOLDGROUPS); + UpdateTriState(IDC_HIDEEMPTYGROUPS, dwFlags & CLVM_HIDEEMPTYGROUPS, dwFlags & CLVM_SHOWEMPTYGROUPS); + int useLastMsg = dwFlags & CLVM_USELASTMSG; chkLastMsg.SetState(useLastMsg); - CheckDlgButton(m_hwnd, IDC_USEGROUPS, useGroupsState ? BST_CHECKED : BST_UNCHECKED); - cmbLastMsgOp.Enable(useLastMsg); cmbcmbLastMsgUnit.Enable(useLastMsg); EnableWindow(GetDlgItem(m_hwnd, IDC_LASTMSGVALUE), useLastMsg); @@ -468,137 +614,6 @@ class CViewModeSetupDlg1 : public CViewModePage cmbLastMsgOp.SetCurSel(LOBYTE(HIWORD(lmdat))); cmbcmbLastMsgUnit.SetCurSel(HIBYTE(HIWORD(lmdat))); } - -public: - CViewModeSetupDlg1(CViewModeSetupDlg *_1) : - CViewModePage(IDD_OPT_VIEWMODES1, _1), - modes(this, IDC_VIEWMODES), - groups(this, IDC_GROUPS), - statuses(this, IDC_STATUSMODES), - protocols(this, IDC_PROTOCOLS), - btnAdd(this, IDC_ADDVIEWMODE, SKINICON_OTHER_ADDCONTACT, LPGEN("Add view mode")), - btnRename(this, IDC_RENAMEVIEWMODE, SKINICON_OTHER_RENAME, LPGEN("Rename view mode")), - btnDelete(this, IDC_DELETEVIEWMODE, SKINICON_OTHER_DELETE, LPGEN("Remove view mode")), - chkLastMsg(this, IDC_LASTMSG), - cmbProtoGroup(this, IDC_PROTOGROUPOP), - cmbGroupStatus(this, IDC_GROUPSTATUSOP), - cmbLastMsgOp(this, IDC_LASTMESSAGEOP), - cmbcmbLastMsgUnit(this, IDC_LASTMESSAGEUNIT) - { - btnAdd.OnClick = Callback(this, &CViewModeSetupDlg1::onClick_Add); - btnRename.OnClick = Callback(this, &CViewModeSetupDlg1::onClick_Rename); - btnDelete.OnClick = Callback(this, &CViewModeSetupDlg1::onClick_Delete); - - chkLastMsg.OnChange = Callback(this, &CViewModeSetupDlg1::onChange_LastMsg); - - modes.OnSelChange = Callback(this, &CViewModeSetupDlg1::onSelChange_List); - } - - bool OnInitDialog() override - { - FillDialog(); - - int index = 0; - - if (g_CluiData.current_viewmode[0] != '\0') { - wchar_t *temp = mir_utf8decodeW(g_CluiData.current_viewmode); - if (temp) { - index = modes.FindString(temp); - mir_free(temp); - } - if (index == -1) - index = 0; - } - - if (modes.SetCurSel(0) != LB_ERR) { - m_iCurrItem = index; - pOwner->UpdateFilters(); - } - else m_iCurrItem = -1; - - SendDlgItemMessage(m_hwnd, IDC_AUTOCLEARSPIN, UDM_SETRANGE, 0, MAKELONG(1000, 0)); - return true; - } - - void onChange_LastMsg(CCtrlCheck *) - { - bool bUseLastMsg = chkLastMsg.GetState(); - cmbLastMsgOp.Enable(bUseLastMsg); - cmbcmbLastMsgUnit.Enable(bUseLastMsg); - EnableWindow(GetDlgItem(m_hwnd, IDC_LASTMSGVALUE), bUseLastMsg); - pOwner->btnApply.Enable(); - } - - void onClick_Add(CCtrlButton *) - { - ENTER_STRING es = {}; - es.caption = LPGENW("Enter view mode name"); - if (!EnterString(&es)) - return; - - T2Utf szUTF8Buf(es.ptszResult); - - if (db_get_dw(0, CLVM_MODULE, szUTF8Buf, -1) != -1) - MessageBox(nullptr, TranslateT("A view mode with this name does already exist"), TranslateT("Duplicate name"), MB_OK); - else { - int iNewItem = modes.AddString(es.ptszResult); - if (iNewItem != LB_ERR) { - modes.SetCurSel(iNewItem); - SaveViewMode(szUTF8Buf, L"", "", 0, -1, 0, 0, 0); - m_iCurrItem = iNewItem; - cmbProtoGroup.SetCurSel(0); - cmbGroupStatus.SetCurSel(0); - } - } - - pOwner->UpdateFilters(); - } - - void onClick_Rename(CCtrlButton *) - { - ENTER_STRING es = {}; - es.caption = LPGENW("Enter new view mode name"); - if (!EnterString(&es)) - return; - - int idx = modes.GetCurSel(); - ptrW szTempBuf(modes.GetItemText(idx)); - if (!mir_wstrlen(szTempBuf)) - return; - - DeleteViewMode(T2Utf(szTempBuf)); - modes.DeleteString(idx); - modes.InsertString(es.ptszResult, idx); - modes.SetCurSel(idx); - SaveState(); - } - - void onClick_Delete(CCtrlButton *) - { - if (IDYES != MessageBox(nullptr, TranslateT("Really delete this view mode? This cannot be undone"), TranslateT("Delete a view mode"), MB_YESNO | MB_ICONQUESTION)) - return; - - int idx = modes.GetCurSel(); - ptrW szTempBuf(modes.GetItemText(idx)); - if (!mir_wstrlen(szTempBuf)) - return; - - DeleteViewMode(T2Utf(szTempBuf)); - - modes.DeleteString(idx); - if (modes.SetCurSel(0) != LB_ERR) { - m_iCurrItem = 0; - pOwner->UpdateFilters(); - } - else m_iCurrItem = -1; - } - - void onSelChange_List(CCtrlListBox*) - { - SaveState(); - m_iCurrItem = modes.GetCurSel(); - pOwner->UpdateFilters(); - } }; //////////////////////////////////////////////////////////////////////////////////////// @@ -1248,18 +1263,24 @@ void ApplyViewMode(const char *szName) mir_snprintf(szSetting, "%c_LastMode", 246); db_unset(0, CLVM_MODULE, szSetting); - if (g_CluiData.bOldUseGroups != (uint8_t)-1) + if (g_CluiData.bOldUseGroups != -1) CallService(MS_CLIST_SETUSEGROUPS, (WPARAM)g_CluiData.bOldUseGroups, 0); Clist_Broadcast(CLM_AUTOREBUILD, 0, 0); KillTimer(g_hwndViewModeFrame, TIMERID_VIEWMODEEXPIRE); - if (g_CluiData.boldHideOffline != (uint8_t)-1) - g_clistApi.pfnSetHideOffline(g_CluiData.boldHideOffline); - if (g_CluiData.bOldUseGroups != (uint8_t)-1) - CallService(MS_CLIST_SETUSEGROUPS, (WPARAM)g_CluiData.bOldUseGroups, 0); - g_CluiData.boldHideOffline = (uint8_t)-1; - g_CluiData.bOldUseGroups = (uint8_t)-1; + if (g_CluiData.bOldHideOffline != -1) + g_clistApi.pfnSetHideOffline(g_CluiData.bOldHideOffline); + if (g_CluiData.bOldHideEmptyGroups != -1) + SendMessage(g_clistApi.hwndContactTree, CLM_SETHIDEEMPTYGROUPS, g_CluiData.bOldHideEmptyGroups, 0); + if (g_CluiData.bOldFoldGroups != -1) + SendMessage(g_clistApi.hwndContactTree, CLM_EXPAND, 0, g_CluiData.bOldFoldGroups ? CLE_COLLAPSE : CLE_EXPAND); + + g_CluiData.bOldUseGroups = -1; + g_CluiData.bOldHideOffline = -1; + g_CluiData.bOldHideEmptyGroups = -1; + g_CluiData.bOldFoldGroups = -1; + g_CluiData.current_viewmode[0] = 0; g_CluiData.old_viewmode[0] = 0; @@ -1335,33 +1356,49 @@ void ApplyViewMode(const char *szName) g_CluiData.bFilterEffective |= CLVM_STICKY_CONTACTS; if (g_CluiData.bFilterEffective & CLVM_FILTER_STATUS) { - if (g_CluiData.boldHideOffline == (uint8_t)-1) - g_CluiData.boldHideOffline = Clist::HideOffline; + if (g_CluiData.bOldHideOffline == -1) + g_CluiData.bOldHideOffline = Clist::HideOffline; g_clistApi.pfnSetHideOffline(false); } - else if (g_CluiData.boldHideOffline != (uint8_t)-1) { - g_clistApi.pfnSetHideOffline(g_CluiData.boldHideOffline); - g_CluiData.boldHideOffline = -1; + else if (g_CluiData.bOldHideOffline != -1) { + g_clistApi.pfnSetHideOffline(g_CluiData.bOldHideOffline); + g_CluiData.bOldHideOffline = -1; } - int bUseGroups = -1; - if (g_CluiData.filterFlags & CLVM_USEGROUPS) - bUseGroups = 1; - else if (g_CluiData.filterFlags & CLVM_DONOTUSEGROUPS) - bUseGroups = 0; - + int bUseGroups = (g_CluiData.filterFlags & CLVM_USEGROUPS) ? 1 : ((g_CluiData.filterFlags & CLVM_DONOTUSEGROUPS) ? 0 : -1); if (bUseGroups != -1) { - if (g_CluiData.bOldUseGroups == (uint8_t)-1) + if (g_CluiData.bOldUseGroups == -1) g_CluiData.bOldUseGroups = Clist::UseGroups; CallService(MS_CLIST_SETUSEGROUPS, bUseGroups, 0); } - else if (g_CluiData.bOldUseGroups != (uint8_t)-1) { + else if (g_CluiData.bOldUseGroups != -1) { CallService(MS_CLIST_SETUSEGROUPS, g_CluiData.bOldUseGroups, 0); g_CluiData.bOldUseGroups = -1; } + int bOldHideEmptyGroups = (g_CluiData.filterFlags & CLVM_HIDEEMPTYGROUPS) ? 1 : ((g_CluiData.filterFlags & CLVM_SHOWEMPTYGROUPS) ? 0 : -1); + if (bOldHideEmptyGroups != -1) { + if (g_CluiData.bOldHideEmptyGroups == -1) + g_CluiData.bOldHideEmptyGroups = Clist::HideEmptyGroups; + + SendMessage(g_clistApi.hwndContactTree, CLM_SETHIDEEMPTYGROUPS, bOldHideEmptyGroups, 0); + } + else if (g_CluiData.bOldHideEmptyGroups != -1) { + SendMessage(g_clistApi.hwndContactTree, CLM_SETHIDEEMPTYGROUPS, g_CluiData.bOldHideEmptyGroups, 0); + g_CluiData.bOldHideEmptyGroups = -1; + } + + int bOldFoldGroups = (g_CluiData.filterFlags & CLVM_FOLDGROUPS) ? 1 : ((g_CluiData.filterFlags & CLVM_UNFOLDGROUPS) ? 0 : -1); + if (bOldFoldGroups != -1) { + SendMessage(g_clistApi.hwndContactTree, CLM_EXPAND, 0, bOldFoldGroups ? CLE_COLLAPSE : CLE_EXPAND); + } + else if (g_CluiData.bOldFoldGroups != -1) { + SendMessage(g_clistApi.hwndContactTree, CLM_EXPAND, 0, g_CluiData.bOldFoldGroups ? CLE_COLLAPSE : CLE_EXPAND); + g_CluiData.bOldFoldGroups = -1; + } + SetWindowText(hwndSelector, ptrW(mir_utf8decodeW((szName[0] == 13) ? szName + 1 : szName))); } diff --git a/plugins/Clist_modern/src/resource.h b/plugins/Clist_modern/src/resource.h index 079c8703d8..bd22bd519d 100644 --- a/plugins/Clist_modern/src/resource.h +++ b/plugins/Clist_modern/src/resource.h @@ -1,6 +1,6 @@ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. -// Used by w:\miranda-ng\plugins\Clist_modern\res\resource.rc +// Used by W:\miranda-ng\plugins\Clist_modern\res\resource.rc // #define IDC_ALWAYS_VISIBLEICON 0 #define IDC_APPLY 3 @@ -422,6 +422,8 @@ #define IDC_SELECTMODE 19126 #define IDC_CONFIGUREMODES 19127 #define IDC_USEGROUPS 19128 +#define IDC_HIDEEMPTYGROUPS 19129 +#define IDC_FOLD_GROUPS 19130 #define POPUP_NEWSUBGROUP 40004 #define POPUP_GROUPSHOWOFFLINE 40019 #define IDC_FRAME_META 40054 @@ -443,7 +445,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 512 #define _APS_NEXT_COMMAND_VALUE 40022 -#define _APS_NEXT_CONTROL_VALUE 2025 +#define _APS_NEXT_CONTROL_VALUE 2026 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif -- cgit v1.2.3