static void LoadGroups(vector<ExtraIconGroup *> &groups) { unsigned int count = DBGetContactSettingWord(NULL, MODULE_NAME "Groups", "Count", 0); for (unsigned int i = 0; i < count; ++i) { char setting[512]; mir_snprintf(setting, MAX_REGS(setting), "%d_count", i); unsigned int items = DBGetContactSettingWord(NULL, MODULE_NAME "Groups", setting, 0); if (items < 1) continue; mir_snprintf(setting, MAX_REGS(setting), "__group_%d", i); ExtraIconGroup *group = new ExtraIconGroup(setting); for (unsigned int j = 0; j < items; ++j) { mir_snprintf(setting, MAX_REGS(setting), "%d_%d", i, j); DBVARIANT dbv = { 0 }; if (!DBGetContactSettingString(NULL, MODULE_NAME "Groups", setting, &dbv)) { if (!IsEmpty(dbv.pszVal)) { BaseExtraIcon *extra = GetExtraIconByName(dbv.pszVal); if (extra != NULL) { group->items.push_back(extra); if (extra->getSlot() >= 0) group->setSlot(extra->getSlot()); } } DBFreeVariant(&dbv); } } if (group->items.size() < 2) { delete group; continue; } groups.push_back(group); } }
static void LoadGroups(LIST<ExtraIconGroup> &groups) { int count = db_get_w(NULL, MODULE_NAME "Groups", "Count", 0); for (int i=0; i < count; i++) { char setting[512]; mir_snprintf(setting, "%d_count", i); unsigned int items = db_get_w(NULL, MODULE_NAME "Groups", setting, 0); if (items < 1) continue; mir_snprintf(setting, "__group_%d", i); ExtraIconGroup *group = new ExtraIconGroup(setting); for (unsigned int j = 0; j < items; j++) { mir_snprintf(setting, "%d_%d", i, j); ptrA szIconName(db_get_sa(NULL, MODULE_NAME "Groups", setting)); if (IsEmpty(szIconName)) continue; BaseExtraIcon *extra = GetExtraIconByName(szIconName); if (extra == NULL) continue; group->m_items.insert(extra); if (extra->getSlot() >= 0) group->setSlot(extra->getSlot()); } if (group->m_items.getCount() < 2) { delete group; continue; } groups.insert(group); } }
virtual void OnApply() { // Store old slots int *oldSlots = new int[registeredExtraIcons.getCount()]; int lastUsedSlot = -1; for (int i = 0; i < registeredExtraIcons.getCount(); i++) { if (extraIconsByHandle[i] == registeredExtraIcons[i]) oldSlots[i] = registeredExtraIcons[i]->getSlot(); else // Remove old slot for groups to re-set images oldSlots[i] = -1; lastUsedSlot = MAX(lastUsedSlot, registeredExtraIcons[i]->getSlot()); } lastUsedSlot = MIN(lastUsedSlot, GetNumberOfSlots()); // Get user data and create new groups LIST<ExtraIconGroup> groups(1); BYTE pos = 0; int firstEmptySlot = 0; HTREEITEM ht = m_tree.GetRoot(); TVITEMEX tvi; tvi.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE; tvi.stateMask = TVIS_STATEIMAGEMASK; while (ht) { tvi.hItem = ht; m_tree.GetItem(&tvi); intlist*ids = (intlist*)tvi.lParam; if (ids == NULL || ids->count < 1) continue; // ??? bool enabled = ((tvi.state & INDEXTOSTATEIMAGEMASK(3)) == INDEXTOSTATEIMAGEMASK(2)); int slot = (enabled ? firstEmptySlot++ : -1); if (slot >= GetNumberOfSlots()) slot = -1; if (ids->count == 1) { BaseExtraIcon *extra = registeredExtraIcons[ids->data[0] - 1]; extra->setPosition(pos++); extra->setSlot(slot); } else { char name[128]; mir_snprintf(name, "__group_%d", groups.getCount()); ExtraIconGroup *group = new ExtraIconGroup(name); for (int i = 0; i < ids->count; i++) { BaseExtraIcon *extra = registeredExtraIcons[ids->data[i] - 1]; extra->setPosition(pos++); group->addExtraIcon(extra); } group->setSlot(slot); groups.insert(group); } ht = m_tree.GetNextSibling(ht); } // Store data for (int i = 0; i < registeredExtraIcons.getCount(); i++) { BaseExtraIcon *extra = registeredExtraIcons[i]; char setting[512]; mir_snprintf(setting, "Position_%s", extra->getName()); db_set_w(NULL, MODULE_NAME, setting, extra->getPosition()); mir_snprintf(setting, "Slot_%s", extra->getName()); db_set_w(NULL, MODULE_NAME, setting, extra->getSlot()); } CallService(MS_DB_MODULE_DELETE, 0, (LPARAM)MODULE_NAME "Groups"); db_set_w(NULL, MODULE_NAME "Groups", "Count", groups.getCount()); for (int k = 0; k < groups.getCount(); k++) { ExtraIconGroup *group = groups[k]; char setting[512]; mir_snprintf(setting, "%d_count", k); db_set_w(NULL, MODULE_NAME "Groups", setting, (WORD)group->m_items.getCount()); for (int j = 0; j < group->m_items.getCount(); j++) { BaseExtraIcon *extra = group->m_items[j]; mir_snprintf(setting, "%d_%d", k, j); db_set_s(NULL, MODULE_NAME "Groups", setting, extra->getName()); } } // Clean removed slots for (int j = firstEmptySlot; j <= lastUsedSlot; j++) RemoveExtraIcons(j); // Apply icons to new slots RebuildListsBasedOnGroups(groups); for (int n = 0; n < extraIconsBySlot.getCount(); n++) { ExtraIcon *extra = extraIconsBySlot[n]; if (extra->getType() != EXTRAICON_TYPE_GROUP) if (oldSlots[((BaseExtraIcon *)extra)->getID() - 1] == extra->getSlot()) continue; if (extra->isEnabled()) extra->applyIcons(); } delete[] oldSlots; }