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