disable UI and show a floater while rendering

master
zetaPRIME 2022-03-15 05:43:04 -04:00
parent 7858449637
commit c168ed95d3
7 changed files with 185 additions and 8 deletions

2
notes
View File

@ -35,7 +35,7 @@ TODO {
- support rendering to FLAC
- figure out why it defaults to mp3 regardless of type selection?? (it's because qt does a default suffix)
add rendering modal
- add rendering floater
revert action

View File

@ -278,8 +278,7 @@ void AudioEngine::render(std::shared_ptr<Project> p, QString fileName) {
});
while (mode == Rendering) QCoreApplication::processEvents(); // hold modality but allow updates
while (mode == Rendering && project == p) QCoreApplication::processEvents(); // hold modality but allow UI updates
//qDebug() << enc.readAllStandardOutput();
//qDebug() << enc.readAllStandardError();

View File

@ -78,8 +78,9 @@ MainWindow::MainWindow(QWidget *parent, const QString& fileName) :
socket = new UISocket(); // create this first
ui->setupUi(this);
// remove tab containing system widgets
// remove tabs containing system widgets
ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->extra_));
ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->extra_2));
undoStack = new QUndoStack(this);
//undoStack->setUndoLimit(256);
@ -127,6 +128,18 @@ MainWindow::MainWindow(QWidget *parent, const QString& fileName) :
//ui->menuBar->setStyleSheet("QMenuBar { background: transparent; vertical-align: center; } QMenuBar::item { } QMenuBar::item:!pressed { background: transparent; }");
}
{ /* Set up floater container */ } {
auto fc = ui->floaterContainer;
fc->setParent(this);
fc->setAttribute(Qt::WA_TransparentForMouseEvents); // click through
fc->setFocusPolicy(Qt::NoFocus); // can't be focused
fc->move(0, 0);
fc->setFixedSize(this->size());
setFloater();
}
{ /* Set up recent file entries */ } {
auto fm = ui->menuFile;
@ -528,6 +541,12 @@ MainWindow* MainWindow::projectWindow(const QString &fileName) {
return nullptr;
}
void MainWindow::resizeEvent(QResizeEvent* e) {
this->QMainWindow::resizeEvent(e);
ui->floaterContainer->setFixedSize(this->size());
}
void MainWindow::closeEvent(QCloseEvent* e) {
if (promptSave()) {
e->ignore();
@ -640,9 +659,7 @@ void MainWindow::menuFileSaveAs() {
void MainWindow::menuFileExport() {
if (project->exportFileName.isEmpty()) menuFileExportAs();
else {
audioEngine->render(project, project->exportFileName);
}
else render();
}
void MainWindow::menuFileExportAs() {
@ -653,10 +670,25 @@ void MainWindow::menuFileExportAs() {
} else saveDir = saveDir.append("/untitled.mp3");
if (auto fileName = FileOps::showSaveAsDialog(this, "Save project as...", saveDir, FileOps::Filter::audioOut, "mp3"); !fileName.isEmpty()) {
project->exportFileName = fileName;
audioEngine->render(project, project->exportFileName);
render();
}
}
void MainWindow::render() {
std::vector<QWidget*> dis {
ui->pattern, ui->patchboard, ui->samples,
ui->menuBar, ui->playButton
};
for (auto w : dis) w->setEnabled(false);
setFloater(ui->floaterRendering);
audioEngine->render(project, project->exportFileName);
if (openWindows.find(this) == openWindows.end()) return; // don't try to update UI if the window has been disposed
setFloater();
for (auto w : dis) w->setEnabled(true);
}
void MainWindow::menuFileNewWindow() {
auto w = new MainWindow();
w->show();
@ -772,6 +804,12 @@ void MainWindow::setSongInfoPaneExpanded(bool open) {
ui->songInfoPane->setMaximumHeight(s);
}
void MainWindow::setFloater(QWidget* w) {
auto idx = ui->floaterContainer->indexOf(w);
if (idx < 0) idx = 0;
ui->floaterContainer->setCurrentIndex(idx);
}
bool MainWindow::selectPatternForEditing(Pattern* pattern) {
if (!pattern || pattern == editingPattern.get()) return false; // no u
if (pattern->project != project.get()) return false; // wrong project

View File

@ -55,6 +55,9 @@ namespace Xybrid {
void updateTitle();
void setSongInfoPaneExpanded(bool);
void setFloater(QWidget* = nullptr);
void render();
public:
const std::shared_ptr<Data::Project>& getProject() const { return project; }
@ -67,6 +70,7 @@ namespace Xybrid {
inline UISocket* uiSocket() { return socket; }
protected:
void resizeEvent(QResizeEvent*) override;
void closeEvent(QCloseEvent*) override;
bool eventFilter(QObject *obj, QEvent *event) override;

View File

@ -1043,6 +1043,109 @@
</layout>
</widget>
</widget>
<widget class="QWidget" name="extra_2">
<attribute name="title">
<string>floater</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<item>
<widget class="QStackedWidget" name="floaterContainer">
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="floaterNone"/>
<widget class="QWidget" name="floaterRendering">
<layout class="QHBoxLayout" name="horizontalLayout_13">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>388</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="Xybrid::UI::FloaterBG" name="floaterRenderingBg" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>120</width>
<height>48</height>
</size>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_14">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="labelRendering">
<property name="text">
<string>Rendering...</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
@ -1202,6 +1305,12 @@
<header>ui/waveformpreviewwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>Xybrid::UI::FloaterBG</class>
<extends>QWidget</extends>
<header>ui/floaterbg.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="res/resources.qrc"/>

14
xybrid/ui/floaterbg.cpp Normal file
View File

@ -0,0 +1,14 @@
#include "floaterbg.h"
#include <QVariant>
using Xybrid::UI::FloaterBG;
FloaterBG::FloaterBG(QWidget* parent) : QWidget(parent) {
// set custom appearance
setStyleSheet(R"css(
background: palette(window);
border: 1px solid palette(mid);
border-radius: 5;
)css");
}

13
xybrid/ui/floaterbg.h Normal file
View File

@ -0,0 +1,13 @@
#pragma once
#include <QWidget>
namespace Xybrid::UI {
class FloaterBG : public QWidget {
Q_OBJECT
// this is really just here for QSS purposes
public:
FloaterBG(QWidget* parent);
~FloaterBG() override = default;
};
}