~inkscape.dev/inkscape/trunk

« back to all changes in this revision

Viewing changes to src/ui/control-manager.cpp

  • Committer: Martin Owens
  • Date: 2016-04-02 18:21:12 UTC
  • Revision ID: doctormo@gmail.com-20160402182112-c5bpd40v98htjhcj
Fix node size regression and add ctrlResize property for multiple use.

Show diffs side-by-side

added added

removed removed

Lines of Context:
54
54
 
55
55
} // namespace
56
56
 
57
 
#define FILL_COLOR_NORMAL 0xffffff7f
58
 
#define FILL_COLOR_MOUSEOVER 0xff0000ff
59
 
 
60
57
// Default color for line:
61
58
#define LINE_COLOR_PRIMARY 0x0000ff7f
62
59
#define LINE_COLOR_SECONDARY 0xff00007f
83
80
 
84
81
    bool setControlType(SPCanvasItem *item, ControlType type);
85
82
 
 
83
    bool setControlResize(SPCanvasItem *item, int ctrlResize);
 
84
 
86
85
    void setSelected(SPCanvasItem *item, bool selected);
87
86
 
88
87
private:
108
107
    ControlManager &_manager;
109
108
    sigc::signal<void> _sizeChangedSignal;
110
109
    PrefListener _prefHook;
111
 
    int _size;
 
110
    int _size;   // Size from the grabsize preference
 
111
    int _resize; // Way size should change from grabsize
112
112
    std::vector<SPCanvasItem *> _itemList;
113
113
    std::map<Inkscape::ControlType, std::vector<int> > _sizeTable;
114
114
    std::map<Inkscape::ControlType, GType> _typeTable;
115
115
    std::map<Inkscape::ControlType, SPCtrlShapeType> _ctrlToShape;
116
 
    std::set<Inkscape::ControlType> _sizeChangers;
 
116
    std::set<Inkscape::ControlType> _resizeOnSelect;
117
117
};
118
118
 
119
119
ControlManagerImpl::ControlManagerImpl(ControlManager &manager) :
121
121
    _sizeChangedSignal(),
122
122
    _prefHook(*this),
123
123
    _size(3),
 
124
    _resize(3),
124
125
    _itemList(),
125
126
    _sizeTable()
126
127
{
153
154
 
154
155
    // -------
155
156
 
156
 
    _sizeChangers.insert(CTRL_TYPE_NODE_AUTO);
157
 
    _sizeChangers.insert(CTRL_TYPE_NODE_CUSP);
158
 
    _sizeChangers.insert(CTRL_TYPE_NODE_SMOOTH);
159
 
    _sizeChangers.insert(CTRL_TYPE_NODE_SYMETRICAL);
 
157
    _resizeOnSelect.insert(CTRL_TYPE_NODE_AUTO);
 
158
    _resizeOnSelect.insert(CTRL_TYPE_NODE_CUSP);
 
159
    _resizeOnSelect.insert(CTRL_TYPE_NODE_SMOOTH);
 
160
    _resizeOnSelect.insert(CTRL_TYPE_NODE_SYMETRICAL);
160
161
 
161
162
    // -------
162
163
 
234
235
            item = sp_canvas_item_new(parent, SP_TYPE_CTRL,
235
236
                                      "size", targetSize,
236
237
                                      "filled", 1,
237
 
                                      "fill_color", FILL_COLOR_NORMAL,
 
238
                                      "fill_color", 0xffffff7f,
238
239
                                      "stroked", 1,
239
240
                                      "stroke_color", 0x000000ff,
240
241
                                      NULL);
284
285
void ControlManagerImpl::updateItem(SPCanvasItem *item)
285
286
{
286
287
    if (item) {
287
 
        double target = _sizeTable[item->ctrlType][_size - 1];
 
288
        double target = _sizeTable[item->ctrlType][_size - 1] + item->ctrlResize;
288
289
 
289
 
        if (_sizeChangers.count(item->ctrlType) && _manager.isSelected(item)) {
290
 
            target += 2;
291
 
        }
292
290
        g_object_set(item, "size", target, NULL);
293
291
 
294
292
        sp_canvas_item_request_update(item);
303
301
        accepted = true;
304
302
    } else if (item) {
305
303
        if (_ctrlToShape.count(type) && (_typeTable[type] == _typeTable[item->ctrlType])) { // compatible?
306
 
            double targetSize = _sizeTable[type][_size - 1];
307
 
            if (_manager.isSelected(item) && _sizeChangers.count(item->ctrlType)) {
308
 
                targetSize += 2.0;
309
 
            }
 
304
            double targetSize = _sizeTable[type][_size - 1] + item->ctrlResize;
310
305
            SPCtrlShapeType targetShape = _ctrlToShape[type];
 
306
 
311
307
            g_object_set(item, "shape", targetShape, "size", targetSize, NULL);
312
308
            item->ctrlType = type;
313
309
            accepted = true;
317
313
    return accepted;
318
314
}
319
315
 
 
316
bool ControlManagerImpl::setControlResize(SPCanvasItem *item, int ctrlResize)
 
317
{
 
318
    if(item) {
 
319
        item->ctrlResize = ctrlResize;
 
320
        double targetSize = _sizeTable[item->ctrlType][_size - 1] + item->ctrlResize;
 
321
        g_object_set(item, "size", targetSize, NULL);
 
322
        return true;
 
323
    }
 
324
    return false;
 
325
}
320
326
 
321
327
void ControlManagerImpl::setSelected(SPCanvasItem *item, bool selected)
322
328
{
323
329
    if (_manager.isSelected(item) != selected) {
324
330
        item->ctrlFlags ^= CTRL_FLAG_SELECTED; // toggle, since we know it is different
325
331
 
 
332
        if (selected && _resizeOnSelect.count(item->ctrlType)) {
 
333
            item->ctrlResize = 2;
 
334
        }
 
335
 
326
336
        // TODO refresh colors
327
 
        double targetSize = _sizeTable[item->ctrlType][_size - 1];
328
 
        if (selected && _sizeChangers.count(item->ctrlType)) {
329
 
            targetSize += 2.0;
330
 
        }
 
337
        double targetSize = _sizeTable[item->ctrlType][_size - 1] + _resize;
331
338
        g_object_set(item, "size", targetSize, NULL);
332
339
    }
333
340
}
431
438
    return _impl->setControlType(item, type);
432
439
}
433
440
 
 
441
bool ControlManager::setControlResize(SPCanvasItem *item, int ctrlResize)
 
442
{
 
443
    return _impl->setControlResize(item, ctrlResize);
 
444
}
 
445
 
434
446
bool ControlManager::isActive(SPCanvasItem *item) const
435
447
{
436
448
    return (item->ctrlFlags & CTRL_FLAG_ACTIVE) != 0;