You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pa-calculator/library.cpp

439 lines
14 KiB
C++

#include "library.h"
#include "ui_library.h"
#include <iostream>
#include <QMessageBox>
#include <QSettings>
#include <QFileDialog>
#include <QDebug>
library::library(QWidget *parent) :
QDialog(parent),
ui(new Ui::library)
{
ui->setupUi(this);
unsaved=false;
speakerUnsaved=false;
}
library::~library()
{
delete ui;
}
void library::setAmpPointer(cAmp *pAmp, unsigned int ampCount){
m_pCamp=pAmp;
m_cAmpCount=ampCount;
}
unsigned int library::getAmpCount()
{
return m_cAmpCount;
}
cAmp *library::getAmps()
{
return m_pCamp;
}
void library::setSpeakerPointer(cSpeaker *pSpeaker, unsigned int speakerCount)
{
m_pSpeaker=pSpeaker;
m_SpeakerCount=speakerCount;
}
unsigned int library::getSpeakerCount()
{
return m_SpeakerCount;
}
cSpeaker *library::getSpeaker()
{
return m_pSpeaker;
}
void library::open()
{
ui->listWidget_ampView->setCurrentRow(0);
QSettings settings("DKM-Tech","Pa-Calculator");
if (settings.value("library/path","")==""){
settings.setValue("library/path",QFileDialog::getSaveFileName(this,"Select Library Storage File","","Pa Calculator Library File (*.palib)"));
}
//qDebug() << settings.value("library/path","none").toString();
refreshAmpView();
refreshSpeakerView();
this->exec();
if (unsaved or speakerUnsaved){
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, "Unsaved Changes", "Save unsaved Changes?",
QMessageBox::Yes|QMessageBox::No);
if (reply == QMessageBox::Yes) {
on_pushButton_applyChanges_clicked();
on_pushButton_applySpeaker_clicked();
}
}
saveLibraryToFile();
}
void library::on_pushButton_addAmp_clicked()
{
m_cAmpCount+=1;
cAmp* tempAmps=new cAmp[m_cAmpCount];
for (unsigned int i=0;i<m_cAmpCount-1;i++){
tempAmps[i].setName(m_pCamp[i].getName());
tempAmps[i].setSensivity(m_pCamp[i].getSensitivity());
tempAmps[i].setSensUnit(m_pCamp[i].getSensivityUnit());
for (unsigned int j=0;j<m_pCamp[i].getAmpModesCount();j++){
tempAmps[i].addAmpMode(m_pCamp[i].getAmpMode(j));
}
}
delete [] m_pCamp;
m_pCamp=tempAmps;
m_pCamp[m_cAmpCount-1]=cAmp("Unnamed Amp",1,volt);
refreshAmpView();
ui->listWidget_ampView->setCurrentRow(m_cAmpCount-1);
ui->lineEdit_ampName->setFocus();
ui->lineEdit_ampName->selectAll();
}
void library::refreshAmpView()
{
ui->listWidget_ampView->clear();
for (unsigned int i=0;i<m_cAmpCount;i++){
ui->listWidget_ampView->addItem(QString::fromStdString(m_pCamp[i].getName()));
}
//std::cerr<<"refreshAmpView started"<<std::endl;
//printAllAmps();
}
void library::refreshModeOverview()
{
ui->listWidget_modeSelector->clear();
if (m_cAmpCount>0){
if (m_pCamp[getCurrentAmpIndex()].getAmpModesCount()>0){
for (unsigned int i=0;i<m_pCamp[getCurrentAmpIndex()].getAmpModesCount();i++){
ui->listWidget_modeSelector->addItem(QString::fromStdString(m_pCamp[getCurrentAmpIndex()].getAmpMode(i).getName()));
//std::cout <<"mode "<<i+1<<" : " <<m_pCamp[getCurrentAmpIndex()].getAmpMode(i).getName()<<std::endl;
}
}
}
//std::cerr<<"refreshModeOverview started"<<std::endl;
//printAllAmps();
}
void library::refreshSpeakerView()
{
ui->listWidget_speakerView->clear();
for (unsigned int i=0;i<m_SpeakerCount;i++){
ui->listWidget_speakerView->addItem(QString::fromStdString(m_pSpeaker[i].getName()));
}
}
int library::getCurrentAmpIndex()
{
return ui->listWidget_ampView->currentRow();
}
int library::getCurrentAmpModeIndex()
{
return ui->listWidget_modeSelector->currentRow();
}
int library::getCurrentSpeakerIndex()
{
return ui->listWidget_speakerView->currentRow();
}
void library::printAllAmps()
{
std::cout << "Number of Amps: "<<m_cAmpCount<<std::endl<<std::endl;
for (unsigned int i=0;i<m_cAmpCount;i++){
m_pCamp[i].print();
std::cout <<std::endl;
}
}
void library::saveLibraryToFile()
{
QSettings settings("DKM-Tech","Pa-Calculator");
QString fileName = settings.value("library/path",QString::fromStdString("")).toString();
if (fileName.isEmpty())
return;
else {
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::information(this, tr("Unable to open file"),
file.errorString());
return;
}
QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_5);
out << (uint)m_cAmpCount;
for (unsigned int j=0;j<m_cAmpCount;j++){
out << m_pCamp[j];
}
out << (uint)m_SpeakerCount;
for (unsigned int j=0;j<m_SpeakerCount;j++){
out << m_pSpeaker[j];
}
}
}
void library::on_listWidget_ampView_currentRowChanged(int currentRow)
{
if (currentRow>=0){
ui->lineEdit_ampName->setText(QString::fromStdString(m_pCamp[currentRow].getName()));
ui->comboBox_sensUnit->setCurrentIndex(m_pCamp[currentRow].getSensivityUnit());
ui->doubleSpinBox_inputSensitivity->setValue(m_pCamp[currentRow].getSensitivity());
refreshModeOverview();
ui->listWidget_modeSelector->setCurrentRow(0);
ui->lineEdit_ampName->setEnabled(true);
ui->doubleSpinBox_inputSensitivity->setEnabled(true);
}else
{
ui->lineEdit_ampName->setEnabled(false);
ui->doubleSpinBox_inputSensitivity->setEnabled(false);
}
}
void library::on_pushButton_applyChanges_clicked()
{
if (getCurrentAmpIndex()>=0){
unsaved =false;
m_pCamp[getCurrentAmpIndex()].setName(ui->lineEdit_ampName->text().toStdString());
m_pCamp[getCurrentAmpIndex()].setSensivity(ui->doubleSpinBox_inputSensitivity->value());
sensitivityUnit currentSens;
if (ui->comboBox_sensUnit->currentIndex()==0){
currentSens=volt;
}else{
currentSens=dBu;
}
m_pCamp[getCurrentAmpIndex()].setSensUnit(currentSens);
int selectedRow=getCurrentAmpIndex();
refreshAmpView();
ui->listWidget_ampView->setCurrentRow(selectedRow);
}
}
void library::on_comboBox_sensUnit_currentIndexChanged(int index)
{
double oldValue=ui->doubleSpinBox_inputSensitivity->value();
if (index==0){
ui->doubleSpinBox_inputSensitivity->setSuffix(QString(" V"));
ui->doubleSpinBox_inputSensitivity->setDecimals(2);
ui->doubleSpinBox_inputSensitivity->setValue(0.7746*qPow(10,oldValue/20));
}else{
ui->doubleSpinBox_inputSensitivity->setSuffix(QString(" dBu"));
ui->doubleSpinBox_inputSensitivity->setDecimals(1);
ui->doubleSpinBox_inputSensitivity->setValue(20*std::log10(oldValue/0.7746));
}
}
void library::on_pushButton_deleteAmp_clicked()
{
if (getCurrentAmpIndex()>=0){
m_cAmpCount-=1;
cAmp* tempAmps=new cAmp[m_cAmpCount];
unsigned int selectedRow=getCurrentAmpIndex();
for (unsigned int i=0;i<selectedRow;i++){
tempAmps[i]=m_pCamp[i];
}
for (unsigned int i=selectedRow+1;i<m_cAmpCount+1;i++){
tempAmps[i-1]=m_pCamp[i];
}
delete [] m_pCamp;
m_pCamp=tempAmps;
refreshAmpView();
if (selectedRow-1<0 && m_cAmpCount>0){
ui->listWidget_ampView->setCurrentRow(0);
}else
{
ui->listWidget_ampView->setCurrentRow(selectedRow-1);
}
}
}
void library::on_pushButton_addMode_clicked()
{
if (getCurrentAmpIndex()>=0)
{
if (ui->lineEdit_modeName->text()==""){
QMessageBox msgBox(QMessageBox::Warning,"No mode name","Mode name can't be empty. Please enter a name.");
msgBox.exec();
}else{
cAmpMode mode(ui->lineEdit_modeName->text().toStdString(),ui->spinBox_ratedImp->value(),ui->spinBox_ratedPower->value());
m_pCamp[getCurrentAmpIndex()].addAmpMode(mode);
}
}
refreshModeOverview();
}
void library::on_listWidget_modeSelector_currentRowChanged(int currentRow)
{
if (getCurrentAmpIndex()>=0){
if (currentRow >=0){
ui->lineEdit_modeName->setText(QString::fromStdString(m_pCamp[getCurrentAmpIndex()].getAmpMode(getCurrentAmpModeIndex()).getName()));
ui->spinBox_ratedImp->setValue(m_pCamp[getCurrentAmpIndex()].getAmpMode(getCurrentAmpModeIndex()).getRatedImp());
ui->spinBox_ratedPower->setValue(m_pCamp[getCurrentAmpIndex()].getAmpMode(getCurrentAmpModeIndex()).getRatedPower());
}
}
}
void library::on_pushButton_deleteMode_clicked()
{
int selectedRow=getCurrentAmpModeIndex();
m_pCamp[getCurrentAmpIndex()].deleteAmpMode(getCurrentAmpModeIndex());
refreshModeOverview();
if (selectedRow-1<0 && m_pCamp[getCurrentAmpIndex()].getAmpModesCount()){
ui->listWidget_modeSelector->setCurrentRow(0);
}else
{
ui->listWidget_modeSelector->setCurrentRow(selectedRow-1);
}
}
void library::on_pushButton_applyMode_clicked()
{
unsaved =false;
if (ui->lineEdit_modeName->text()==""){
QMessageBox msgBox(QMessageBox::Warning,"No mode name","Mode name can't be empty. Please enter a name.");
msgBox.exec();
}else{
cAmpMode mode(ui->lineEdit_modeName->text().toStdString(),ui->spinBox_ratedImp->value(),ui->spinBox_ratedPower->value());
m_pCamp[getCurrentAmpIndex()].setAmpMode(getCurrentAmpModeIndex(),mode);
}
int selectedMode=getCurrentAmpModeIndex();
refreshModeOverview();
ui->listWidget_modeSelector->setCurrentRow(selectedMode);
}
void library::on_lineEdit_ampName_textEdited(const QString &arg1)
{
if (unsaved==false){
ui->listWidget_ampView->currentItem()->setText(ui->listWidget_ampView->currentItem()->text()+QString::fromStdString("*"));
unsaved =true;
}
}
void library::on_pushButton_addSpeaker_clicked()
{
m_SpeakerCount+=1;
cSpeaker* tempSpeaker=new cSpeaker[m_SpeakerCount];
for (unsigned int i=0;i<m_SpeakerCount-1;i++){
tempSpeaker[i].setName(m_pSpeaker[i].getName());
tempSpeaker[i].setImpedance(m_pSpeaker[i].getImpedance());
tempSpeaker[i].setRMSPower(m_pSpeaker[i].getRMSPower());
tempSpeaker[i].setPeakPower(m_pSpeaker[i].getPeakPower());
tempSpeaker[i].setHPF(m_pSpeaker[i].getHPF());
}
delete [] m_pSpeaker;
m_pSpeaker=tempSpeaker;
m_pSpeaker[m_SpeakerCount-1]=cSpeaker("Unnamed Speaker",8,100,400,100);
refreshSpeakerView();
ui->listWidget_speakerView->setCurrentRow(m_SpeakerCount-1);
ui->lineEdit_speakerName->setFocus();
ui->lineEdit_speakerName->selectAll();
}
void library::on_listWidget_speakerView_currentRowChanged(int currentRow)
{
if (currentRow>=0){
ui->lineEdit_speakerName->setText(QString::fromStdString(m_pSpeaker[currentRow].getName()));
ui->spinBox_speakerImp->setValue(m_pSpeaker[currentRow].getImpedance());
ui->spinBox_speakerRMSPower->setValue(m_pSpeaker[currentRow].getRMSPower());
ui->spinBox_speakerPeakPower->setValue(m_pSpeaker[currentRow].getPeakPower());
ui->spinBox_speakerHPF->setValue(m_pSpeaker[currentRow].getHPF());
ui->lineEdit_speakerName->setEnabled(true);
//ui->spinBox_speakerImp->setEnabled(true);
//ui->spinBox_speakerRMSPower->setEnabled(true);
//ui->spinBox_speakerPeakPower->setEnabled(true);
//ui->spinBox_speakerHPF->setEnabled(true);
}else {
//ui->lineEdit_speakerName->setEnabled(false);
//ui->spinBox_speakerImp->setEnabled(false);
//ui->spinBox_speakerRMSPower->setEnabled(false);
//ui->spinBox_speakerPeakPower->setEnabled(false);
//ui->spinBox_speakerHPF->setEnabled(false);
}
}
void library::on_pushButton_deleteSpeaker_clicked()
{
if (getCurrentSpeakerIndex()>=0){
m_SpeakerCount-=1;
cSpeaker* tempSpeaker=new cSpeaker[m_SpeakerCount];
unsigned int selectedRow=getCurrentSpeakerIndex();
for (unsigned int i=0;i<selectedRow;i++){
tempSpeaker[i]=m_pSpeaker[i];
}
for (unsigned int i=selectedRow+1;i<m_SpeakerCount+1;i++){
tempSpeaker[i-1]=m_pSpeaker[i];
}
delete [] m_pSpeaker;
m_pSpeaker=tempSpeaker;
refreshSpeakerView();
if (selectedRow-1<0 && m_SpeakerCount>0){
ui->listWidget_speakerView->setCurrentRow(0);
}else
{
ui->listWidget_speakerView->setCurrentRow(selectedRow-1);
}
}
}
void library::on_pushButton_applySpeaker_clicked()
{
if (getCurrentSpeakerIndex()>=0){
speakerUnsaved =false;
m_pSpeaker[getCurrentSpeakerIndex()].setName(ui->lineEdit_speakerName->text().toStdString());
m_pSpeaker[getCurrentSpeakerIndex()].setImpedance(ui->spinBox_speakerImp->value());
m_pSpeaker[getCurrentSpeakerIndex()].setRMSPower(ui->spinBox_speakerRMSPower->value());
m_pSpeaker[getCurrentSpeakerIndex()].setPeakPower(ui->spinBox_speakerPeakPower->value());
m_pSpeaker[getCurrentSpeakerIndex()].setHPF(ui->spinBox_speakerHPF->value());
int selectedRow=getCurrentSpeakerIndex();
refreshSpeakerView();
ui->listWidget_speakerView->setCurrentRow(selectedRow);
}
}
void library::on_lineEdit_speakerName_textEdited(const QString &arg1)
{
if (speakerUnsaved==false){
ui->listWidget_speakerView->currentItem()->setText(ui->listWidget_speakerView->currentItem()->text()+QString::fromStdString("*"));
speakerUnsaved =true;
}
}