Files
Work/guitar/ChordBuilderDialog.cpp
2024-08-07 09:16:27 -04:00

161 lines
5.8 KiB
C++

#include <guitar/ChordBuilderDialog.hpp>
#include <guitar/guitar.hpp>
#include <guitar/TabEntry.hpp>
#include <guitar/MessageBox.hpp>
#include <guitar/CBCommands.hpp>
#include <guitar/MessageBox.hpp>
#include <music/ChordCompiler.hpp>
#include <common/puredwrd.hpp>
#include <common/crsctrl.hpp>
#include <common/StringBuffer.hpp>
using namespace Music;
ChordBuilderDialog::ChordBuilderDialog(void)
{
mInitHandler.setCallback(this,&ChordBuilderDialog::initHandler);
mCreateHandler.setCallback(this,&ChordBuilderDialog::createHandler);
mCloseHandler.setCallback(this,&ChordBuilderDialog::closeHandler);
mDestroyHandler.setCallback(this,&ChordBuilderDialog::destroyHandler);
mCommandHandler.setCallback(this,&ChordBuilderDialog::commandHandler);
insertHandler(VectorHandler::InitDialogHandler,&mInitHandler);
insertHandler(VectorHandler::CreateHandler,&mCreateHandler);
insertHandler(VectorHandler::CloseHandler,&mCloseHandler);
insertHandler(VectorHandler::CommandHandler,&mCommandHandler);
insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
}
ChordBuilderDialog::ChordBuilderDialog(const ChordBuilderDialog &someChordBuilderDialog)
{ // private implementation
*this=someChordBuilderDialog;
}
ChordBuilderDialog::~ChordBuilderDialog()
{
removeHandler(VectorHandler::InitDialogHandler,&mInitHandler);
removeHandler(VectorHandler::CreateHandler,&mCreateHandler);
removeHandler(VectorHandler::CloseHandler,&mCloseHandler);
removeHandler(VectorHandler::CommandHandler,&mCommandHandler);
removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
}
ChordBuilderDialog &ChordBuilderDialog::operator=(const ChordBuilderDialog &someChordBuilderDialog)
{ // private implementation
return *this;
}
bool ChordBuilderDialog::perform(GUIWindow &parentWindow,CallbackPointer &callbackPointer)
{
Rect clientRect;
mPlayNoteHandler=callbackPointer;
parentWindow.clientRect(clientRect);
mDisplayPoint.x((clientRect.right()-clientRect.left())/2);
mDisplayPoint.y((clientRect.bottom()-clientRect.top())/2);
return ::DialogBoxParam(processInstance(),(LPSTR)"CHORDBUILDERDIALOG",(HWND)parentWindow,DWindow::DlgProc,(LPARAM)(DWindow*)this);
}
CallbackData::ReturnType ChordBuilderDialog::initHandler(CallbackData &someCallbackData)
{
mDisplayPoint.x(mDisplayPoint.x()-(width()/2));
mDisplayPoint.y(mDisplayPoint.y()-(height()/2));
move(mDisplayPoint);
return (CallbackData::ReturnType)false;
}
CallbackData::ReturnType ChordBuilderDialog::createHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType ChordBuilderDialog::closeHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType ChordBuilderDialog::destroyHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType ChordBuilderDialog::commandHandler(CallbackData &someCallbackData)
{
switch(someCallbackData.wmCommandID())
{
case IDCANCEL :
endDialog(false);
break;
case IDOK :
if(handleChordSelection())endDialog(true);
else MessageBox::messageBox("Unable to parse chord.","Please check parameters (parser is case sensitive)");
break;
case ENTERCHORD_EXAMPLES :
handleShowExamples();
break;
}
if(LBN_SELCHANGE==someCallbackData.wmCommandCommand())handleChordSelection();
return (CallbackData::ReturnType)FALSE;
}
bool ChordBuilderDialog::handleChordSelection(void)
{
ChordCompiler chordCompiler;
Music::Chord chord;
String strChord;
strChord=getText(ENTERCHORD_EDIT);
if(!chordCompiler.compile(strChord,chord))return false;
CallbackData cbData(CBCommands::FBPlayChord,(DWORD)&chord);
mPlayNoteHandler.callback(cbData);
return true;
}
void ChordBuilderDialog::makeTabEntry(String strLine,TabEntry &entry)
{
strLine=strLine.betweenString('[',']');
if(strLine.isNull())return;
char *ptr=strLine.str();
entry.remove();
for(int string=0;string<6;string++)
{
if(!string)ptr=::strtok(ptr," ]\0");
else ptr=::strtok(0," ]\0");
if(String(ptr).equals("x"))continue;
FrettedNote frettedNote;
frettedNote.setString(string);
frettedNote.setFret(::atoi(ptr));
frettedNote.setNote(mFretboard.getAt(frettedNote.getString(),frettedNote.getFret()));
entry.insert(&frettedNote);
}
}
void ChordBuilderDialog::handleShowExamples()
{
StringBuffer stringBuffer;
String crlf("\n");
stringBuffer.append("\"C^\" - C Major 7th ").append(crlf);
stringBuffer.append("\"Db^\" - D Flat Major 7th").append(crlf);
stringBuffer.append("\"C^#4\" - C Major 7th- sharp 4").append(crlf);
stringBuffer.append("\"D7\" - D Dominant 7th").append(crlf);
stringBuffer.append("\"D-7\" - D Minor 7th").append(crlf);
stringBuffer.append("\"Cb7#9\" - C Flat 7th - sharp 9").append(crlf);
stringBuffer.append("\"Eb-7\" - E Flat Minor 7th").append(crlf);
stringBuffer.append("\"G-\" - G Minor").append(crlf);
stringBuffer.append("\"Ab7\" - A Flat Dominant 7th").append(crlf);
stringBuffer.append("\"F#7\" - F Sharp Major 7th").append(crlf);
stringBuffer.append("\"C7#9\" - C Dominant 7th - sharp 9").append(crlf);
stringBuffer.append("\"Gb^#4\" - G Flat Major 7th - sharp 4").append(crlf);
stringBuffer.append("\"G7#11\" - G Dominant 7th - sharp 11").append(crlf);
stringBuffer.append("\"Ebsus\" - E Flat Sus").append(crlf);
stringBuffer.append("\"Dsusb9\" - D Sus - Flat 9").append(crlf);
stringBuffer.append("\"F#susb9\"- F Sharp Sus - Flat 9").append(crlf);
stringBuffer.append("\"Ebsusb9\"- E Flat Sus - Flat 9").append(crlf);
stringBuffer.append("\"A-b6\" - A Minor - Flat 6").append(crlf);
stringBuffer.append("\"Ao\" - A Half Diminished a.k.a B-7b5").append(crlf);
stringBuffer.append("\"C-#7\" - C Minor - Sharp 7 a.k.a C MinorMajor").append(crlf);
stringBuffer.append("\"C-^\" - C MinorMajor").append(crlf);
MessageBox::messageBox(*this,"Example Chords",stringBuffer.toString());
}