~arcachofo/simulide/1.1.0

« back to all changes in this revision

Viewing changes to src/gui/circuitwidget/components/switches/keypad.cpp

  • Committer: arcachofo
  • Date: 2021-01-01 14:23:42 UTC
  • Revision ID: arcachofo@simulide.com-20210101142342-ozfljnll44g5lbl3
Initial Commit 0.5.15-RC3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
 *   Copyright (C) 2018 by santiago González                               *
 
3
 *   santigoro@gmail.com                                                   *
 
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 3 of the License, or     *
 
8
 *   (at your option) any later version.                                   *
 
9
 *                                                                         *
 
10
 *   This program is distributed in the hope that it will be useful,       *
 
11
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 
12
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 
13
 *   GNU General Public License for more details.                          *
 
14
 *                                                                         *
 
15
 *   You should have received a copy of the GNU General Public License     *
 
16
 *   along with this program; if not, see <http://www.gnu.org/licenses/>.  *
 
17
 *                                                                         *
 
18
 ***************************************************************************/
 
19
 
 
20
#include "keypad.h"
 
21
#include "simulator.h"
 
22
#include "circuit.h"
 
23
#include "itemlibrary.h"
 
24
 
 
25
static const char* KeyPad_properties[] = {
 
26
    QT_TRANSLATE_NOOP("App::Property","Key Labels")
 
27
};
 
28
 
 
29
Component* KeyPad::construct( QObject* parent, QString type, QString id )
 
30
{ return new KeyPad( parent, type, id ); }
 
31
 
 
32
LibraryItem* KeyPad::libraryItem()
 
33
{
 
34
    return new LibraryItem(
 
35
            tr( "KeyPad" ),
 
36
            tr( "Switches" ),
 
37
            "keypad.png",
 
38
            "KeyPad",
 
39
            KeyPad::construct);
 
40
}
 
41
 
 
42
KeyPad::KeyPad( QObject* parent, QString type, QString id )
 
43
      : Component( parent, type, id )
 
44
      , eElement( id )
 
45
{
 
46
    Q_UNUSED( KeyPad_properties );
 
47
 
 
48
    m_graphical = true;
 
49
    
 
50
    setLabelPos(-8,-16, 0);
 
51
    
 
52
    m_keyLabels = "123456789*0#";
 
53
    m_rows = 4;
 
54
    m_cols = 3;
 
55
    setupButtons();
 
56
}
 
57
KeyPad::~KeyPad(){}
 
58
 
 
59
void KeyPad::stamp()
 
60
{
 
61
    for( int row=0; row<m_rows; row++ )
 
62
    {
 
63
        Pin* rowPin = m_pin[row];
 
64
        eNode* rowNode = rowPin->getEnode();
 
65
        
 
66
        for( int col=0; col<m_cols; col++ )
 
67
        {
 
68
            Pin* colPin = m_pin[m_rows+col];
 
69
            eNode* colNode = colPin->getEnode();
 
70
            
 
71
            PushBase* button = m_buttons.at( row*m_cols+col );
 
72
            
 
73
            ePin* epin0 = button->getEpin( 0 );
 
74
            epin0->setEnode( rowNode );
 
75
            
 
76
            ePin* epin1 = button->getEpin( 1 );
 
77
            epin1->setEnode( colNode );
 
78
        }
 
79
    }
 
80
}
 
81
 
 
82
void KeyPad::setupButtons()
 
83
{
 
84
    bool pauseSim = Simulator::self()->isRunning();
 
85
    if( pauseSim ) Simulator::self()->pauseSim();
 
86
    
 
87
    m_area = QRectF( -12, -4, 16*m_cols+8, 16*m_rows+8 );
 
88
    
 
89
    for( PushBase* button : m_buttons ) 
 
90
    {
 
91
       m_buttons.removeOne( button );
 
92
       Circuit::self()->removeComp( button );
 
93
    }
 
94
    
 
95
    for( Pin* pin : m_pin ) 
 
96
    {
 
97
        if( pin->isConnected() ) pin->connector()->remove();
 
98
        if( pin->scene() ) Circuit::self()->removeItem( pin );
 
99
        delete pin;
 
100
    }
 
101
    m_pin.resize( m_rows + m_cols );
 
102
    
 
103
    int labelMax = m_keyLabels.size()-1;
 
104
    
 
105
    for( int row=0; row<m_rows; row++ )
 
106
    {
 
107
        QString pinId = m_id;
 
108
        pinId.append( QString("-Pin")+QString::number(row)) ;
 
109
        QPoint pinPos = QPoint(m_cols*16, 8+row*16);
 
110
        m_pin[row] = new Pin( 0, pinPos, pinId, 0, this);
 
111
        
 
112
        for( int col=0; col<m_cols; col++ )
 
113
        {
 
114
            QString butId = m_id+"button"+QString::number(row)+QString::number(col);
 
115
            //qDebug()<<butId;
 
116
            PushBase* button = new PushBase( this, "PushBase", butId );
 
117
            button->SetupButton();
 
118
            button->setParentItem( this );
 
119
            button->setPos( QPointF(col*16+12, 16+row*16 ) );
 
120
            button->setFlag( QGraphicsItem::ItemIsSelectable, false );
 
121
            m_buttons.append( button );
 
122
            
 
123
            int pos = row*m_cols+col;
 
124
            QString buttonLabel = "";
 
125
            if( pos <= labelMax ) buttonLabel = m_keyLabels.mid( pos, 1 );
 
126
            button->setKey( buttonLabel );
 
127
 
 
128
            if( row == 0 )
 
129
            {
 
130
                QString pinId = m_id;
 
131
                pinId.append( QString("-Pin")+QString::number(m_rows+col)) ;
 
132
                QPoint pinPos = QPoint( col*16, m_rows*16+8);
 
133
                m_pin[m_rows+col] = new Pin( 270, pinPos, pinId, 0, this);
 
134
            }
 
135
        }
 
136
    }
 
137
    if( pauseSim ) Simulator::self()->resumeSim();
 
138
    Circuit::self()->update();
 
139
}
 
140
 
 
141
double KeyPad::rows()
 
142
{
 
143
    return m_rows;
 
144
}
 
145
 
 
146
void KeyPad::setRows( double rows )
 
147
{
 
148
    m_rows = rows;
 
149
    setupButtons();
 
150
}
 
151
 
 
152
double KeyPad::cols()
 
153
{
 
154
    return m_cols;
 
155
}
 
156
 
 
157
void KeyPad::setCols( double cols )
 
158
{
 
159
    m_cols = cols;
 
160
    setupButtons();
 
161
}
 
162
 
 
163
QString KeyPad::keyLabels()
 
164
{
 
165
    return m_keyLabels;
 
166
}
 
167
void KeyPad::setKeyLabels( QString keyLabels )
 
168
{
 
169
    m_keyLabels = keyLabels;
 
170
    
 
171
    int labelMax = m_keyLabels.size()-1;
 
172
    
 
173
    for( int row=0; row<m_rows; row++ )
 
174
    {
 
175
        for( int col=0; col<m_cols; col++ )
 
176
        {
 
177
            PushBase* button = m_buttons.at( row*m_cols+col );
 
178
            
 
179
            int pos = row*m_cols+col;
 
180
            QString buttonLabel = "";
 
181
            if( pos <= labelMax ) buttonLabel = m_keyLabels.mid( pos, 1 );
 
182
            button->setKey( buttonLabel );
 
183
        }
 
184
    }
 
185
}
 
186
 
 
187
void KeyPad::remove()
 
188
{
 
189
    for( PushBase* button : m_buttons ) 
 
190
        Circuit::self()->removeComp( button );
 
191
 
 
192
    Component::remove();
 
193
}
 
194
 
 
195
void KeyPad::paint( QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *widget )
 
196
{
 
197
    Component::paint( p, option, widget );
 
198
 
 
199
    p->drawRoundedRect( m_area,2,2 );
 
200
}
 
201
 
 
202
#include "moc_keypad.cpp"