Minor UI changes (#89)

* automatically scroll to new entry

* fix remote file check always matching

* sort combobox entries alphabetically (meida / processes / audio)

* fix some visual issues on non-default OBS themes
This commit is contained in:
WarmUpTill
2020-12-28 17:03:55 +01:00
committed by GitHub
parent 80e2b3dd14
commit e377be3999
13 changed files with 97 additions and 126 deletions

View File

@@ -146,17 +146,22 @@ void AdvSceneSwitcher::populateAudioSelection(QComboBox *sel, bool addSelect)
auto sourceEnum = [](void *data, obs_source_t *source) -> bool /* -- */
{
QComboBox *combo = reinterpret_cast<QComboBox *>(data);
std::vector<std::string> *list =
reinterpret_cast<std::vector<std::string> *>(data);
uint32_t flags = obs_source_get_output_flags(source);
if ((flags & OBS_SOURCE_AUDIO) != 0) {
const char *name = obs_source_get_name(source);
combo->addItem(name);
list->push_back(obs_source_get_name(source));
}
return true;
};
obs_enum_sources(sourceEnum, sel);
std::vector<std::string> audioSources;
obs_enum_sources(sourceEnum, &audioSources);
sort(audioSources.begin(), audioSources.end());
for (std::string &source : audioSources) {
sel->addItem(source.c_str());
}
}
void AdvSceneSwitcher::populateMediaSelection(QComboBox *sel, bool addSelect)
@@ -170,17 +175,22 @@ void AdvSceneSwitcher::populateMediaSelection(QComboBox *sel, bool addSelect)
auto sourceEnum = [](void *data, obs_source_t *source) -> bool /* -- */
{
QComboBox *combo = reinterpret_cast<QComboBox *>(data);
std::vector<std::string> *list =
reinterpret_cast<std::vector<std::string> *>(data);
std::string sourceId = obs_source_get_id(source);
if (sourceId.compare("ffmpeg_source") == 0 ||
sourceId.compare("vlc_source") == 0) {
const char *name = obs_source_get_name(source);
combo->addItem(name);
list->push_back(obs_source_get_name(source));
}
return true;
};
obs_enum_sources(sourceEnum, sel);
std::vector<std::string> meidaSources;
obs_enum_sources(sourceEnum, &meidaSources);
sort(meidaSources.begin(), meidaSources.end());
for (std::string &source : meidaSources) {
sel->addItem(source.c_str());
}
}
void AdvSceneSwitcher::populateProcessSelection(QComboBox *sel, bool addSelect)
@@ -191,10 +201,34 @@ void AdvSceneSwitcher::populateProcessSelection(QComboBox *sel, bool addSelect)
QStringList processes;
GetProcessList(processes);
processes.sort();
for (QString &process : processes)
sel->addItem(process);
}
void AdvSceneSwitcher::listAddClicked(QListWidget *list,
SwitchWidget *newWidget,
QPushButton *addButton,
QMetaObject::Connection *addHighlight)
{
if (!list || !newWidget) {
blog(LOG_WARNING,
"listAddClicked called without valid list or widget");
return;
}
if (addButton && addHighlight)
addButton->disconnect(*addHighlight);
QListWidgetItem *item;
item = new QListWidgetItem(list);
list->addItem(item);
item->setSizeHint(newWidget->minimumSizeHint());
list->setItemWidget(item, newWidget);
list->scrollToItem(item);
}
bool AdvSceneSwitcher::listMoveUp(QListWidget *list)
{
int index = list->currentRow();

View File

@@ -75,6 +75,9 @@ public:
QColor = QColor(0, 0, 0, 0),
QString specifier = "QLabel ");
void listAddClicked(QListWidget *list, SwitchWidget *newWidget,
QPushButton *addButton = nullptr,
QMetaObject::Connection *addHighlight = nullptr);
bool listMoveUp(QListWidget *list);
bool listMoveDown(QListWidget *list);

View File

@@ -6,18 +6,12 @@ static QMetaObject::Connection addPulse;
void AdvSceneSwitcher::on_audioAdd_clicked()
{
ui->audioAdd->disconnect(addPulse);
std::lock_guard<std::mutex> lock(switcher->m);
switcher->audioSwitches.emplace_back();
QListWidgetItem *item;
item = new QListWidgetItem(ui->audioSwitches);
ui->audioSwitches->addItem(item);
AudioSwitchWidget *sw =
new AudioSwitchWidget(&switcher->audioSwitches.back());
item->setSizeHint(sw->minimumSizeHint());
ui->audioSwitches->setItemWidget(item, sw);
listAddClicked(ui->audioSwitches,
new AudioSwitchWidget(&switcher->audioSwitches.back()),
ui->audioAdd, &addPulse);
}
void AdvSceneSwitcher::on_audioRemove_clicked()
@@ -352,8 +346,6 @@ AudioSwitchWidget::AudioSwitchWidget(AudioSwitch *s) : SwitchWidget(s)
audioVolumeThreshold->setValue(s->volumeThreshold);
}
setStyleSheet("* { background-color: transparent; }");
QHBoxLayout *switchLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{audioSources}}", audioSources},

View File

@@ -5,18 +5,13 @@ static QMetaObject::Connection addPulse;
void AdvSceneSwitcher::on_executableAdd_clicked()
{
ui->executableAdd->disconnect(addPulse);
std::lock_guard<std::mutex> lock(switcher->m);
switcher->executableSwitches.emplace_back();
QListWidgetItem *item;
item = new QListWidgetItem(ui->executables);
ui->executables->addItem(item);
ExecutableSwitchWidget *sw = new ExecutableSwitchWidget(
&switcher->executableSwitches.back());
item->setSizeHint(sw->minimumSizeHint());
ui->executables->setItemWidget(item, sw);
listAddClicked(ui->executables,
new ExecutableSwitchWidget(
&switcher->executableSwitches.back()),
ui->executableAdd, &addPulse);
}
void AdvSceneSwitcher::on_executableRemove_clicked()
@@ -224,8 +219,6 @@ ExecutableSwitchWidget::ExecutableSwitchWidget(ExecutableSwitch *s)
requiresFocus->setChecked(s->inFocus);
}
setStyleSheet("* { background-color: transparent; }");
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{processes}}", processes},

View File

@@ -169,10 +169,14 @@ bool compareIgnoringLineEnding(QString &s1, QString &s2)
while (!s1stream.atEnd() || !s2stream.atEnd()) {
QString s1s = s1stream.readLine();
QString s2s = s2stream.readLine();
if (QString::compare(s1s, s2s, Qt::CaseSensitive) != 0) {
if (s1s != s2s) {
return false;
}
}
if (!s1stream.atEnd() && !s2stream.atEnd())
return false;
return true;
}
@@ -197,8 +201,8 @@ bool matchFileContent(QString &filedata, FileSwitch &s)
bool checkRemoteFileContent(FileSwitch &s)
{
std::string data = getRemoteData(s.file);
QString text = QString::fromStdString(s.text);
return matchFileContent(text, s);
QString qdata = QString::fromStdString(data);
return matchFileContent(qdata, s);
}
bool checkLocalFileContent(FileSwitch &s)
@@ -226,6 +230,9 @@ void SwitcherData::checkFileContent(bool &match, OBSWeakSource &scene,
OBSWeakSource &transition)
{
for (FileSwitch &s : fileSwitches) {
if (!s.initialized())
continue;
bool equal = false;
if (s.remote) {
equal = checkRemoteFileContent(s);
@@ -250,13 +257,9 @@ void AdvSceneSwitcher::on_fileAdd_clicked()
std::lock_guard<std::mutex> lock(switcher->m);
switcher->fileSwitches.emplace_back();
QListWidgetItem *item;
item = new QListWidgetItem(ui->fileSwitches);
ui->fileSwitches->addItem(item);
FileSwitchWidget *sw =
new FileSwitchWidget(&switcher->fileSwitches.back());
item->setSizeHint(sw->minimumSizeHint());
ui->fileSwitches->setItemWidget(item, sw);
listAddClicked(ui->fileSwitches,
new FileSwitchWidget(&switcher->fileSwitches.back()),
ui->fileAdd, &addPulse);
}
void AdvSceneSwitcher::on_fileRemove_clicked()
@@ -490,8 +493,6 @@ FileSwitchWidget::FileSwitchWidget(FileSwitch *s) : SwitchWidget(s, false)
checkFileContent->setChecked(s->onlyMatchIfChanged);
}
setStyleSheet("* { background-color: transparent; }");
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{fileType}}", fileType},
{"{{filePath}}", filePath},

View File

@@ -30,6 +30,12 @@ SwitchWidget::SwitchWidget(SceneSwitcherEntry *s, bool usePreviousScene)
scenes = new QComboBox();
transitions = new QComboBox();
// Depending on selected OBS theme some widgets might have a different
// background color than the listwidget and might look out of place
setStyleSheet("QLabel { background-color: transparent; }\
QSlider { background-color: transparent; }\
QCheckBox { background-color: transparent; }");
QWidget::connect(scenes, SIGNAL(currentTextChanged(const QString &)),
this, SLOT(SceneChanged(const QString &)));
QWidget::connect(transitions,

View File

@@ -8,18 +8,12 @@ constexpr auto media_any_idx = 9;
void AdvSceneSwitcher::on_mediaAdd_clicked()
{
ui->mediaAdd->disconnect(addPulse);
std::lock_guard<std::mutex> lock(switcher->m);
switcher->mediaSwitches.emplace_back();
QListWidgetItem *item;
item = new QListWidgetItem(ui->mediaSwitches);
ui->mediaSwitches->addItem(item);
MediaSwitchWidget *sw =
new MediaSwitchWidget(&switcher->mediaSwitches.back());
item->setSizeHint(sw->minimumSizeHint());
ui->mediaSwitches->setItemWidget(item, sw);
listAddClicked(ui->mediaSwitches,
new MediaSwitchWidget(&switcher->mediaSwitches.back()),
ui->mediaAdd, &addPulse);
}
void AdvSceneSwitcher::on_mediaRemove_clicked()
@@ -483,8 +477,6 @@ MediaSwitchWidget::MediaSwitchWidget(MediaSwitch *s) : SwitchWidget(s)
time->setDisabled(true);
}
setStyleSheet("* { background-color: transparent; }");
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{meidaSources}}", meidaSources},

View File

@@ -7,18 +7,12 @@ static QMetaObject::Connection addPulse;
void AdvSceneSwitcher::on_randomAdd_clicked()
{
ui->randomAdd->disconnect(addPulse);
std::lock_guard<std::mutex> lock(switcher->m);
switcher->randomSwitches.emplace_back();
QListWidgetItem *item;
item = new QListWidgetItem(ui->randomSwitches);
ui->randomSwitches->addItem(item);
RandomSwitchWidget *sw =
new RandomSwitchWidget(&switcher->randomSwitches.back());
item->setSizeHint(sw->minimumSizeHint());
ui->randomSwitches->setItemWidget(item, sw);
listAddClicked(ui->randomSwitches,
new RandomSwitchWidget(&switcher->randomSwitches.back()),
ui->randomAdd, &addPulse);
}
void AdvSceneSwitcher::on_randomRemove_clicked()
@@ -153,8 +147,6 @@ RandomSwitchWidget::RandomSwitchWidget(RandomSwitch *s) : SwitchWidget(s, false)
delay->setValue(s->delay);
}
setStyleSheet("* { background-color: transparent; }");
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{scenes}}", scenes},

View File

@@ -63,18 +63,13 @@ void AdvSceneSwitcher::on_screenRegionSwitches_currentRowChanged(int idx)
void AdvSceneSwitcher::on_screenRegionAdd_clicked()
{
ui->screenRegionAdd->disconnect(addPulse);
std::lock_guard<std::mutex> lock(switcher->m);
switcher->screenRegionSwitches.emplace_back();
QListWidgetItem *item;
item = new QListWidgetItem(ui->screenRegionSwitches);
ui->screenRegionSwitches->addItem(item);
ScreenRegionWidget *sw =
new ScreenRegionWidget(&switcher->screenRegionSwitches.back());
item->setSizeHint(sw->minimumSizeHint());
ui->screenRegionSwitches->setItemWidget(item, sw);
listAddClicked(
ui->screenRegionSwitches,
new ScreenRegionWidget(&switcher->screenRegionSwitches.back()),
ui->screenRegionAdd, &addPulse);
}
void AdvSceneSwitcher::on_screenRegionRemove_clicked()
@@ -290,8 +285,6 @@ ScreenRegionWidget::ScreenRegionWidget(ScreenRegionSwitch *s)
maxY->setValue(s->maxY);
}
setStyleSheet("* { background-color: transparent; }");
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{minX}}", minX}, {"{{minY}}", minY},

View File

@@ -9,18 +9,13 @@ static QMetaObject::Connection addPulse;
void AdvSceneSwitcher::on_sceneSequenceAdd_clicked()
{
ui->sceneSequenceAdd->disconnect(addPulse);
std::lock_guard<std::mutex> lock(switcher->m);
switcher->sceneSequenceSwitches.emplace_back();
QListWidgetItem *item;
item = new QListWidgetItem(ui->sceneSequenceSwitches);
ui->sceneSequenceSwitches->addItem(item);
SequenceWidget *sw =
new SequenceWidget(&switcher->sceneSequenceSwitches.back());
item->setSizeHint(sw->minimumSizeHint());
ui->sceneSequenceSwitches->setItemWidget(item, sw);
listAddClicked(
ui->sceneSequenceSwitches,
new SequenceWidget(&switcher->sceneSequenceSwitches.back()),
ui->sceneSequenceAdd, &addPulse);
}
void AdvSceneSwitcher::on_sceneSequenceRemove_clicked()
@@ -353,8 +348,6 @@ SequenceWidget::SequenceWidget(SceneSequenceSwitch *s) : SwitchWidget(s)
GetWeakSourceName(s->startScene).c_str());
}
setStyleSheet("* { background-color: transparent; }");
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{startScenes}}", startScenes},

View File

@@ -5,18 +5,12 @@ static QMetaObject::Connection addPulse;
void AdvSceneSwitcher::on_timeAdd_clicked()
{
ui->timeAdd->disconnect(addPulse);
std::lock_guard<std::mutex> lock(switcher->m);
switcher->timeSwitches.emplace_back();
QListWidgetItem *item;
item = new QListWidgetItem(ui->timeSwitches);
ui->timeSwitches->addItem(item);
TimeSwitchWidget *sw =
new TimeSwitchWidget(&switcher->timeSwitches.back());
item->setSizeHint(sw->minimumSizeHint());
ui->timeSwitches->setItemWidget(item, sw);
listAddClicked(ui->timeSwitches,
new TimeSwitchWidget(&switcher->timeSwitches.back()),
ui->timeAdd, &addPulse);
}
void AdvSceneSwitcher::on_timeRemove_clicked()
@@ -250,8 +244,6 @@ TimeSwitchWidget::TimeSwitchWidget(TimeSwitch *s) : SwitchWidget(s)
time->setTime(s->time);
}
setStyleSheet("* { background-color: transparent; }");
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{triggers}}", triggers},

View File

@@ -6,13 +6,9 @@ void AdvSceneSwitcher::on_transitionsAdd_clicked()
std::lock_guard<std::mutex> lock(switcher->m);
switcher->sceneTransitions.emplace_back();
QListWidgetItem *item;
item = new QListWidgetItem(ui->sceneTransitions);
ui->sceneTransitions->addItem(item);
TransitionSwitchWidget *sw =
new TransitionSwitchWidget(&switcher->sceneTransitions.back());
item->setSizeHint(sw->minimumSizeHint());
ui->sceneTransitions->setItemWidget(item, sw);
listAddClicked(
ui->sceneTransitions,
new TransitionSwitchWidget(&switcher->sceneTransitions.back()));
}
void AdvSceneSwitcher::on_transitionsRemove_clicked()
@@ -77,13 +73,9 @@ void AdvSceneSwitcher::on_defaultTransitionsAdd_clicked()
std::lock_guard<std::mutex> lock(switcher->m);
switcher->defaultSceneTransitions.emplace_back();
QListWidgetItem *item;
item = new QListWidgetItem(ui->defaultTransitions);
ui->defaultTransitions->addItem(item);
DefTransitionSwitchWidget *sw = new DefTransitionSwitchWidget(
&switcher->defaultSceneTransitions.back());
item->setSizeHint(sw->minimumSizeHint());
ui->defaultTransitions->setItemWidget(item, sw);
listAddClicked(ui->defaultTransitions,
new DefTransitionSwitchWidget(
&switcher->defaultSceneTransitions.back()));
}
void AdvSceneSwitcher::on_defaultTransitionsRemove_clicked()
@@ -427,8 +419,6 @@ TransitionSwitchWidget::TransitionSwitchWidget(SceneTransition *s)
scenes2->setCurrentText(GetWeakSourceName(s->scene2).c_str());
}
setStyleSheet("* { background-color: transparent; }");
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{scenes}}", scenes},
@@ -474,8 +464,6 @@ void TransitionSwitchWidget::Scene2Changed(const QString &text)
DefTransitionSwitchWidget::DefTransitionSwitchWidget(DefaultSceneTransition *s)
: SwitchWidget(s, false)
{
setStyleSheet("* { background-color: transparent; }");
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{scenes}}", scenes}, {"{{transitions}}", transitions}};

View File

@@ -5,18 +5,12 @@ static QMetaObject::Connection addPulse;
void AdvSceneSwitcher::on_windowAdd_clicked()
{
ui->windowAdd->disconnect(addPulse);
std::lock_guard<std::mutex> lock(switcher->m);
switcher->windowSwitches.emplace_back();
QListWidgetItem *item;
item = new QListWidgetItem(ui->windowSwitches);
ui->windowSwitches->addItem(item);
WindowSwitchWidget *sw =
new WindowSwitchWidget(&switcher->windowSwitches.back());
item->setSizeHint(sw->minimumSizeHint());
ui->windowSwitches->setItemWidget(item, sw);
listAddClicked(ui->windowSwitches,
new WindowSwitchWidget(&switcher->windowSwitches.back()),
ui->windowAdd, &addPulse);
}
void AdvSceneSwitcher::on_windowRemove_clicked()
@@ -407,8 +401,6 @@ WindowSwitchWidget::WindowSwitchWidget(WindowSwitch *s) : SwitchWidget(s, false)
focused->setChecked(s->focus);
}
setStyleSheet("* { background-color: transparent; }");
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{windows}}", windows},