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 }