From: <Rel...@us...> - 2007-02-03 21:24:47
|
Revision: 172 http://svn.sourceforge.net/modplug/?rev=172&view=rev Author: Relabsoluness Date: 2007-02-03 13:24:42 -0800 (Sat, 03 Feb 2007) Log Message: ----------- (Note: This doesn't include the patch from pelya; I wanted to get my modifications committed before merging it.) + <Relabs> Ability to 'scale' envelope points, i.e. to move envelope points by given factor; try right click in envelope views. . <Relabs> Fixed 24-bit wav loading again :) . <Relabs> Fixed an ITP-saving bug I had created when extending the pattern/order-limit(messes orderlist up). . <Relabs> Fixed an ITP-loading bug concerning loading empty comments; could be noticed as trash characters in the comments when there shouldn't have been any. . <Relabs> Bug fix related to handling of finesteps when creating tunings. . <Relabs> Fixed the way modified flag appears when modifying tunings. . <Relabs> Fixed bug that VSTi was making no sound when corresponding instrument had no associated sample - Can cause some tracks using VSTi's to play differently. / <Relabs> Modified the way pattern data is saved/loaded with ITP in order to be able to hack the MODCOMMAND-class. / <Relabs> The tuning dialog now has a treeview instead of the comboboxes. / <Relabs> Local tunings are no longer saved to file everytime the program closes. / <Relabs> Changed the 'order message' at the bottom bar of the screen "Position x of y" to "Position x of y (x_in_hex of y_in_hex)". / <Relabs> To orderlist context menu, changed "Insert Pattern" and "Remove Pattern" to "Insert Order" and "Remove Order" because I find the former somewhat misleading. - Sometimes loading multiple files from openfile dialog fails. Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.h branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc branches/OpenMPT_MPTm_Tuning/mptrack/pattern.cpp branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h branches/OpenMPT_MPTm_Tuning/mptrack/patternContainer.cpp branches/OpenMPT_MPTm_Tuning/mptrack/resource.h branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DMF.CPP branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp branches/OpenMPT_MPTm_Tuning/soundlib/mod_specifications.h branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h branches/OpenMPT_MPTm_Tuning/soundlib/tuning.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningCollection.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningcollection.h branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h branches/OpenMPT_MPTm_Tuning/soundlib/midi.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -877,6 +877,7 @@ } PostViewMessage(VIEWMSG_SETCURRENTINSTRUMENT, m_nInstrument); UnlockControls(); + return TRUE; } @@ -2466,6 +2467,15 @@ v.push_back(&m_pSndFile->m_TuningsTuneSpecific); CTuningDialog td(this, v, pInstH->pTuning); td.DoModal(); + if(td.GetModifiedStatus(&m_pSndFile->s_TuningsSharedLocal)) + { + if(MsgBox(IDS_APPLY_TUNING_MODIFICATIONS, this, "", MB_OKCANCEL) == IDOK) + m_pSndFile->SaveStaticTunings(); + } + if(td.GetModifiedStatus(&m_pSndFile->m_TuningsTuneSpecific)) + { + m_pModDoc->SetModified(); + } //Recreating tuning combobox so that possible //new tuning(s) come visible. Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -409,8 +409,16 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); s[0] = 0; - wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "Position %02Xh of %02Xh" : "Position %d of %d", - m_nScrollPos, pSndFile->GetNumPatterns()); + if(CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) + { + wsprintf(s, "Position %02Xh of %02Xh", m_nScrollPos, pSndFile->GetNumPatterns()); + } + else + { + wsprintf(s, "Position %d of %d (%02Xh of %02Xh)", + m_nScrollPos, pSndFile->GetNumPatterns(), m_nScrollPos, pSndFile->GetNumPatterns()); + } + if (m_nScrollPos < pSndFile->Order.size()) { UINT nPat = pSndFile->Order[m_nScrollPos]; @@ -661,8 +669,8 @@ if (hMenu) { - AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Pattern\tIns"); - AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Pattern\tDel"); + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Order\tIns"); + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Order\tDel"); AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_NEW, "Create &New Pattern"); AppendMenu(hMenu, MF_STRING|greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern"); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -273,11 +273,8 @@ srcy = pfnt->nAlphaNZ_Y + 13 * COLUMN_HEIGHT; break; case '#': - srcx = pfnt->nNoteX + pfnt->nNoteWidth/2; - srcy = pfnt->nNoteY + 2*COLUMN_HEIGHT; - //TODO: '#' doesn't show properly in effect column. - //srcx = pfnt->nAlphaAM_X; - //srcy = pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; + srcx = pfnt->nAlphaAM_X; + srcy = pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; break; //rewbs.smoothVST case '\\': Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -648,10 +648,6 @@ delete m_pPerfCounter; CChannelManagerDlg::DestroySharedInstance(); - - - //Saving statictunings here. - CSoundFile::SaveStaticTunings(); } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -872,7 +872,8 @@ if ((nPlugin) && (nPlugin <= MAX_MIXPLUGINS)) { IMixPlugin *pPlugin = m_SndFile.m_MixPlugins[nPlugin-1].pMixPlugin; - if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->nVolume, MAX_BASECHANNELS); + //if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->nVolume, MAX_BASECHANNELS); + if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->GetVSTVolume(), MAX_BASECHANNELS); } } } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -83,7 +83,6 @@ //--------------------------------------------------------------- { if(size() < count) resize(count, 0xFF); - ASSERT(count == size()); size_t i = 0; Added: branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -0,0 +1,94 @@ +// ScaleEnvPointsDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "mptrack.h" +#include "ScaleEnvPointsDlg.h" + + +// CScaleEnvPointsDlg dialog + +IMPLEMENT_DYNAMIC(CScaleEnvPointsDlg, CDialog) +CScaleEnvPointsDlg::CScaleEnvPointsDlg(CWnd* pParent, INSTRUMENTHEADER* pInst, BYTE env) + : CDialog(CScaleEnvPointsDlg::IDD, pParent), + m_pInstrument(pInst), + m_Env(env) +//---------------------------------------------------------------------- +{ +} + +CScaleEnvPointsDlg::~CScaleEnvPointsDlg() +//--------------------------------------- +{ +} + +void CScaleEnvPointsDlg::DoDataExchange(CDataExchange* pDX) +//-------------------------------------------------------- +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_EDIT_FACTOR, m_EditFactor); +} + + +BEGIN_MESSAGE_MAP(CScaleEnvPointsDlg, CDialog) + +END_MESSAGE_MAP() + + +// CScaleEnvPointsDlg message handlers + +void CScaleEnvPointsDlg::OnOK() +//------------------------------ +{ + char buffer[10]; + GetDlgItemText(IDC_EDIT_FACTOR, buffer, 9); + float factor = static_cast<float>(atof(buffer)); + if(factor > 0) + { + WORD (*array)[MAX_ENVPOINTS] = NULL; + UINT* arraySize = NULL; + switch(m_Env) + { + case ENV_VOLUME: + array = &m_pInstrument->VolPoints; + arraySize = &m_pInstrument->nVolEnv; + break; + + case ENV_PANNING: + array = &m_pInstrument->PanPoints; + arraySize = &m_pInstrument->nPanEnv; + break; + + case ENV_PITCH: + array = &m_pInstrument->PitchPoints; + arraySize = &m_pInstrument->nPitchEnv; + break; + } + + if(array && arraySize) + { + for(UINT i = 0; i<*arraySize; i++) + { + (*array)[i] *= factor; + + //Checking that the order of points is preserved. + if(i > 0 && (*array)[i] <= (*array)[i-1]) + (*array)[i] = (*array)[i-1]+1; + } + } + } + + CDialog::OnOK(); +} + +BOOL CScaleEnvPointsDlg::OnInitDialog() +//------------------------------------- +{ + CDialog::OnInitDialog(); + + SetDlgItemText(IDC_EDIT_FACTOR, ""); + m_EditFactor.SetFocus(); + + + return FALSE; // return TRUE unless you set the focus to a control +} Added: branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h 2007-02-03 21:24:42 UTC (rev 172) @@ -0,0 +1,33 @@ +#pragma once +#include "sndfile.h" +#include "afxwin.h" + +// CScaleEnvPointsDlg dialog + +//======================================= +class CScaleEnvPointsDlg : public CDialog +//======================================= +{ + DECLARE_DYNAMIC(CScaleEnvPointsDlg) + +public: + CScaleEnvPointsDlg(CWnd* pParent, INSTRUMENTHEADER* pInst, BYTE env); // standard constructor + virtual ~CScaleEnvPointsDlg(); + +// Dialog Data + enum { IDD = IDD_SCALE_ENV_POINTS }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + DECLARE_MESSAGE_MAP() + +private: + INSTRUMENTHEADER* m_pInstrument; + BYTE m_Env; //To tell which envelope to process. + CEdit m_EditFactor; +protected: + virtual void OnOK(); +public: + virtual BOOL OnInitDialog(); +}; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -3,17 +3,20 @@ #include "TuningDialog.h" #include <algorithm> #include "misc_util.h" +#include ".\tuningdialog.h" const string CTuningDialog::s_stringTypeGEN = "General"; const string CTuningDialog::s_stringTypeRP = "Ratio periodic"; const string CTuningDialog::s_stringTypeTET = "TET"; +const CTuningDialog::TUNINGTREEITEM CTuningDialog::s_notFoundItemTuning = TUNINGTREEITEM(); +const HTREEITEM CTuningDialog::s_notFoundItemTree = NULL; + /* TODOS: --Clear tuning(when copying existing tuning, it might have - e.g. unwanted note names which should able to be removed. --Drag'n'drop tuningfiles +-Clear tuning -Tooltips. +-Create own dialogs for Tuning collection part, and Tuning part. */ @@ -25,7 +28,11 @@ m_TuningCollections(rVec), m_TempTunings("Sandbox"), m_NoteEditApply(true), - m_RatioEditApply(true) + m_RatioEditApply(true), + m_pActiveTuningCollection(NULL), + m_TreeItemTuningItemMap(s_notFoundItemTree, s_notFoundItemTuning), + m_TreeCtrlTuning(this), + m_DoErrorExit(false) //---------------------------------------- { m_pActiveTuning = pTun; @@ -39,37 +46,129 @@ { for(size_t i = 0; i<m_TuningCollections.size(); i++) { - vector<CTuningCollection*>::iterator iter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), m_TuningCollections[i]); - if(iter != m_DeletableTuningCollections.end()) + if(IsDeletable(m_TuningCollections[i])) { delete m_TuningCollections[i]; - m_DeletableTuningCollections.erase(iter); + m_TuningCollections[i] = NULL; } } m_TuningCollections.clear(); m_DeletableTuningCollections.clear(); } +HTREEITEM CTuningDialog::AddTreeItem(CTuningCollection* pTC, HTREEITEM parent, HTREEITEM insertAfter) +//--------------------------------------------------------------------------------------------------- +{ + const HTREEITEM temp = m_TreeCtrlTuning.InsertItem(pTC->GetName().c_str(), parent, insertAfter); + HTREEITEM temp2 = NULL; + m_TreeItemTuningItemMap.AddPair(temp, TUNINGTREEITEM(pTC)); + for(size_t i = 0; i<pTC->GetNumTunings(); i++) + { + temp2 = AddTreeItem(&pTC->GetTuning(i), temp, temp2); + } + m_TreeCtrlTuning.EnsureVisible(temp); + return temp; +} + +HTREEITEM CTuningDialog::AddTreeItem(CTuning* pT, HTREEITEM parent, HTREEITEM insertAfter) +//----------------------------------------------------------------------------------------- +{ + const HTREEITEM temp = m_TreeCtrlTuning.InsertItem(pT->GetName().c_str(), parent, insertAfter); + m_TreeItemTuningItemMap.AddPair(temp, TUNINGTREEITEM(pT)); + m_TreeCtrlTuning.EnsureVisible(temp); + return temp; +} + +void CTuningDialog::DeleteTreeItem(CTuning* pT) +//--------------------------------------------- +{ + if(!pT) + return; + + HTREEITEM temp = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pT)); + if(temp) + { + HTREEITEM nextitem = m_TreeCtrlTuning.GetNextItem(temp, TVGN_NEXT); + if(!nextitem) nextitem = m_TreeCtrlTuning.GetNextItem(temp, TVGN_PREVIOUS); + m_pActiveTuning = m_TreeItemTuningItemMap.GetMapping_12(nextitem).GetT(); + m_TreeCtrlTuning.DeleteItem(temp); + //Note: Item from map is deleted 'automatically' in + //OnTvnDeleteitemTreeTuning. + + } +} + +void CTuningDialog::DeleteTreeItem(CTuningCollection* pTC) +//--------------------------------------------- +{ + if(!pTC) + return; + + m_pActiveTuning = NULL; + const HTREEITEM temp = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTC)); + if(temp) + { + TUNINGTREEITEM prevTTI = m_TreeItemTuningItemMap.GetMapping_12(m_TreeCtrlTuning.GetNextItem(temp, TVGN_PREVIOUS)); + TUNINGTREEITEM nextTTI = m_TreeItemTuningItemMap.GetMapping_12(m_TreeCtrlTuning.GetNextItem(temp, TVGN_NEXT)); + + CTuningCollection* pTCprev = prevTTI.GetTC(); + CTuningCollection* pTCnext = nextTTI.GetTC(); + if(pTCnext == NULL) + pTCnext = GetpTuningCollection(nextTTI.GetT()); + if(pTCprev == NULL) + pTCprev = GetpTuningCollection(prevTTI.GetT()); + + if(pTCnext != NULL && pTCnext != m_pActiveTuningCollection) + m_pActiveTuningCollection = pTCnext; + else + { + if(pTCprev != m_pActiveTuningCollection) + m_pActiveTuningCollection = pTCprev; + else + m_pActiveTuningCollection = NULL; + } + + m_TreeCtrlTuning.DeleteItem(temp); + //Note: Item from map is deleted 'automatically' in + //OnTvnDeleteitemTreeTuning. + } + else + { + ASSERT(false); + m_DoErrorExit = true; + m_pActiveTuningCollection = NULL; + } +} + BOOL CTuningDialog::OnInitDialog() //-------------------------------- { CDialog::OnInitDialog(); - + m_RatioMapWnd.Init(this, 0); - //Adding tuning collection names to the combobox. + //-->Creating treeview + m_TreeItemTuningItemMap.ClearMapping(); for(size_t i = 0; i<m_TuningCollections.size(); i++) { - m_CombobTuningCollection.AddString(m_TuningCollections[i]->GetName().c_str()); + AddTreeItem(m_TuningCollections[i], NULL, NULL); } + //<-- Creating treeview - //Adding tuning type names to corresponding combobox + m_pActiveTuningCollection = GetpTuningCollection(m_pActiveTuning); + + //Adding tuning type names to corresponding combobox. m_CombobTuningType.AddString(s_stringTypeGEN.c_str()); m_CombobTuningType.AddString(s_stringTypeRP.c_str()); m_CombobTuningType.AddString(s_stringTypeTET.c_str()); m_ButtonSet.EnableWindow(FALSE); + //#ifdef DEBUG + m_EditTuningCollectionVersion.ShowWindow(SW_SHOW); + m_EditTuningCollectionEditMask.ShowWindow(SW_SHOW); + //#endif + m_EditFineTuneSteps.SetLimitText(3); UpdateView(); @@ -77,117 +176,155 @@ return TRUE; } -void CTuningDialog::UpdateView() + +void CTuningDialog::UpdateView(const int updateMask) //------------------------------ { - - if(m_pActiveTuning == NULL && (m_TuningCollections.size() == 0 || m_TuningCollections[0]->GetNumTunings() == 0)) + if(m_DoErrorExit) { - ASSERT(false); + DoErrorExit(); return; } - if(m_pActiveTuning == NULL) - m_pActiveTuning = &m_TuningCollections[0]->GetTuning(0); - - - //Finding out where given tuning belongs to. - size_t curTCol = 0, curT = 0; //cur <-> Current, T <-> Tuning, Col <-> Collection. - bool found = false; - for(size_t i = 0; i<m_TuningCollections.size(); i++) + //-->Updating treeview + if(updateMask != UM_TUNINGDATA) { - CTuningCollection& rCurTCol = *m_TuningCollections.at(i); - for(size_t j = 0; j<rCurTCol.GetNumTunings(); j++) + TUNINGTREEITEM tuningitem; + if(m_pActiveTuning) + tuningitem.Set(m_pActiveTuning); + else { - if(m_pActiveTuning == &rCurTCol.GetTuning(static_cast<unsigned short>(j))) - { - curTCol = i; - curT = j; - found = true; - break; - } + if(m_pActiveTuningCollection) + tuningitem.Set(m_pActiveTuningCollection); } + HTREEITEM treeitem = m_TreeItemTuningItemMap.GetMapping_21(tuningitem); + if(treeitem) + { + m_TreeCtrlTuning.Select(treeitem, TVGN_CARET); + if(m_pActiveTuning) + m_TreeCtrlTuning.SetItemText(treeitem, m_pActiveTuning->GetName().c_str()); + else + m_TreeCtrlTuning.SetItemText(treeitem, m_pActiveTuningCollection->GetName().c_str()); + } } - ASSERT(found); + //<--Updating treeview + - m_CombobTuningCollection.SetCurSel(curTCol); - OnCbnSelchangeComboTcol(); - m_CombobTuningCollection.Invalidate(); + if(m_pActiveTuningCollection == NULL) + { + return; + } - m_CombobTuningName.SetCurSel(curT); - m_CombobTuningName.Invalidate(); + //Updating tuning collection part--> + if(updateMask == 0 || updateMask & UM_TUNINGCOLLECTION) + { + m_EditTuningCollectionName.SetWindowText(m_pActiveTuningCollection->GetName().c_str()); + m_EditTuningCollectionVersion.SetWindowText(m_pActiveTuningCollection->GetVersionString().c_str()); + m_EditTuningCollectionEditMask.SetWindowText(m_pActiveTuningCollection->GetEditMaskString().c_str()); + m_EditTuningCollectionItemNum.SetWindowText(Stringify(m_pActiveTuningCollection->GetNumTunings()).c_str()); + m_EditTuningCollectionPath.SetWindowText(m_pActiveTuningCollection->GetSaveFilePath().c_str()); + } + //<-- Updating tuning collection part + //Updating tuning part--> + if(m_pActiveTuning != NULL && (updateMask & UM_TUNINGDATA || updateMask == 0)) + { + UpdateTuningType(); - UpdateTuningType(); + m_EditName.SetWindowText(m_pActiveTuning->GetName().c_str()); + m_EditName.Invalidate(); - m_EditName.SetWindowText(m_pActiveTuning->GetName().c_str()); - m_EditName.Invalidate(); + //Finetunesteps-edit + m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->GetFineStepCount()).c_str()); + m_EditFineTuneSteps.Invalidate(); - //Finetunesteps-edit - m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->GetFineStepCount()).c_str()); - m_EditFineTuneSteps.Invalidate(); + //Making sure that ratiomap window is showing and + //updating its content. + m_RatioMapWnd.ShowWindow(SW_SHOW); + m_RatioMapWnd.m_pTuning = m_pActiveTuning; + m_RatioMapWnd.Invalidate(); + UpdateRatioMapEdits(m_RatioMapWnd.GetShownCentre()); - //.Making sure that ratiomap window is showing and - //updating its content. - m_RatioMapWnd.ShowWindow(SW_SHOW); - m_RatioMapWnd.m_pTuning = m_pActiveTuning; - m_RatioMapWnd.Invalidate(); - UpdateRatioMapEdits(m_RatioMapWnd.GetShownCentre()); - - const CTuning::STEPTYPE period = m_pActiveTuning->GetPeriod(); - const CTuning::RATIOTYPE periodRatio = m_pActiveTuning->GetPeriodRatio(); - if(period > 0) - { - m_EditSteps.EnableWindow(); - m_EditSteps.SetWindowText(Stringify(period).c_str()); + const CTuning::STEPTYPE period = m_pActiveTuning->GetPeriod(); + const CTuning::RATIOTYPE periodRatio = m_pActiveTuning->GetPeriodRatio(); + if(period > 0) + { + m_EditSteps.EnableWindow(); + m_EditSteps.SetWindowText(Stringify(period).c_str()); - m_EditRatioPeriod.EnableWindow(); - m_EditRatioPeriod.SetWindowText(Stringify(periodRatio).c_str()); - } - else //case: m_pActiveTuning is of type general. - { - m_EditSteps.EnableWindow(false); - m_EditRatioPeriod.EnableWindow(false); - } + m_EditRatioPeriod.EnableWindow(); + m_EditRatioPeriod.SetWindowText(Stringify(periodRatio).c_str()); + } + else //case: m_pActiveTuning is of type general. + { + m_EditSteps.EnableWindow(false); + m_EditRatioPeriod.EnableWindow(false); + } - m_EditRatioPeriod.Invalidate(); - m_EditSteps.Invalidate(); + m_EditRatioPeriod.Invalidate(); + m_EditSteps.Invalidate(); - bool enableControls = true; - if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST || + bool enableControls = true; + + if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST || m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) - { - CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); - if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) - m_ButtonReadOnly.EnableWindow(FALSE); + { + CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); + if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) + m_ButtonReadOnly.EnableWindow(FALSE); + else + m_ButtonReadOnly.EnableWindow(TRUE); + + enableControls = false; + } else - m_ButtonReadOnly.EnableWindow(TRUE); + { + CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); + m_ButtonReadOnly.EnableWindow(); + } - enableControls = false; + m_CombobTuningType.EnableWindow(enableControls); + m_EditTableSize.SetReadOnly(!enableControls); + m_EditBeginNote.SetReadOnly(!enableControls); + m_EditSteps.SetReadOnly(!enableControls); + m_EditRatioPeriod.SetReadOnly(!enableControls); + m_EditRatio.SetReadOnly(!enableControls); + m_EditNotename.SetReadOnly(!enableControls); + m_EditMiscActions.SetReadOnly(!enableControls); + m_EditFineTuneSteps.SetReadOnly(!enableControls); + m_EditName.SetReadOnly(!enableControls); + + m_ButtonSet.EnableWindow(enableControls); + + m_CombobTuningType.Invalidate(); + m_EditSteps.Invalidate(); + m_EditRatioPeriod.Invalidate(); } - else + else { - CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); - m_ButtonReadOnly.EnableWindow(); - } + if(m_pActiveTuning == NULL) //No active tuning, clearing tuning part. + { + m_EditName.SetWindowText(""); + m_EditTableSize.SetWindowText(""); + m_EditBeginNote.SetWindowText(""); + m_EditSteps.SetWindowText(""); + m_EditRatioPeriod.SetWindowText(""); + m_EditRatio.SetWindowText(""); + m_EditNotename.SetWindowText(""); + m_EditMiscActions.SetWindowText(""); + m_EditFineTuneSteps.SetWindowText(""); + m_EditName.SetWindowText(""); - m_CombobTuningType.EnableWindow(enableControls); - m_EditTableSize.SetReadOnly(!enableControls); - m_EditBeginNote.SetReadOnly(!enableControls); - m_EditSteps.SetReadOnly(!enableControls); - m_EditRatioPeriod.SetReadOnly(!enableControls); - m_EditRatio.SetReadOnly(!enableControls); - m_EditNotename.SetReadOnly(!enableControls); - m_EditMiscActions.SetReadOnly(!enableControls); - m_EditFineTuneSteps.SetReadOnly(!enableControls); - m_EditName.SetReadOnly(!enableControls); - - m_ButtonSet.EnableWindow(enableControls); - - m_CombobTuningType.Invalidate(); - m_EditSteps.Invalidate(); - m_EditRatioPeriod.Invalidate(); + m_CombobTuningType.SetCurSel(-1); + m_ButtonReadOnly.EnableWindow(FALSE); + + m_RatioMapWnd.ShowWindow(SW_HIDE); + m_RatioMapWnd.m_pTuning = NULL; + m_RatioMapWnd.Invalidate(); + } + } + //<--Updating tuning part } @@ -196,16 +333,11 @@ { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATICRATIOMAP, m_RatioMapWnd); - DDX_Control(pDX, IDC_COMBO_TCOL, m_CombobTuningCollection); - DDX_Control(pDX, IDC_COMBO_T, m_CombobTuningName); DDX_Control(pDX, IDC_COMBO_TTYPE, m_CombobTuningType); DDX_Control(pDX, IDC_EDIT_TABLESIZE, m_EditTableSize); DDX_Control(pDX, IDC_EDIT_BEGINNOTE, m_EditBeginNote); DDX_Control(pDX, IDC_EDIT_STEPS, m_EditSteps); DDX_Control(pDX, IDC_EDIT_RATIOPERIOD, m_EditRatioPeriod); - DDX_Control(pDX, IDC_CHECK_NEWTUNING, m_CheckNewTuning); - DDX_Control(pDX, IDC_ADD_TUNING, m_ButtonAddTuning); - DDX_Control(pDX, IDC_REMOVE_TUNING, m_ButtonRemoveTuning); DDX_Control(pDX, IDC_EDIT_RATIOVALUE, m_EditRatio); DDX_Control(pDX, IDC_EDIT_NOTENAME, m_EditNotename); DDX_Control(pDX, IDC_BUTTON_SETVALUES, m_ButtonSet); @@ -215,19 +347,20 @@ DDX_Control(pDX, IDC_EDIT_FINETUNESTEPS, m_EditFineTuneSteps); DDX_Control(pDX, IDC_CHECK_READONLY, m_ButtonReadOnly); DDX_Control(pDX, IDC_EDIT_NAME, m_EditName); + DDX_Control(pDX, IDC_TREE_TUNING, m_TreeCtrlTuning); + DDX_Control(pDX, IDC_EDIT_TUNINGCOLLECTION_NAME, m_EditTuningCollectionName); + DDX_Control(pDX, IDC_EDIT_TUNINGC_VERSION, m_EditTuningCollectionVersion); + DDX_Control(pDX, IDC_EDIT_TUNINGC_EDITMASK, m_EditTuningCollectionEditMask); + DDX_Control(pDX, IDC_EDIT_TUNINGNUM, m_EditTuningCollectionItemNum); + DDX_Control(pDX, IDC_EDIT_TUNINGCOLLECTION_PATH, m_EditTuningCollectionPath); } + BEGIN_MESSAGE_MAP(CTuningDialog, CDialog) - ON_CBN_SELCHANGE(IDC_COMBO_TCOL, OnCbnSelchangeComboTcol) - ON_CBN_SELCHANGE(IDC_COMBO_T, OnCbnSelchangeComboT) - ON_BN_CLICKED(IDC_CHECK_NEWTUNING, OnBnClickedCheckNewtuning) ON_CBN_SELCHANGE(IDC_COMBO_TTYPE, OnCbnSelchangeComboTtype) ON_EN_CHANGE(IDC_EDIT_STEPS, OnEnChangeEditSteps) ON_EN_CHANGE(IDC_EDIT_RATIOPERIOD, OnEnChangeEditRatioperiod) - ON_BN_CLICKED(IDC_ADD_TUNING, OnBnClickedAddTuning) - ON_BN_CLICKED(IDC_REMOVE_TUNING, OnBnClickedRemoveTuning) - ON_CBN_EDITCHANGE(IDC_COMBO_T, OnCbnEditchangeComboT) ON_EN_CHANGE(IDC_EDIT_NOTENAME, OnEnChangeEditNotename) ON_BN_CLICKED(IDC_BUTTON_SETVALUES, OnBnClickedButtonSetvalues) ON_EN_CHANGE(IDC_EDIT_RATIOVALUE, OnEnChangeEditRatiovalue) @@ -241,72 +374,39 @@ ON_EN_KILLFOCUS(IDC_EDIT_RATIOPERIOD, OnEnKillfocusEditRatioperiod) ON_EN_KILLFOCUS(IDC_EDIT_RATIOVALUE, OnEnKillfocusEditRatiovalue) ON_EN_KILLFOCUS(IDC_EDIT_NOTENAME, OnEnKillfocusEditNotename) + ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_TUNING, OnTvnSelchangedTreeTuning) + ON_NOTIFY(TVN_DELETEITEM, IDC_TREE_TUNING, OnTvnDeleteitemTreeTuning) + ON_NOTIFY(NM_RCLICK, IDC_TREE_TUNING, OnNMRclickTreeTuning) + ON_NOTIFY(TVN_BEGINDRAG, IDC_TREE_TUNING, OnTvnBegindragTreeTuning) + ON_COMMAND(ID_REMOVETUNING, OnRemoveTuning) + ON_COMMAND(ID_ADDTUNING, OnAddTuning) + ON_COMMAND(ID_MOVETUNING, OnMoveTuning) + ON_COMMAND(ID_COPYTUNING, OnCopyTuning) + ON_COMMAND(ID_REMOVETUNINGCOLLECTION, OnRemoveTuningCollection) + ON_BN_CLICKED(IDC_BUTTON_TUNINGCOLLECTION_SAVE, OnBnClickedButtonTuningcollectionSave) END_MESSAGE_MAP() -// CTuningDialog message handlers - -void CTuningDialog::OnCbnSelchangeComboTcol() -//------------------------------------------- +void CTuningDialog::DoErrorExit() +//------------------------------- { - const int curTCol = m_CombobTuningCollection.GetCurSel(); - if(curTCol < 0 || curTCol >= static_cast<int>(m_TuningCollections.size())) return; - - //Checking whether collection allows removing - if(m_TuningCollections[curTCol]->CanEdit(CTuningCollection::EM_REMOVE)) - m_ButtonRemoveTuning.EnableWindow(true); - else - m_ButtonRemoveTuning.EnableWindow(false); - - //Clearing existing items from name-combobox... - while(m_CombobTuningName.GetCount() > 0) - m_CombobTuningName.DeleteString(0); - - //...adding names of tunings in the current tuning collection... - CTuningCollection& rTCol = *m_TuningCollections.at(curTCol); - for(size_t i = 0; i<rTCol.GetNumTunings(); i++) - { - m_CombobTuningName.AddString(rTCol.GetTuning(static_cast<unsigned short>(i)).GetName().c_str()); - } - - //Checking whether tuning collection allows adding - //tunings... - if(m_TuningCollections.at(curTCol)->CanEdit(CTuningCollection::EM_ADD)) - m_ButtonAddTuning.EnableWindow(); - else - m_ButtonAddTuning.EnableWindow(false); - - if(m_TuningCollections.at(curTCol)->CanEdit(CTuningCollection::EM_REMOVE)) - m_ButtonRemoveTuning.EnableWindow(); - else - m_ButtonRemoveTuning.EnableWindow(FALSE); + m_DoErrorExit = false; + m_pActiveTuning = NULL; + m_pActiveTuningCollection = NULL; + MsgBox(IDS_ERR_DIALOG, this, NULL, MB_ICONINFORMATION); + OnOK(); } -void CTuningDialog::OnCbnSelchangeComboT() -//---------------------------------------- -{ - const int TCol = m_CombobTuningCollection.GetCurSel(); - if(TCol < 0 || TCol >= static_cast<int>(m_TuningCollections.size())) return; - CTuningCollection& rTCol = *m_TuningCollections.at(TCol); +// CTuningDialog message handlers - //...checking that tuning index is valid... - const unsigned short T = static_cast<unsigned short>(m_CombobTuningName.GetCurSel()); - if(T < 0 || T >= rTCol.GetNumTunings()) - return; - - m_pActiveTuning = &rTCol.GetTuning(T); - m_RatioMapWnd.m_pTuning = m_pActiveTuning; - - UpdateView(); -} - void CTuningDialog::UpdateTuningType() //------------------------------------ { if(m_pActiveTuning) { - ASSERT(m_CombobTuningType.GetCount() > 0); + if(m_CombobTuningType.GetCount() < 3) m_DoErrorExit = true; + if(m_pActiveTuning->GetTuningType() == CTuning::TT_TET) m_CombobTuningType.SetCurSel(2); else @@ -317,12 +417,7 @@ } } -void CTuningDialog::OnBnClickedCheckNewtuning() -//--------------------------------------------- -{ -} - CTuning::CTUNINGTYPE CTuningDialog::GetTuningTypeFromStr(const string& str) const //-------------------------------------------------------------------------------- { @@ -350,6 +445,8 @@ { if(MessageBox("This will change the ratio values; continue?", 0, MB_YESNO) == IDYES) { + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + const size_t BS = 20; char buffer[BS]; m_EditSteps.GetWindowText(buffer, BS); @@ -369,7 +466,7 @@ if(newType == CTuning::TT_TET) m_pActiveTuning->CreateTET(steps, pr); - UpdateView(); + UpdateView(UM_TUNINGDATA); } else //Not wanting to discard current values. { @@ -399,88 +496,6 @@ } -void CTuningDialog::OnBnClickedAddTuning() -//----------------------------------------- -{ - if(m_pActiveTuning == NULL) //Should never be true. - return; - - if(m_pActiveTuning->GetName().length() == 0) - { - MessageBox("Please give name for the tuning", 0, MB_OK); - return; - } - - if(m_CombobTuningCollection.GetCurSel() < 0 || m_CombobTuningCollection.GetCurSel() >= static_cast<int>(m_TuningCollections.size())) - { - MessageBox("No tuning collection chosen", 0, MB_OK); - return; - } - - CTuningCollection& rTCol = *m_TuningCollections[m_CombobTuningCollection.GetCurSel()]; - - string detailStr = string("Add tuning to '") + rTCol.GetName() + string("'(it will be create as a copy of current tuning)?"); - if(MessageBox(detailStr.c_str(), 0, MB_YESNO) == IDYES) - { - CTuning* pNewTuning = new CTuningRTI(m_pActiveTuning); - if(rTCol.AddTuning(pNewTuning)) - { - MessageBox("Add tuning failed"); - delete pNewTuning; - return; - } - m_pActiveTuning = pNewTuning; - UpdateView(); - } -} - -void CTuningDialog::OnBnClickedRemoveTuning() -//------------------------------------------- -{ - UpdateView(); - //Now TCol and T should have the values pointing to m_pActiveTuning. - const size_t TCol = static_cast<size_t>(m_CombobTuningCollection.GetCurSel()); - const size_t T = static_cast<size_t>(m_CombobTuningName.GetCurSel()); - if(TCol >= m_TuningCollections.size() || - T >= m_TuningCollections[TCol]->GetNumTunings()) - return; - - CTuningCollection& rTCol = *m_TuningCollections[TCol]; - const CTuning& rT = m_TuningCollections[TCol]->GetTuning(static_cast<WORD>(T)); - ASSERT(&rT == m_pActiveTuning); - string str = string("Remove tuning '") + rT.GetName() + string("' from collection ") + rTCol.GetName() + string("?"); - if(MessageBox(str.c_str(), 0, MB_YESNO) == IDYES) - { - if(m_TuningCollections[TCol]->Remove(T)) - { - MessageBox("Tuning removal failed"); - return; - } - if(rTCol.GetNumTunings() > 0) - m_pActiveTuning = &rTCol.GetTuning(static_cast<WORD>(min(T, rTCol.GetNumTunings()-1))); - else - if(m_TuningCollections.size() > 0 && m_TuningCollections[0] && m_TuningCollections[0]->GetNumTunings() > 0) - m_pActiveTuning = &m_TuningCollections[0]->GetTuning(0); - else - m_pActiveTuning = NULL; - - UpdateView(); - } -} - -void CTuningDialog::OnCbnEditchangeComboT() -//----------------------------------------- -{ - if(m_pActiveTuning != NULL) - { - const size_t BS = 40; - char buffer[BS]; - m_CombobTuningName.GetWindowText(buffer, BS); - m_pActiveTuning->SetName(buffer); - UpdateView(); - } -} - void CTuningDialog::OnEnChangeEditNotename() //------------------------------------------ { @@ -508,6 +523,7 @@ else m_pActiveTuning->ClearNoteName(currentNote); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_RatioMapWnd.Invalidate(); } @@ -534,6 +550,7 @@ if(str.length() > 0) { m_pActiveTuning->SetRatio(currentNote, static_cast<CTuning::RATIOTYPE>(atof(buffer))); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; UpdateTuningType(); m_RatioMapWnd.Invalidate(); } @@ -552,6 +569,7 @@ char buffer[BS]; m_EditMiscActions.GetWindowText(buffer, BS); m_pActiveTuning->Multiply(static_cast<CTuning::RATIOTYPE>(atof(buffer))); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_EditMiscActions.SetWindowText(""); m_RatioMapWnd.Invalidate(); } @@ -577,18 +595,18 @@ void CTuningDialog::OnBnClickedButtonExport() //------------------------------------------- { - CTuningCollection* pTC = NULL; //Used if exporting tuning collection. - const CTuning* pT = m_pActiveTuning; + const CTuningCollection* pTC = m_pActiveTuningCollection; - if(pT == NULL) + if(pT == NULL && pTC == NULL) + { + MsgBox(IDS_ERR_NO_TUNING_SELECTION, this, NULL, MB_ICONINFORMATION); return; - - size_t TCol = static_cast<size_t>(m_CombobTuningCollection.GetCurSel()); - if(TCol < m_TuningCollections.size()) - pTC = m_TuningCollections[TCol]; + } - string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|"); + string filter; + if(pT != NULL) + filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|"); if(pTC != NULL) filter += string("Tuning collection files (") + CTuningCollection::s_FileExtension + string(")|*") + CTuningCollection::s_FileExtension + string("|"); @@ -626,8 +644,9 @@ //------------------------------------------- { //TODO: Ability to import ratios from text file. - string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|") + - string("Tuning collection files (*") + CTuningCollection::s_FileExtension + string(")|*") + CTuningCollection::s_FileExtension + string("|"); + string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(", *") + CTuningCollection::s_FileExtension + string(")|*") + + CTuning::s_FileExtension + string(";*") + CTuningCollection::s_FileExtension + string("|"); + CFileDialog dlg(TRUE, NULL, NULL, @@ -653,6 +672,8 @@ { m_TempTunings.AddTuning(pT); m_pActiveTuning = pT; + + AddTreeItem(m_pActiveTuning, m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(&m_TempTunings)), NULL); UpdateView(); } } @@ -664,8 +685,8 @@ //a separate collection - no possibility to //directly replace some collection. CTuningCollection* pNewTCol = new CTuningCollection; - ifstream fin(dlg.GetPathName(), ios::binary); - failure = pNewTCol->UnSerializeBinary(fin); + pNewTCol->SetSavefilePath(static_cast<LPCTSTR>(dlg.GetPathName())); + failure = pNewTCol->UnSerializeBinary(); if(failure) { delete pNewTCol; pNewTCol = 0; @@ -674,8 +695,7 @@ { m_TuningCollections.push_back(pNewTCol); m_DeletableTuningCollections.push_back(pNewTCol); - m_CombobTuningCollection.AddString(pNewTCol->GetName().c_str()); - m_CombobTuningCollection.SetCurSel(m_CombobTuningCollection.GetCount()-1); + AddTreeItem(pNewTCol, NULL, NULL); UpdateView(); } @@ -703,6 +723,7 @@ char buffer[BS]; m_EditFineTuneSteps.GetWindowText(buffer, BS); m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->SetFineStepCount(static_cast<CTuning::FINESTEPTYPE>(atoi(buffer)))).c_str()); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_EditFineTuneSteps.Invalidate(); } } @@ -719,15 +740,16 @@ if(m_pActiveTuning->SetEditMask(CTuning::EM_CONST)) CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); else - UpdateView(); + UpdateView(UM_TUNINGDATA); } else { if(m_pActiveTuning->SetEditMask(CTuning::EM_ALLOWALL)) CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); else - UpdateView(); + UpdateView(UM_TUNINGDATA); } + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; } @@ -740,7 +762,9 @@ char buffer[BS]; m_EditName.GetWindowText(buffer, BS); m_pActiveTuning->SetName(buffer); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); + UpdateView(UM_TUNINGCOLLECTION); } } @@ -754,7 +778,8 @@ char buffer[BS]; m_EditSteps.GetWindowText(buffer, BS); m_pActiveTuning->ChangePeriod(static_cast<CTuning::STEPTYPE>(atoi(buffer))); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); } } @@ -768,20 +793,489 @@ char buffer[BS]; m_EditRatioPeriod.GetWindowText(buffer, BS); m_pActiveTuning->ChangePeriodRatio(static_cast<CTuning::RATIOTYPE>(atof(buffer))); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); } } void CTuningDialog::OnEnKillfocusEditRatiovalue() //----------------------------------------------- { - UpdateView(); + UpdateView(UM_TUNINGDATA); } void CTuningDialog::OnEnKillfocusEditNotename() //----------------------------------------------- { + UpdateView(UM_TUNINGDATA); +} + +bool CTuningDialog::GetModifiedStatus(const CTuningCollection* const pTc) const +//----------------------------------------------------------------------------- +{ + MODIFIED_MAP::const_iterator iter = m_ModifiedTCs.find(pTc); + if(iter != m_ModifiedTCs.end()) + return (*iter).second; + else + return false; + +} + +CTuningCollection* CTuningDialog::GetpTuningCollection(HTREEITEM ti) const +//------------------------------------------------------------------------ +{ + //If treeitem is that of a tuningcollection, return address of + //that tuning collection. If treeitem is that of a tuning, return + //the owning tuningcollection + TUNINGTREEITEM tunItem = m_TreeItemTuningItemMap.GetMapping_12(ti); + CTuningCollection* pTC = tunItem.GetTC(); + if(pTC) + return pTC; + else + { + CTuning* pT = tunItem.GetT(); + return GetpTuningCollection(pT); + } +} + +CTuningCollection* CTuningDialog::GetpTuningCollection(const CTuning* const pT) const +//----------------------------------------------------------------- +{ + for(size_t i = 0; i<m_TuningCollections.size(); i++) + { + CTuningCollection& rCurTCol = *m_TuningCollections.at(i); + for(size_t j = 0; j<rCurTCol.GetNumTunings(); j++) + { + if(pT == &rCurTCol.GetTuning(static_cast<unsigned short>(j))) + { + return &rCurTCol; + } + } + } + return NULL; +} + + +void CTuningDialog::OnTvnSelchangedTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//---------------------------------------------------------------------------- +{ + //This methods gets called when selected item in the treeview + //changes. + + //TODO: This gets called before killfocus messages of edits, this + // can be a problem. + + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + + TUNINGTREEITEM ti = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + if(ti) + { + int updateMask = UM_TUNINGDATA; + CTuningCollection* pPrevTuningCollection = m_pActiveTuningCollection; + CTuning* pT = ti.GetT(); + CTuningCollection* pTC = ti.GetTC(); + if(pTC) + { + m_pActiveTuningCollection = pTC; + ASSERT(pT == NULL); + m_pActiveTuning = NULL; + } + else + { + m_pActiveTuning = pT; + m_pActiveTuningCollection = GetpTuningCollection(m_pActiveTuning); + + } + if(m_pActiveTuningCollection != pPrevTuningCollection) updateMask |= UM_TUNINGCOLLECTION; + UpdateView(updateMask); + } + else + { + m_DoErrorExit = true; + } + + *pResult = 0; +} + +void CTuningDialog::OnTvnDeleteitemTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//---------------------------------------------------------------------------- +{ + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + // TODO: Add your control notification handler code here + *pResult = 0; + if(pNMTreeView->itemOld.mask & TVIF_HANDLE && pNMTreeView->itemOld.hItem) + { + m_TreeItemTuningItemMap.RemoveValue_1(pNMTreeView->itemOld.hItem); + } + else + m_DoErrorExit = true; +} + +void CTuningDialog::OnNMRclickTreeTuning(NMHDR *, LRESULT *pResult) +//----------------------------------------------------------------------- +{ + *pResult = 0; + + HTREEITEM hItem; + POINT point, ptClient; + + GetCursorPos(&point); + ptClient = point; + m_TreeCtrlTuning.ScreenToClient(&ptClient); + hItem = m_TreeCtrlTuning.HitTest(ptClient, NULL); + if(hItem == NULL) + return; + + m_TreeCtrlTuning.Select(hItem, TVGN_CARET); + + TUNINGTREEITEM tunitem = m_TreeItemTuningItemMap.GetMapping_12(hItem); + + if(!tunitem) + { + m_DoErrorExit = true; + return; + } + + HMENU popUpMenu = CreatePopupMenu(); + if(popUpMenu == NULL) return; + + CTuning* pT = tunitem.GetT(); + CTuningCollection* pTC = tunitem.GetTC(); + + if(pT) //Creating context menu for tuning-item + { + pTC = GetpTuningCollection(pT); + if(pTC != NULL) + { + UINT mask = MF_STRING; + if(!pTC->CanEdit(CTuningCollection::EM_REMOVE)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_REMOVETUNING, "Remove"); + + m_CommandItemDest.Set(pT); + } + } + else //Creating context menu for tuning collection item. + { + if(pTC != NULL) + { + UINT mask = MF_STRING; + + if(!pTC->CanEdit(CTuningCollection::EM_ADD)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_ADDTUNING, "Add tuning"); + + mask = MF_STRING; + if(!IsDeletable(pTC)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_REMOVETUNINGCOLLECTION, "Delete tuning collection"); + + m_CommandItemDest.Set(pTC); + } + } + + GetCursorPos(&point); + TrackPopupMenu(popUpMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, 0, m_hWnd, NULL); + DestroyMenu(popUpMenu); +} + +bool CTuningDialog::IsDeletable(const CTuningCollection* const pTC) const +//-------------------------------------------------------------------------------- +{ + vector<CTuningCollection*>::const_iterator iter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), pTC); + if(iter != m_DeletableTuningCollections.end()) + return true; + else + return false; +} + + +void CTuningDialog::OnTvnBegindragTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//--------------------------------------------------------------------------- +{ + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + *pResult = 0; + + m_CommandItemDest.Reset(); + m_CommandItemSrc.Reset(); + if(pNMTreeView == NULL || pNMTreeView->itemNew.hItem == NULL) return; + TUNINGTREEITEM tunitem = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + if(tunitem.GetT() == NULL) + { + MsgBox(IDS_UNSUPPORTED_TUNING_DnD, this); + return; + } + + m_TreeCtrlTuning.SetDragging(); + m_DragItem = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + m_TreeCtrlTuning.Select(pNMTreeView->itemNew.hItem, TVGN_CARET); +} + +void CTuningDialog::OnEndDrag(HTREEITEM dragDestItem) +//-------------------------------------------------- +{ + m_TreeCtrlTuning.SetDragging(false); + if(m_DragItem == NULL) + return; + + m_CommandItemSrc = m_DragItem; + m_DragItem.Reset(); + + TUNINGTREEITEM destTunItem = m_TreeItemTuningItemMap.GetMapping_12(dragDestItem); + if(!destTunItem) + return; + + CTuningCollection* pTCdest = NULL; + CTuningCollection* pTCsrc = m_CommandItemSrc.GetTC(); + + if(pTCsrc == NULL) + pTCsrc = GetpTuningCollection(m_CommandItemSrc.GetT()); + + if(pTCsrc == NULL) + { + ASSERT(false); + return; + } + + if(destTunItem.GetT()) //Item dragged on tuning + pTCdest = GetpTuningCollection(destTunItem.GetT()); + else //Item dragged on tuningcollecition + pTCdest = destTunItem.GetTC(); + + //For now, ignoring drags within a tuning collection. + if(pTCdest == pTCsrc) + return; + + if(pTCdest) + { + UINT mask = MF_STRING; + HMENU popUpMenu = CreatePopupMenu(); + if(popUpMenu == NULL) return; + + POINT point; + GetCursorPos(&point); + + if(!pTCdest->CanEdit(CTuningCollection::EM_ADD)) + mask |= MF_GRAYED; + AppendMenu(popUpMenu, mask, ID_COPYTUNING, "Copy here"); + + if(!pTCsrc->CanEdit(CTuningCollection::EM_REMOVE) || + !pTCdest->CanEdit(CTuningCollection::EM_ADD)) + mask = MF_STRING | MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_MOVETUNING, "Move here"); + + GetCursorPos(&point); + TrackPopupMenu(popUpMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, 0, m_hWnd, NULL); + DestroyMenu(popUpMenu); + + m_CommandItemDest.Set(pTCdest); + } +} + +bool CTuningDialog::AddTuning(CTuningCollection* pTC, CTuning* pT) +//---------------------------------------------------------------- +{ + //Default: pT == NULL + + if(!pTC) + { + MessageBox("No tuning collection chosen", 0, MB_OK); + return true; + } + + CTuning* pNewTuning = new CTuningRTI(pT); + if(pTC->AddTuning(pNewTuning)) + { + MessageBox("Add tuning failed"); + delete pNewTuning; + return true; + } + AddTreeItem(pNewTuning, m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTC)), NULL); + m_pActiveTuning = pNewTuning; + m_ModifiedTCs[pTC] = true; UpdateView(); + + return false; } +void CTuningDialog::OnAddTuning() +//------------------------------- +{ + if(!m_CommandItemDest.GetTC()) + { + m_CommandItemDest = s_notFoundItemTuning; + return; + } + + CTuningCollection* pTC = m_CommandItemDest.GetTC(); + m_CommandItemDest = s_notFoundItemTuning; + m_ModifiedTCs[pTC]; + AddTuning(pTC); +} + +void CTuningDialog::OnRemoveTuning() +//---------------------------------- +{ + CTuning* pT = m_CommandItemDest.GetT(); + if(m_CommandItemDest.GetT()) + { + CTuningCollection* pTC = GetpTuningCollection(pT); + if(pTC) + { + string str = string("Remove tuning '") + pT->GetName() + string("' from ' ") + pTC->GetName() + string("'?"); + if(MessageBox(str.c_str(), 0, MB_YESNO) == IDYES) + { + if(!pTC->Remove(pT)) + { + m_ModifiedTCs[pTC] = true; + DeleteTreeItem(pT); + UpdateView(); + } + else + { + MessageBox("Tuning removal failed"); + } + } + } + } + + m_CommandItemDest = s_notFoundItemTuning; +} + +void CTuningDialog::OnMoveTuning() +//-------------------------------- +{ + if(!m_CommandItemDest) + return; + + CTuning* pT = m_CommandItemSrc.GetT(); + CTuningCollection* pTCsrc = GetpTuningCollection(pT); + + if(pT == NULL) + { + m_CommandItemDest = s_notFoundItemTuning; + return; + } + + CTuningCollection* pTCdest = NULL; + if(m_CommandItemDest.GetT()) + pTCdest = GetpTuningCollection(m_CommandItemDest.GetT()); + else + pTCdest = m_CommandItemDest.GetTC(); + + + HTREEITEM treeItemSrcTC = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTCsrc)); + HTREEITEM treeItemDestTC = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTCdest)); + DeleteTreeItem(pT); + m_ModifiedTCs[pTCsrc] = true; + if(CTuningCollection::TransferTuning(pTCsrc, pTCdest, pT)) + { + MsgBox(IDS_OPERATION_FAIL, this, NULL, MB_OK); + AddTreeItem(pT, treeItemSrcTC, NULL); + } + else + AddTreeItem(pT, treeItemDestTC, NULL); + + UpdateView(); +} + + +void CTuningDialog::OnCopyTuning() +//-------------------------------- +{ + CTuningCollection* pTC = m_CommandItemDest.GetTC(); + + if(!pTC) + return; + + m_CommandItemDest = s_notFoundItemTuning; + + CTuning* pT = m_CommandItemSrc.GetT(); + if(pT == NULL) + { + return; + } + m_ModifiedTCs[pTC] = true; + AddTuning(pTC, pT); +} + +void CTuningDialog::OnRemoveTuningCollection() +//-------------------------------------------- +{ + if(!m_pActiveTuningCollection) + return; + + if(!IsDeletable(m_pActiveTuningCollection)) + { + ASSERT(false); + return; + } + + TUNINGVECTOR::iterator iter = find(m_TuningCollections.begin(), m_TuningCollections.end(), m_pActiveTuningCollection); + if(iter == m_TuningCollections.end()) + { + ASSERT(false); + return; + } + TUNINGVECTOR::iterator DTCiter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), *iter); + CTuningCollection* deletableTC = m_pActiveTuningCollection; + //Note: Order matters in the following lines. + m_DeletableTuningCollections.erase(DTCiter); + m_TuningCollections.erase(iter); + DeleteTreeItem(m_pActiveTuningCollection); + delete deletableTC; deletableTC = 0; + + UpdateView(); +} + + +void CTuningDialog::OnBnClickedButtonTuningcollectionSave() +//--------------------------------------------------------- +{ + if(!m_pActiveTuningCollection) + return; + + if(m_pActiveTuningCollection->SerializeBinary()) + { + MsgBox(IDS_OPERATION_FAIL, this, NULL, MB_ICONINFORMATION); + } + else + { + m_ModifiedTCs[m_pActiveTuningCollection] = false; + } +} + + +//////////////////////////////////////////////////////// +//*************** +//CTuningTreeCtrl +//*************** +//////////////////////////////////////////////////////// + +BEGIN_MESSAGE_MAP(CTuningTreeCtrl, CTreeCtrl) + ON_WM_LBUTTONUP() +END_MESSAGE_MAP() + + +void CTuningTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point) +//----------------------------------------------------------- +{ + if(IsDragging()) + { + HTREEITEM hItem; + hItem = HitTest(point, NULL); + m_rParentDialog.OnEndDrag(hItem); + + CTreeCtrl::OnLButtonUp(nFlags, point); + } +} + + Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2007-02-03 21:24:42 UTC (rev 172) @@ -5,11 +5,179 @@ #include "tuningcollection.h" #include <vector> #include <string> +#include "afxcmn.h" +#include "afxwin.h" using std::vector; using std::string; +//========================== +template<class T1, class T2> +class CBijectiveMap +//========================== +{ +public: + CBijectiveMap(const T1& a, const T2& b) + : m_NotFoundT1(a), + m_NotFoundT2(b) + {} + void AddPair(const T1& a, const T2& b) + { + m_T1.push_back(a); + m_T2.push_back(b); + } + + void ClearMapping() + { + m_T1.clear(); + m_T2.clear(); + } + + size_t Size() const + { + ASSERT(m_T1.size() == m_T2.size()); + return m_T1.size(); + } + + void RemoveValue_1(const T1& a) + { + vector<T1>::iterator iter = find(m_T1.begin(), m_T1.end(), a); + if(iter != m_T1.end()) + { + m_T2.erase(m_T2.begin() + (iter-m_T1.begin())); + m_T1.erase(iter); + } + } + + void RemoveValue_2(const T2& b) + { + vector<T2>::iterator iter = find(m_T2.begin(), m_T2.end(), b); + if(iter != m_T2.end()) + { + m_T1.erase(m_T1.begin() + (iter-m_T2.begin())); + m_T2.erase(iter); + } + } + + T2 GetMapping_12(const T1& a) const + { + vector<T1>::const_iterator iter = find(m_T1.begin(), m_T1.end(), a); + if(iter != m_T1.end()) + { + return m_T2[iter-m_T1.begin()]; + } + else + return m_NotFoundT2; + } + + T1 GetMapping_21(const T2& b) const + { + vector<T2>::const_iterator iter = find(m_T2.begin(), m_T2.end(), b); + if(iter != m_T2.end()) + { + return m_T1[iter-m_T2.begin()]; + } + else + return m_NotFoundT1; + } + +private: + vector<T1> m_T1; + vector<T2> m_T2; + //Elements are collected to two arrays so that elements with the + //same index are mapped to each other. + + T1 m_NotFoundT1; + T2 m_NotFoundT2; +}; + +class CTuningDialog; + +//====================================== +class CTuningTreeCtrl : public CTreeCtrl +//====================================== +{ +private: + CTuningDialog& m_rParentDialog; +public: + CTuningTreeCtrl(CTuningDialog* parent) : m_rParentDialog(*parent) {} + //Note: Parent address may be given in initialiser list so + //do not use it. + + void SetDragging(bool state = true) {m_Dragging = state;} + bool IsDragging() {return m_Dragging;} + +private: + bool m_Dragging; + + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + DECLARE_MESSAGE_MAP() +}; + +//=================== +class CTuningTreeItem +//=================== +{ +private: + CTuning* m_pTuning; + CTuningCollection* m_pTuningCollection; + +public: + CTuningTreeItem() : m_pTuning(NULL), + m_pTuningCollection(NULL) + {} + + CTuningTreeItem(CTuning* pT) : + m_pTuning(pT), + m_pTuningCollection(NULL) + {} + + CTuningTreeItem(CTuningCollection* pTC) : + m_pTuning(NULL), + m_pTuningCollection(pTC) + {} + + bool operator==(const CTuningTreeItem& ti) const + { + if(m_pTuning == ti.m_pTuning && + m_pTuningCollection == ti.m_pTuningCollection) + return true; + else + return false; + } + + void Reset() {m_pTuning = NULL; m_pTuningCollection = NULL;} + + + void Set(CTuning* pT) + { + m_pTuning = pT; + m_pTuningCollection = NULL; + } + + void Set(CTuningCollection* pTC) + { + m_pTuning = NULL; + m_pTuningCollection = pTC; + } + + operator void*() + { + //Mimicing pointer behavior: if(CTuningTreeItemInstance) equals + //if(CTuningTreeItemInstance.m_pTuning != NULL || + // CTuningTreeItemInstance.m_pTuningCollection != NULL) + if(m_pTuning) + return m_pTuning; + else + return m_pTuningCollection; + } + + CTuningCollection* GetTC() {return m_pTuningCollection;} + + CTuning* GetT() {return m_pTuning;} +}; + // CTuningDialog dialog //================================== @@ -18,6 +186,8 @@ { DECLARE_DYNAMIC(CTuningDialog) + friend class CTuningTreeCtrl; + public: typedef vector<CTuningCollection*> TUNINGVECTOR; @@ -30,33 +200,52 @@ void AddTuningCollection(CTuningCollection* pTC) {if(pTC) m_TuningCollections.push_back(pTC);} void UpdateRatioMapEdits(const CTuning::STEPTYPE&); + bool GetModifiedStatus(const CTuningCollection* const pTc) const; + // Dialog Data enum { IDD = IDD_TUNING }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - DECLARE_MESSAGE_MAP() - private: CTuning::CTUNINGTYPE GetTuningTypeFromStr(const string& str) const; - void UpdateView(); + void UpdateView(const int UpdateMask = 0); void UpdateTuningType(); - + HTREEITEM AddTreeItem(CTuningCollection* pTC, HTREEITEM parent, HTREEITEM insertAfter); + HTREEITEM AddTreeItem(CTuning* pT, HTREEITEM parent, HTREEITEM insertAfter); + + void DeleteTreeItem(CTuning* pT); + void DeleteTreeItem(CTuningCollection* pTC); + + void OnEndDrag(HTREEITEM dragDestItem); + + CTuningCollection* GetpTuningCollection(const CTuning* const) const; + //Returns pointer to the tuning collection where tuning given as argument + //belongs to. + + CTuningCollection* GetpTuningCollection(HTREEITEM ti) const; + //Returns the address of corresponding tuningcollection; if it points + //to tuning-entry, returning the owning tuningcollection + + bool IsDeletable(const CTuningCollection* const pTC) const; + //Checks whether tuning collection can be deleted. + private: CTuningRatioMapWnd m_RatioMapWnd; TUNINGVECTOR m_TuningCollections; vector<CTuningCollection*> m_DeletableTuningCollections; CTuning* m_pActiveTuning; + CTuningCollection* m_pActiveTuningCollection; + CTuningCollection m_TempTunings; - CComboBox m_CombobTuningCollection; - CComboBox m_CombobTuningName; CComboBox m_CombobTuningType; + //Tuning Edits--> CEdit m_EditTableSize; CEdit m_EditBeginNote; CEdit m_EditSteps; @@ -66,26 +255,87 @@ CEdit m_EditMiscActions; CEdit m_EditFineTuneSteps; CEdit m_EditName; + //<--Tuning Edits + + //-->Tuning collection edits + CEdit m_EditTuningCollectionName; + CEdit m_EditTuningCollectionVersion; + CEdit m_EditTuningCollectionEditMask; + CEdit m_EditTuningCollectionItemNum; + CEdit m_EditTuningCollectionPath; + //<--Tuningcollection edits - CButton m_CheckNewTuning; - CButton m_ButtonAddTuning; - CButton m_ButtonRemoveTuning; CButton m_ButtonSet; CButton m_ButtonExport; CButton m_ButtonImport; CButton m_ButtonReadOnly; + CTuningTreeCtrl m_TreeCtrlTuning; +private: + static const string s_stringTypeGEN; + static const string s_stringTypeRP; + static const string s_stringTypeTET; + + typedef CTuningTreeItem TUNINGTREEITEM; + typedef CBijectiveMap<HTREEITEM, TUNINGTREEITEM> TREETUNING_MAP; + TREETUNING_MAP m_TreeItemTuningItemMap; + + TUNINGTREEITEM m_DragItem; + TUNINGTREEITEM m_CommandItemSrc; + TUNINGTREEITEM m_CommandItemDest; + //Commanditem is used when receiving context menu-commands, + //m_CommandItemDest is used when the command really need only + //one argument. + + typedef map<const CTuningCollection* const, bool> MODIFIED_MAP; + MODIFIED_MAP m_ModifiedTCs; + //If tuning collection seems to have been modified, its address + //is added to this map. + + enum + { + TT_TUNINGCOLLECTION = 1, + TT_TUNING + }; + + bool m_NoteEditApply; + bool m_RatioEditApply; + //To indicate whether to apply changes made to + //to those edit boxes(they are modified by non-user + //activies and in these cases the value should be applied + //to the tuning data. + + enum + { + UM_TUNINGDATA = 1, //UM <-> Update Mask + UM_TUNINGCOLLECTION = 2, + }; + + static const TUNINGTREEITEM s_notFoundItemTuning; + static const HTREEITEM s_notFoundItemTree; + + bool AddTuning(CTuningCollection*, CTuning* pT = NULL); + + bool m_DoErrorExit; + //Flag to prevent multiple exit error-messages. + + void DoErrorExit(); + + +//Treectrl context menu functions. public: - afx_msg void OnCbnSelchangeComboTcol(); - afx_msg void OnCbnSelchangeComboT(); - afx_msg void OnBnClickedCheckNewtuning(); + afx_msg void OnRemoveTuning(); + afx_msg void OnAddTuning(); + afx_msg void OnMoveTuning(); + afx_msg void OnCopyTuning(); + afx_msg void OnRemoveTuningCollection(); + +//Event-functions +public: afx_msg void OnCbnSelchangeComboTtype... [truncated message content] |