void RemoveItemsCommand::redo() { KnobItemsTablePtr model = _items.begin()->item->getModel(); KnobTableItemPtr nextItem; { KnobTableItemPtr item = _items.back().item; assert(item); int index = item->getIndexInParent(); std::vector<KnobTableItemPtr> topLevel = model->getTopLevelItems(); if (!topLevel.empty()) { if (index + 1 < (int)topLevel.size()) { nextItem = topLevel[index + 1]; } else { if (topLevel[0] != item) { nextItem = topLevel[0]; } } } } model->beginEditSelection(); model->clearSelection(eTableChangeReasonInternal); for (std::list<ItemToRemove>::const_iterator it = _items.begin(); it != _items.end(); ++it) { model->removeItem(it->item, eTableChangeReasonInternal); } if (nextItem) { model->addToSelection(nextItem, eTableChangeReasonInternal); } model->endEditSelection(eTableChangeReasonInternal); model->getNode()->getApp()->triggerAutoSave(); }
AddItemsCommand::AddItemsCommand(const KnobTableItemPtr &item) : UndoCommand() , _isFirstRedo(true) { ItemToAdd p; p.item = item; p.parentItem = item->getParent(); p.indexInParent = item->getIndexInParent(); _items.push_back(p); setText( tr("Add Item").toStdString() ); }
void NodeAnimPrivate::insertItem(int index, const KnobTableItemPtr& item, TableChangeReasonEnum reason) { // The item already exists if (_publicInterface->findTableItem(item)) { return; } KnobTableItemPtr parentItem = item->getParent(); TableItemAnimPtr parentAnim; if (parentItem) { // If the parent item is not yet in the model, do not create item, the parent will create its children recursively if (parentItem->getIndexInParent() == -1) { return; } parentAnim = _publicInterface->findTableItem(parentItem); } KnobItemsTableGuiPtr table = _publicInterface->getNodeGui()->getKnobItemsTable(item->getModel()->getTableIdentifier()); assert(table); if (parentItem) { TableItemAnimPtr anim(TableItemAnim::create(_publicInterface->getModel(), table, _publicInterface->shared_from_this(), item, parentAnim->getRootItem())); parentAnim->insertChild(index, anim); } else { TableItemAnimPtr anim(TableItemAnim::create(_publicInterface->getModel(), table, _publicInterface->shared_from_this(), item, nameItem)); if (index < 0 || index >= (int)topLevelTableItems.size()) { topLevelTableItems.push_back(anim); } else { std::vector<TableItemAnimPtr>::iterator it = topLevelTableItems.begin(); std::advance(it, index); topLevelTableItems.insert(it, anim); } } // Create children recursively std::vector<KnobTableItemPtr> children = item->getChildren(); for (std::size_t i = 0; i < children.size(); ++i) { insertItem(i, children[i], reason); } }
void RemoveItemsCommand::undo() { KnobItemsTablePtr model = _items.begin()->item->getModel(); model->beginEditSelection(); model->clearSelection(eTableChangeReasonInternal); for (std::list<ItemToRemove>::const_iterator it = _items.begin(); it != _items.end(); ++it) { int prevIndex = -1; KnobTableItemPtr prevItem = it->prevItem.lock(); if (prevItem) { prevIndex = prevItem->getIndexInParent(); } if (prevIndex != -1) { model->insertItem(prevIndex, it->item, it->item->getParent(), eTableChangeReasonInternal); } else { model->addItem(it->item, it->item->getParent(), eTableChangeReasonInternal); } model->addToSelection(it->item, eTableChangeReasonInternal); } model->endEditSelection(eTableChangeReasonInternal); model->getNode()->getApp()->triggerAutoSave(); }
TableItemAnimPtr AnimationModule::findTableItemAnim(const KnobTableItemPtr& item) const { KnobItemsTablePtr model = item->getModel(); if (!model) { return TableItemAnimPtr(); } for (std::list<NodeAnimPtr>::iterator it = _imp->nodes.begin(); it != _imp->nodes.end(); ++it) { const std::vector<TableItemAnimPtr>& toplevelItems = (*it)->getTopLevelItems(); for (std::size_t i = 0; i < toplevelItems.size(); ++i) { TableItemAnimPtr r = findTableItemAnimRecursive(toplevelItems[i], item); if (r) { return r; } } } return TableItemAnimPtr(); }
void NodeAnim::onTableItemInserted(int index, const KnobTableItemPtr& item, TableChangeReasonEnum) { KnobTableItemPtr parentItem = item->getParent(); TableItemAnimPtr parentAnim; if (parentItem) { parentAnim = findTableItem(parentItem); } KnobItemsTableGuiPtr table = getNodeGui()->getKnobItemsTable(); if (parentItem) { TableItemAnimPtr anim(TableItemAnim::create(getModel(), table, shared_from_this(), item, parentAnim->getRootItem())); parentAnim->insertChild(index, anim); } else { TableItemAnimPtr anim(TableItemAnim::create(getModel(), table, shared_from_this(), item, _imp->nameItem)); if (index < 0 || index >= (int)_imp->topLevelTableItems.size()) { _imp->topLevelTableItems.push_back(anim); } else { std::vector<TableItemAnimPtr>::iterator it = _imp->topLevelTableItems.begin(); std::advance(it, index); _imp->topLevelTableItems.insert(it, anim); } } }
QPixmap KnobGuiButton::loadPixmapInternal(bool checked, bool applyColorOverlay, const QColor& overlayColor) { KnobGuiPtr knobUI = getKnobGui(); KnobButtonPtr knob = _knob.lock(); EffectInstancePtr isEffect = toEffectInstance( knob->getHolder() ); KnobTableItemPtr isTableItem = toKnobTableItem(knob->getHolder()); if (isTableItem) { isEffect = isTableItem->getModel()->getNode()->getEffectInstance(); } QString filePath; if (knobUI->getLayoutType() == KnobGui::eKnobLayoutTypeViewerUI) { filePath = QString::fromUtf8( knob->getInViewerContextIconFilePath(checked).c_str() ); } else { filePath = QString::fromUtf8( knob->getIconLabel(checked).c_str() ); } if ( !filePath.isEmpty() && !QFile::exists(filePath) ) { if (isEffect) { //Prepend the resources path QString resourcesPath = QString::fromUtf8( isEffect->getNode()->getPluginResourcesPath().c_str() ); if ( !resourcesPath.endsWith( QLatin1Char('/') ) ) { resourcesPath += QLatin1Char('/'); } filePath.prepend(resourcesPath); } } if ( !filePath.isEmpty() ) { #if 0 QPixmap pix; if (pix.load(filePath)) { return pix; } #else QImage img; if ( img.load(filePath) ) { if (applyColorOverlay) { int depth = img.depth(); if (depth != 32) { img = img.convertToFormat(QImage::Format_ARGB32); } depth = img.depth(); assert(depth == 32); for (int y = 0; y < img.height(); ++y) { QRgb* pix = (QRgb*)img.scanLine(y); for (int x = 0; x < img.width(); ++x) { QRgb srcPix = pix[x]; double a = qAlpha(srcPix) / 255.f; double r = qRed(srcPix) / 255.f * a; double g = qGreen(srcPix) / 255.f * a; double b = qBlue(srcPix) / 255.f * a; r = Image::clamp(overFunctor(overlayColor.redF(), r, overlayColor.alphaF()), 0., 1.); g = Image::clamp(overFunctor(overlayColor.greenF(), g, overlayColor.alphaF()), 0., 1.); b = Image::clamp(overFunctor(overlayColor.blueF(), b, overlayColor.alphaF()), 0., 1.); a = Image::clamp(overFunctor(overlayColor.alphaF(), a, overlayColor.alphaF()) * a, 0., 1.); QRgb p = qRgba(r * 255, g * 255, b * 255, a * 255); img.setPixel(x, y, p); } } } QPixmap pix = QPixmap::fromImage(img); return pix; } #endif } return QPixmap(); } // loadPixmapInternal