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