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

137 lines
3.9 KiB
C++

#include <guitar/MIDIDialog.hpp>
#include <guitar/guitar.hpp>
#include <guitar/MIDIHelper.hpp>
MIDIDialog::MIDIDialog(void)
{
mInitHandler.setCallback(this,&MIDIDialog::initHandler);
mCreateHandler.setCallback(this,&MIDIDialog::createHandler);
mCloseHandler.setCallback(this,&MIDIDialog::closeHandler);
mDestroyHandler.setCallback(this,&MIDIDialog::destroyHandler);
mCommandHandler.setCallback(this,&MIDIDialog::commandHandler);
insertHandler(VectorHandler::InitDialogHandler,&mInitHandler);
insertHandler(VectorHandler::CreateHandler,&mCreateHandler);
insertHandler(VectorHandler::CloseHandler,&mCloseHandler);
insertHandler(VectorHandler::CommandHandler,&mCommandHandler);
insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
}
MIDIDialog::MIDIDialog(const MIDIDialog &someMIDIDialog)
{ // private implementation
*this=someMIDIDialog;
}
MIDIDialog::~MIDIDialog()
{
removeHandler(VectorHandler::InitDialogHandler,&mInitHandler);
removeHandler(VectorHandler::CreateHandler,&mCreateHandler);
removeHandler(VectorHandler::CloseHandler,&mCloseHandler);
removeHandler(VectorHandler::CommandHandler,&mCommandHandler);
removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
}
MIDIDialog &MIDIDialog::operator=(const MIDIDialog &someMIDIDialog)
{ // private implementation
return *this;
}
bool MIDIDialog::perform(GUIWindow &parentWindow,const String &strPathMIDIFileName,int &selectedTrack)
{
bool returnCode;
mPathMIDIFileName=strPathMIDIFileName;
returnCode=::DialogBoxParam(processInstance(),(LPSTR)"MIDIDIALOG",(HWND)parentWindow,DWindow::DlgProc,(LPARAM)(DWindow*)this);
if(returnCode)selectedTrack=mSelectedTrack;
return returnCode;
}
CallbackData::ReturnType MIDIDialog::initHandler(CallbackData &someCallbackData)
{
MIDIHelper midiHelper;
TrackInfos trackInfos;
midiHelper.getTrackInfo(mPathMIDIFileName,trackInfos);
setTrackInformation(trackInfos);
return (CallbackData::ReturnType)false;
}
CallbackData::ReturnType MIDIDialog::createHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MIDIDialog::closeHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MIDIDialog::destroyHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MIDIDialog::commandHandler(CallbackData &someCallbackData)
{
switch(someCallbackData.wmCommandID())
{
case IDCANCEL :
endDialog(false);
break;
case IDOK :
mSelectedTrack=getSelectedTrack();
if(-1==mSelectedTrack)endDialog(false);
else endDialog(true);
break;
}
if(BN_CLICKED==someCallbackData.wmCommandCommand())handleClick(someCallbackData);
return (CallbackData::ReturnType)FALSE;
}
void MIDIDialog::setTrackInformation(TrackInfos &trackInfos)
{
bool isFirst=true;
for(int index=0;index<trackInfos.size();index++)
{
const TrackInfo &trackInfo=trackInfos[index];
::EnableWindow(getItem(MIDI_TRACK1+trackInfo.getTrackNo()),true);
if(isFirst)
{
isFirst=false;
sendMessage(MIDI_TRACK1+trackInfo.getTrackNo(),BM_SETCHECK,true,0L);
}
String strEvents;
strEvents.fromInt(trackInfo.getEventCount());
sendMessage(MIDI_EVENTS_TRACK1+trackInfo.getTrackNo(),WM_SETTEXT,(WPARAM)0,(LPARAM)String().fromInt(trackInfo.getEventCount()).str());
}
}
void MIDIDialog::handleClick(const CallbackData &someCallbackData)
{
UINT clickedId(LOWORD(someCallbackData.wParam()));
if(!(clickedId>=MIDI_TRACK1&&clickedId<=MIDI_TRACK16))return;
mSelectedTrack=clickedId-MIDI_TRACK1;
for(int btnId=MIDI_TRACK1;btnId<=MIDI_TRACK16;btnId++)
{
if(btnId!=clickedId)sendMessage(btnId,BM_SETCHECK,0,0L);
}
}
int MIDIDialog::getSelectedTrack(void)const
{
int selectedTrack=-1;
for(int btnId=MIDI_TRACK1;btnId<=MIDI_TRACK16;btnId++)
{
if(1==sendMessage(btnId,BM_GETCHECK,0,0L))
{
selectedTrack=btnId-MIDI_TRACK1;
break;
}
}
return selectedTrack;
}