QSize UserViewDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { UserViewItemBase *base = dynamic_cast<UserViewItemBase*>(m_uv->itemFromIndex(index)); QSize size; if(!base) return size; size.setWidth( m_uv->width() ); QFont f(option.font); int h = 0; if (base->type() == GRP_ITEM) { if (CorePlugin::instance()->value("SmallGroupFont").toBool()) { int size = f.pixelSize(); if (size > 0) { f.setPixelSize(size * 3 / 4); } else { size = f.pointSize(); f.setPointSize(size * 3 / 4); } } h = 14; } if (base->type() == USR_ITEM) { ContactItem *item = static_cast<ContactItem*>(base); QString icons = item->text(CONTACT_ICONS); while (!icons.isEmpty()) { QString icon = getToken(icons, ','); QImage img = Image(icon); if (img.height() > h) h = img.height(); } if (item->m_unread) { CommandDef *lcmdDefUnreadMessages = CorePlugin::instance()->messageTypes.find(item->m_unread); if (lcmdDefUnreadMessages) { QImage img = Image(lcmdDefUnreadMessages->icon); if (img.height() > h) h = img.height(); } } } QFontMetrics fm(f); int fh = fm.height(); if (fh > h) h = fh; size.setHeight( h + 2 ); return size; }
ContactItem *UserListBase::findContactItem(unsigned id, QListViewItem *p) { for (QListViewItem *item = p ? p->firstChild() : firstChild(); item; item = item->nextSibling()){ UserViewItemBase *i = static_cast<UserViewItemBase*>(item); if (i->type() == USR_ITEM){ ContactItem *contactItem = static_cast<ContactItem*>(item); if (contactItem->id() == id) return contactItem; } if (item->isExpandable()){ ContactItem *res = findContactItem(id, item); if (res) return res; } } return NULL; }
void UserList::drawItem(UserViewItemBase *base, QPainter *p, const QColorGroup &cg, int width, int margin) { if (base->type() == GRP_ITEM){ GroupItem *item = static_cast<GroupItem*>(base); p->setFont(font()); QString text; if (item->id()){ Group *grp = getContacts()->group(item->id()); if (grp){ text = grp->getName(); }else{ text = "???"; } }else{ text = i18n("Not in list"); } int x = drawIndicator(p, 2 + margin, item, isGroupSelected(item->id()), cg); if (!CorePlugin::m_plugin->getUseSysColors()) p->setPen(CorePlugin::m_plugin->getColorGroup()); x = item->drawText(p, x, width, text); item->drawSeparator(p, x, width, cg); return; } if (base->type() == USR_ITEM){ ContactItem *item = static_cast<ContactItem*>(base); int x = drawIndicator(p, 2 + margin, item, isSelected(item->id()), cg); if (!item->isSelected() || !hasFocus() || !CorePlugin::m_plugin->getUseDblClick()){ if (CorePlugin::m_plugin->getUseSysColors()){ if (item->status() != STATUS_ONLINE) p->setPen(palette().disabled().text()); }else{ switch (item->status()){ case STATUS_ONLINE: break; case STATUS_AWAY: p->setPen(CorePlugin::m_plugin->getColorAway()); break; case STATUS_NA: p->setPen(CorePlugin::m_plugin->getColorNA()); break; case STATUS_DND: p->setPen(CorePlugin::m_plugin->getColorDND()); break; default: p->setPen(CorePlugin::m_plugin->getColorOffline()); break; } } } x = item->drawText(p, x, width, item->text(CONTACT_TEXT)); return; } UserListBase::drawItem(base, p, cg, width, margin); }
bool CheckProto_1( const ContactItem& contactItem, const ClaimType indexed, const ContactSectionVersion parentVersion) { if (indexed) { if (!contactItem.has_id()) { std::cerr << "Verify serialized contact item failed: missing id." << std::endl; return false; } if (MIN_PLAUSIBLE_IDENTIFIER < contactItem.id().size()) { std::cerr << "Verify serialized contact item failed: invalid id." << std::endl; return false; } } else { if (contactItem.has_id()) { std::cerr << "Verify serialized contact item failed: id not blank." << std::endl; return false; } } if (!contactItem.has_type()) { std::cerr << "Verify serialized contact item failed: missing type." << std::endl; return false; } if (!ValidContactItemType(parentVersion, contactItem.type())) { std::cerr << "Verify serialized contact item failed: invalid type." << std::endl; return false; } if (!contactItem.has_value()) { std::cerr << "Verify serialized contact item failed: missing value." << std::endl; return false; } for (auto& it: contactItem.attribute()) { if (!ValidContactItemAttribute(contactItem.version(), static_cast<ContactItemAttribute>(it))) { std::cerr << "Verify serialized contact item failed: invalid attribute." << std::endl; return false; } } return true; }
void *UserListBase::processEvent(Event *e) { if (e->type() == EventRepaintView) viewport()->repaint(); if (m_bInit){ switch (e->type()){ case EventGroupCreated:{ Group *g = (Group*)(e->param()); addGroupForUpdate(g->id()); break; } case EventGroupChanged:{ Group *g = (Group*)(e->param()); addGroupForUpdate(g->id()); break; } case EventGroupDeleted:{ Group *g = (Group*)(e->param()); for (list<unsigned long>::iterator it = updGroups.begin(); it != updGroups.end(); ++it){ if (*it == g->id()){ updGroups.erase(it); break; } } QListViewItem *item = findGroupItem(g->id()); deleteItem(item); break; } case EventContactCreated:{ Contact *c = (Contact*)(e->param()); if (!c->getIgnore() && (c->getTemporary() == 0)) addContactForUpdate(c->id()); break; } case EventContactStatus: case EventContactChanged:{ Contact *c = (Contact*)(e->param()); if (!c->getIgnore() && (c->getTemporary() == 0)){ addContactForUpdate(c->id()); }else{ Event e(EventContactDeleted, c); processEvent(&e); } break; } case EventMessageReceived:{ Message *msg = (Message*)(e->param()); if (msg->type() == MessageStatus){ Contact *contact = getContacts()->contact(msg->contact()); if (contact) addContactForUpdate(contact->id()); } break; } case EventContactDeleted:{ Contact *g = (Contact*)(e->param()); for (list<unsigned long>::iterator it = updContacts.begin(); it != updContacts.end(); ++it){ if (*it == g->id()){ updContacts.erase(it); break; } } ContactItem *item = findContactItem(g->id()); if (item){ if (m_groupMode){ GroupItem *grpItem = static_cast<GroupItem*>(item->parent()); grpItem->m_nContacts--; if (item->m_bOnline) grpItem->m_nContactsOnline--; addGroupForUpdate(grpItem->id()); deleteItem(item); if ((m_groupMode == 2) && (grpItem->firstChild() == NULL) && m_bShowOnline){ DivItem *div = static_cast<DivItem*>(grpItem->parent()); if (div->state() == DIV_OFFLINE){ deleteItem(grpItem); if (div->firstChild() == NULL) deleteItem(div); } } }else{ QListViewItem *p = item->parent(); deleteItem(item); if (p->firstChild() == NULL) deleteItem(p); } } break; } } } return ListView::processEvent(e); }
void UserListBase::drawUpdates() { m_bDirty = false; updTimer->stop(); QListViewItem *item; list<unsigned long>::iterator it; for (it = updGroups.begin(); it != updGroups.end(); ++it){ Group *group = getContacts()->group(*it); if (group == NULL) continue; switch (m_groupMode){ case 1: item = findGroupItem(group->id()); if (item){ static_cast<GroupItem*>(item)->update(group); repaintItem(item); }else{ new GroupItem(this, group, true); } break; case 2: for (item = firstChild(); item; item = item->nextSibling()){ UserViewItemBase *i = static_cast<UserViewItemBase*>(item); if (i->type() != DIV_ITEM) continue; DivItem *divItem = static_cast<DivItem*>(i); GroupItem *grpItem = findGroupItem(group->id(), divItem); if (grpItem){ grpItem->update(group); repaintItem(grpItem); }else{ new GroupItem(divItem, group, divItem->state() == DIV_OFFLINE); } } break; } } updGroups.clear(); DivItem *itemOnline = NULL; DivItem *itemOffline = NULL; if (updContacts.size()){ if (m_groupMode != 1){ for (item = firstChild(); item != NULL; item = item->nextSibling()){ UserViewItemBase *i = static_cast<UserViewItemBase*>(item); if (i->type() != DIV_ITEM) continue; DivItem *divItem = static_cast<DivItem*>(i); if (divItem->state() == DIV_ONLINE) itemOnline = divItem; if (divItem->state() == DIV_OFFLINE) itemOffline = divItem; } } } for (it = updContacts.begin(); it != updContacts.end(); ++it){ Contact *contact = getContacts()->contact(*it); if (contact == NULL) continue; ContactItem *contactItem; GroupItem *grpItem; unsigned style; string icons; unsigned status = getUserStatus(contact, style, icons); unsigned unread = getUnread(contact->id()); bool bShow = false; ListUserData *data = (ListUserData*)(contact->getUserData(CorePlugin::m_plugin->list_data_id)); if (data && data->ShowAllways) bShow = true; switch (m_groupMode){ case 0: if (status == STATUS_OFFLINE){ if (itemOnline){ contactItem = findContactItem(contact->id(), itemOnline); if (contactItem){ deleteItem(contactItem); if (itemOnline->firstChild() == NULL){ deleteItem(itemOnline); itemOnline = NULL; } } } if ((unread == 0) && !bShow && m_bShowOnline){ if (itemOffline){ contactItem = findContactItem(contact->id(), itemOffline); if (contactItem){ deleteItem(contactItem); if (itemOffline->firstChild() == NULL){ deleteItem(itemOffline); itemOffline = NULL; } } } break; } if (itemOffline == NULL){ itemOffline = new DivItem(this, DIV_OFFLINE); setOpen(itemOffline, true); } contactItem = findContactItem(contact->id(), itemOffline); if (contactItem){ if (contactItem->update(contact, status, style, icons.c_str(), unread)) addSortItem(itemOffline); repaintItem(contactItem); }else{ contactItem = new ContactItem(itemOffline, contact, status, style, icons.c_str(), unread); } }else{ if (itemOffline){ contactItem = findContactItem(contact->id(), itemOffline); if (contactItem){ deleteItem(contactItem); if (itemOffline->firstChild() == NULL){ deleteItem(itemOffline); itemOffline = NULL; } } } if (itemOnline == NULL){ itemOnline = new DivItem(this, DIV_ONLINE); setOpen(itemOnline, true); } contactItem = findContactItem(contact->id(), itemOnline); if (contactItem){ if (contactItem->update(contact, status, style, icons.c_str(), unread)) addSortItem(itemOnline); repaintItem(contactItem); }else{ contactItem = new ContactItem(itemOnline, contact, status, style, icons.c_str(), unread); } } break; case 1: contactItem = findContactItem(contact->id()); grpItem = NULL; if (contactItem){ grpItem = static_cast<GroupItem*>(contactItem->parent()); if (((status == STATUS_OFFLINE) && (unread == 0) && !bShow && m_bShowOnline) || (contact->getGroup() != grpItem->id())){ grpItem->m_nContacts--; if (contactItem->m_bOnline) grpItem->m_nContactsOnline--; addGroupForUpdate(grpItem->id()); deleteItem(contactItem); contactItem = NULL; grpItem = NULL; } } if ((status != STATUS_OFFLINE) || unread || bShow || !m_bShowOnline){ if (grpItem == NULL) grpItem = findGroupItem(contact->getGroup()); if (grpItem){ if (contactItem){ if (contactItem->update(contact, status, style, icons.c_str(), unread)) addSortItem(grpItem); repaintItem(contactItem); if (!m_bShowOnline && (contactItem->m_bOnline != (status != STATUS_OFFLINE))){ if (status == STATUS_OFFLINE){ grpItem->m_nContactsOnline--; contactItem->m_bOnline = false; }else{ grpItem->m_nContactsOnline++; contactItem->m_bOnline = true; } addGroupForUpdate(grpItem->id()); } }else{ contactItem = new ContactItem(grpItem, contact, status, style, icons.c_str(), unread); grpItem->m_nContacts++; if (!m_bShowOnline && (status != STATUS_OFFLINE)){ grpItem->m_nContactsOnline++; contactItem->m_bOnline = true; } addGroupForUpdate(grpItem->id()); } } } break; case 2: contactItem = findContactItem(contact->id(), itemOnline); grpItem = NULL; if (contactItem){ grpItem = static_cast<GroupItem*>(contactItem->parent()); if ((status == STATUS_OFFLINE) || (grpItem->id() != contact->getGroup())){ grpItem->m_nContacts--; addGroupForUpdate(grpItem->id()); deleteItem(contactItem); contactItem = NULL; } } if (itemOffline){ contactItem = findContactItem(contact->id(), itemOffline); grpItem = NULL; if (contactItem){ grpItem = static_cast<GroupItem*>(contactItem->parent()); if ((status != STATUS_OFFLINE) || (grpItem->id() != contact->getGroup())){ grpItem->m_nContacts--; addGroupForUpdate(grpItem->id()); deleteItem(contactItem); contactItem = NULL; if (m_bShowOnline && (grpItem->firstChild() == NULL)){ deleteItem(grpItem); grpItem = NULL; if (itemOffline->firstChild() == NULL){ deleteItem(itemOffline); itemOffline = NULL; } } } } } if ((unread == 0) && !bShow && (status == STATUS_OFFLINE) && m_bShowOnline) break; DivItem *divItem; if (status == STATUS_OFFLINE){ if (itemOffline == NULL){ itemOffline = new DivItem(this, DIV_OFFLINE); setOpen(itemOffline, true); } divItem = itemOffline; }else{ divItem = itemOnline; } grpItem = findGroupItem(contact->getGroup(), divItem); if (grpItem == NULL){ Group *grp = getContacts()->group(contact->getGroup()); if (grp == NULL) break; grpItem = new GroupItem(divItem, grp, true); } contactItem = findContactItem(contact->id(), grpItem); if (contactItem){ if (contactItem->update(contact, status, style, icons.c_str(), unread)) addSortItem(grpItem); }else{ new ContactItem(grpItem, contact, status, style, icons.c_str(), unread); grpItem->m_nContacts++; addGroupForUpdate(grpItem->id()); } } } updContacts.clear(); for (list<QListViewItem*>::iterator it_sort = sortItems.begin(); it_sort != sortItems.end(); ++it_sort){ (*it_sort)->sort(); } sortItems.clear(); }
void UserList::contentsMouseReleaseEvent(QMouseEvent *e) { QListViewItem *list_item = itemAt(contentsToViewport(e->pos())); if (list_item == NULL) return; switch (static_cast<UserViewItemBase*>(list_item)->type()){ case USR_ITEM:{ ContactItem *item = static_cast<ContactItem*>(list_item); if (isSelected(item->id())){ for (list<unsigned>::iterator it = selected.begin(); it != selected.end(); ++it){ if ((*it) == item->id()){ selected.erase(it); break; } } }else{ selected.push_back(item->id()); } item->repaint(); item->parent()->repaint(); emit selectChanged(); break; } case GRP_ITEM:{ GroupItem *item = static_cast<GroupItem*>(list_item); if (isGroupSelected(item->id())){ for (QListViewItem *i = item->firstChild(); i; i = i->nextSibling()){ ContactItem *ci = static_cast<ContactItem*>(i); list<unsigned>::iterator it; for (it = selected.begin(); it != selected.end(); ++it){ if ((*it) == ci->id()){ selected.erase(it); break; } } ci->repaint(); } }else{ for (QListViewItem *i = item->firstChild(); i; i = i->nextSibling()){ ContactItem *ci = static_cast<ContactItem*>(i); list<unsigned>::iterator it; for (it = selected.begin(); it != selected.end(); ++it) if ((*it) == ci->id()) break; if (it == selected.end()){ selected.push_back(ci->id()); ci->repaint(); } } } item->repaint(); emit selectChanged(); break; } } m_pressedItem = NULL; }
bool UDXFile::importRecords(const QString &url, ContactList &list, bool append) { if (!openFile(url, QIODevice::ReadOnly)) return false; // Read XML QString err_msg; int err_line, err_col; if (!setContent(&file, &err_msg, &err_line, &err_col)) { _errors << QObject::tr("Can't read content from file %1\n%2\nline %3, col %4\n") .arg(url).arg(err_msg).arg(err_line).arg(err_col); closeFile(); return false; } closeFile(); // Root element QDomElement root = documentElement(); if (root.nodeName()!="DataExchangeInfo") { _errors << QObject::tr("Root node is not 'DataExchangeInfo' at file\n%1").arg(url); return false; } // Codepage, version, expected record count QDomElement recInfo = root.firstChildElement("RecordInfo"); if (recInfo.isNull()) { _errors << QObject::tr("Can't find 'RecordInfo' tag at file\n%1").arg(url); return false; } QString charSet = recInfo.firstChildElement("Encoding").text(); if (charSet.isEmpty()) { _errors << QObject::tr("Warning: codepage not found, trying use UTF-8..."); charSet = "UTF-8"; } QString udxVer = recInfo.firstChildElement("UdxVersion").text(); if (udxVer.isEmpty()) { _errors << QObject::tr("Warning: udx version not found, treat as 1.0..."); udxVer = "1.0"; } QDomElement vcfInfo = recInfo.firstChildElement("RecordOfvCard"); QString vcVer = vcfInfo.firstChildElement("vCardVersion").text(); int expCount = vcfInfo.firstChildElement("vCardRecord").text().toInt(); // vCard set QDomElement vCard = root.firstChildElement("vCard"); if (vCard.isNull()) { _errors << QObject::tr("Can't find 'vCard' records at file\n%1").arg(url); return false; } // QTextCodec* codec = QTextCodec::codecForName(charSet.toLocal8Bit()); TODO not works on windows ContactItem item; if (!append) list.clear(); QDomElement vCardInfo = vCard.firstChildElement("vCardInfo"); while (!vCardInfo.isNull()) { item.clear(); item.originalFormat = "UDX"; item.version = udxVer; item.subVersion = vcVer; item.id = vCardInfo.firstChildElement("Sequence").text(); QDomElement fields = vCardInfo.firstChildElement("vCardField"); if (fields.isNull()) _errors << QObject::tr("Can't find 'vCardField' at sequence %1").arg(item.id); QDomElement field = fields.firstChildElement(); while (!field.isNull()) { QString fldName = field.nodeName().toUpper(); QString fldValue = field.text(); // codec->toUnicode(field.text().toLocal8Bit()); TODO not works on windows if (fldName=="N") { fldValue.replace("\\;", " "); // In ALL known me udx files part before first ; was EMPTY fldValue.remove(";"); item.names = fldValue.split(" "); // If empty parts not in-middle, remove it item.dropFinalEmptyNames(); } else if (fldName.startsWith("TEL")) { Phone phone; phone.number = fldValue; if (fldName=="TEL") phone.tTypes << "CELL"; else if (fldName=="TELHOME") phone.tTypes << "HOME"; else if (fldName=="TELWORK") phone.tTypes << "WORK"; else if (fldName=="TELFAX") phone.tTypes << "FAX"; else _errors << QObject::tr("Unknown phone type: %1 (%2)").arg(phone.number).arg(item.names[0]); item.phones.push_back(phone); } else if (fldName=="ORGNAME") item.organization = fldValue; else if (fldName=="BDAY") item.birthday.value = QDateTime::fromString(fldValue, "yyyyMMdd"); // TODO Maybe, use DateItem::fromString else if (fldName=="EMAIL") { Email email; email.address = fldValue; email.emTypes << "pref"; item.emails.push_back(email); } else _errors << QObject::tr("Unknown 'vCardfield' type: %1").arg(fldName); field = field.nextSiblingElement(); } item.calculateFields(); list.push_back(item); vCardInfo = vCardInfo.nextSiblingElement(); } if (list.count()!=expCount) _errors << QObject::tr("%1 records read, %2 expected").arg(list.count()).arg(expCount); // Unknown tags statistics int totalUnknownTags = 0; foreach (const ContactItem& _item, list) totalUnknownTags += _item.unknownTags.count(); if (totalUnknownTags) _errors << QObject::tr("%1 unknown tags found").arg(totalUnknownTags); // Ready return (!list.isEmpty()); }
bool ContactItem::operator== (const ContactItem& other) const { return contact_->AimId_ == other.Get()->AimId_; }
void UserViewDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { UserViewItemBase *base = dynamic_cast<UserViewItemBase*>(m_uv->itemFromIndex(index)); if( NULL == base ) return; painter->save(); painter->translate(option.rect.x(), option.rect.y()); QPainter *p = painter; QPalette cg = option.palette; int width = option.rect.width(); int height = option.rect.height(); QSize itemsize = option.rect.size(); int margin = 1; switch( base->type() ) { case GRP_ITEM: { GroupItem *item = static_cast<GroupItem*>(base); QString text = index.data( Qt::DisplayRole ).toString(); QImage img = Image( ( option.state & QStyle::State_Open ) ? "expanded" : "collapsed"); if (!img.isNull()) p->drawImage(2 + margin, (height - img.height()) / 2, img); int x = 24 + margin; if (!( option.state & QStyle::State_Open ) && item->m_unread) { CommandDef *lcmdDefUnreadMessages = CorePlugin::instance()->messageTypes.find(item->m_unread); if (lcmdDefUnreadMessages) { img = Image(lcmdDefUnreadMessages->icon); if (!img.isNull()) { if (m_uv->m_bUnreadBlink) p->drawImage(x, (height - img.height()) / 2, img); x += img.width() + 2; } } } if (!CorePlugin::instance()->value("UseSysColors").toBool()) p->setPen(CorePlugin::instance()->value("ColorGroup").toUInt()); QFont f(option.font); if (CorePlugin::instance()->value("SmallGroupFont").toBool()) { int size = f.pixelSize(); if (size > 0) f.setPixelSize(size * 3 / 4); else { size = f.pointSize(); f.setPointSize(size * 3 / 4); } } f.setBold(true); p->setFont(f); x = drawText(p, x, itemsize, text); if (CorePlugin::instance()->value("GroupSeparator").toBool()) drawSeparator(p, x, itemsize, m_uv->style()); break; } case USR_ITEM: { ContactItem *item = static_cast<ContactItem*>(base); QFont f(option.font); if (item->style() & CONTACT_ITALIC) { if (CorePlugin::instance()->value("VisibleStyle").toUInt() & STYLE_ITALIC) f.setItalic(true); if (CorePlugin::instance()->value("VisibleStyle").toUInt() & STYLE_UNDER) f.setUnderline(true); if (CorePlugin::instance()->value("VisibleStyle").toUInt() & STYLE_STRIKE) f.setStrikeOut(true); } if (item->style() & CONTACT_UNDERLINE) { if (CorePlugin::instance()->value("AuthStyle").toUInt() & STYLE_ITALIC) f.setItalic(true); if (CorePlugin::instance()->value("AuthStyle").toUInt() & STYLE_UNDER) f.setUnderline(true); if (CorePlugin::instance()->value("AuthStyle").toUInt() & STYLE_STRIKE) f.setStrikeOut(true); } if (item->style() & CONTACT_STRIKEOUT) { if (CorePlugin::instance()->value("InvisibleStyle").toUInt() & STYLE_ITALIC) f.setItalic(true); if (CorePlugin::instance()->value("InvisibleStyle").toUInt() & STYLE_UNDER) f.setUnderline(true); if (CorePlugin::instance()->value("InvisibleStyle").toUInt() & STYLE_STRIKE) f.setStrikeOut(true); } int x = margin; QIcon mainIcon = index.data( Qt::DecorationRole ).value<QIcon>(); if (!mainIcon.isNull()) { QPixmap img = mainIcon.pixmap( 16 ); x += 2; p->drawPixmap(x, ( height - img.height() ) / 2, img); x += img.width() + 2; } if (x < 24) x = 24; if (!item->isSelected() || !m_uv->hasFocus() || !CorePlugin::instance()->value("UseDblClick").toBool()) { if (!CorePlugin::instance()->value("UseSysColors").toBool()) { switch (item->status()) { case STATUS_ONLINE: p->setPen(CorePlugin::instance()->value("ColorOnline").toUInt()); break; case STATUS_FFC: p->setPen(CorePlugin::instance()->value("ColorOnline").toUInt()); break; case STATUS_AWAY: p->setPen(CorePlugin::instance()->value("ColorAway").toUInt()); break; case STATUS_NA: p->setPen(CorePlugin::instance()->value("ColorNA").toUInt()); break; case STATUS_DND: p->setPen(CorePlugin::instance()->value("ColorDND").toUInt()); break; default: p->setPen(CorePlugin::instance()->value("ColorOffline").toUInt()); break; } } if (item->status() != STATUS_ONLINE && item->status() != STATUS_FFC) p->setPen(m_uv->palette().color(QPalette::Disabled,QPalette::Text)); } if (item->m_bBlink) f.setBold(true); else f.setBold(false); p->setFont(f); QString highlight; QString text = index.data( Qt::DisplayRole ).toString(); int pos=0; if(!m_uv->m_search.isEmpty()) { pos=text.toUpper().indexOf(m_uv->m_search.toUpper()); //Search for substring in contact name if (pos > -1) highlight=text.mid(pos,m_uv->m_search.length()); } int save_x = x; //p->setPen(QColor(0, 0, 0)); x = drawText(p, x, itemsize, text); if (pos > 0) save_x = drawText(p, save_x, itemsize, text.left(pos)) - 4; x += 2; if (!highlight.isEmpty()) { QPen oldPen = p->pen(); QColor oldBg = p->background().color(); p->setBackgroundMode(Qt::OpaqueMode); if (item == m_uv->m_searchItem) if (item == m_uv->currentItem() && CorePlugin::instance()->value("UseDblClick").toBool()) { p->setBackground(cg.color(QPalette::HighlightedText)); p->setPen(cg.color(QPalette::Highlight)); } else { p->setBackground(cg.color(QPalette::Highlight)); p->setPen(cg.color(QPalette::HighlightedText)); } else { p->setBackground(oldPen.color()); p->setPen(oldBg); } drawText(p, save_x, itemsize, highlight); p->setPen(oldPen); p->setBackground(oldBg); p->setBackgroundMode(Qt::TransparentMode); } unsigned xIcon = width; QString icons = index.data( SIM::ExtraIconsRole ).toString(); while( !icons.isEmpty() ) { QString icon = getToken(icons, ','); QImage img = Image(icon); if (!img.isNull()) { xIcon -= img.width() + 2; if (xIcon < (unsigned)x) break; p->drawImage(xIcon, (height - img.height()) / 2, img); } } break; } case DIV_ITEM: { QString text = index.data( Qt::DisplayRole ).toString(); QFont f(option.font); int size = f.pixelSize(); if (size <= 0) { size = f.pointSize(); f.setPointSize(size * 3 / 4); } else f.setPixelSize(size * 3 / 4); p->setFont(f); int x = drawText(p, 24 + margin, itemsize, text); drawSeparator(p, x, itemsize, m_uv->style()); break; } } painter->restore(); }
void UserView::drawItem(UserViewItemBase *base, QPainter *p, const QColorGroup &cg, int width, int margin) { if (base->type() == GRP_ITEM){ GroupItem *item = static_cast<GroupItem*>(base); QFont f(font()); int size = f.pixelSize(); if (size <= 0){ size = f.pointSize(); f.setPointSize(size * 3 / 4); }else{ f.setPixelSize(size * 3 / 4); } f.setBold(true); p->setFont(f); QString text; if (item->id()){ Group *grp = getContacts()->group(item->id()); if (grp){ text = grp->getName(); }else{ text = "???"; } }else{ text = i18n("Not in list"); } if (item->m_nContacts){ text += " ("; if (item->m_nContactsOnline){ text += QString::number(item->m_nContactsOnline); text += "/"; } text += QString::number(item->m_nContacts); text += ")"; } const QPixmap &pict = Pict(item->isOpen() ? "expanded" : "collapsed"); p->drawPixmap(2 + margin, (item->height() - pict.height()) / 2, pict); int x = 24 + margin; if (!item->isOpen() && item->m_unread){ CommandDef *def = CorePlugin::m_plugin->messageTypes.find(item->m_unread); if (def){ const QPixmap &pict = Pict(def->icon); if (m_bUnreadBlink) p->drawPixmap(x, (item->height() - pict.height()) / 2, pict); x += pict.width() + 2; } } if (!CorePlugin::m_plugin->getUseSysColors()) p->setPen(CorePlugin::m_plugin->getColorGroup()); x = item->drawText(p, x, width, text); if (CorePlugin::m_plugin->getGroupSeparator()) item->drawSeparator(p, x, width, cg); return; } if (base->type() == USR_ITEM){ ContactItem *item = static_cast<ContactItem*>(base); QFont f(font()); if (item->style() & CONTACT_ITALIC) f.setItalic(true); if (item->style() & CONTACT_UNDERLINE) f.setUnderline(true); if (item->style() & CONTACT_STRIKEOUT) f.setStrikeOut(true); if (item->m_bBlink){ f.setBold(true); }else{ f.setBold(false); } p->setFont(f); string icons = item->text(CONTACT_ICONS).latin1(); string icon = getToken(icons, ','); if (item->m_unread && m_bUnreadBlink){ CommandDef *def = CorePlugin::m_plugin->messageTypes.find(item->m_unread); if (def) icon = def->icon; } int x = margin; if (icon.length()){ const QPixmap &pict = Pict(icon.c_str()); x += 2; p->drawPixmap(x, (item->height() - pict.height()) / 2, pict); x += pict.width() + 2; } if (x < 24) x = 24; if (!item->isSelected() || !hasFocus() || !CorePlugin::m_plugin->getUseDblClick()){ if (CorePlugin::m_plugin->getUseSysColors()){ if (item->status() != STATUS_ONLINE) p->setPen(palette().disabled().text()); }else{ switch (item->status()){ case STATUS_ONLINE: break; case STATUS_AWAY: p->setPen(CorePlugin::m_plugin->getColorAway()); break; case STATUS_NA: p->setPen(CorePlugin::m_plugin->getColorNA()); break; case STATUS_DND: p->setPen(CorePlugin::m_plugin->getColorDND()); break; default: p->setPen(CorePlugin::m_plugin->getColorOffline()); break; } } } QString highlight; QString text = item->text(CONTACT_TEXT); if (!m_search.isEmpty()){ if (text.left(m_search.length()).upper() == m_search.upper()) highlight = text.left(m_search.length()); } int save_x = x; x = item->drawText(p, x, width, text); x += 2; if (!highlight.isEmpty()){ QPen oldPen = p->pen(); QColor oldBg = p->backgroundColor(); p->setBackgroundMode(OpaqueMode); if (item == m_searchItem){ if ((item == currentItem()) && CorePlugin::m_plugin->getUseDblClick()){ p->setBackgroundColor(cg.highlightedText()); p->setPen(cg.highlight()); }else{ p->setBackgroundColor(cg.highlight()); p->setPen(cg.highlightedText()); } }else{ p->setBackgroundColor(oldPen.color()); p->setPen(oldBg); } item->drawText(p, save_x, width, highlight); p->setPen(oldPen); p->setBackgroundColor(oldBg); p->setBackgroundMode(TransparentMode); } unsigned xIcon = width; while (icons.length()){ icon = getToken(icons, ','); const QPixmap &pict = Pict(icon.c_str()); xIcon -= pict.width() + 2; if (xIcon < (unsigned)x) break; p->drawPixmap(xIcon, (item->height() - pict.height()) / 2, pict); } return; } UserListBase::drawItem(base, p, cg, width, margin); }
void ContactDialog::getData(ContactItem& c) { // Names c.fullName = ui->leFullName->text(); c.names.clear(); for (int i=0; i<nameCount; i++) c.names.push_back(findChild<QLineEdit*>(QString("leName%1").arg(i+1))->text()); // Phones c.phones.clear(); for (int i=0; i<phoneCount; i++) { Phone ph; readTriplet("Phone", i+1, ph.number, ph.tTypes, Phone::standardTypes); c.phones.push_back(ph); } // Emails c.emails.clear(); for (int i=0; i<emailCount; i++) { Email em; readTriplet("Email", i+1, em.address, em.emTypes, Email::standardTypes); c.emails.push_back(em); } // Birthday and anniversaries c.birthday = birthdayDetails; c.birthday.value = (ui->cbBirthday->isChecked()) ? ui->dteBirthday->dateTime() : QDateTime(); for (int i=0; i<anniversaryCount; i++) { DateItem di; readAnniversary(i+1, di); c.anniversaries.push_back(di); } // Photo QString photoText = ui->lbPhotoContent->text(); if ((!photoText.isEmpty()) && photoText!=S_PH_UNKNOWN_FORMAT) { // URL c.photoType = "URL"; c.photoUrl = photoText; } else if (!photo.isEmpty()) { // image c.photoType = detectPhotoFormat(); c.photo = photo; } else { // deleted by user c.photoType.clear(); c.photoUrl.clear(); c.photo.clear(); } // Addresses readAddress(ui->gbAddrHome, c.addrHome); if (!c.addrHome.isEmpty() && !c.addrHome.paTypes.contains("home", Qt::CaseInsensitive)) c.addrHome.paTypes << "home"; readAddress(ui->gbAddrWork, c.addrWork); if (!c.addrWork.isEmpty() && !c.addrWork.paTypes.contains("work", Qt::CaseInsensitive)) c.addrWork.paTypes << "work"; // Internet c.nickName = ui->leNickName->text(); c.url = ui->leURL->text(); c.jabberName = ui->leJabber->text(); c.icqName = ui->leICQ->text(); c.skypeName = ui->leSkype->text(); // Work c.organization = ui->leOrganization->text(); c.title = ui->leTitle->text(); // Other c.sortString = ui->leSortString->text(); c.description = ui->edDescription->toPlainText(); c.calculateFields(); }