Initial Commit
This commit is contained in:
		
							
								
								
									
										44
									
								
								Parts/AndGate.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								Parts/AndGate.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
#include "AndGate.h"
 | 
			
		||||
 | 
			
		||||
#include "../Connector.h"
 | 
			
		||||
 | 
			
		||||
AndGate::AndGate(Logic* logic)
 | 
			
		||||
    :Part(logic)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(2);
 | 
			
		||||
    addOutputs(1);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> AndGate::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    QVector<bool> ret(1);
 | 
			
		||||
    ret[0] = inputs[0] && inputs[1];
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath AndGate::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    QPainterPath painterPath;
 | 
			
		||||
 | 
			
		||||
    // Left vertical line
 | 
			
		||||
    painterPath.moveTo(-8, 8);
 | 
			
		||||
    painterPath.lineTo(-8, -8);
 | 
			
		||||
    // Upper horizontal line
 | 
			
		||||
    painterPath.lineTo(-2, -8);
 | 
			
		||||
    // Right arc
 | 
			
		||||
    painterPath.cubicTo(11, -8, 11, 8, -2, 8);
 | 
			
		||||
    // Lower horizontal line
 | 
			
		||||
    painterPath.lineTo(-8, 8);
 | 
			
		||||
    // Upper input line
 | 
			
		||||
    painterPath.moveTo(-14, -4);
 | 
			
		||||
    painterPath.lineTo(-8, -4);
 | 
			
		||||
    // Lower input line
 | 
			
		||||
    painterPath.moveTo(-14, 4);
 | 
			
		||||
    painterPath.lineTo(-8, 4);
 | 
			
		||||
    // Output line
 | 
			
		||||
    painterPath.moveTo(8, 0);
 | 
			
		||||
    painterPath.lineTo(14, 0);
 | 
			
		||||
    return painterPath;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								Parts/AndGate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Parts/AndGate.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef ANDGATE_H
 | 
			
		||||
#define ANDGATE_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class AndGate : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    AndGate(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // ANDGATE_H
 | 
			
		||||
							
								
								
									
										38
									
								
								Parts/BufferGate.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								Parts/BufferGate.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
#include "BufferGate.h"
 | 
			
		||||
 | 
			
		||||
#include "../Connector.h"
 | 
			
		||||
 | 
			
		||||
BufferGate::BufferGate(Logic* logic)
 | 
			
		||||
    :Part(logic)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(1);
 | 
			
		||||
    addOutputs(1);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> BufferGate::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    QVector<bool> ret(1);
 | 
			
		||||
    ret[0] = inputs[0];
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath BufferGate::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    QPainterPath painterPath;
 | 
			
		||||
    QPolygon triangle;
 | 
			
		||||
    triangle.append(QPoint(-8, 8));
 | 
			
		||||
    triangle.append(QPoint(-8, -8));
 | 
			
		||||
    triangle.append(QPoint(8, 0));
 | 
			
		||||
    triangle.append(QPoint(-8, 8));
 | 
			
		||||
    painterPath.addPolygon(triangle);
 | 
			
		||||
    // Input line
 | 
			
		||||
    painterPath.moveTo(-14, 0);
 | 
			
		||||
    painterPath.lineTo(-8, 0);
 | 
			
		||||
    // Output line
 | 
			
		||||
    painterPath.moveTo(8, 0);
 | 
			
		||||
    painterPath.lineTo(14, 0);
 | 
			
		||||
    return painterPath;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								Parts/BufferGate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Parts/BufferGate.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef BUFFERGATE_H
 | 
			
		||||
#define BUFFERGATE_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class BufferGate : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    BufferGate(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // BUFFERGATE_H
 | 
			
		||||
							
								
								
									
										26
									
								
								Parts/HighConstant.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Parts/HighConstant.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
#include "HighConstant.h"
 | 
			
		||||
 | 
			
		||||
#include "../Connector.h"
 | 
			
		||||
 | 
			
		||||
HighConstant::HighConstant(Logic* logic)
 | 
			
		||||
    :Part(logic, Circle)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(0);
 | 
			
		||||
    addOutputs(1);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
    m_brushColorNormal = Qt::GlobalColor::green;
 | 
			
		||||
    m_brushColorSelected = Qt::GlobalColor::green;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> HighConstant::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    QVector<bool> ret(1);
 | 
			
		||||
    ret[0] = true;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath HighConstant::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    return QPainterPath();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								Parts/HighConstant.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Parts/HighConstant.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef HIGHCONSTANT_H
 | 
			
		||||
#define HIGHCONSTANT_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class HighConstant : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    HighConstant(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // HIGHCONSTANT_H
 | 
			
		||||
							
								
								
									
										56
									
								
								Parts/IntegratedCircuit.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								Parts/IntegratedCircuit.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
#include "IntegratedCircuit.h"
 | 
			
		||||
 | 
			
		||||
#include "../Scene.h"
 | 
			
		||||
#include "../Logic.h"
 | 
			
		||||
#include "ToggleButton.h"
 | 
			
		||||
#include "LightBulb.h"
 | 
			
		||||
 | 
			
		||||
static bool compareToggleButtons(const ToggleButton* a, const ToggleButton* b) { return a->y() < b->y(); }
 | 
			
		||||
static bool compareLightBulbs(const LightBulb* a, const LightBulb* b) { return a->y() < b->y(); }
 | 
			
		||||
 | 
			
		||||
IntegratedCircuit::IntegratedCircuit(Logic* logic, QString filename)
 | 
			
		||||
    :Part(logic), m_filename(filename), m_icLogic(new Logic)
 | 
			
		||||
{
 | 
			
		||||
    setWidth(4);
 | 
			
		||||
 | 
			
		||||
    m_icLogic->loadFromFile(filename);
 | 
			
		||||
 | 
			
		||||
    for(auto part : m_icLogic->m_parts)
 | 
			
		||||
    {
 | 
			
		||||
        if(part->partType() == PartType::IOToggleButton)
 | 
			
		||||
            m_icLogicInputs.append((ToggleButton*)part);
 | 
			
		||||
        else if(part->partType() == PartType::IOLightBulb)
 | 
			
		||||
            m_icLogicOutputs.append((LightBulb*)part);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    addInputs(m_icLogicInputs.length());
 | 
			
		||||
    addOutputs(m_icLogicOutputs.length());
 | 
			
		||||
 | 
			
		||||
    // Sort according to y position
 | 
			
		||||
    std::sort(m_icLogicInputs.begin(), m_icLogicInputs.end(), compareToggleButtons);
 | 
			
		||||
    std::sort(m_icLogicOutputs.begin(), m_icLogicOutputs.end(), compareLightBulbs);
 | 
			
		||||
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString IntegratedCircuit::filename()
 | 
			
		||||
{
 | 
			
		||||
    return m_filename;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> IntegratedCircuit::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    for(int i = 0; i < inputs.length(); i++)
 | 
			
		||||
        m_icLogicInputs[i]->m_toggleState = inputs[i];
 | 
			
		||||
    m_icLogic->doLogicStep();
 | 
			
		||||
    QVector<bool> ret(m_icLogicOutputs.length());
 | 
			
		||||
    for(int i = 0; i < m_icLogicOutputs.length(); i++)
 | 
			
		||||
        ret[i] = m_icLogicOutputs[i]->m_state;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath IntegratedCircuit::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    return QPainterPath();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								Parts/IntegratedCircuit.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								Parts/IntegratedCircuit.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
#ifndef INTEGRATEDCIRCUIT_H
 | 
			
		||||
#define INTEGRATEDCIRCUIT_H
 | 
			
		||||
 | 
			
		||||
#include <QString>
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class Logic;
 | 
			
		||||
class ToggleButton;
 | 
			
		||||
class LightBulb;
 | 
			
		||||
 | 
			
		||||
class IntegratedCircuit : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    IntegratedCircuit(Logic* logic, QString filename = "");
 | 
			
		||||
 | 
			
		||||
    QString filename();
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    QString m_filename;
 | 
			
		||||
 | 
			
		||||
    Logic* m_icLogic;
 | 
			
		||||
 | 
			
		||||
    QVector<ToggleButton*> m_icLogicInputs;
 | 
			
		||||
    QVector<LightBulb*> m_icLogicOutputs;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // INTEGRATEDCIRCUIT_H
 | 
			
		||||
							
								
								
									
										38
									
								
								Parts/LightBulb.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								Parts/LightBulb.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
#include "LightBulb.h"
 | 
			
		||||
 | 
			
		||||
#include "../Connector.h"
 | 
			
		||||
 | 
			
		||||
LightBulb::LightBulb(Logic* logic)
 | 
			
		||||
    :Part(logic, Circle)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(1);
 | 
			
		||||
    addOutputs(0);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
    m_brushColorNormal = Qt::GlobalColor::black;
 | 
			
		||||
    m_brushColorSelected = Qt::GlobalColor::black;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> LightBulb::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    m_state = inputs[0];
 | 
			
		||||
 | 
			
		||||
    // Set color according to input state (on or off)
 | 
			
		||||
    if(m_state)
 | 
			
		||||
    {
 | 
			
		||||
        m_brushColorNormal = Qt::GlobalColor::green;
 | 
			
		||||
        m_brushColorSelected = Qt::GlobalColor::green;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        m_brushColorNormal = Qt::GlobalColor::black;
 | 
			
		||||
        m_brushColorSelected = Qt::GlobalColor::black;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return QVector<bool>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath LightBulb::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    return QPainterPath();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								Parts/LightBulb.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								Parts/LightBulb.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
#ifndef LAMP_H
 | 
			
		||||
#define LAMP_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class LightBulb : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    friend class IntegratedCircuit;
 | 
			
		||||
 | 
			
		||||
    LightBulb(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    bool m_state = false;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif // LAMP_H
 | 
			
		||||
							
								
								
									
										26
									
								
								Parts/LowConstant.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Parts/LowConstant.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
#include "LowConstant.h"
 | 
			
		||||
 | 
			
		||||
#include "../Connector.h"
 | 
			
		||||
 | 
			
		||||
LowConstant::LowConstant(Logic* logic)
 | 
			
		||||
    :Part(logic, Circle)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(0);
 | 
			
		||||
    addOutputs(1);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
    m_brushColorNormal = Qt::GlobalColor::black;
 | 
			
		||||
    m_brushColorSelected = Qt::GlobalColor::black;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> LowConstant::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    QVector<bool> ret(1);
 | 
			
		||||
    ret[0] = false;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath LowConstant::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    return QPainterPath();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								Parts/LowConstant.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Parts/LowConstant.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef LOWCONSTANT_H
 | 
			
		||||
#define LOWCONSTANT_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class LowConstant : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    LowConstant(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // LOWCONSTANT_H
 | 
			
		||||
							
								
								
									
										46
									
								
								Parts/NandGate.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								Parts/NandGate.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#include "NandGate.h"
 | 
			
		||||
 | 
			
		||||
#include "../Connector.h"
 | 
			
		||||
 | 
			
		||||
NandGate::NandGate(Logic* logic)
 | 
			
		||||
    :Part(logic)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(2);
 | 
			
		||||
    addOutputs(1);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> NandGate::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    QVector<bool> ret(1);
 | 
			
		||||
    ret[0] = !(inputs[0] && inputs[1]);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath NandGate::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    QPainterPath painterPath;
 | 
			
		||||
 | 
			
		||||
    // Left vertical line
 | 
			
		||||
    painterPath.moveTo(-8, 8);
 | 
			
		||||
    painterPath.lineTo(-8, -8);
 | 
			
		||||
    // Upper horizontal line
 | 
			
		||||
    painterPath.lineTo(-2, -8);
 | 
			
		||||
    // Right arc
 | 
			
		||||
    painterPath.cubicTo(11, -8, 11, 8, -2, 8);
 | 
			
		||||
    // Lower horizontal line
 | 
			
		||||
    painterPath.lineTo(-8, 8);
 | 
			
		||||
    // Inverting dot
 | 
			
		||||
    painterPath.addEllipse(8.f, -1.5f, 3.f, 3.f);
 | 
			
		||||
    // Upper input line
 | 
			
		||||
    painterPath.moveTo(-14, -4);
 | 
			
		||||
    painterPath.lineTo(-8, -4);
 | 
			
		||||
    // Lower input line
 | 
			
		||||
    painterPath.moveTo(-14, 4);
 | 
			
		||||
    painterPath.lineTo(-8, 4);
 | 
			
		||||
    // Output line
 | 
			
		||||
    painterPath.moveTo(11.5f, 0.f);
 | 
			
		||||
    painterPath.lineTo(14, 0);
 | 
			
		||||
    return painterPath;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								Parts/NandGate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Parts/NandGate.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef NANDGATE_H
 | 
			
		||||
#define NANDGATE_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class NandGate : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    NandGate(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // NANDGATE_H
 | 
			
		||||
							
								
								
									
										49
									
								
								Parts/NorGate.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								Parts/NorGate.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
#include "NorGate.h"
 | 
			
		||||
 | 
			
		||||
#include "../Connector.h"
 | 
			
		||||
 | 
			
		||||
NorGate::NorGate(Logic* logic)
 | 
			
		||||
    :Part(logic)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(2);
 | 
			
		||||
    addOutputs(1);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> NorGate::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    QVector<bool> ret(1);
 | 
			
		||||
    ret[0] = !(inputs[0] || inputs[1]);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath NorGate::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    QPainterPath painterPath;
 | 
			
		||||
    // Left arc
 | 
			
		||||
    painterPath.moveTo(-10, -8);
 | 
			
		||||
    painterPath.quadTo(-2, 0, -10, 8);
 | 
			
		||||
    // Lower line
 | 
			
		||||
    painterPath.lineTo(-2, 8);
 | 
			
		||||
    // Lower arc
 | 
			
		||||
    painterPath.quadTo(5, 6, 8, 0);
 | 
			
		||||
    //
 | 
			
		||||
    painterPath.moveTo(-10, -8);
 | 
			
		||||
    // Upper line
 | 
			
		||||
    painterPath.lineTo(-2, -8);
 | 
			
		||||
    // Upper arc
 | 
			
		||||
    painterPath.quadTo(5, -6, 8, 0);
 | 
			
		||||
    // Inverting dot
 | 
			
		||||
    painterPath.addEllipse(8.f, -1.5f, 3.f, 3.f);
 | 
			
		||||
    // Upper input line
 | 
			
		||||
    painterPath.moveTo(-14, -4);
 | 
			
		||||
    painterPath.lineTo(-7.5f, -4.f);
 | 
			
		||||
    // Lower input line
 | 
			
		||||
    painterPath.moveTo(-14, 4);
 | 
			
		||||
    painterPath.lineTo(-7.5f, 4.f);
 | 
			
		||||
    // Output line
 | 
			
		||||
    painterPath.moveTo(11.5f, 0.f);
 | 
			
		||||
    painterPath.lineTo(14, 0);
 | 
			
		||||
    return painterPath;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								Parts/NorGate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Parts/NorGate.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef NORGATE_H
 | 
			
		||||
#define NORGATE_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class NorGate : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    NorGate(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // NORGATE_H
 | 
			
		||||
							
								
								
									
										39
									
								
								Parts/NotGate.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								Parts/NotGate.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
#include "NotGate.h"
 | 
			
		||||
 | 
			
		||||
#include "../Connector.h"
 | 
			
		||||
 | 
			
		||||
NotGate::NotGate(Logic* logic)
 | 
			
		||||
    :Part(logic)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(1);
 | 
			
		||||
    addOutputs(1);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> NotGate::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    QVector<bool> ret(1);
 | 
			
		||||
    ret[0] = !inputs[0];
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath NotGate::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    QPainterPath painterPath;
 | 
			
		||||
    QPolygon triangle;
 | 
			
		||||
    triangle.append(QPoint(-8, 8));
 | 
			
		||||
    triangle.append(QPoint(-8, -8));
 | 
			
		||||
    triangle.append(QPoint(8, 0));
 | 
			
		||||
    triangle.append(QPoint(-8, 8));
 | 
			
		||||
    painterPath.addPolygon(triangle);
 | 
			
		||||
    // Inverting dot
 | 
			
		||||
    painterPath.addEllipse(8.f, -1.5f, 3.f, 3.f);
 | 
			
		||||
    // Input line
 | 
			
		||||
    painterPath.moveTo(-14, 0);
 | 
			
		||||
    painterPath.lineTo(-8, 0);
 | 
			
		||||
    // Output line
 | 
			
		||||
    painterPath.moveTo(11.5f, 0.f);
 | 
			
		||||
    painterPath.lineTo(14, 0);
 | 
			
		||||
    return painterPath;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								Parts/NotGate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Parts/NotGate.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef NOTGATE_H
 | 
			
		||||
#define NOTGATE_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class NotGate : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    NotGate(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // NOTGATE_H
 | 
			
		||||
							
								
								
									
										47
									
								
								Parts/OrGate.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								Parts/OrGate.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
#include "OrGate.h"
 | 
			
		||||
 | 
			
		||||
#include "../Connector.h"
 | 
			
		||||
 | 
			
		||||
OrGate::OrGate(Logic* logic)
 | 
			
		||||
    :Part(logic)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(2);
 | 
			
		||||
    addOutputs(1);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> OrGate::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    QVector<bool> ret(1);
 | 
			
		||||
    ret[0] = inputs[0] || inputs[1];
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath OrGate::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    QPainterPath painterPath;
 | 
			
		||||
    // Left arc
 | 
			
		||||
    painterPath.moveTo(-10, -8);
 | 
			
		||||
    painterPath.quadTo(-2, 0, -10, 8);
 | 
			
		||||
    // Lower line
 | 
			
		||||
    painterPath.lineTo(-2, 8);
 | 
			
		||||
    // Lower arc
 | 
			
		||||
    painterPath.quadTo(5, 6, 8, 0);
 | 
			
		||||
    //
 | 
			
		||||
    painterPath.moveTo(-10, -8);
 | 
			
		||||
    // Upper line
 | 
			
		||||
    painterPath.lineTo(-2, -8);
 | 
			
		||||
    // Upper arc
 | 
			
		||||
    painterPath.quadTo(5, -6, 8, 0);
 | 
			
		||||
    // Upper input line
 | 
			
		||||
    painterPath.moveTo(-14, -4);
 | 
			
		||||
    painterPath.lineTo(-7.5f, -4.f);
 | 
			
		||||
    // Lower input line
 | 
			
		||||
    painterPath.moveTo(-14, 4);
 | 
			
		||||
    painterPath.lineTo(-7.5f, 4.f);
 | 
			
		||||
    // Output line
 | 
			
		||||
    painterPath.moveTo(8, 0);
 | 
			
		||||
    painterPath.lineTo(14, 0);
 | 
			
		||||
    return painterPath;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								Parts/OrGate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Parts/OrGate.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef ORGATE_H
 | 
			
		||||
#define ORGATE_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class OrGate : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    OrGate(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // ORGATE_H
 | 
			
		||||
							
								
								
									
										43
									
								
								Parts/ToggleButton.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								Parts/ToggleButton.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
#include "ToggleButton.h"
 | 
			
		||||
 | 
			
		||||
#include <QGraphicsSceneMouseEvent>
 | 
			
		||||
 | 
			
		||||
ToggleButton::ToggleButton(Logic* logic)
 | 
			
		||||
    :Part(logic, Circle)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(0);
 | 
			
		||||
    addOutputs(1);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
    m_brushColorNormal = Qt::GlobalColor::red;
 | 
			
		||||
    m_brushColorSelected = Qt::GlobalColor::red;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> ToggleButton::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    QVector<bool> ret(1);
 | 
			
		||||
    ret[0] = m_toggleState;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath ToggleButton::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    return QPainterPath();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ToggleButton::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
 | 
			
		||||
{
 | 
			
		||||
    m_toggleState = !m_toggleState;
 | 
			
		||||
    if(m_toggleState)
 | 
			
		||||
    {
 | 
			
		||||
        m_brushColorNormal = Qt::GlobalColor::darkRed;
 | 
			
		||||
        m_brushColorSelected = Qt::GlobalColor::darkRed;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        m_brushColorNormal = Qt::GlobalColor::red;
 | 
			
		||||
        m_brushColorSelected = Qt::GlobalColor::red;
 | 
			
		||||
    }
 | 
			
		||||
    update();
 | 
			
		||||
    Part::mouseDoubleClickEvent(event);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								Parts/ToggleButton.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								Parts/ToggleButton.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
#ifndef TOGGLEBUTTON_H
 | 
			
		||||
#define TOGGLEBUTTON_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class ToggleButton : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    friend class IntegratedCircuit;
 | 
			
		||||
 | 
			
		||||
    ToggleButton(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override;
 | 
			
		||||
 | 
			
		||||
    QPointF m_dragBeginPos;
 | 
			
		||||
 | 
			
		||||
    bool m_toggleState = false;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // TOGGLEBUTTON_H
 | 
			
		||||
							
								
								
									
										52
									
								
								Parts/XnorGate.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								Parts/XnorGate.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
#include "XnorGate.h"
 | 
			
		||||
 | 
			
		||||
#include "../Connector.h"
 | 
			
		||||
 | 
			
		||||
XnorGate::XnorGate(Logic* logic)
 | 
			
		||||
    :Part(logic)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(2);
 | 
			
		||||
    addOutputs(1);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> XnorGate::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    QVector<bool> ret(1);
 | 
			
		||||
    ret[0] = !((inputs[0] || inputs[1]) && (!(inputs[0] && inputs[1])));
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath XnorGate::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    QPainterPath painterPath;
 | 
			
		||||
    // 0th Left arc
 | 
			
		||||
    painterPath.moveTo(-12, -8);
 | 
			
		||||
    painterPath.quadTo(-4, 0, -12, 8);
 | 
			
		||||
    // 1st Left arc
 | 
			
		||||
    painterPath.moveTo(-10, -8);
 | 
			
		||||
    painterPath.quadTo(-2, 0, -10, 8);
 | 
			
		||||
    // Lower line
 | 
			
		||||
    painterPath.lineTo(-2, 8);
 | 
			
		||||
    // Lower arc
 | 
			
		||||
    painterPath.quadTo(5, 6, 8, 0);
 | 
			
		||||
    //
 | 
			
		||||
    painterPath.moveTo(-10, -8);
 | 
			
		||||
    // Upper line
 | 
			
		||||
    painterPath.lineTo(-2, -8);
 | 
			
		||||
    // Upper arc
 | 
			
		||||
    painterPath.quadTo(5, -6, 8, 0);
 | 
			
		||||
    // Inverting dot
 | 
			
		||||
    painterPath.addEllipse(8.f, -1.5f, 3.f, 3.f);
 | 
			
		||||
    // Upper input line
 | 
			
		||||
    painterPath.moveTo(-14, -4);
 | 
			
		||||
    painterPath.lineTo(-7.5f, -4.f);
 | 
			
		||||
    // Lower input line
 | 
			
		||||
    painterPath.moveTo(-14, 4);
 | 
			
		||||
    painterPath.lineTo(-7.5f, 4.f);
 | 
			
		||||
    // Output line
 | 
			
		||||
    painterPath.moveTo(11.5f, 0.f);
 | 
			
		||||
    painterPath.lineTo(14, 0);
 | 
			
		||||
    return painterPath;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								Parts/XnorGate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Parts/XnorGate.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef XNORGATE_H
 | 
			
		||||
#define XNORGATE_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class XnorGate : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    XnorGate(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // XNORGATE_H
 | 
			
		||||
							
								
								
									
										50
									
								
								Parts/XorGate.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								Parts/XorGate.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
#include "XorGate.h"
 | 
			
		||||
 | 
			
		||||
#include "../Connector.h"
 | 
			
		||||
 | 
			
		||||
XorGate::XorGate(Logic* logic)
 | 
			
		||||
    :Part(logic)
 | 
			
		||||
{
 | 
			
		||||
    addInputs(2);
 | 
			
		||||
    addOutputs(1);
 | 
			
		||||
    recalculateLayout();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVector<bool> XorGate::compute(QVector<bool> inputs)
 | 
			
		||||
{
 | 
			
		||||
    QVector<bool> ret(1);
 | 
			
		||||
    ret[0] = (inputs[0] || inputs[1]) && (!(inputs[0] && inputs[1]));
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPainterPath XorGate::symbolPainterPath(QRect limits)
 | 
			
		||||
{
 | 
			
		||||
    Q_UNUSED(limits)
 | 
			
		||||
    QPainterPath painterPath;
 | 
			
		||||
    // 0th Left arc
 | 
			
		||||
    painterPath.moveTo(-12, -8);
 | 
			
		||||
    painterPath.quadTo(-4, 0, -12, 8);
 | 
			
		||||
    // 1st Left arc
 | 
			
		||||
    painterPath.moveTo(-10, -8);
 | 
			
		||||
    painterPath.quadTo(-2, 0, -10, 8);
 | 
			
		||||
    // Lower line
 | 
			
		||||
    painterPath.lineTo(-2, 8);
 | 
			
		||||
    // Lower arc
 | 
			
		||||
    painterPath.quadTo(5, 6, 8, 0);
 | 
			
		||||
    //
 | 
			
		||||
    painterPath.moveTo(-10, -8);
 | 
			
		||||
    // Upper line
 | 
			
		||||
    painterPath.lineTo(-2, -8);
 | 
			
		||||
    // Upper arc
 | 
			
		||||
    painterPath.quadTo(5, -6, 8, 0);
 | 
			
		||||
    // Upper input line
 | 
			
		||||
    painterPath.moveTo(-14, -4);
 | 
			
		||||
    painterPath.lineTo(-7.5f, -4.f);
 | 
			
		||||
    // Lower input line
 | 
			
		||||
    painterPath.moveTo(-14, 4);
 | 
			
		||||
    painterPath.lineTo(-7.5f, 4.f);
 | 
			
		||||
    // Output line
 | 
			
		||||
    painterPath.moveTo(8, 0);
 | 
			
		||||
    painterPath.lineTo(14, 0);
 | 
			
		||||
    return painterPath;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								Parts/XorGate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Parts/XorGate.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef XORGATE_H
 | 
			
		||||
#define XORGATE_H
 | 
			
		||||
 | 
			
		||||
#include "../Part.h"
 | 
			
		||||
 | 
			
		||||
class XorGate : public Part
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    XorGate(Logic* logic);
 | 
			
		||||
 | 
			
		||||
    QVector<bool> compute(QVector<bool> inputs) override;
 | 
			
		||||
    QPainterPath symbolPainterPath(QRect limits) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // XORGATE_H
 | 
			
		||||
		Reference in New Issue
	
	Block a user