disable UI and show a floater while rendering
parent
7858449637
commit
c168ed95d3
2
notes
2
notes
|
@ -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
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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");
|
||||
}
|
|
@ -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;
|
||||
};
|
||||
}
|
Loading…
Reference in New Issue