334 lines
7.4 KiB
C++
334 lines
7.4 KiB
C++
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#include "std_afx.h"
|
|
#include "object_viewer.h"
|
|
#include "sound_anim_dlg.h"
|
|
#include "pick_sound.h"
|
|
#include "sound_system.h"
|
|
|
|
#include "nel/sound/u_audio_mixer.h"
|
|
#include "nel/sound/sound_anim_marker.h"
|
|
|
|
using namespace std;
|
|
using namespace NLMISC;
|
|
using namespace NLSOUND;
|
|
|
|
|
|
|
|
// ********************************************************
|
|
|
|
CSoundAnimDlg::CSoundAnimDlg(CObjectViewer* objView, CAnimationDlg* animDlg, CWnd* pParent/*=NULL*/)
|
|
: CDialog(CSoundAnimDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CSoundAnimDlg)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
|
|
_ObjView = objView;
|
|
_AnimationDlg = animDlg;
|
|
_SelectedMarker = 0;
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
int CSoundAnimDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CDialog::OnCreate(lpCreateStruct) == -1)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
RECT r;
|
|
r.top = 3;
|
|
r.bottom = 53;
|
|
r.left = 150;
|
|
r.right = 674;
|
|
|
|
_AnimView.Create(_ObjView, _AnimationDlg, this, r);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
BOOL CSoundAnimDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::handle()
|
|
{
|
|
char text[256];
|
|
float sec = _AnimationDlg->getTime();
|
|
_snprintf(text, 256, "time: %.3f", sec);
|
|
GetDlgItem(IDC_SOUNDANIMINFO)->SetWindowText(text);
|
|
|
|
_AnimView.updateCursor();
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::setAnimTime(float animStart, float animEnd)
|
|
{
|
|
nlwarning("START=%.3f - END=%.3f", animStart, animEnd);
|
|
_AnimView.setAnimTime(animStart, animEnd);
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::updateScroll(uint pos, uint min, uint max)
|
|
{
|
|
CScrollBar* scroll = (CScrollBar*) GetDlgItem(IDC_SOUND_ANIM_SCROLLBAR);
|
|
|
|
scroll->SetScrollRange(min, max, FALSE);
|
|
scroll->SetScrollPos(pos, TRUE);
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CSoundAnimDlg)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::selectMarker(CSoundAnimMarker* marker)
|
|
{
|
|
_SelectedMarker = marker;
|
|
updateSounds();
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::updateSounds()
|
|
{
|
|
if (_SelectedMarker != 0)
|
|
{
|
|
vector<NLMISC::TStringId> sounds;
|
|
|
|
_SelectedMarker->getSounds(sounds);
|
|
|
|
CListBox* list = (CListBox*) GetDlgItem(IDC_SOUND_ANIM_LIST);
|
|
list->ResetContent();
|
|
|
|
vector<NLMISC::TStringId>::iterator iter;
|
|
|
|
for (iter = sounds.begin(); iter != sounds.end(); iter++)
|
|
{
|
|
list->AddString(CStringMapper::unmap(*iter).c_str());
|
|
}
|
|
|
|
list->UpdateData();
|
|
}
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::OnAddSound()
|
|
{
|
|
if (_SelectedMarker != 0)
|
|
{
|
|
// CPickSound::TNameVect names;
|
|
vector<NLMISC::TStringId> names;
|
|
|
|
|
|
NLSOUND::UAudioMixer *audioMixer = CSoundSystem::getAudioMixer();
|
|
if (audioMixer)
|
|
{
|
|
audioMixer->getSoundNames(names);
|
|
}
|
|
|
|
CPickSound ps(names, this);
|
|
|
|
if (ps.DoModal() == IDOK)
|
|
{
|
|
// string name = ps.getName();
|
|
_SelectedMarker->addSound(ps.getName());
|
|
updateSounds();
|
|
}
|
|
}
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::OnRemoveSound()
|
|
{
|
|
if (_SelectedMarker != 0)
|
|
{
|
|
char s[256];
|
|
CListBox* list = (CListBox*) GetDlgItem(IDC_SOUND_ANIM_LIST);
|
|
|
|
if (list->GetText(list->GetCurSel(), s) != LB_ERR)
|
|
{
|
|
string name(s);
|
|
_SelectedMarker->removeSound(CStringMapper::map(name));
|
|
updateSounds();
|
|
}
|
|
}
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::OnSave()
|
|
{
|
|
_AnimView.save();
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::OnZoomOut()
|
|
{
|
|
_AnimView.zoomOut();
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::OnZoomIn()
|
|
{
|
|
_AnimView.zoomIn();
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::OnMark()
|
|
{
|
|
_AnimView.mark();
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::OnDelete()
|
|
{
|
|
_AnimView.deleteMarker();
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
void CSoundAnimDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
|
|
{
|
|
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
|
|
|
|
nlwarning("CSoundAnimDlg::OnHScroll");
|
|
|
|
// Get the minimum and maximum scroll-bar positions.
|
|
int minpos;
|
|
int maxpos;
|
|
pScrollBar->GetScrollRange(&minpos, &maxpos);
|
|
maxpos = pScrollBar->GetScrollLimit();
|
|
|
|
// Get the current position of scroll box.
|
|
int curpos = pScrollBar->GetScrollPos();
|
|
|
|
// Determine the new position of scroll box.
|
|
switch (nSBCode)
|
|
{
|
|
case SB_LEFT: // Scroll to far left.
|
|
curpos = minpos;
|
|
break;
|
|
|
|
case SB_RIGHT: // Scroll to far right.
|
|
curpos = maxpos;
|
|
break;
|
|
|
|
case SB_ENDSCROLL: // End scroll.
|
|
break;
|
|
|
|
case SB_LINELEFT: // Scroll left.
|
|
curpos -= 5;
|
|
if (curpos < minpos)
|
|
{
|
|
curpos = minpos;
|
|
}
|
|
break;
|
|
|
|
case SB_LINERIGHT: // Scroll right.
|
|
curpos += 5;
|
|
if (curpos > maxpos)
|
|
{
|
|
curpos = maxpos;
|
|
}
|
|
break;
|
|
|
|
case SB_PAGELEFT: // Scroll one page left.
|
|
{
|
|
// Get the page size.
|
|
SCROLLINFO info;
|
|
pScrollBar->GetScrollInfo(&info, SIF_ALL);
|
|
|
|
if (curpos > minpos)
|
|
{
|
|
curpos = std::max(minpos, curpos - (int) info.nPage);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case SB_PAGERIGHT: // Scroll one page right.
|
|
{
|
|
// Get the page size.
|
|
SCROLLINFO info;
|
|
pScrollBar->GetScrollInfo(&info, SIF_ALL);
|
|
|
|
if (curpos < maxpos)
|
|
{
|
|
curpos = std::min(maxpos, curpos + (int) info.nPage);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
|
|
curpos = nPos; // of the scroll box at the end of the drag operation.
|
|
break;
|
|
|
|
case SB_THUMBTRACK: // Drag scroll box to specified position. nPos is the
|
|
curpos = nPos; // position that the scroll box has been dragged to.
|
|
break;
|
|
}
|
|
|
|
// Set the new position of the thumb (scroll box).
|
|
pScrollBar->SetScrollPos(curpos);
|
|
|
|
_AnimView.changeScroll(curpos);
|
|
|
|
CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
|
|
}
|
|
|
|
// ********************************************************
|
|
|
|
BEGIN_MESSAGE_MAP(CSoundAnimDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CSoundAnimDlg)
|
|
ON_BN_CLICKED(IDC_ANIM_SOUND_ADD, OnAddSound)
|
|
ON_BN_CLICKED(IDC_ANIM_SOUND_REMOVE, OnRemoveSound)
|
|
ON_BN_CLICKED(IDC_ANIM_SOUND_SAVE, OnSave)
|
|
ON_BN_CLICKED(IDC_ANIM_SOUND_ZOOMIN, OnZoomIn)
|
|
ON_BN_CLICKED(IDC_ANIM_SOUND_ZOOMOUT, OnZoomOut)
|
|
ON_BN_CLICKED(IDC_ANIM_SOUND_MARK, OnMark)
|
|
ON_BN_CLICKED(IDC_ANIM_SOUND_DELETE, OnDelete)
|
|
ON_WM_CREATE()
|
|
ON_WM_HSCROLL()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|