1 /***************************************************************************
2 * Copyright (C) 2005 by David Saxton *
3 * david@bluehaze.org *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 ***************************************************************************/
10
11 #include "bussplitter.h"
12 #include "ecnode.h"
13 #include "libraryitem.h"
14 #include "wire.h"
15
16 #include <KLocalizedString>
17 #include <QPainter>
18
construct(ItemDocument * itemDocument,bool newItem,const char * id)19 Item* BusSplitter::construct( ItemDocument *itemDocument, bool newItem, const char *id )
20 {
21 return new BusSplitter( (ICNDocument*)itemDocument, newItem, id );
22 }
23
24
libraryItem()25 LibraryItem* BusSplitter::libraryItem()
26 {
27 return new LibraryItem(
28 QStringList(QString("ec/bus")),
29 i18n("Bus"),
30 i18n("Connections"),
31 "bus.png",
32 LibraryItem::lit_component,
33 BusSplitter::construct );
34 }
35
36
37 const unsigned MAX_BUS_SIZE = 10000;
38
39
BusSplitter(ICNDocument * icnDocument,bool newItem,const char * id)40 BusSplitter::BusSplitter( ICNDocument *icnDocument, bool newItem, const char *id )
41 : Component( icnDocument, newItem, id ? id : "Bus" )
42 {
43 m_name = i18n("Bus Splitter");
44
45 m_busSize = 0;
46 init1PinLeft();
47 m_pInNode = m_pNNode[0];
48
49 createProperty( "size", Variant::Type::Int );
50 property("size")->setCaption( i18n("Size") );
51 property("size")->setMinValue(1);
52 property("size")->setMaxValue(MAX_BUS_SIZE);
53 property("size")->setValue(8);
54 }
55
56
~BusSplitter()57 BusSplitter::~BusSplitter()
58 {
59 }
60
61
dataChanged()62 void BusSplitter::dataChanged()
63 {
64 unsigned busSize = dataInt("size");
65
66 if ( busSize < 1 )
67 busSize = 1;
68
69 else if ( busSize > MAX_BUS_SIZE )
70 busSize = MAX_BUS_SIZE;
71
72 if ( busSize == m_busSize )
73 return;
74
75 m_pInNode->setNumPins(busSize);
76
77 if ( busSize > m_busSize )
78 {
79 m_pWires.resize(busSize);
80 for ( unsigned i = m_busSize; i < unsigned(busSize); i++ )
81 {
82 Pin * pin = createPin( 16, 0, 180, outNodeID(i) )->pin();
83 m_pWires[i] = new Wire( m_pInNode->pin(i), pin );
84 }
85 }
86 else
87 {
88 for ( unsigned i = busSize; i < unsigned(m_busSize); i++ )
89 {
90 removeNode( outNodeID(i) );
91 delete m_pWires[i];
92 }
93 m_pWires.resize(busSize);
94 }
95 m_busSize = busSize;
96
97 // Position pins
98 setSize( 0, -int(m_busSize+1)*8, 8, int(m_busSize+1)*16, true );
99 for ( int i = 0; i < int(m_busSize); i++ )
100 m_nodeMap[ outNodeID(i) ].y = 16*i - int(m_busSize+1)*8 + 24;
101 m_nodeMap["n1"].y = -int(m_busSize+1)*8 + 8;
102
103 updateAttachedPositioning();
104 }
105
106
outNodeID(unsigned node) const107 QString BusSplitter::outNodeID( unsigned node ) const
108 {
109 return QString("out_%1").arg(QString::number(node));
110 }
111
112
drawShape(QPainter & p)113 void BusSplitter::drawShape( QPainter &p )
114 {
115 initPainter(p);
116
117 // QPen pen(p.pen());
118 // pen.setWidth();
119 // p.setPen(pen);
120
121 int _x = int(x());
122 int _y = int(y());
123
124 QRect r = m_sizeRect;
125 r.translate( _x, _y );
126 p.drawRect(r);
127
128 deinitPainter(p);
129 }
130
131
132
133