extract CEditor::DoAudioPreview, also use in file dialog

This commit is contained in:
dobrykafe 2023-10-05 21:28:58 +02:00
parent 6e2ddfbeaf
commit 5b609c8e06
2 changed files with 105 additions and 111 deletions

View file

@ -891,6 +891,104 @@ bool CEditor::CallbackSaveSound(const char *pFileName, int StorageType, void *pU
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)
{
const bool ModPressed = Input()->ModifierIsPressed();
@ -1257,107 +1355,15 @@ void CEditor::DoToolbarLayers(CUIRect ToolBar)
void CEditor::DoToolbarSounds(CUIRect ToolBar)
{
CUIRect ToolBarTop, ToolBarBottom, Button, SeekBar;
CUIRect ToolBarTop, ToolBarBottom;
ToolBar.HSplitMid(&ToolBarTop, &ToolBarBottom, 5.0f);
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];
// play/pause button
{
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);
}
static int s_PlayPauseButton, s_StopButton, s_SeekBar = 0;
DoAudioPreview(ToolBarBottom, &s_PlayPauseButton, &s_StopButton, &s_SeekBar, pSelectedSound->m_SoundID);
}
}
@ -4746,25 +4752,11 @@ void CEditor::RenderFileDialog()
Preview.Margin(10.0f, &Preview);
if(m_FilePreviewState == PREVIEW_LOADED)
{
CUIRect Button;
Preview.HSplitTop(20.0f, &Preview, nullptr);
Preview.VSplitLeft(Preview.h, &Button, &Preview);
Preview.VSplitLeft(Preview.h / 4.0f, nullptr, &Preview);
static int s_PlayStopButton;
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))
{
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);
static int s_PlayPauseButton, s_StopButton, s_SeekBar = 0;
DoAudioPreview(Preview, &s_PlayPauseButton, &s_StopButton, &s_SeekBar, m_FilePreviewSound);
}
else if(m_FilePreviewState == PREVIEW_ERROR)
{

View file

@ -875,6 +875,8 @@ public:
void SortImages();
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
enum
{