From ed3e9ef50803535f509f869b7cc2df91b583166c Mon Sep 17 00:00:00 2001 From: David Marsh Date: Mon, 22 Jul 2024 15:44:28 +0100 Subject: [PATCH] Abstract layout stuff + clean up layout --- output-dialog.cpp | 335 +++++++++++++++------------------------------- output-dialog.hpp | 11 +- 2 files changed, 116 insertions(+), 230 deletions(-) diff --git a/output-dialog.cpp b/output-dialog.cpp index af0aee0..16bc755 100644 --- a/output-dialog.cpp +++ b/output-dialog.cpp @@ -63,11 +63,15 @@ QLabel *generateFormLabel(std::string text) { } // Helper for generating output name field -QLineEdit *OutputDialog::generateOutputNameField(std::string text, QPushButton *confirmButton) { +QLineEdit *OutputDialog::generateOutputNameField(std::string text, QPushButton *confirmButton, bool edit) { auto field = new QLineEdit; field->setText(QString::fromUtf8(obs_module_text(text.c_str()))); field->setStyleSheet("padding: 4px 8px;"); + if (edit) { // edit mode, set field value from output value + field->setText(outputName); + } + connect(field, &QLineEdit::textEdited, [this, field, confirmButton] { outputName = field->text(); validateOutputs(confirmButton); @@ -77,11 +81,15 @@ QLineEdit *OutputDialog::generateOutputNameField(std::string text, QPushButton * } // Helper for generating output server field -QLineEdit *OutputDialog::generateOutputServerField(QPushButton *confirmButton, bool locked) { +QLineEdit *OutputDialog::generateOutputServerField(QPushButton *confirmButton, bool locked, bool edit) { auto field = new QLineEdit; field->setStyleSheet("padding: 4px 8px;"); field->setDisabled(locked); + if (edit) { // edit mode, set field value from output value + field->setText(outputServer); + } + if (!locked) { connect(field, &QLineEdit::textEdited, [this, field, confirmButton] { outputServer = field->text(); @@ -134,10 +142,14 @@ QComboBox *OutputDialog::generateOutputServerCombo(std::string service, QPushBut } // Helper for generating output key field -QLineEdit *OutputDialog::generateOutputKeyField(QPushButton *confirmButton) { +QLineEdit *OutputDialog::generateOutputKeyField(QPushButton *confirmButton, bool edit) { auto field = new QLineEdit; field->setStyleSheet("padding: 4px 8px;"); + if (edit) { // edit mode, set field value from output value + field->setText(outputKey); + } + connect(field, &QLineEdit::textEdited, [this, field, confirmButton] { outputKey = field->text(); validateOutputs(confirmButton); @@ -146,6 +158,24 @@ QLineEdit *OutputDialog::generateOutputKeyField(QPushButton *confirmButton) { return field; } +// Helper for generating wizard button layout +QHBoxLayout *OutputDialog::generateWizardButtonLayout(QPushButton *confirmButton, QPushButton *serviceButton, bool edit) { + auto layout = new QHBoxLayout; + layout->setSpacing(0); + layout->setContentsMargins(0,0,0,0); + + if (!edit && serviceButton != nullptr) { // Not edit mode and we have a service (back) button + layout->addWidget(serviceButton, 1); + layout->addStretch(1); + + layout->addWidget(confirmButton, 0, Qt::AlignRight); + } else { // edit mode, push the button to the right + layout->addWidget(confirmButton, 0, Qt::AlignRight); + } + + return layout; +} + // Helper for generating QPushButtons w/ style QPushButton *generateButton(QString text) { auto button = new QPushButton; @@ -156,6 +186,18 @@ QPushButton *generateButton(QString text) { return button; } +// Helper for generating back button +QPushButton *OutputDialog::generateBackButton() { + auto button = generateButton(QString("< Back")); + + connect(button, &QPushButton::clicked, [this] { + stackedWidget->setCurrentIndex(0); + resetOutputs(); + }); + + return button; +} + QToolButton *OutputDialog::selectionButton(std::string title, QIcon icon, int selectionStep) { auto button = new QToolButton; @@ -365,11 +407,11 @@ QWidget *OutputDialog::WizardInfoKick(bool edit) { formLayout->setSpacing(12); // Output name - auto outputNameField = generateOutputNameField("KickOutput", confirmButton); + auto outputNameField = generateOutputNameField("KickOutput", confirmButton, edit); formLayout->addRow(generateFormLabel("OutputName"), outputNameField); // Server field - auto serverSelection = generateOutputServerField(confirmButton, true); + auto serverSelection = generateOutputServerField(confirmButton, true, edit); serverSelection->setText("rtmps://fa723fc1b171.global-contribute.live-video.net"); formLayout->addRow(generateFormLabel("KickServer"), serverSelection); @@ -377,7 +419,7 @@ QWidget *OutputDialog::WizardInfoKick(bool edit) { formLayout->addWidget(generateInfoLabel("KickServerInfo")); // Server key - auto outputKeyField = generateOutputKeyField(confirmButton); + auto outputKeyField = generateOutputKeyField(confirmButton, edit); formLayout->addRow(generateFormLabel("KickStreamKey"), outputKeyField); // Server key info @@ -391,32 +433,19 @@ QWidget *OutputDialog::WizardInfoKick(bool edit) { pageLayout->addLayout(contentLayout); - // Controls - auto controlsLayout = new QHBoxLayout; - controlsLayout->setSpacing(12); - // back button - if (!edit) { - auto serviceButton = generateButton(QString("< Back")); - - connect(serviceButton, &QPushButton::clicked, [this] { - stackedWidget->setCurrentIndex(0); - resetOutputs(); - }); - - controlsLayout->addWidget(serviceButton, 0); - controlsLayout->addStretch(1); - } + auto serviceButton = edit ? nullptr : generateBackButton(); + + // Controls layout + auto controlsLayout = generateWizardButtonLayout(confirmButton, serviceButton, edit); // confirm button (initialised above so we can set state) connect(confirmButton, &QPushButton::clicked, [this] { acceptOutputs(); }); - controlsLayout->addWidget(confirmButton, 0); - // Hook it all together - pageLayout->addLayout(controlsLayout); + pageLayout->addLayout(controlsLayout, 1); page->setLayout(pageLayout); // Defaults for when we're changed to @@ -431,14 +460,6 @@ QWidget *OutputDialog::WizardInfoKick(bool edit) { }); } - - // Edit changes - if (edit) { - outputNameField->setText(outputName); - serverSelection->setText(outputServer); - outputKeyField->setText(outputKey); - } - return page; } @@ -467,18 +488,18 @@ QWidget *OutputDialog::WizardInfoYouTube(bool edit) { formLayout->setSpacing(12); // Output name - auto outputNameField = generateOutputNameField("YouTubeOutput", confirmButton); + auto outputNameField = generateOutputNameField("YouTubeOutput", confirmButton, edit); formLayout->addRow(generateFormLabel("OutputName"), outputNameField); // Server selection - auto serverSelection = generateOutputServerCombo("YouTube - RTMPS", confirmButton); + auto serverSelection = generateOutputServerCombo("YouTube - RTMPS", confirmButton, edit); formLayout->addRow(generateFormLabel("YouTubeServer"), serverSelection); // Server info formLayout->addWidget(generateInfoLabel("YouTubeServerInfo")); // Server key - auto outputKeyField = generateOutputKeyField(confirmButton); + auto outputKeyField = generateOutputKeyField(confirmButton, edit); formLayout->addRow(generateFormLabel("YouTubeStreamKey"), outputKeyField); // Server key info @@ -492,32 +513,19 @@ QWidget *OutputDialog::WizardInfoYouTube(bool edit) { pageLayout->addLayout(contentLayout); - // Controls - auto controlsLayout = new QHBoxLayout; - controlsLayout->setSpacing(12); - // back button - if (!edit) { - auto serviceButton = generateButton(QString("< Back")); - - connect(serviceButton, &QPushButton::clicked, [this] { - stackedWidget->setCurrentIndex(0); - resetOutputs(); - }); - - controlsLayout->addWidget(serviceButton, 0); - controlsLayout->addStretch(1); - } + auto serviceButton = edit ? nullptr : generateBackButton(); + + // Controls layout + auto controlsLayout = generateWizardButtonLayout(confirmButton, serviceButton, edit); // confirm button (initialised above so we can set state) connect(confirmButton, &QPushButton::clicked, [this] { acceptOutputs(); }); - - controlsLayout->addWidget(confirmButton, 0); // Hook it all together - pageLayout->addLayout(controlsLayout); + pageLayout->addLayout(controlsLayout, 1); page->setLayout(pageLayout); // Defaults for when we're changed to @@ -531,13 +539,7 @@ QWidget *OutputDialog::WizardInfoYouTube(bool edit) { } }); } - - // Edit changes - if (edit) { - outputNameField->setText(outputName); - outputKeyField->setText(outputKey); - } - + return page; } @@ -566,18 +568,18 @@ QWidget *OutputDialog::WizardInfoTwitter(bool edit) { formLayout->setSpacing(12); // Output name - auto outputNameField = generateOutputNameField("TwitterOutput", confirmButton); + auto outputNameField = generateOutputNameField("TwitterOutput", confirmButton, edit); formLayout->addRow(generateFormLabel("OutputName"), outputNameField); // Server selection - auto serverSelection = generateOutputServerCombo("Twitter", confirmButton); + auto serverSelection = generateOutputServerCombo("Twitter", confirmButton, edit); formLayout->addRow(generateFormLabel("TwitterServer"), serverSelection); // Server info formLayout->addWidget(generateInfoLabel("TwitterServerInfo")); // Server key - auto outputKeyField = generateOutputKeyField(confirmButton); + auto outputKeyField = generateOutputKeyField(confirmButton, edit); formLayout->addRow(generateFormLabel("TwitterStreamKey"), outputKeyField); // Server key info @@ -591,32 +593,19 @@ QWidget *OutputDialog::WizardInfoTwitter(bool edit) { pageLayout->addLayout(contentLayout); - // Controls - auto controlsLayout = new QHBoxLayout; - controlsLayout->setSpacing(12); - // back button - if (!edit) { - auto serviceButton = generateButton(QString("< Back")); - - connect(serviceButton, &QPushButton::clicked, [this] { - stackedWidget->setCurrentIndex(0); - resetOutputs(); - }); - - controlsLayout->addWidget(serviceButton, 0); - controlsLayout->addStretch(1); - } + auto serviceButton = edit ? nullptr : generateBackButton(); + + // Controls layout + auto controlsLayout = generateWizardButtonLayout(confirmButton, serviceButton, edit); // confirm button (initialised above so we can set state) connect(confirmButton, &QPushButton::clicked, [this] { acceptOutputs(); }); - - controlsLayout->addWidget(confirmButton, 0); // Hook it all together - pageLayout->addLayout(controlsLayout); + pageLayout->addLayout(controlsLayout, 1); page->setLayout(pageLayout); // Defaults for when we're changed to @@ -631,12 +620,6 @@ QWidget *OutputDialog::WizardInfoTwitter(bool edit) { }); } - // Edit changes - if (edit) { - outputNameField->setText(outputName); - outputKeyField->setText(outputKey); - } - return page; } @@ -667,18 +650,18 @@ QWidget *OutputDialog::WizardInfoUnknown(bool edit) { formLayout->setSpacing(12); // Output name - auto outputNameField = generateOutputNameField("CustomOutput", confirmButton); + auto outputNameField = generateOutputNameField("CustomOutput", confirmButton, edit); formLayout->addRow(generateFormLabel("OutputName"), outputNameField); // Server field - auto serverSelection = generateOutputServerField(confirmButton, false); + auto serverSelection = generateOutputServerField(confirmButton, false, edit); formLayout->addRow(generateFormLabel("CustomServer"), serverSelection); // Server info formLayout->addWidget(generateInfoLabel("CustomServerInfo")); // Server key - auto outputKeyField = generateOutputKeyField(confirmButton); + auto outputKeyField = generateOutputKeyField(confirmButton, edit); formLayout->addRow(generateFormLabel("CustomStreamKey"), outputKeyField); // Server key info @@ -692,32 +675,19 @@ QWidget *OutputDialog::WizardInfoUnknown(bool edit) { pageLayout->addLayout(contentLayout); - // Controls - auto controlsLayout = new QHBoxLayout; - controlsLayout->setSpacing(12); - // back button - if (!edit) { - auto serviceButton = generateButton(QString("< Back")); - - connect(serviceButton, &QPushButton::clicked, [this] { - stackedWidget->setCurrentIndex(0); - resetOutputs(); - }); - - controlsLayout->addWidget(serviceButton, 0); - controlsLayout->addStretch(1); - } + auto serviceButton = edit ? nullptr : generateBackButton(); + + // Controls layout + auto controlsLayout = generateWizardButtonLayout(confirmButton, serviceButton, edit); // confirm button (initialised above so we can set state) connect(confirmButton, &QPushButton::clicked, [this] { acceptOutputs(); }); - controlsLayout->addWidget(confirmButton, 0); - // Hook it all together - pageLayout->addLayout(controlsLayout); + pageLayout->addLayout(controlsLayout, 1); page->setLayout(pageLayout); // Defaults for when we're changed to @@ -732,13 +702,6 @@ QWidget *OutputDialog::WizardInfoUnknown(bool edit) { }); } - // Edit changes - if (edit) { - outputNameField->setText(outputName); - serverSelection->setText(outputServer); - outputKeyField->setText(outputKey); - } - return page; } @@ -767,7 +730,7 @@ QWidget *OutputDialog::WizardInfoTwitch(bool edit) { formLayout->setSpacing(12); // Output name - auto outputNameField = generateOutputNameField("TwitchOutput", confirmButton); + auto outputNameField = generateOutputNameField("TwitchOutput", confirmButton, edit); formLayout->addRow(generateFormLabel("OutputName"), outputNameField); // Server selection @@ -778,7 +741,7 @@ QWidget *OutputDialog::WizardInfoTwitch(bool edit) { formLayout->addWidget(generateInfoLabel("TwitchServerInfo")); // Server key - auto outputKeyField = generateOutputKeyField(confirmButton); + auto outputKeyField = generateOutputKeyField(confirmButton, edit); formLayout->addRow(generateFormLabel("TwitchStreamKey"), outputKeyField); // Server key info @@ -792,32 +755,19 @@ QWidget *OutputDialog::WizardInfoTwitch(bool edit) { pageLayout->addLayout(contentLayout); - // Controls - auto controlsLayout = new QHBoxLayout; - controlsLayout->setSpacing(12); - // back button - if (!edit) { - auto serviceButton = generateButton(QString("< Back")); - - connect(serviceButton, &QPushButton::clicked, [this] { - stackedWidget->setCurrentIndex(0); - resetOutputs(); - }); - - controlsLayout->addWidget(serviceButton, 0); - controlsLayout->addStretch(1); - } + auto serviceButton = edit ? nullptr : generateBackButton(); + + // Controls layout + auto controlsLayout = generateWizardButtonLayout(confirmButton, serviceButton, edit); // confirm button (initialised above so we can set state) connect(confirmButton, &QPushButton::clicked, [this] { acceptOutputs(); }); - - controlsLayout->addWidget(confirmButton, 0); // Hook it all together - pageLayout->addLayout(controlsLayout); + pageLayout->addLayout(controlsLayout, 1); page->setLayout(pageLayout); // Defaults for when we're changed to @@ -833,12 +783,6 @@ QWidget *OutputDialog::WizardInfoTwitch(bool edit) { }); } - // Edit changes - if (edit) { - outputNameField->setText(outputName); - outputKeyField->setText(outputKey); - } - return page; } @@ -869,11 +813,11 @@ QWidget *OutputDialog::WizardInfoTrovo(bool edit) { formLayout->setSpacing(12); // Output name - auto outputNameField = generateOutputNameField("TrovoOutput", confirmButton); + auto outputNameField = generateOutputNameField("TrovoOutput", confirmButton, edit); formLayout->addRow(generateFormLabel("OutputName"), outputNameField); // Server field - auto serverSelection = generateOutputServerField(confirmButton, true); + auto serverSelection = generateOutputServerField(confirmButton, true, edit); serverSelection->setText("rtmp://livepush.trovo.live/live/"); @@ -883,7 +827,7 @@ QWidget *OutputDialog::WizardInfoTrovo(bool edit) { formLayout->addWidget(generateInfoLabel("TrovoServerInfo")); // Server key - auto outputKeyField = generateOutputKeyField(confirmButton); + auto outputKeyField = generateOutputKeyField(confirmButton, edit); formLayout->addRow(generateFormLabel("TrovoStreamKey"), outputKeyField); // Server key info @@ -897,32 +841,19 @@ QWidget *OutputDialog::WizardInfoTrovo(bool edit) { pageLayout->addLayout(contentLayout); - // Controls - auto controlsLayout = new QHBoxLayout; - controlsLayout->setSpacing(12); - // back button - if (!edit) { - auto serviceButton = generateButton(QString("< Back")); - - connect(serviceButton, &QPushButton::clicked, [this] { - stackedWidget->setCurrentIndex(0); - resetOutputs(); - }); - - controlsLayout->addWidget(serviceButton, 0); - controlsLayout->addStretch(1); - } + auto serviceButton = edit ? nullptr : generateBackButton(); + + // Controls layout + auto controlsLayout = generateWizardButtonLayout(confirmButton, serviceButton, edit); // confirm button (initialised above so we can set state) connect(confirmButton, &QPushButton::clicked, [this] { acceptOutputs(); }); - controlsLayout->addWidget(confirmButton, 0); - // Hook it all together - pageLayout->addLayout(controlsLayout); + pageLayout->addLayout(controlsLayout, 1); page->setLayout(pageLayout); // Defaults for when we're changed to @@ -937,13 +868,6 @@ QWidget *OutputDialog::WizardInfoTrovo(bool edit) { }); } - // Edit changes - if (edit) { - outputNameField->setText(outputName); - serverSelection->setText(outputServer); - outputKeyField->setText(outputKey); - } - return page; } @@ -974,18 +898,18 @@ QWidget *OutputDialog::WizardInfoTikTok(bool edit) { formLayout->setSpacing(12); // Output name - auto outputNameField = generateOutputNameField("TikTokOutput", confirmButton); + auto outputNameField = generateOutputNameField("TikTokOutput", confirmButton, edit); formLayout->addRow(generateFormLabel("OutputName"), outputNameField); // Server field - auto serverSelection = generateOutputServerField(confirmButton, false); + auto serverSelection = generateOutputServerField(confirmButton, false, edit); formLayout->addRow(generateFormLabel("TikTokServer"), serverSelection); // Server info formLayout->addWidget(generateInfoLabel("TikTokServerInfo")); // Server key - auto outputKeyField = generateOutputKeyField(confirmButton); + auto outputKeyField = generateOutputKeyField(confirmButton, edit); formLayout->addRow(generateFormLabel("TikTokStreamKey"), outputKeyField); // Server key info @@ -999,32 +923,19 @@ QWidget *OutputDialog::WizardInfoTikTok(bool edit) { pageLayout->addLayout(contentLayout); - // Controls - auto controlsLayout = new QHBoxLayout; - controlsLayout->setSpacing(12); - // back button - if (!edit) { - auto serviceButton = generateButton(QString("< Back")); - - connect(serviceButton, &QPushButton::clicked, [this] { - stackedWidget->setCurrentIndex(0); - resetOutputs(); - }); - - controlsLayout->addWidget(serviceButton, 0); - controlsLayout->addStretch(1); - } + auto serviceButton = edit ? nullptr : generateBackButton(); + + // Controls layout + auto controlsLayout = generateWizardButtonLayout(confirmButton, serviceButton, edit); // confirm button (initialised above so we can set state) connect(confirmButton, &QPushButton::clicked, [this] { acceptOutputs(); }); - - controlsLayout->addWidget(confirmButton, 0); // Hook it all together - pageLayout->addLayout(controlsLayout); + pageLayout->addLayout(controlsLayout, 1); page->setLayout(pageLayout); // Defaults for when we're changed to @@ -1039,14 +950,6 @@ QWidget *OutputDialog::WizardInfoTikTok(bool edit) { }); } - // Edit changes - if (edit) { - outputNameField->setText(outputName); - serverSelection->setText(outputServer); - outputKeyField->setText(outputKey); - } - - return page; } @@ -1077,11 +980,11 @@ QWidget *OutputDialog::WizardInfoFacebook(bool edit) { formLayout->setSpacing(12); // Output name - auto outputNameField = generateOutputNameField("FacebookOutput", confirmButton); + auto outputNameField = generateOutputNameField("FacebookOutput", confirmButton, edit); formLayout->addRow(generateFormLabel("OutputName"), outputNameField); // Server field - auto serverSelection = generateOutputServerField(confirmButton, true); + auto serverSelection = generateOutputServerField(confirmButton, true, edit); serverSelection->setText("rtmps://rtmp-api.facebook.com:443/rtmp/"); formLayout->addRow(generateFormLabel("FacebookServer"), serverSelection); @@ -1090,7 +993,7 @@ QWidget *OutputDialog::WizardInfoFacebook(bool edit) { formLayout->addWidget(generateInfoLabel("FacebookServerInfo")); // Server key - auto outputKeyField = generateOutputKeyField(confirmButton); + auto outputKeyField = generateOutputKeyField(confirmButton, edit); formLayout->addRow(generateFormLabel("FacebookStreamKey"), outputKeyField); // Server key info @@ -1104,32 +1007,19 @@ QWidget *OutputDialog::WizardInfoFacebook(bool edit) { pageLayout->addLayout(contentLayout); - // Controls - auto controlsLayout = new QHBoxLayout; - controlsLayout->setSpacing(12); - // back button - if (!edit) { - auto serviceButton = generateButton(QString("< Back")); - - connect(serviceButton, &QPushButton::clicked, [this] { - stackedWidget->setCurrentIndex(0); - resetOutputs(); - }); - - controlsLayout->addWidget(serviceButton, 0); - controlsLayout->addStretch(1); - } + auto serviceButton = edit ? nullptr : generateBackButton(); + + // Controls layout + auto controlsLayout = generateWizardButtonLayout(confirmButton, serviceButton, edit); // confirm button (initialised above so we can set state) connect(confirmButton, &QPushButton::clicked, [this] { acceptOutputs(); }); - controlsLayout->addWidget(confirmButton, 0); - // Hook it all together - pageLayout->addLayout(controlsLayout); + pageLayout->addLayout(controlsLayout, 1); page->setLayout(pageLayout); // Defaults for when we're changed to @@ -1144,12 +1034,5 @@ QWidget *OutputDialog::WizardInfoFacebook(bool edit) { }); } - // Edit changes - if (edit) { - outputNameField->setText(outputName); - serverSelection->setText(outputServer); - outputKeyField->setText(outputKey); - } - return page; } diff --git a/output-dialog.hpp b/output-dialog.hpp index 2d59c0e..41f14e6 100644 --- a/output-dialog.hpp +++ b/output-dialog.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include "obs-data.h" @@ -43,11 +44,13 @@ private: void validateOutputs(QPushButton *confirmButton); // Generators - QLineEdit *generateOutputNameField(std::string text, QPushButton *confirmButton); - QLineEdit *generateOutputServerField(QPushButton *confirmButton, bool locked); + QLineEdit *generateOutputNameField(std::string text, QPushButton *confirmButton, bool edit = false); + QLineEdit *generateOutputServerField(QPushButton *confirmButton, bool locked, bool edit = false); QComboBox *generateOutputServerCombo(std::string service, QPushButton *confirmButton, bool edit = false); - QLineEdit *generateOutputKeyField(QPushButton *confirmButton); - + QLineEdit *generateOutputKeyField(QPushButton *confirmButton, bool edit = false); + QHBoxLayout *generateWizardButtonLayout(QPushButton *confirmButton, QPushButton *serviceButton, bool edit); + QPushButton *generateBackButton(); + obs_data_t *getService(std::string serviceName); QStackedWidget *stackedWidget;