summaryrefslogtreecommitdiffstats
path: root/src/gui/kdeext/QCanvasGroupableItem.h
blob: b7d4fbbb9a522a7e81b1e5a60cdf27d83edf3b0c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
// -*- c-basic-offset: 4 -*-

/*
    Rosegarden
    A sequencer and musical notation editor.

    This program is Copyright 2000-2008
        Guillaume Laurent   <[email protected]>,
        Chris Cannam        <[email protected]>,
        Richard Bown        <[email protected]>

    The moral right of the authors to claim authorship of this work
    has been asserted.

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of the
    License, or (at your option) any later version.  See the file
    COPYING included with this distribution for more information.
*/

#ifndef TQCANVASGROUPABLEITEM_H
#define TQCANVASGROUPABLEITEM_H

#include <tqcanvas.h>

class TQCanvasItemGroup;

/**
 * This class is meant to be inherited by TQCanvasItem tqchildren to make
 * them groupable.
 *
 * On destruction, the item will remove itself from the group it's
 * attached to.
 *
 * @see QCanvasSpriteGroupable
 * @see TQCanvasLineGroupable
 */
class QCanvasGroupableItem
{
    friend class TQCanvasItemGroup;

public:

    /**
     * Create a groupable item, e.g. put the item in the specified
     * TQCanvasItemGroup. If withRelativeCoords is true, the item's
     * position will be translated so that it's coordinates are
     * relative to those of the item group.
     *
     * @see TQCanvasItemGroup#addItemWithRelativeCoords()
     */
    QCanvasGroupableItem(TQCanvasItem*, TQCanvasItemGroup*,
                         bool withRelativeCoords = false);

    virtual ~QCanvasGroupableItem();

    /// Returns the TQCanvasItemGroup this groupable item belongs to
    TQCanvasItemGroup* group() { return m_group; }

    /// Returns the TQCanvasItemGroup this groupable item belongs to
    const TQCanvasItemGroup* group() const { return m_group; }

    /// Returns the TQCanvasItem which this groupable item wraps
    TQCanvasItem *item() { return m_item; }

    /**
     * Same as moveBy(), except that the move is done relative to the
     * item group's coordinates
     */
    virtual void relativeMoveBy(double dx, double dy);

protected:
    /**
     * Detach item from the item group - called by TQCanvasItemGroup only
     *
     * Set m_group to 0, so that on destruction the item won't try to
     * remove itself from the group
     */
    void detach();
    
private:
    //--------------- Data members ---------------------------------

    TQCanvasItemGroup* m_group;
    TQCanvasItem*      m_item;

};


/**
 * This class implements TQCanvasItem groups
 *
 * An item group will keep its items in a fixed relative position when
 * moved, just like in a drawing program where you can "bind" several
 * items together so that they'll behave as a single item.
 *
 * Proper behavior requires collaboration from the TQCanvasView,
 * though. When about to move an item, the TQCanvasView object should
 * first check if it's not a groupable item, and if so fetch its
 * TQCanvasItemGroup and move it instead.
 */
class TQCanvasItemGroup : public TQCanvasItem
{
public: 
    TQCanvasItemGroup(TQCanvas *);
    virtual ~TQCanvasItemGroup();

    virtual void moveBy(double dx, double dy);
    virtual void advance(int stage);
    virtual bool collidesWith(const TQCanvasItem*) const;
    virtual void draw(TQPainter&);
    virtual void setVisible(bool yes);
    virtual void setSelected(bool yes);
    virtual void setEnabled(bool yes);
    virtual void setActive(bool yes);
    virtual int rtti() const;
    virtual TQRect boundingRect() const;
    virtual TQRect boundingRectAdvanced() const;

    /**
     * Add a new item to this group.
     *
     * The item's coordinates are kept as is.
     *
     * @see addItemWithRelativeCoords()
     */
    virtual void addItem(TQCanvasItem *);

    /**
     * Add a new item to this group.
     *
     * The item's coordinates are considered relative to the group.
     * For example, suppose you have a TQCanvasItemGroup whose coords
     * are 10,10. If you call addItemWithRelativeCoords() with an item
     * whose coords are 5,5, the item is moved so that its coords
     * will be 5,5 relative to the group (e.g. 15,15).
     *
     * @see addItem()
     */
    virtual void addItemWithRelativeCoords(TQCanvasItem *);

    /**
     * Remove the specified item from the group
     */
    virtual void removeItem(TQCanvasItem*);

private:
    virtual bool collidesWith(const TQCanvasSprite*,
                              const TQCanvasPolygonalItem*,
                              const TQCanvasRectangle*,
                              const TQCanvasEllipse*,
                              const TQCanvasText* ) const;

protected:
    //--------------- Data members ---------------------------------

    TQCanvasItemList m_items;
};


/**
 * A TQCanvasLine which can be put in a QCanvasGroup
 */
class TQCanvasLineGroupable : public TQCanvasLine, public QCanvasGroupableItem
{
public: 
    TQCanvasLineGroupable(TQCanvas *c, TQCanvasItemGroup *g);
};

/**
 * A TQCanvasRectangle which can be put in a QCanvasGroup
 */
class TQCanvasRectangleGroupable : public TQCanvasRectangle, public QCanvasGroupableItem
{
public: 
    TQCanvasRectangleGroupable(TQCanvas *c, TQCanvasItemGroup *g);
};

/**
 * A TQCanvasText which can be put in a QCanvasGroup
 */
class TQCanvasTextGroupable : public TQCanvasText, public QCanvasGroupableItem
{
public: 
    TQCanvasTextGroupable(TQCanvas *c, TQCanvasItemGroup *g);
    TQCanvasTextGroupable(const TQString&, TQCanvas *c, TQCanvasItemGroup *g);
};

/**
 * A QCanvasSprite that can be put in a QCanvasGroup
 */
class TQCanvasSpriteGroupable : public TQCanvasSprite, public QCanvasGroupableItem
{
public:
    TQCanvasSpriteGroupable(TQCanvasPixmapArray*,
                           TQCanvas*,
                           TQCanvasItemGroup*);
};

#endif