File indexing completed on 2024-12-01 05:12:55
0001 /*************************************************************************** 0002 * Copyright (C) 2005 by David Saxton * 0003 * david@bluehaze.org * 0004 * * 0005 * This program is free software; you can redistribute it and/or modify * 0006 * it under the terms of the GNU General Public License as published by * 0007 * the Free Software Foundation; either version 2 of the License, or * 0008 * (at your option) any later version. * 0009 ***************************************************************************/ 0010 0011 #include "mechanicsgroup.h" 0012 #include "mechanicsdocument.h" 0013 #include "mechanicsitem.h" 0014 0015 MechanicsGroup::MechanicsGroup(MechanicsDocument *mechanicsDocument) 0016 : ItemGroup(mechanicsDocument) 0017 { 0018 b_isRaised = false; 0019 } 0020 0021 MechanicsGroup::~MechanicsGroup() 0022 { 0023 } 0024 0025 bool MechanicsGroup::addItem(Item *item) 0026 { 0027 if (!item || !item->canvas() || m_itemList.contains(item)) { 0028 return false; 0029 } 0030 0031 // Check that the item's parent isn't already selected 0032 Item *parent = item->parentItem(); 0033 while (parent) { 0034 if (m_itemList.contains(parent)) 0035 return false; 0036 parent = parent->parentItem(); 0037 } 0038 removeChildren(item); 0039 0040 registerItem(item); 0041 updateInfo(); 0042 item->setSelected(true); 0043 if (MechanicsItem *mechanicsItem = dynamic_cast<MechanicsItem *>(item)) 0044 mechanicsItem->setRaised(b_isRaised); 0045 emit itemAdded(item); 0046 return true; 0047 } 0048 0049 bool MechanicsGroup::removeItem(Item *item) 0050 { 0051 if (!item || !m_itemList.contains(item)) { 0052 return false; 0053 } 0054 unregisterItem(item); 0055 updateInfo(); 0056 item->setSelected(false); 0057 MechanicsItem *mechanicsItem = dynamic_cast<MechanicsItem *>(item); 0058 if (mechanicsItem) 0059 mechanicsItem->setRaised(false); 0060 emit itemRemoved(item); 0061 return true; 0062 } 0063 0064 void MechanicsGroup::removeChildren(Item *item) 0065 { 0066 if (!item) 0067 return; 0068 0069 const ItemList children = item->children(); 0070 const ItemList::const_iterator end = children.end(); 0071 for (ItemList::const_iterator it = children.begin(); it != end; ++it) { 0072 removeChildren(*it); 0073 removeItem(*it); 0074 } 0075 } 0076 0077 void MechanicsGroup::setRaised(bool isRaised) 0078 { 0079 b_isRaised = isRaised; 0080 const ItemList::iterator end = m_itemList.end(); 0081 for (ItemList::iterator it = m_itemList.begin(); it != end; ++it) { 0082 MechanicsItem *mechanicsItem = dynamic_cast<MechanicsItem *>(static_cast<Item *>(*it)); 0083 if (mechanicsItem) 0084 mechanicsItem->setRaised(b_isRaised); 0085 } 0086 } 0087 0088 void MechanicsGroup::setSelectionMode(uint sm) 0089 { 0090 const ItemList::iterator end = m_itemList.end(); 0091 for (ItemList::iterator it = m_itemList.begin(); it != end; ++it) { 0092 MechanicsItem *mechanicsItem = dynamic_cast<MechanicsItem *>(static_cast<Item *>(*it)); 0093 if (mechanicsItem) 0094 mechanicsItem->setSelectionMode(static_cast<MechanicsItem::SelectionMode>(sm)); 0095 } 0096 } 0097 0098 MechanicsItemList MechanicsGroup::extractMechanicsItems() const 0099 { 0100 MechanicsItemList mechanicsItemList; 0101 0102 const ItemList::const_iterator end = m_itemList.end(); 0103 for (ItemList::const_iterator it = m_itemList.begin(); it != end; ++it) { 0104 MechanicsItem *mechanicsItem = dynamic_cast<MechanicsItem *>(static_cast<Item *>(*it)); 0105 if (mechanicsItem) 0106 mechanicsItemList.append(mechanicsItem); 0107 } 0108 0109 return mechanicsItemList; 0110 } 0111 0112 MechanicsItemList MechanicsGroup::toplevelMechItemList() const 0113 { 0114 MechanicsItemList toplevel; 0115 0116 MechanicsItemList mechItemList = extractMechanicsItems(); 0117 0118 const MechanicsItemList::const_iterator end = mechItemList.end(); 0119 for (MechanicsItemList::const_iterator it = mechItemList.begin(); it != end; ++it) { 0120 MechanicsItem *parent = *it; 0121 while (parent) { 0122 if (!parent->parentItem() && !toplevel.contains(parent)) 0123 toplevel.append(parent); 0124 0125 parent = dynamic_cast<MechanicsItem *>(parent->parentItem()); 0126 } 0127 } 0128 0129 return toplevel; 0130 } 0131 0132 void MechanicsGroup::setSelected(bool sel) 0133 { 0134 const ItemList::iterator end = m_itemList.end(); 0135 for (ItemList::iterator it = m_itemList.begin(); it != end; ++it) { 0136 if (*it && (*it)->isSelected() != sel) { 0137 (*it)->setSelected(sel); 0138 } 0139 } 0140 } 0141 0142 bool MechanicsGroup::addQCanvasItem(KtlQCanvasItem *item) 0143 { 0144 return addItem(dynamic_cast<Item *>(item)); 0145 } 0146 0147 bool MechanicsGroup::contains(KtlQCanvasItem *item) const 0148 { 0149 return m_itemList.contains(dynamic_cast<Item *>(item)); 0150 } 0151 0152 void MechanicsGroup::deleteAllItems() 0153 { 0154 const ItemList::iterator end = m_itemList.end(); 0155 for (ItemList::iterator it = m_itemList.begin(); it != end; ++it) { 0156 if (*it) 0157 (*it)->removeItem(); 0158 } 0159 0160 removeAllItems(); 0161 } 0162 0163 void MechanicsGroup::mergeGroup(ItemGroup *itemGroup) 0164 { 0165 MechanicsGroup *group = dynamic_cast<MechanicsGroup *>(itemGroup); 0166 if (!group) { 0167 return; 0168 } 0169 0170 const ItemList items = group->items(); 0171 const ItemList::const_iterator end = items.end(); 0172 for (ItemList::const_iterator it = items.begin(); it != end; ++it) { 0173 addItem(*it); 0174 } 0175 } 0176 0177 void MechanicsGroup::removeAllItems() 0178 { 0179 while (!m_itemList.isEmpty()) 0180 removeItem(m_itemList.first()); 0181 } 0182 0183 void MechanicsGroup::removeQCanvasItem(KtlQCanvasItem *item) 0184 { 0185 removeItem(dynamic_cast<Item *>(item)); 0186 } 0187 0188 void MechanicsGroup::setItems(KtlQCanvasItemList list) 0189 { 0190 { 0191 ItemList removeList; 0192 const ItemList::iterator end = m_itemList.end(); 0193 for (ItemList::iterator it = m_itemList.begin(); it != end; ++it) { 0194 if (!list.contains(*it)) { 0195 removeList.append(*it); 0196 } 0197 } 0198 const ItemList::iterator rend = removeList.end(); 0199 for (ItemList::iterator it = removeList.begin(); it != rend; ++it) { 0200 removeItem(*it); 0201 (*it)->setSelected(false); 0202 } 0203 } 0204 0205 const KtlQCanvasItemList::iterator end = list.end(); 0206 for (KtlQCanvasItemList::iterator it = list.begin(); it != end; ++it) { 0207 // We don't need to check that we've already got the item as it will 0208 // be checked in the function call 0209 addQCanvasItem(*it); 0210 } 0211 } 0212 0213 void MechanicsGroup::updateInfo() 0214 { 0215 } 0216 0217 #include "moc_mechanicsgroup.cpp"