22#include " ui/effects/VstSelectorDialog.h"
33#include " ui/effects/PluginEditorWindow.h"
44#include " ui/pianoroll/PianoRollEditor.h"
5+ #include " ui/audioclip/AudioClipEditor.h"
56#include " ui/dialogs/ExportDialog.h"
67#include " ui/SplashScreen.h"
78#include " utils/ThemeManager.h"
2122#include < QPlainTextEdit>
2223#include < QComboBox>
2324#include < QShortcutEvent>
25+ #include < QTimer>
2426#include < QtConcurrent/QtConcurrent>
2527
2628namespace freedaw {
@@ -92,6 +94,8 @@ MainWindow::MainWindow(FreeDawApplication& app, QWidget* parent)
9294 this , [this ]() {
9395 if (pianoRoll_)
9496 pianoRoll_->setClip (nullptr );
97+ if (audioClipEditor_)
98+ audioClipEditor_->setClip (nullptr , nullptr );
9599 });
96100
97101 setCorner (Qt::TopRightCorner, Qt::RightDockWidgetArea);
@@ -102,6 +106,8 @@ MainWindow::MainWindow(FreeDawApplication& app, QWidget* parent)
102106 createToolBar ();
103107 createStatusBar ();
104108
109+ resizeDocks ({mixerDock_}, {350 }, Qt::Vertical);
110+
105111 aiQuickPrompt_ = new AiQuickPrompt (this );
106112 connect (aiQuickPrompt_, &AiQuickPrompt::promptSubmitted,
107113 this , [this ](const QString& text) {
@@ -252,6 +258,10 @@ void MainWindow::createMenus()
252258 viewMenu->addAction (" Toggle &Effects" , this , [this ]() {
253259 effectsDock_->setVisible (!effectsDock_->isVisible ());
254260 });
261+ viewMenu->addAction (" Toggle Audio &Clip Editor" , this , [this ]() {
262+ audioClipDock_->setVisible (!audioClipDock_->isVisible ());
263+ if (audioClipDock_->isVisible ()) audioClipDock_->raise ();
264+ });
255265 viewMenu->addAction (" Toggle &Routing" , this , [this ]() {
256266 routingDock_->setVisible (!routingDock_->isVisible ());
257267 if (routingDock_->isVisible ()) routingDock_->raise ();
@@ -438,6 +448,12 @@ void MainWindow::createToolBar()
438448 effectsToggle->setToolTip (" Toggle Effects" );
439449 mainToolBar_->addAction (effectsToggle);
440450 }
451+ if (audioClipDock_) {
452+ auto * audioClipToggle = audioClipDock_->toggleViewAction ();
453+ audioClipToggle->setIcon (faIcon (icons::fa::Waveform));
454+ audioClipToggle->setToolTip (" Toggle Audio Clip Editor" );
455+ mainToolBar_->addAction (audioClipToggle);
456+ }
441457 if (routingDock_) {
442458 auto * routingToggle = routingDock_->toggleViewAction ();
443459 routingToggle->setIcon (miIcon (icons::mi::Settings));
@@ -511,6 +527,42 @@ void MainWindow::createDocks()
511527 pianoRoll_->setClip (clip);
512528 });
513529
530+ // Audio Clip Editor dock (bottom, tabbed with mixer and piano roll)
531+ audioClipDock_ = new QDockWidget (" Audio Clip" , this );
532+ audioClipDock_->setAccessibleName (" Audio Clip Editor Dock" );
533+ audioClipEditor_ = new AudioClipEditor (audioClipDock_);
534+ audioClipDock_->setWidget (audioClipEditor_);
535+ addDockWidget (Qt::BottomDockWidgetArea, audioClipDock_);
536+
537+ connect (audioClipEditor_, &AudioClipEditor::clipModified,
538+ timelineView_, &TimelineView::rebuildClips);
539+
540+ connect (&editMgr_, &EditManager::aboutToChangeEdit, this , [this ]() {
541+ if (audioClipEditor_)
542+ audioClipEditor_->setClip (nullptr , nullptr );
543+ });
544+
545+ connect (&editMgr_, &EditManager::editChanged, this , [this ]() {
546+ if (audioClipEditor_ && audioClipEditor_->clip ()) {
547+ if (editMgr_.isClipValid (audioClipEditor_->clip ()))
548+ audioClipEditor_->refresh ();
549+ else
550+ audioClipEditor_->setClip (nullptr , nullptr );
551+ }
552+ });
553+
554+ connect (&editMgr_, &EditManager::audioClipModified,
555+ this , [this ](te::WaveAudioClip* clip) {
556+ if (audioClipEditor_ && audioClipEditor_->clip () == clip)
557+ audioClipEditor_->refresh ();
558+ });
559+
560+ connect (&editMgr_, &EditManager::audioClipSelected,
561+ this , [this ](te::WaveAudioClip* clip) {
562+ if (audioClipDock_ && audioClipDock_->isVisible () && audioClipEditor_ && clip)
563+ audioClipEditor_->setClip (clip, &editMgr_);
564+ });
565+
514566 // Routing view dock (bottom, tabbed with mixer and piano roll)
515567 routingDock_ = new QDockWidget (" Routing" , this );
516568 routingDock_->setAccessibleName (" Routing Dock" );
@@ -533,12 +585,16 @@ void MainWindow::createDocks()
533585 });
534586
535587 tabifyDockWidget (mixerDock_, pianoRollDock_);
536- tabifyDockWidget (pianoRollDock_, routingDock_);
588+ tabifyDockWidget (pianoRollDock_, audioClipDock_);
589+ tabifyDockWidget (audioClipDock_, routingDock_);
537590 mixerDock_->raise ();
538591
539592 connect (&editMgr_, &EditManager::midiClipDoubleClicked,
540593 this , &MainWindow::onMidiClipDoubleClicked);
541594
595+ connect (&editMgr_, &EditManager::audioClipDoubleClicked,
596+ this , &MainWindow::onAudioClipDoubleClicked);
597+
542598 // File browser dock (right, collapsible)
543599 browserDock_ = new QDockWidget (" Browser" , this );
544600 browserDock_->setAccessibleName (" File Browser Dock" );
@@ -777,4 +833,14 @@ void MainWindow::onMidiClipDoubleClicked(te::MidiClip* clip)
777833 pianoRoll_->setClip (clip);
778834}
779835
836+ void MainWindow::onAudioClipDoubleClicked (te::WaveAudioClip* clip)
837+ {
838+ if (!clip) return ;
839+ audioClipDock_->setVisible (true );
840+ audioClipDock_->raise ();
841+
842+ if (audioClipEditor_)
843+ audioClipEditor_->setClip (clip, &editMgr_);
844+ }
845+
780846} // namespace freedaw
0 commit comments