void WItemDelegate::updateModelIndex(WWidget *widget, const WModelIndex& index) { WidgetRef w(widget); if (index.flags() & ItemIsUserCheckable) { IndexCheckBox *cb = checkBox(w, index, false, false); if (cb) cb->setIndex(index); } }
IndexCheckBox *WItemDelegate::checkBox(WidgetRef& w, const WModelIndex& index, bool autoCreate, bool triState) { IndexCheckBox *checkBox = dynamic_cast<IndexCheckBox *>(w.w->find("c")); if (!checkBox) { if (autoCreate) { IndexCheckBox * const result = checkBox = new IndexCheckBox(index); checkBox->setObjectName("c"); checkBox->clicked().preventPropagation(); IndexContainerWidget *wc = dynamic_cast<IndexContainerWidget *>(w.w->find("o")); if (!wc) { wc = new IndexContainerWidget(index); wc->setObjectName("o"); w.w->setInline(true); w.w->setStyleClass(WString::Empty); /* We first remove to avoid reparenting warnings */ IndexContainerWidget *p = dynamic_cast<IndexContainerWidget *>(w.w->parent()); if (p) p->removeWidget(w.w); wc->addWidget(w.w); w.w = wc; } wc->insertWidget(0, checkBox); checkBox->changed().connect (boost::bind(&WItemDelegate::onCheckedChange, this, result)); } else return 0; } checkBox->setTristate(triState); return checkBox; }
void WItemDelegate::updateModelIndex(WWidget *widget, const WModelIndex& index) { WidgetRef w(widget); if (index.flags() & ItemIsUserCheckable) { IndexCheckBox *cb = checkBox(w, index, false, false); if (cb) cb->setIndex(index); } if (index.flags() & ItemHasDeferredTooltip) { IndexText *text = dynamic_cast<IndexText *>(widget); if (text) text->setIndex(index); IndexAnchor *anchor = dynamic_cast<IndexAnchor *>(widget); if (anchor) anchor->setIndex(index); IndexContainerWidget *c = dynamic_cast<IndexContainerWidget *>(widget); if (c) c->setIndex(index); } }
WWidget *WItemDelegate::update(WWidget *widget, const WModelIndex& index, WFlags<ViewItemRenderFlag> flags) { bool editing = widget && widget->find("t") == 0; if (flags & RenderEditing) { if (!editing) { widget = createEditor(index, flags); WInteractWidget *iw = dynamic_cast<WInteractWidget *>(widget); if (iw) { // Disable drag & drop and selection behaviour iw->mouseWentDown().preventPropagation(); iw->clicked().preventPropagation(); } } } else { if (editing) widget = 0; } WidgetRef widgetRef(widget); bool isNew = false; if (!(flags & RenderEditing)) { if (!widgetRef.w) { isNew = true; IndexText *t = new IndexText(index); t->setObjectName("t"); if (index.isValid() && !(index.flags() & ItemIsXHTMLText)) t->setTextFormat(PlainText); t->setWordWrap(true); widgetRef.w = t; } if (!index.isValid()) return widgetRef.w; bool haveCheckBox = false; boost::any checkedData = index.data(CheckStateRole); if (!checkedData.empty()) { haveCheckBox = true; CheckState state = (checkedData.type() == typeid(bool) ? (boost::any_cast<bool>(checkedData) ? Checked : Unchecked) : (checkedData.type() == typeid(CheckState) ? boost::any_cast<CheckState>(checkedData) : Unchecked)); IndexCheckBox *icb = checkBox(widgetRef, index, true, index.flags() & ItemIsTristate); icb->setCheckState(state); icb->setEnabled(index.flags() & ItemIsUserCheckable); } else if (!isNew) delete checkBox(widgetRef, index, false); boost::any linkData = index.data(LinkRole); if (!linkData.empty()) { WLink link = boost::any_cast<WLink>(linkData); IndexAnchor *a = anchorWidget(widgetRef, index); a->setLink(link); if (link.type() == WLink::Resource) a->setTarget(TargetNewWindow); } IndexText *t = textWidget(widgetRef, index); WString label = asString(index.data(), textFormat_); if (label.empty() && haveCheckBox) label = WString::fromUTF8(" "); t->setText(label); std::string iconUrl = asString(index.data(DecorationRole)).toUTF8(); if (!iconUrl.empty()) { iconWidget(widgetRef, index, true)->setImageLink(WLink(iconUrl)); } else if (!isNew) delete iconWidget(widgetRef, index, false); } if (index.flags() & ItemHasDeferredTooltip){ widgetRef.w->setDeferredToolTip(true, (index.flags() & ItemIsXHTMLText) ? XHTMLText : PlainText); } else { WString tooltip = asString(index.data(ToolTipRole)); if (!tooltip.empty() || !isNew) widgetRef.w->setToolTip(tooltip, (index.flags() & ItemIsXHTMLText) ? XHTMLText : PlainText); } WT_USTRING sc = asString(index.data(StyleClassRole)); if (flags & RenderSelected) sc += WT_USTRING::fromUTF8 (" " + WApplication::instance()->theme()->activeClass()); if (flags & RenderEditing) sc += WT_USTRING::fromUTF8(" Wt-delegate-edit"); widgetRef.w->setStyleClass(sc); if (index.flags() & ItemIsDropEnabled) widgetRef.w->setAttributeValue("drop", WString::fromUTF8("true")); else if (!widgetRef.w->attributeValue("drop").empty()) widgetRef.w->setAttributeValue("drop", WString::fromUTF8("f")); return widgetRef.w; }