File indexing completed on 2024-05-05 05:46:03
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 "bussplitter.h" 0012 #include "ecnode.h" 0013 #include "libraryitem.h" 0014 #include "wire.h" 0015 0016 #include <KLocalizedString> 0017 #include <QPainter> 0018 0019 Item *BusSplitter::construct(ItemDocument *itemDocument, bool newItem, const char *id) 0020 { 0021 return new BusSplitter(static_cast<ICNDocument *>(itemDocument), newItem, id); 0022 } 0023 0024 LibraryItem *BusSplitter::libraryItem() 0025 { 0026 return new LibraryItem(QStringList(QString("ec/bus")), i18n("Bus"), i18n("Connections"), "bus.png", LibraryItem::lit_component, BusSplitter::construct); 0027 } 0028 0029 const unsigned MAX_BUS_SIZE = 10000; 0030 0031 BusSplitter::BusSplitter(ICNDocument *icnDocument, bool newItem, const char *id) 0032 : Component(icnDocument, newItem, id ? id : "Bus") 0033 { 0034 m_name = i18n("Bus Splitter"); 0035 0036 m_busSize = 0; 0037 init1PinLeft(); 0038 m_pInNode = m_pNNode[0]; 0039 0040 createProperty("size", Variant::Type::Int); 0041 property("size")->setCaption(i18n("Size")); 0042 property("size")->setMinValue(1); 0043 property("size")->setMaxValue(MAX_BUS_SIZE); 0044 property("size")->setValue(8); 0045 } 0046 0047 BusSplitter::~BusSplitter() 0048 { 0049 } 0050 0051 void BusSplitter::dataChanged() 0052 { 0053 unsigned busSize = dataInt("size"); 0054 0055 if (busSize < 1) 0056 busSize = 1; 0057 0058 else if (busSize > MAX_BUS_SIZE) 0059 busSize = MAX_BUS_SIZE; 0060 0061 if (busSize == m_busSize) 0062 return; 0063 0064 m_pInNode->setNumPins(busSize); 0065 0066 if (busSize > m_busSize) { 0067 m_pWires.resize(busSize); 0068 for (unsigned i = m_busSize; i < unsigned(busSize); i++) { 0069 Pin *pin = createPin(16, 0, 180, outNodeID(i))->pin(); 0070 m_pWires[i] = new Wire(m_pInNode->pin(i), pin); 0071 } 0072 } else { 0073 for (unsigned i = busSize; i < unsigned(m_busSize); i++) { 0074 removeNode(outNodeID(i)); 0075 delete m_pWires[i]; 0076 } 0077 m_pWires.resize(busSize); 0078 } 0079 m_busSize = busSize; 0080 0081 // Position pins 0082 setSize(0, -int(m_busSize + 1) * 8, 8, int(m_busSize + 1) * 16, true); 0083 for (int i = 0; i < int(m_busSize); i++) 0084 m_nodeMap[outNodeID(i)].y = 16 * i - int(m_busSize + 1) * 8 + 24; 0085 m_nodeMap["n1"].y = -int(m_busSize + 1) * 8 + 8; 0086 0087 updateAttachedPositioning(); 0088 } 0089 0090 QString BusSplitter::outNodeID(unsigned node) const 0091 { 0092 return QString("out_%1").arg(QString::number(node)); 0093 } 0094 0095 void BusSplitter::drawShape(QPainter &p) 0096 { 0097 initPainter(p); 0098 0099 // QPen pen(p.pen()); 0100 // pen.setWidth(); 0101 // p.setPen(pen); 0102 0103 int _x = int(x()); 0104 int _y = int(y()); 0105 0106 QRect r = m_sizeRect; 0107 r.translate(_x, _y); 0108 p.drawRect(r); 0109 0110 deinitPainter(p); 0111 }