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() );

}
Example #3
0
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();
}
Example #5
0
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();

}
Example #6
0
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);
        }
    }

}
Example #7
0
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