/// data() is re-implemented from QStandardItemModel to return the widget window title and icon for the Qt::DecorationRole and Qt::DisplayRole/Qt::EditRole QVariant AMWindowPaneModel::data(const QModelIndex &index, int role) const { switch(role) { case Qt::DisplayRole: case Qt::EditRole: // alias items can have separate descriptions, but for normal items, the DisplayRole and EditRole should be the window title if(!isAlias(index) && internalPane(index)) return internalPane(index)->windowTitle(); else return AMDragDropItemModel::data(index, role); break; case Qt::DecorationRole: if(!isAlias(index) && internalPane(index)) return internalPane(index)->windowIcon(); else return AMDragDropItemModel::data(index, role); break; // read-only property, defined as being (a) NOT an alias, AND (b) having no valid window pane widget set case AMWindowPaneModel::IsHeadingRole: return (index.isValid() && !isAlias(index) && internalPane(index) == 0); break; // Dock state: alias items should return the dock state of their target. Other items simply return their dock state, as stored in the AMWindowPaneModel::DockStateRole. case AMWindowPaneModel::DockStateRole: if(isAlias(index)) { QStandardItem* target = aliasTarget(index); if(target) return data(target->index(), role); else return true; } else return AMDragDropItemModel::data(index, role); break; case AMWindowPaneModel::UndockResizeRole: return AMDragDropItemModel::data(index, role); break; case AMWindowPaneModel::IsVisibleRole: if (AMDragDropItemModel::data(index, role).isValid()) return AMDragDropItemModel::data(index, role); else return true; break; default: return AMDragDropItemModel::data(index, role); } }
/// Convenience function to return a pointer to an item's QWidget window pane. For alias items, will return the window pane of the target. \warning Might be 0 if an invalid item has been added to the model, or if this index is a heading item. QWidget* AMWindowPaneModel::pane(const QModelIndex& index) const { if(!index.isValid()) return 0; if(isAlias(index)) { QStandardItem* target = aliasTarget(index); if(target) return internalPane(target->index()); else return 0; } else { return internalPane(index); } }
void AMWindowPaneModel::onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last) { for(int row=first; row<=last; row++) { QModelIndex i = index(row, 0, parent); if(!isAlias(i)) { QWidget* w = internalPane(i); if(w) { widget2item_.remove(w); w->removeEventFilter(this); } } } }
void AMWindowPaneModel::onRowsInserted(const QModelIndex &parent, int first, int last) { // for each item inserted: install event filter on the widget, and add to the widget lookup hash. for(int row=first; row<=last; row++) { QModelIndex i = index(row, 0, parent); if(!isAlias(i)) { QWidget* widget = internalPane(i); if(widget) { widget2item_.insert(widget, itemFromIndex(i)); widget->installEventFilter(this); } } } }
/// Convenience function to check if this item is a header item. This is defined as being true when (a) the item is NOT an alias, AND (b) that the AM::Widget role is 0/unset. bool AMWindowPaneModel::isHeading(const QModelIndex &index) const { return (index.isValid() && !isAlias(index) && internalPane(index) == 0); }
/// setData() is re-implemented from QStandardItemModel to set the widget window title and icon for the Qt::DecorationRole and Qt::DisplayRole/Qt::EditRole bool AMWindowPaneModel::setData(const QModelIndex &index, const QVariant &value, int role) { if(!index.isValid()) return false; switch(role) { case Qt::DisplayRole: case Qt::EditRole: // alias items and heading items can have separate descriptions, but for normal items, the DisplayRole and EditRole should be the window title if(isAlias(index) || isHeading(index)) return AMDragDropItemModel::setData(index, value, role); if(internalPane(index)) { internalPane(index)->setWindowTitle(value.toString()); return true; } else return false; break; case Qt::DecorationRole: // alias items and heading items can have separate icons, but for normal items, the Decoration role should be the window icon if(isAlias(index) || isHeading(index)) return AMDragDropItemModel::setData(index, value, role); if(internalPane(index)) { internalPane(index)->setWindowIcon(value.value<QIcon>()); return true; } else return false; break; case AMWindowPaneModel::DockStateRole: { // docking an alias? dock the target instead. if(isAlias(index)) { QStandardItem* target = aliasTarget(index); if(target) return setData(target->index(), value, role); else return false; } bool nowDocked = value.toBool(); bool wasDocked = isDocked(index); // set dock state like normal, but emit special signal dockStateChanged() if it's changing. if(AMDragDropItemModel::setData(index, value, role)) { QWidget* w = internalPane(index); if(wasDocked && !nowDocked) emit dockStateChanged(w, false, index.data(AMWindowPaneModel::UndockResizeRole).toBool()); else if(!wasDocked && nowDocked) emit dockStateChanged(w, true, index.data(AMWindowPaneModel::UndockResizeRole).toBool()); return true; } else return false; break; } case AMWindowPaneModel::UndockResizeRole: return AMDragDropItemModel::setData(index, value, role); break; default: return AMDragDropItemModel::setData(index, value, role); } }