mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +00:00
extract CEditor::DoAudioPreview
, also use in file dialog
This commit is contained in:
parent
6e2ddfbeaf
commit
5b609c8e06
|
@ -891,6 +891,104 @@ bool CEditor::CallbackSaveSound(const char *pFileName, int StorageType, void *pU
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CEditor::DoAudioPreview(CUIRect View, const void *pPlayPauseButtonID, const void *pStopButtonID, const void *pSeekBarID, const int SampleID)
|
||||||
|
{
|
||||||
|
CUIRect Button, SeekBar;
|
||||||
|
// play/pause button
|
||||||
|
{
|
||||||
|
View.VSplitLeft(View.h, &Button, &View);
|
||||||
|
if(DoButton_FontIcon(pPlayPauseButtonID, Sound()->IsPlaying(SampleID) ? FONT_ICON_PAUSE : FONT_ICON_PLAY, 0, &Button, 0, "Play/pause audio preview", IGraphics::CORNER_ALL) ||
|
||||||
|
(m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_SPACE)))
|
||||||
|
{
|
||||||
|
if(Sound()->IsPlaying(SampleID))
|
||||||
|
Sound()->Pause(SampleID);
|
||||||
|
else
|
||||||
|
Sound()->Play(CSounds::CHN_GUI, SampleID, ISound::FLAG_PREVIEW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// stop button
|
||||||
|
{
|
||||||
|
View.VSplitLeft(2.0f, nullptr, &View);
|
||||||
|
View.VSplitLeft(View.h, &Button, &View);
|
||||||
|
if(DoButton_FontIcon(pStopButtonID, FONT_ICON_STOP, 0, &Button, 0, "Stop audio preview", IGraphics::CORNER_ALL))
|
||||||
|
{
|
||||||
|
Sound()->Stop(SampleID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// do seekbar
|
||||||
|
{
|
||||||
|
View.VSplitLeft(5.0f, nullptr, &View);
|
||||||
|
const float Cut = std::min(View.w, 200.0f);
|
||||||
|
View.VSplitLeft(Cut, &SeekBar, &View);
|
||||||
|
SeekBar.HMargin(2.5f, &SeekBar);
|
||||||
|
|
||||||
|
const float Rounding = 5.0f;
|
||||||
|
const void *pId = pSeekBarID;
|
||||||
|
|
||||||
|
char aBuffer[64];
|
||||||
|
const float CurrentTime = Sound()->GetSampleCurrentTime(SampleID);
|
||||||
|
const float TotalTime = Sound()->GetSampleTotalTime(SampleID);
|
||||||
|
|
||||||
|
// draw seek bar
|
||||||
|
SeekBar.Draw(ColorRGBA(0, 0, 0, 0.5f), IGraphics::CORNER_ALL, Rounding);
|
||||||
|
|
||||||
|
// draw filled bar
|
||||||
|
const float Amount = CurrentTime / TotalTime;
|
||||||
|
CUIRect FilledBar = SeekBar;
|
||||||
|
FilledBar.w = 2 * Rounding + (FilledBar.w - 2 * Rounding) * Amount;
|
||||||
|
FilledBar.Draw(ColorRGBA(1, 1, 1, 0.5f), IGraphics::CORNER_ALL, Rounding);
|
||||||
|
|
||||||
|
// draw time
|
||||||
|
char aCurrentTime[32];
|
||||||
|
str_time_float(CurrentTime, TIME_HOURS, aCurrentTime, sizeof(aCurrentTime));
|
||||||
|
char aTotalTime[32];
|
||||||
|
str_time_float(TotalTime, TIME_HOURS, aTotalTime, sizeof(aTotalTime));
|
||||||
|
str_format(aBuffer, sizeof(aBuffer), "%s / %s", aCurrentTime, aTotalTime);
|
||||||
|
UI()->DoLabel(&SeekBar, aBuffer, SeekBar.h * 0.70f, TEXTALIGN_MC);
|
||||||
|
|
||||||
|
// do the logic
|
||||||
|
const bool Inside = UI()->MouseInside(&SeekBar);
|
||||||
|
|
||||||
|
if(UI()->CheckActiveItem(pId))
|
||||||
|
{
|
||||||
|
if(!UI()->MouseButton(0))
|
||||||
|
UI()->SetActiveItem(nullptr);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float s_PrevAmount = 0.0f;
|
||||||
|
float AmountSeek = clamp((UI()->MouseX() - SeekBar.x - Rounding) / (float)(SeekBar.w - 2 * Rounding), 0.0f, 1.0f);
|
||||||
|
|
||||||
|
if(Input()->ShiftIsPressed())
|
||||||
|
{
|
||||||
|
AmountSeek = s_PrevAmount + (AmountSeek - s_PrevAmount) * 0.05f;
|
||||||
|
if(AmountSeek >= 0.0f && AmountSeek <= 1.0f && absolute(s_PrevAmount - AmountSeek) >= 0.0001f)
|
||||||
|
{
|
||||||
|
Sound()->SetSampleCurrentTime(SampleID, AmountSeek);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(AmountSeek >= 0.0f && AmountSeek <= 1.0f && absolute(s_PrevAmount - AmountSeek) >= 0.001f)
|
||||||
|
{
|
||||||
|
s_PrevAmount = AmountSeek;
|
||||||
|
Sound()->SetSampleCurrentTime(SampleID, AmountSeek);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(UI()->HotItem() == pId)
|
||||||
|
{
|
||||||
|
if(UI()->MouseButton(0))
|
||||||
|
{
|
||||||
|
UI()->SetActiveItem(pId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Inside)
|
||||||
|
UI()->SetHotItem(pId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CEditor::DoToolbarLayers(CUIRect ToolBar)
|
void CEditor::DoToolbarLayers(CUIRect ToolBar)
|
||||||
{
|
{
|
||||||
const bool ModPressed = Input()->ModifierIsPressed();
|
const bool ModPressed = Input()->ModifierIsPressed();
|
||||||
|
@ -1257,107 +1355,15 @@ void CEditor::DoToolbarLayers(CUIRect ToolBar)
|
||||||
|
|
||||||
void CEditor::DoToolbarSounds(CUIRect ToolBar)
|
void CEditor::DoToolbarSounds(CUIRect ToolBar)
|
||||||
{
|
{
|
||||||
CUIRect ToolBarTop, ToolBarBottom, Button, SeekBar;
|
CUIRect ToolBarTop, ToolBarBottom;
|
||||||
ToolBar.HSplitMid(&ToolBarTop, &ToolBarBottom, 5.0f);
|
ToolBar.HSplitMid(&ToolBarTop, &ToolBarBottom, 5.0f);
|
||||||
|
|
||||||
if(m_SelectedSound >= 0 && (size_t)m_SelectedSound < m_Map.m_vpSounds.size())
|
if(m_SelectedSound >= 0 && (size_t)m_SelectedSound < m_Map.m_vpSounds.size())
|
||||||
{
|
{
|
||||||
const std::shared_ptr<CEditorSound> pSelectedSound = m_Map.m_vpSounds[m_SelectedSound];
|
const std::shared_ptr<CEditorSound> pSelectedSound = m_Map.m_vpSounds[m_SelectedSound];
|
||||||
|
|
||||||
// play/pause button
|
static int s_PlayPauseButton, s_StopButton, s_SeekBar = 0;
|
||||||
{
|
DoAudioPreview(ToolBarBottom, &s_PlayPauseButton, &s_StopButton, &s_SeekBar, pSelectedSound->m_SoundID);
|
||||||
ToolBarBottom.VSplitLeft(ToolBarBottom.h, &Button, &ToolBarBottom);
|
|
||||||
static int s_PlayPauseButton;
|
|
||||||
if(DoButton_FontIcon(&s_PlayPauseButton, Sound()->IsPlaying(pSelectedSound->m_SoundID) ? FONT_ICON_PAUSE : FONT_ICON_PLAY, 0, &Button, 0, "Play/pause audio preview", IGraphics::CORNER_ALL) ||
|
|
||||||
(m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_SPACE)))
|
|
||||||
{
|
|
||||||
if(Sound()->IsPlaying(pSelectedSound->m_SoundID))
|
|
||||||
Sound()->Pause(pSelectedSound->m_SoundID);
|
|
||||||
else
|
|
||||||
Sound()->Play(CSounds::CHN_GUI, pSelectedSound->m_SoundID, ISound::FLAG_PREVIEW);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// stop button
|
|
||||||
{
|
|
||||||
ToolBarBottom.VSplitLeft(2.0f, nullptr, &ToolBarBottom);
|
|
||||||
ToolBarBottom.VSplitLeft(ToolBarBottom.h, &Button, &ToolBarBottom);
|
|
||||||
static int s_StopButton;
|
|
||||||
if(DoButton_FontIcon(&s_StopButton, FONT_ICON_STOP, 0, &Button, 0, "Stop audio preview", IGraphics::CORNER_ALL))
|
|
||||||
{
|
|
||||||
Sound()->Stop(pSelectedSound->m_SoundID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// do seekbar
|
|
||||||
{
|
|
||||||
ToolBarBottom.VSplitLeft(5.0f, nullptr, &ToolBarBottom);
|
|
||||||
ToolBarBottom.VSplitLeft(200.0f, &SeekBar, &ToolBarBottom);
|
|
||||||
const float Rounding = 5.0f;
|
|
||||||
|
|
||||||
static int s_SeekBarID = 0;
|
|
||||||
void *pId = &s_SeekBarID;
|
|
||||||
|
|
||||||
char aBuffer[64];
|
|
||||||
float CurrentTime = Sound()->GetSampleCurrentTime(pSelectedSound->m_SoundID);
|
|
||||||
float TotalTime = Sound()->GetSampleTotalTime(pSelectedSound->m_SoundID);
|
|
||||||
|
|
||||||
// draw seek bar
|
|
||||||
SeekBar.Draw(ColorRGBA(0, 0, 0, 0.5f), IGraphics::CORNER_ALL, Rounding);
|
|
||||||
|
|
||||||
// draw filled bar
|
|
||||||
float Amount = CurrentTime / TotalTime;
|
|
||||||
CUIRect FilledBar = SeekBar;
|
|
||||||
FilledBar.w = 2 * Rounding + (FilledBar.w - 2 * Rounding) * Amount;
|
|
||||||
FilledBar.Draw(ColorRGBA(1, 1, 1, 0.5f), IGraphics::CORNER_ALL, Rounding);
|
|
||||||
|
|
||||||
// draw time
|
|
||||||
char aCurrentTime[32];
|
|
||||||
str_time_float(CurrentTime, TIME_HOURS, aCurrentTime, sizeof(aCurrentTime));
|
|
||||||
char aTotalTime[32];
|
|
||||||
str_time_float(TotalTime, TIME_HOURS, aTotalTime, sizeof(aTotalTime));
|
|
||||||
str_format(aBuffer, sizeof(aBuffer), "%s / %s", aCurrentTime, aTotalTime);
|
|
||||||
UI()->DoLabel(&SeekBar, aBuffer, SeekBar.h * 0.70f, TEXTALIGN_MC);
|
|
||||||
|
|
||||||
// do the logic
|
|
||||||
const bool Inside = UI()->MouseInside(&SeekBar);
|
|
||||||
|
|
||||||
if(UI()->CheckActiveItem(pId))
|
|
||||||
{
|
|
||||||
if(!UI()->MouseButton(0))
|
|
||||||
UI()->SetActiveItem(nullptr);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
static float s_PrevAmount = 0.0f;
|
|
||||||
float AmountSeek = clamp((UI()->MouseX() - SeekBar.x - Rounding) / (float)(SeekBar.w - 2 * Rounding), 0.0f, 1.0f);
|
|
||||||
|
|
||||||
if(Input()->ShiftIsPressed())
|
|
||||||
{
|
|
||||||
AmountSeek = s_PrevAmount + (AmountSeek - s_PrevAmount) * 0.05f;
|
|
||||||
if(AmountSeek >= 0.0f && AmountSeek <= 1.0f && absolute(s_PrevAmount - AmountSeek) >= 0.0001f)
|
|
||||||
{
|
|
||||||
Sound()->SetSampleCurrentTime(pSelectedSound->m_SoundID, AmountSeek);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(AmountSeek >= 0.0f && AmountSeek <= 1.0f && absolute(s_PrevAmount - AmountSeek) >= 0.001f)
|
|
||||||
{
|
|
||||||
s_PrevAmount = AmountSeek;
|
|
||||||
Sound()->SetSampleCurrentTime(pSelectedSound->m_SoundID, AmountSeek);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(UI()->HotItem() == pId)
|
|
||||||
{
|
|
||||||
if(UI()->MouseButton(0))
|
|
||||||
{
|
|
||||||
UI()->SetActiveItem(pId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Inside)
|
|
||||||
UI()->SetHotItem(pId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4746,25 +4752,11 @@ void CEditor::RenderFileDialog()
|
||||||
Preview.Margin(10.0f, &Preview);
|
Preview.Margin(10.0f, &Preview);
|
||||||
if(m_FilePreviewState == PREVIEW_LOADED)
|
if(m_FilePreviewState == PREVIEW_LOADED)
|
||||||
{
|
{
|
||||||
CUIRect Button;
|
|
||||||
Preview.HSplitTop(20.0f, &Preview, nullptr);
|
Preview.HSplitTop(20.0f, &Preview, nullptr);
|
||||||
Preview.VSplitLeft(Preview.h, &Button, &Preview);
|
|
||||||
Preview.VSplitLeft(Preview.h / 4.0f, nullptr, &Preview);
|
Preview.VSplitLeft(Preview.h / 4.0f, nullptr, &Preview);
|
||||||
|
|
||||||
static int s_PlayStopButton;
|
static int s_PlayPauseButton, s_StopButton, s_SeekBar = 0;
|
||||||
if(DoButton_FontIcon(&s_PlayStopButton, Sound()->IsPlaying(m_FilePreviewSound) ? FONT_ICON_STOP : FONT_ICON_PLAY, 0, &Button, 0, "Play/stop audio preview", IGraphics::CORNER_ALL))
|
DoAudioPreview(Preview, &s_PlayPauseButton, &s_StopButton, &s_SeekBar, m_FilePreviewSound);
|
||||||
{
|
|
||||||
if(Sound()->IsPlaying(m_FilePreviewSound))
|
|
||||||
Sound()->Stop(m_FilePreviewSound);
|
|
||||||
else
|
|
||||||
Sound()->Play(CSounds::CHN_GUI, m_FilePreviewSound, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
char aTotalTime[32];
|
|
||||||
char aTotalTimeLabel[64];
|
|
||||||
str_time_float(Sound()->GetSampleTotalTime(m_FilePreviewSound), TIME_HOURS, aTotalTime, sizeof(aTotalTime));
|
|
||||||
str_format(aTotalTimeLabel, sizeof(aTotalTimeLabel), "Duration: %s", aTotalTime);
|
|
||||||
UI()->DoLabel(&Preview, aTotalTimeLabel, 12.0f, TEXTALIGN_ML);
|
|
||||||
}
|
}
|
||||||
else if(m_FilePreviewState == PREVIEW_ERROR)
|
else if(m_FilePreviewState == PREVIEW_ERROR)
|
||||||
{
|
{
|
||||||
|
|
|
@ -875,6 +875,8 @@ public:
|
||||||
void SortImages();
|
void SortImages();
|
||||||
bool SelectLayerByTile();
|
bool SelectLayerByTile();
|
||||||
|
|
||||||
|
void DoAudioPreview(CUIRect View, const void *pPlayPauseButtonID, const void *pStopButtonID, const void *pSeekBarID, const int SampleID);
|
||||||
|
|
||||||
// Tile Numbers For Explanations - TODO: Add/Improve tiles and explanations
|
// Tile Numbers For Explanations - TODO: Add/Improve tiles and explanations
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue