khanat-opennel-code/code/nel/tools/3d/object_viewer/sound_anim_dlg.cpp
2010-12-15 20:36:30 +01:00

334 lines
7.7 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()