summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/m_clist.h1
-rw-r--r--src/mir_app/src/clc.h17
-rw-r--r--src/mir_app/src/clistgroups.cpp37
-rw-r--r--src/mir_app/src/ignore.cpp2
-rw-r--r--src/mir_app/src/movetogroup.cpp10
5 files changed, 38 insertions, 29 deletions
diff --git a/include/m_clist.h b/include/m_clist.h
index b5879d4256..d2aac83840 100644
--- a/include/m_clist.h
+++ b/include/m_clist.h
@@ -373,6 +373,7 @@ EXTERN_C MIR_APP_DLL(int) Clist_GroupRename(MGROUP hGroup, const wchar_t *ptszNe
// returns a wchar_t* on success, NULL on failure
// if pdwFlags is not NULL, also stores group flags into it (one of GROUPF_* constants
+#define GROUPF_HIDDEN 0x02
#define GROUPF_EXPANDED 0x04
#define GROUPF_HIDEOFFLINE 0x08
#define GROUPF_SHOWOFFLINE 0x40
diff --git a/src/mir_app/src/clc.h b/src/mir_app/src/clc.h
index cace9520c9..aae9e070d1 100644
--- a/src/mir_app/src/clc.h
+++ b/src/mir_app/src/clc.h
@@ -177,7 +177,20 @@ struct CGroupInternal
CGroupInternal(int _id, const wchar_t *_name, int _flags);
~CGroupInternal();
- int groupId, flags, oldId = -1;
+ int groupId, oldId = -1;
+ union {
+ int flags; // combination of GROUPF_* constants
+ struct {
+ bool bUnused1 : 1;
+ bool bHidden : 1;
+ bool bExpanded : 1;
+ bool bHideOffline : 1;
+ bool bUnused2 : 1;
+ bool bUnused3 : 1;
+ bool bShowOffline : 1;
+ };
+ };
+
uint32_t ignore = 0;
bool bSaveExpanded;
wchar_t *groupName;
@@ -187,6 +200,6 @@ struct CGroupInternal
};
void Clist_RebuildGroups(HWND hwnd, ClcData *dat);
-void Clist_GroupSetIgnore(MGROUP hGroup, uint32_t mask);
+void Clist_GroupSetIgnore(MGROUP hGroup, uint32_t mask, bool bHidden);
CGroupInternal* FindGroup(const wchar_t *ptszGroupName);
diff --git a/src/mir_app/src/clistgroups.cpp b/src/mir_app/src/clistgroups.cpp
index 3deced7d3a..d3d1650c63 100644
--- a/src/mir_app/src/clistgroups.cpp
+++ b/src/mir_app/src/clistgroups.cpp
@@ -39,10 +39,7 @@ static int CompareGrpByName(const CGroupInternal *p1, const CGroupInternal *p2)
}
static LIST<CGroupInternal> arByName(20, CompareGrpByName);
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-LIST<CGroupInternal> arByIds(20, NumericKeySortT);
+static LIST<CGroupInternal> arByIds(20, NumericKeySortT);
static CGroupInternal* FindGroup(int key)
{
@@ -57,7 +54,7 @@ CGroupInternal::CGroupInternal(int _id, const wchar_t *_name, int _flags) :
groupId(_id),
groupName(mir_wstrdup(_name))
{
- bSaveExpanded = (_flags & GROUPF_EXPANDED) != 0;
+ bSaveExpanded = bExpanded;
}
CGroupInternal::~CGroupInternal()
@@ -113,7 +110,8 @@ MIR_APP_DLL(MGROUP) Clist_GroupExists(LPCTSTR ptszGroupName)
void Clist_RebuildGroups(HWND hwnd, ClcData *dat)
{
for (auto &it: arByIds)
- g_clistApi.pfnAddGroup(hwnd, dat, it->groupName, it->flags, it->groupId+1, 0);
+ if (!it->bHidden)
+ g_clistApi.pfnAddGroup(hwnd, dat, it->groupName, it->flags, it->groupId+1, 0);
}
void Clist_GroupAdded(MGROUP hGroup)
@@ -429,40 +427,35 @@ MIR_APP_DLL(int) Clist_GroupRename(MGROUP hGroup, const wchar_t *ptszNewName)
MIR_APP_DLL(void) Clist_GroupSaveExpanded()
{
for (auto &it : arByIds)
- it->bSaveExpanded = (it->flags & GROUPF_EXPANDED) != 0;
+ it->bSaveExpanded = it->bExpanded;
}
MIR_APP_DLL(void) Clist_GroupRestoreExpanded()
{
for (auto &it : arByIds) {
- if (it->bSaveExpanded)
- it->flags |= GROUPF_EXPANDED;
- else
- it->flags &= ~GROUPF_EXPANDED;
+ it->bExpanded = it->bSaveExpanded;
it->save();
}
}
MIR_APP_DLL(int) Clist_GroupSetExpanded(MGROUP hGroup, int iNewState)
{
- CGroupInternal *pGroup = FindGroup(hGroup-1);
- if (pGroup == nullptr)
- return 1;
-
- if (iNewState)
- pGroup->flags |= GROUPF_EXPANDED;
- else
- pGroup->flags &= ~GROUPF_EXPANDED;
- pGroup->save();
- return 0;
+ if (auto *pGroup = FindGroup(hGroup - 1)) {
+ pGroup->bExpanded = iNewState != 0;
+ pGroup->save();
+ return 0;
+ }
+
+ return 1;
}
/////////////////////////////////////////////////////////////////////////////////////////
-void Clist_GroupSetIgnore(MGROUP hGroup, uint32_t mask)
+void Clist_GroupSetIgnore(MGROUP hGroup, uint32_t mask, bool bHidden)
{
if (auto *pGroup = FindGroup(hGroup - 1)) {
pGroup->ignore = mask;
+ pGroup->bHidden = bHidden;
pGroup->save();
}
}
diff --git a/src/mir_app/src/ignore.cpp b/src/mir_app/src/ignore.cpp
index c0e2ef8e5f..09143ccdc7 100644
--- a/src/mir_app/src/ignore.cpp
+++ b/src/mir_app/src/ignore.cpp
@@ -87,7 +87,7 @@ class IgnoreOptsDlg : public CDlgBase
SaveGroupValue(hChildItem);
MGROUP hGroup = UINT_PTR(hItem) & ~HCONTACT_ISGROUP;
- Clist_GroupSetIgnore(hGroup, GetItemMask(hItem));
+ Clist_GroupSetIgnore(hGroup, GetItemMask(hItem), !m_clist.GetCheck(hItem));
hItem = m_clist.GetNextItem(hItem, CLGN_NEXTGROUP);
}
diff --git a/src/mir_app/src/movetogroup.cpp b/src/mir_app/src/movetogroup.cpp
index fa14cb8363..bc47eb2103 100644
--- a/src/mir_app/src/movetogroup.cpp
+++ b/src/mir_app/src/movetogroup.cpp
@@ -74,8 +74,6 @@ static HGENMENU AddGroupItem(HGENMENU hRoot, wchar_t* name, int pos, WPARAM para
// wparam - hcontact
// lparam .popupposition from TMO_MenuItem
-extern LIST<CGroupInternal> arByIds;
-
static int OnContactMenuBuild(WPARAM wParam, LPARAM)
{
for (auto &p : lphGroupsItems)
@@ -91,8 +89,12 @@ static int OnContactMenuBuild(WPARAM wParam, LPARAM)
pos += 100000; // Separator
OBJLIST<GroupItemSort> groups(10, GroupItemSort::compare);
- for (auto &it : arByIds)
- groups.insert(new GroupItemSort(it->groupName, it->groupId+1));
+ for (MGROUP hGroup = 1;; hGroup++) {
+ if (auto *pwszGroupName = Clist_GroupGetName(hGroup))
+ groups.insert(new GroupItemSort(pwszGroupName, hGroup));
+ else
+ break;
+ }
for (auto &p : groups) {
bool checked = szContactGroup && !mir_wstrcmp(szContactGroup, p->name);