From dcfb6d4a4c88419ce7ca5b4fb5eb4747ec435b24 Mon Sep 17 00:00:00 2001 From: Lars Mewes Date: Fri, 8 Oct 2021 11:19:15 +0000 Subject: [PATCH] =?UTF-8?q?Dateien=20hochladen=20nach=20=E2=80=9E=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CircleElement.cpp | 28 +++++++++++++++++++++ CircleElement.h | 46 +++++++++++++++++++++++++++++++++ CircleOfFifths.cpp | 34 +++++++++++++++++++++++++ CircleOfFifths.h | 35 ++++++++++++++++++++++++++ ColorScale.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 206 insertions(+) create mode 100644 CircleElement.cpp create mode 100644 CircleElement.h create mode 100644 CircleOfFifths.cpp create mode 100644 CircleOfFifths.h create mode 100644 ColorScale.cpp diff --git a/CircleElement.cpp b/CircleElement.cpp new file mode 100644 index 0000000..748753e --- /dev/null +++ b/CircleElement.cpp @@ -0,0 +1,28 @@ +#include "CircleElement.h" +#include +#include + +CircleElement::CircleElement(Tone *tone): tone(tone){ + QLineF * guidingLine = new QLineF(); + guidingLine->setP1(QPoint(0,100)); + guidingLine->setP2(QPoint(0,0)); + guidingLine->setAngle(90- 30 * tone->getQuintenPosition()); + setRect(guidingLine->p2().x(),guidingLine->p2().y(), 70,70); + setPos(guidingLine->p2()); + setBrush(QBrush(tone->getColor())); + + delete guidingLine; + +}; + +CircleElement::CircleElement(){}; +CircleElement::~CircleElement(){}; + +Tone * CircleElement::getTone()const{ + return tone; +}; + +//SLOTS: +void CircleElement::redraw(){ + setBrush(QBrush(tone->getColor())); +}; diff --git a/CircleElement.h b/CircleElement.h new file mode 100644 index 0000000..56fa510 --- /dev/null +++ b/CircleElement.h @@ -0,0 +1,46 @@ +/* CIRCLEELEMENT_H + * CLASS DECLARATION + * + * CHANGLOG: + * NAME: | CHANGES: | DATE: | + * Mewes, Lars | Neuerstellung | 24.09.2021 | + * | | | + * | | | + * | | | + * + * DESCRIPTION: + * Diese Klasse "CircleElement" realisiert die einzelnen, farbigen Kreise des Quintenzirkels "CircleOfFifths". + * Um den Signal-Slot-Mechanismus von Qt nutzen zu können, ist sowohl die Ableitung von der "QObject"-Klasse, als auch das "Q_OBJECT"-Makro notwendig. + * (siehe dazu die Qt-Dokumentation) + * Für die graphische Darstellung erbt die "CircleElement"-Klasse von "QGraphicsEllipseItem". Diese Klasse stellt alle wichtigen Funktionen und Attribute + * für die Darstellung in einer "QGraphicsScene" zur Verfügung (siehe Klassendeklaration "CircleOfFifths") + * + * der Slot "void redraw();" wird ausgelöst, sobald (z.B. mittels Color-Picker) die Farbe eines Tons geändert wird. (siehe Klassendeklaration "Tone") + * + * TO-DOs: + * Beschriftung auf den Elementen ergänzen + * + */ + +#pragma once +#include +#include "Tone.h" + +class CircleElement:public QObject, public QGraphicsEllipseItem{ + Q_OBJECT + + Tone * tone; + + public: + CircleElement(Tone * tone); + CircleElement(); + + Tone * getTone()const; + + virtual ~CircleElement(); + +public slots: + + void redraw(); +}; + diff --git a/CircleOfFifths.cpp b/CircleOfFifths.cpp new file mode 100644 index 0000000..747b2ed --- /dev/null +++ b/CircleOfFifths.cpp @@ -0,0 +1,34 @@ +#include "CircleOfFifths.h" +#include "MainWindow.h" +#include + +CircleOfFifths::CircleOfFifths(qreal x, qreal y, qreal w, qreal h, MainWindow * parent): QGraphicsScene(x,y,w,h){ + addItem(circleElements[0] = new CircleElement(parent->colorScale.getToneByName("C"))); + addItem(circleElements[1] = new CircleElement(parent->colorScale.getToneByName("G"))); + addItem(circleElements[2] = new CircleElement(parent->colorScale.getToneByName("D"))); + addItem(circleElements[3] = new CircleElement(parent->colorScale.getToneByName("A"))); + addItem(circleElements[4] = new CircleElement(parent->colorScale.getToneByName("E"))); + addItem(circleElements[5] = new CircleElement(parent->colorScale.getToneByName("H"))); + addItem(circleElements[6] = new CircleElement(parent->colorScale.getToneByName("Fis"))); + addItem(circleElements[7] = new CircleElement(parent->colorScale.getToneByName("Cis"))); + addItem(circleElements[8] = new CircleElement(parent->colorScale.getToneByName("Gis"))); + addItem(circleElements[9] = new CircleElement(parent->colorScale.getToneByName("Dis"))); + addItem(circleElements[10] = new CircleElement(parent->colorScale.getToneByName("Ais"))); + addItem(circleElements[11] = new CircleElement(parent->colorScale.getToneByName("F"))); + + for(int i=0; i<12; i++) + QObject::connect(circleElements[i]->getTone(), &Tone::colorchanged, circleElements[i], &CircleElement::redraw); +}; + +void CircleOfFifths::mousePressEvent(QGraphicsSceneMouseEvent *event){ + if(event->button() == Qt::LeftButton){ + for(int i=0; i<12; i++){ + if(circleElements[i]->sceneBoundingRect().contains(event->scenePos())){ + circleElements[i]->getTone()->setColor(QColorDialog::getColor(circleElements[i]->getTone()->getColor())); + } + }} +}; + +CircleElement * CircleOfFifths::getCircleElement(int number)const{ + return circleElements[number]; +}; diff --git a/CircleOfFifths.h b/CircleOfFifths.h new file mode 100644 index 0000000..44d548c --- /dev/null +++ b/CircleOfFifths.h @@ -0,0 +1,35 @@ +/* CIRCLEOFFIFTHS_H + * CLASS DECLARATION + * + * CHANGLOG: + * NAME: | CHANGES: | DATE: | + * Mewes, Lars | Neuerstellung | 24.09.2021 | + * | | | + * | | | + * | | | + * + * DESCRIPTION: + * Diese Klasse enthält die 12 "circleElements" und stellt sie in einer "QGraphicsScene" dar, von der die Klasse abgeleitet ist + * und verarbeitetet außerdem Mouse-Events. + * + * TO-DOs: + * + * + */ + +#pragma once +#include "ColorScale.h" +#include +#include "CircleElement.h" +#include +class MainWindow; + +class CircleOfFifths: public QGraphicsScene{ + CircleElement * circleElements[12]; +public: + CircleOfFifths(qreal x, qreal y, qreal w, qreal h, MainWindow * parent); + + CircleElement * getCircleElement(int number)const; + + void mousePressEvent(QGraphicsSceneMouseEvent *event); +}; diff --git a/ColorScale.cpp b/ColorScale.cpp new file mode 100644 index 0000000..5fb44ad --- /dev/null +++ b/ColorScale.cpp @@ -0,0 +1,63 @@ +#include "ColorScale.h" + +ColorScale::ColorScale(){ + allTones[0].setColor(Qt::red); + allTones[0].setName("C"); + allTones[0].setFlatTone(true); + + allTones[1].setColor(QColor(150,127,192)); + allTones[1].setName("Cis"); + allTones[1].setFlatTone(false); + + allTones[2].setColor(Qt::yellow); + allTones[2].setName("D"); + allTones[2].setFlatTone(true); + + allTones[3].setColor(QColor(63,32,127)); + allTones[3].setName("Dis"); + allTones[3].setFlatTone(false); + + allTones[4].setColor(QColor(200,255,255)); + allTones[4].setName("E"); + allTones[4].setFlatTone(true); + + allTones[5].setColor(Qt::darkRed); + allTones[5].setName("F"); + allTones[5].setFlatTone(true); + + allTones[6].setColor(Qt::cyan); + allTones[6].setName("Fis"); + allTones[6].setFlatTone(false); + + allTones[7].setColor(QColor(255,100,0)); + allTones[7].setName("G"); + allTones[7].setFlatTone(true); + + allTones[8].setColor(Qt::magenta); + allTones[8].setName("Gis"); + allTones[8].setFlatTone(false); + + allTones[9].setColor(Qt::green); + allTones[9].setName("A"); + allTones[9].setFlatTone(true); + + allTones[10].setColor(Qt::gray); + allTones[10].setName("Ais"); + allTones[10].setFlatTone(false); + + allTones[11].setColor(Qt::blue); + allTones[11].setName("H"); + allTones[11].setFlatTone(true); +} + +Tone * ColorScale::getToneByName(QString name){ + for(int i=0; i<12; i++){ + if(QString::compare(allTones[i].getName(), name, Qt::CaseInsensitive)==0) + return allTones+i; + } + return nullptr; +}; + +Tone * ColorScale::getToneByKeyboardPosition(int pos){ + return allTones + ((pos-12)%12); +}