77
88#include " Kaixo/Core/Gui/Views/ImageView.hpp"
99#include " Kaixo/Core/Gui/Knob.hpp"
10+ #include " Kaixo/Core/Gui/Button.hpp"
1011
1112// ------------------------------------------------
1213
@@ -26,7 +27,7 @@ namespace Kaixo::Gui {
2627
2728 void SettingsView::Entry::mouseDown (const juce::MouseEvent& event) {
2829 View::mouseDown (event);
29- if (settings.click ) settings.click ();
30+ if (settings.click ) settings.click (settings. value );
3031 }
3132
3233 void SettingsView::Entry::paint (juce::Graphics& g) {
@@ -84,7 +85,7 @@ namespace Kaixo::Gui {
8485 .steps = 9 ,
8586 .format = Formatters::Group<" 32" , " 64" , " 128" , " 256" , " 512" , " 1024" , " 2048" , " 4096" , " 8192" >,
8687 .transform = Transformers::Group<9 >,
87- .resetValue = 6 .f / 8 .f
88+ .resetValue = 5 .f / 8 .f
8889 }).value (Math::clamp (Storage::getOrDefault<int >(" fft-size" , 6 ), 0 , 8 ) / 8 .f );
8990
9091 add<Knob>({ 4 , 32 + (y++) * 24 , Width - 8 , 22 }, {
@@ -101,9 +102,26 @@ namespace Kaixo::Gui {
101102 .steps = 9 ,
102103 .format = Formatters::Group<" 32" , " 64" , " 128" , " 256" , " 512" , " 1024" , " 2048" , " 4096" , " 8192" >,
103104 .transform = Transformers::Group<9 >,
104- .resetValue = 6 .f / 8 .f
105+ .resetValue = 5 .f / 8 .f
105106 }).value (Math::clamp (Storage::getOrDefault<int >(" fft-resolution" , 6 ), 0 , 8 ) / 8 .f );
106107
108+ add<Knob>({ 4 , 32 + (y++) * 24 , Width - 8 , 22 }, {
109+ .onchange = [&](ParamValue val) {
110+ constexpr int fftSizes[]{ 5 , 10 , 25 , 50 , 75 , 100 };
111+ int index = Math::clamp (normalToIndex (val, 6 ), 0 , 5 );
112+ Storage::set<int >(" fft-block-size" , index);
113+ settings.fftBlockSizeChanged (fftSizes[index]);
114+ },
115+ .graphics = T.settings .entry ,
116+ .tooltipName = false ,
117+ .tooltipValue = false ,
118+ .name = " FFT Block Size" ,
119+ .steps = 6 ,
120+ .format = Formatters::Group<" 5 ms" , " 10 ms" , " 25 ms" , " 50 ms" , " 75 ms" , " 100 ms" >,
121+ .transform = Transformers::Group<6 >,
122+ .resetValue = 2 .f / 5 .f
123+ }).value (Math::clamp (Storage::getOrDefault<int >(" fft-block-size" , 6 ), 0 , 8 ) / 8 .f );
124+
107125 add<Knob>({ 4 , 32 + (y++) * 24 , Width - 8 , 22 }, {
108126 .onchange = [&](ParamValue val) {
109127 auto range = Transformers::Range<48 .f , 144 .f >.transform (val);
@@ -118,16 +136,31 @@ namespace Kaixo::Gui {
118136 .transform = Transformers::Range<48 .f , 144 .f >,
119137 .resetValue = Transformers::Range<48 .f , 144 .f >.normalize (100 .f )
120138 }).value (Transformers::Range<48 .f , 144 .f >.normalize (Storage::getOrDefault<float >(" fft-range" , 100 .f )));
121-
122- add<Entry>({ 4 , 32 + (y++) * 24 , Width - 8 , 22 }, {
139+
140+ add<Button>({ Width - 24 , 32 + y * 24 , 20 , 20 }, {
141+ .callback = [](bool ) {
142+ File a{ AudioFile::generationLocation ().string () };
143+ a.startAsProcess ();
144+ },
145+ .graphics = T.settings .openFolder
146+ });
147+
148+ Entry& outputFolder = add<Entry>({ 4 , 32 + (y++) * 24 , Width - 32 , 22 }, {
123149 .name = " Output Folder" ,
124150 .value = AudioFile::generationLocation ().string (),
125- .click = [] {
126- File a{ AudioFile::generationLocation ().string () };
127- a.revealToUser ();
151+ .click = [&](std::string& value) {
152+ auto folderChooserFlags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectDirectories;
153+ generationDirectoryChooser = std::make_unique<FileChooser>(" Select directory" , File{ AudioFile::generationLocation ().string () });
154+ generationDirectoryChooser->launchAsync (folderChooserFlags, [&](const FileChooser&) {
155+ auto file = generationDirectoryChooser->getResult ();
156+ if (!file.exists ()) return ; // not real file
157+ std::string fullPath = file.getFullPathName ().toStdString ();
158+ Storage::set<std::string>(" generation-directory" , fullPath);
159+ value = fullPath;
160+ });
128161 }
129162 });
130-
163+
131164 add<Entry>({ 4 , 32 + (y++) * 24 , Width - 8 , 22 }, {
132165 .name = " Version" ,
133166 .value = SYNTH_FullVersion,
0 commit comments