1 //=========================================================
2 //  MusE
3 //  Linux Music Editor
4 //    $Id: citem.h,v 1.2.2.1 2006/10/04 18:45:35 spamatica Exp $
5 //  (C) Copyright 1999 Werner Schweer (ws@seh.de)
6 //
7 //  This program is free software; you can redistribute it and/or
8 //  modify it under the terms of the GNU General Public License
9 //  as published by the Free Software Foundation; version 2 of
10 //  the License, or (at your option) any later version.
11 //
12 //  This program is distributed in the hope that it will be useful,
13 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 //  GNU General Public License for more details.
16 //
17 //  You should have received a copy of the GNU General Public License
18 //  along with this program; if not, write to the Free Software
19 //  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 //
21 //=========================================================
22 
23 #ifndef __CITEM_H__
24 #define __CITEM_H__
25 
26 #include <list>
27 #include <map>
28 #include <set>
29 #include <QPoint>
30 #include <QRect>
31 
32 #include "event.h"
33 
34 
35 // Forward declarations:
36 namespace MusECore {
37 class Part;
38 class Pos;
39 }
40 
41 namespace MusEGui {
42 
43 //---------------------------------------------------------
44 //   CItem
45 //    virtuelle Basisklasse fr alle Canvas Item's
46 //---------------------------------------------------------
47 
48 class CItem {
49    protected:
50       bool _isSelected;
51       bool _isMoving;
52 
53    public:
54       CItem();
~CItem()55       virtual ~CItem() {}
56 
isObjectInRange(const MusECore::Pos &,const MusECore::Pos &)57       virtual bool isObjectInRange(const MusECore::Pos&, const MusECore::Pos&) const { return false; }
58 
isMoving()59       bool isMoving() const        { return _isMoving;  }
setMoving(bool f)60       void setMoving(bool f)       { _isMoving = f;     }
isSelected()61       bool isSelected() const { return _isSelected; }
setSelected(bool f)62       void setSelected(bool f) { _isSelected = f; }
objectIsSelected()63       virtual bool objectIsSelected() const { return false; }
64 
width()65       virtual int width() const            { return 0; }
setWidth(int)66       virtual void setWidth(int)           { }
setHeight(int)67       virtual void setHeight(int)          { }
setMp(const QPoint &)68       virtual void setMp(const QPoint&)    { }
mp()69       virtual const QPoint mp() const      { return QPoint(); }
x()70       virtual int x() const                { return 0; }
y()71       virtual int y() const                { return 0; }
setY(int)72       virtual void setY(int)               { }
pos()73       virtual QPoint pos() const           { return QPoint(); }
setPos(const QPoint &)74       virtual void setPos(const QPoint&)   { }
height()75       virtual int height() const           { return 0; }
bbox()76       virtual QRect bbox() const           { return QRect(); }
setBBox(const QRect &)77       virtual void setBBox(const QRect&)   { }
move(const QPoint &)78       virtual void move(const QPoint&)     { }
setTopLeft(const QPoint &)79       virtual void setTopLeft(const QPoint&)     { }
contains(const QPoint &)80       virtual bool contains(const QPoint&) const  { return false; }
intersects(const QRect &)81       virtual bool intersects(const QRect&) const { return false; }
82 
event()83       virtual MusECore::Event event() const   { return MusECore::Event();  }
setEvent(const MusECore::Event &)84       virtual void setEvent(const MusECore::Event&) { }
part()85       virtual MusECore::Part* part() const    { return NULL; }
setPart(MusECore::Part *)86       virtual void setPart(MusECore::Part*)   { }
87       };
88 
89 
90 //---------------------------------------------------------
91 //   BItem
92 //    Boxed canvas item.
93 //---------------------------------------------------------
94 
95 class BItem : public CItem {
96    protected:
97       QPoint moving;
98       QRect  _bbox;
99       QPoint _pos;
100 
101    public:
102       BItem(const QPoint& p, const QRect& r);
BItem()103       BItem() { }
104 
width()105       int width() const            { return _bbox.width(); }
setWidth(int l)106       void setWidth(int l)         { _bbox.setWidth(l); }
setHeight(int l)107       void setHeight(int l)        { _bbox.setHeight(l); }
setMp(const QPoint & p)108       void setMp(const QPoint&p)   { moving = p;    }
mp()109       const QPoint mp() const      { return moving; }
x()110       int x() const                { return _pos.x(); }
y()111       int y() const                { return _pos.y(); }
setY(int y)112       void setY(int y)             { _bbox.setY(y); }
pos()113       QPoint pos() const           { return _pos; }
setPos(const QPoint & p)114       void setPos(const QPoint& p) { _pos = p;    }
height()115       int height() const           { return _bbox.height(); }
bbox()116       QRect bbox() const           { return _bbox; }
setBBox(const QRect & r)117       void setBBox(const QRect& r) { _bbox = r; }
move(const QPoint & tl)118       void move(const QPoint& tl)  {
119             _bbox.moveTopLeft(tl);
120             _pos = tl;
121             }
setTopLeft(const QPoint & tl)122       void setTopLeft(const QPoint &tl) {
123           _bbox.setTopLeft(tl);
124           _pos = tl;
125       }
contains(const QPoint & p)126       bool contains(const QPoint& p) const  { return _bbox.contains(p); }
intersects(const QRect & r)127       bool intersects(const QRect& r) const { return r.intersects(_bbox); }
128       };
129 
130 //---------------------------------------------------------
131 //   PItem
132 //    Event canvas item with a boxed part only.
133 //---------------------------------------------------------
134 
135 class PItem : public BItem {
136    protected:
137       MusECore::Part* _part;
138 
139    public:
140       PItem(const QPoint& p, const QRect& r);
141       PItem();
142       PItem(MusECore::Part* p);
143 
144       virtual bool objectIsSelected() const;
part()145       MusECore::Part* part() const          { return _part; }
setPart(MusECore::Part * p)146       void setPart(MusECore::Part* p)       { _part = p; }
147       };
148 
149 //---------------------------------------------------------
150 //   EItem
151 //    Event canvas item base class with a boxed event in a part.
152 //---------------------------------------------------------
153 
154 class EItem : public PItem {
155    protected:
156       MusECore::Event _event;
157 
158    public:
159       EItem(const QPoint& p, const QRect& r);
EItem()160       EItem() { }
161       EItem(const MusECore::Event& e, MusECore::Part* p);
162 
163       bool isObjectInRange(const MusECore::Pos&, const MusECore::Pos&) const;
164 
objectIsSelected()165       bool objectIsSelected() const { return _event.selected(); }
166 
event()167       MusECore::Event event() const               { return _event;  }
setEvent(const MusECore::Event & e)168       void setEvent(const MusECore::Event& e)     { _event = e;     }
169       };
170 
171 
172 //---------------------------------------------------------
173 //   CItemMap
174 //    Canvas Item map
175 //---------------------------------------------------------
176 
177 typedef std::multimap<int, CItem*, std::less<int> >::iterator iCItem;
178 typedef std::multimap<int, CItem*, std::less<int> >::const_iterator ciCItem;
179 typedef std::multimap<int, CItem*, std::less<int> >::const_reverse_iterator rciCItem;
180 typedef std::pair<iCItem, iCItem> iCItemRange;
181 
182 class CItemMap: public std::multimap<int, CItem*, std::less<int> > {
183    public:
184       void add(CItem*);
185       CItem* find(const QPoint& pos) const;
clearDelete()186       void clearDelete() {
187             for (iCItem i = begin(); i != end(); ++i)
188                   delete i->second;
189             clear();
190             }
191       };
192 
193 //---------------------------------------------------------
194 //   CItemList
195 //   Simple list of CItem pointers.
196 //---------------------------------------------------------
197 
198 typedef std::list<CItem*>::iterator iCItemList;
199 typedef std::list<CItem*>::const_iterator ciCItemList;
200 
201 class CItemList: public std::list<CItem*> {
202    public:
add(CItem * item)203       void add(CItem* item) { push_back(item); }
clearDelete()204       void clearDelete() {
205         for(ciCItemList i = begin(); i != end(); ++i) {
206           CItem* ce = *i;
207           if(ce)
208             delete ce;
209         }
210         clear();
211       }
find(const CItem * item)212       iCItemList find(const CItem* item) {
213         for(iCItemList i = begin(); i != end(); ++i) {
214           if(*i == item)
215             return i;
216         }
217         return end();
218       }
cfind(const CItem * item)219       ciCItemList cfind(const CItem* item) const {
220         for(ciCItemList i = cbegin(); i != cend(); ++i) {
221           if(*i == item)
222             return i;
223         }
224         return cend();
225       }
226 };
227 
228 //---------------------------------------------------------
229 //   CItemSet
230 //   Simple set of unique CItem pointers.
231 //---------------------------------------------------------
232 
233 typedef std::set<CItem*>::iterator iCItemSet;
234 typedef std::set<CItem*>::const_iterator ciCItemSet;
235 
236 class CItemSet: public std::set<CItem*> {
237    public:
add(CItem * item)238       void add(CItem* item) { insert(item); }
clearDelete()239       void clearDelete() {
240         for(ciCItemSet i = begin(); i != end(); ++i) {
241           CItem* ce = *i;
242           if(ce)
243             delete ce;
244         }
245         clear();
246       }
247 };
248 
249 } // namespace MusEGui
250 
251 #endif
252 
253