|
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] |