2022-03-21 22:34:43 +00:00
/**
* Furnace Tracker - multi - system chiptune tracker
* Copyright ( C ) 2021 - 2022 tildearrow and contributors
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 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 General Public License for more details .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
*/
2022-03-21 21:34:19 +00:00
# include "gui.h"
# include "plot_nolerp.h"
2022-04-02 23:22:06 +00:00
# include "IconsFontAwesome4.h"
2022-03-21 21:34:19 +00:00
# include "misc/cpp/imgui_stdlib.h"
2022-03-30 05:28:49 +00:00
# include <imgui.h>
2022-03-21 21:34:19 +00:00
void FurnaceGUI : : drawWaveEdit ( ) {
if ( nextWindow = = GUI_WINDOW_WAVE_EDIT ) {
waveEditOpen = true ;
ImGui : : SetNextWindowFocus ( ) ;
nextWindow = GUI_WINDOW_NOTHING ;
}
if ( ! waveEditOpen ) return ;
float wavePreview [ 256 ] ;
ImGui : : SetNextWindowSizeConstraints ( ImVec2 ( 450.0f * dpiScale , 300.0f * dpiScale ) , ImVec2 ( scrW * dpiScale , scrH * dpiScale ) ) ;
if ( ImGui : : Begin ( " Wavetable Editor " , & waveEditOpen , settings . allowEditDocking ? 0 : ImGuiWindowFlags_NoDocking ) ) {
if ( curWave < 0 | | curWave > = ( int ) e - > song . wave . size ( ) ) {
ImGui : : Text ( " no wavetable selected " ) ;
} else {
2022-04-02 23:22:06 +00:00
ImGui : : SetNextItemWidth ( 80.0f * dpiScale ) ;
if ( ImGui : : InputInt ( " ##CurWave " , & curWave , 1 , 1 ) ) {
if ( curWave < 0 ) curWave = 0 ;
if ( curWave > = ( int ) e - > song . wave . size ( ) ) curWave = e - > song . wave . size ( ) - 1 ;
}
ImGui : : SameLine ( ) ;
// TODO: load replace
if ( ImGui : : Button ( ICON_FA_FOLDER_OPEN " ##WELoad " ) ) {
doAction ( GUI_ACTION_WAVE_LIST_OPEN ) ;
}
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( ICON_FA_FLOPPY_O " ##WESave " ) ) {
doAction ( GUI_ACTION_WAVE_LIST_SAVE ) ;
}
ImGui : : SameLine ( ) ;
2022-03-21 21:34:19 +00:00
DivWavetable * wave = e - > song . wave [ curWave ] ;
ImGui : : Text ( " Width " ) ;
if ( ImGui : : IsItemHovered ( ) ) {
2022-04-06 07:09:53 +00:00
ImGui : : SetTooltip ( " use a width of: \n - any on Amiga/N163 \n - 32 on Game Boy, PC Engine and WonderSwan \n - 64 on FDS \n - 128 on X1-010 \n any other widths will be scaled during playback. " ) ;
2022-03-21 21:34:19 +00:00
}
ImGui : : SameLine ( ) ;
ImGui : : SetNextItemWidth ( 128.0f * dpiScale ) ;
if ( ImGui : : InputInt ( " ##_WTW " , & wave - > len , 1 , 2 ) ) {
if ( wave - > len > 256 ) wave - > len = 256 ;
if ( wave - > len < 1 ) wave - > len = 1 ;
e - > notifyWaveChange ( curWave ) ;
if ( wavePreviewOn ) e - > previewWave ( curWave , wavePreviewNote ) ;
MARK_MODIFIED ;
}
ImGui : : SameLine ( ) ;
ImGui : : Text ( " Height " ) ;
if ( ImGui : : IsItemHovered ( ) ) {
2022-04-06 07:09:53 +00:00
ImGui : : SetTooltip ( " use a height of: \n - 15 for Game Boy, WonderSwan, X1-010 Envelope shape and N163 \n - 31 for PC Engine \n - 63 for FDS \n - 255 for X1-010 \n any other heights will be scaled during playback. " ) ;
2022-03-21 21:34:19 +00:00
}
ImGui : : SameLine ( ) ;
ImGui : : SetNextItemWidth ( 128.0f * dpiScale ) ;
if ( ImGui : : InputInt ( " ##_WTH " , & wave - > max , 1 , 2 ) ) {
if ( wave - > max > 255 ) wave - > max = 255 ;
if ( wave - > max < 1 ) wave - > max = 1 ;
e - > notifyWaveChange ( curWave ) ;
MARK_MODIFIED ;
}
2022-03-30 05:28:49 +00:00
ImGui : : SameLine ( ) ;
if ( ImGui : : RadioButton ( " Dec " , ! waveHex ) ) {
waveHex = false ;
}
ImGui : : SameLine ( ) ;
if ( ImGui : : RadioButton ( " Hex " , waveHex ) ) {
waveHex = true ;
}
2022-03-21 21:34:19 +00:00
for ( int i = 0 ; i < wave - > len ; i + + ) {
if ( wave - > data [ i ] > wave - > max ) wave - > data [ i ] = wave - > max ;
wavePreview [ i ] = wave - > data [ i ] ;
}
if ( wave - > len > 0 ) wavePreview [ wave - > len ] = wave - > data [ wave - > len - 1 ] ;
ImGui : : SetNextItemWidth ( ImGui : : GetContentRegionAvail ( ) . x ) ; // wavetable text input size found here
if ( ImGui : : InputText ( " ##MMLWave " , & mmlStringW ) ) {
2022-03-30 05:28:49 +00:00
decodeMMLStrW ( mmlStringW , wave - > data , wave - > len , wave - > max , waveHex ) ;
2022-03-21 21:34:19 +00:00
}
if ( ! ImGui : : IsItemActive ( ) ) {
2022-03-30 05:28:49 +00:00
encodeMMLStr ( mmlStringW , wave - > data , wave - > len , - 1 , - 1 , waveHex ) ;
2022-03-21 21:34:19 +00:00
}
ImGui : : PushStyleVar ( ImGuiStyleVar_FramePadding , ImVec2 ( 0.0f , 0.0f ) ) ;
ImVec2 contentRegion = ImGui : : GetContentRegionAvail ( ) ; // wavetable graph size determined here
if ( ImGui : : GetContentRegionAvail ( ) . y > ( ImGui : : GetContentRegionAvail ( ) . x / 2.0f ) ) {
contentRegion = ImVec2 ( ImGui : : GetContentRegionAvail ( ) . x , ImGui : : GetContentRegionAvail ( ) . x / 2.0f ) ;
}
PlotNoLerp ( " ##Waveform " , wavePreview , wave - > len + 1 , 0 , NULL , 0 , wave - > max , contentRegion ) ;
if ( ImGui : : IsItemClicked ( ImGuiMouseButton_Left ) ) {
waveDragStart = ImGui : : GetItemRectMin ( ) ;
waveDragAreaSize = contentRegion ;
waveDragMin = 0 ;
waveDragMax = wave - > max ;
waveDragLen = wave - > len ;
waveDragActive = true ;
waveDragTarget = wave - > data ;
processDrags ( ImGui : : GetMousePos ( ) . x , ImGui : : GetMousePos ( ) . y ) ;
e - > notifyWaveChange ( curWave ) ;
modified = true ;
}
ImGui : : PopStyleVar ( ) ;
}
}
if ( ImGui : : IsWindowFocused ( ImGuiFocusedFlags_ChildWindows ) ) curWindow = GUI_WINDOW_WAVE_EDIT ;
ImGui : : End ( ) ;
}