Fabric.js - Grouped iText not editable

前端 未结 5 1017
暗喜
暗喜 2021-01-04 13:11

The title says all. When a fabric.ITextis part of a fabric.Group, it no longer reacts like a editable text.

Here is a use-case: http://jsfi

5条回答
  •  没有蜡笔的小新
    2021-01-04 13:26

    I know is too late, but here is a working code for your problem: http://jsfiddle.net/fd4yrxq6/2/

    I just made some little changes using the anwares above:

    ...
    // ungroup objects in group
    var items;
    var ungroup = function (group) {
        items = group._objects;
        group._restoreObjectsState();
        canvas.remove(group);
        canvas.renderAll();
        for (var i = 0; i < items.length; i++) {
            canvas.add(items[i]);
        }
        // if you have disabled render on addition
        canvas.renderAll();
    };
    ...
    dimensionText.on('editing:exited', function () {
            for (var i = 0; i < items.length; i++) {
            canvas.remove(items[i]);
        }
        var grp = new fabric.Group(items, {});
        canvas.add(grp);
        grp.on('mousedown', fabricDblClick(grp, function (obj) {
            ungroup(grp);
            canvas.setActiveObject(dimensionText);
            dimensionText.enterEditing();
            dimensionText.selectAll();
        }));
    });
    ...
    

    var canvas = new fabric.Canvas('canvas');
    canvas.setWidth(300);
    canvas.setHeight(300);
    
    // Double-click event handler
    var fabricDblClick = function (obj, handler) {
        return function () {
            if (obj.clicked) handler(obj);
            else {
                obj.clicked = true;
                setTimeout(function () {
                    obj.clicked = false;
                }, 500);
            }
        };
    };
    
    // ungroup objects in group
    var items;
    var ungroup = function (group) {
        items = group._objects;
        group._restoreObjectsState();
        canvas.remove(group);
        canvas.renderAll();
        for (var i = 0; i < items.length; i++) {
            canvas.add(items[i]);
        }
        // if you have disabled render on addition
        canvas.renderAll();
    };
    
    // Re-group when text editing finishes
    var dimensionText = new fabric.IText("Dimension Text", {
        fontFamily: 'Comic Sans',
        fontSize: 14,
        stroke: '#000',
        strokeWidth: 1,
        fill: "#000",
        left: 170,
        top: 60
    });
    dimensionText.on('editing:exited', function () {
            for (var i = 0; i < items.length; i++) {
            canvas.remove(items[i]);
        }
        var grp = new fabric.Group(items, {});
        canvas.add(grp);
        grp.on('mousedown', fabricDblClick(grp, function (obj) {
            ungroup(grp);
            canvas.setActiveObject(dimensionText);
            dimensionText.enterEditing();
            dimensionText.selectAll();
        }));
    });
    
    function addRuler() {
        var dimension_mark = new fabric.Path('M0,0L0,-5L0,5L0,0L150,0L150,-5L150,5L150,0z');
        dimension_mark.set({
            left: 150,
            top: 70,
            stroke: '#333333',
            strokeWidth: 2,
            scaleY: 1
        });
        var dimension_group = new fabric.Group([dimension_mark, dimensionText], {
            left: 50,
            top: 50
        });
        canvas.add(dimension_group);
        dimension_group.on('mousedown', fabricDblClick(dimension_group, function (obj) {
            ungroup(dimension_group);
            canvas.setActiveObject(dimensionText);
            dimensionText.enterEditing();
            dimensionText.selectAll();
            canvas.renderAll();
        }));
    }
    addRuler();
    
    style = {
            left: 100,
            top: 100,
            width: 20,
            height: 20,
            fill: "green",
            lockRotation: true
        };
        var rectangle = new fabric.Polygon([
            { x: 20, y: 0 },
            { x: 0, y: 20 },
            { x: 20, y: 40 },
            { x: 40, y: 20 },
        ], style);
        canvas.add(rectangle);
    .canvas {
        border: 1px solid Black;
        width: 300px;
        height: 300px;
    }
    
    

    Fabric.js - iText editing from Group

提交回复
热议问题