Merge pull request #1859 from cg2121/remove-settings-lines
UI: Various visual improvements
This commit is contained in:
commit
3881f9de27
@ -985,3 +985,11 @@ VisibilityCheckBox::indicator:checked:hover {
|
||||
VisibilityCheckBox::indicator:unchecked:hover {
|
||||
image: url(:res/images/invisible.svg);
|
||||
}
|
||||
|
||||
* [themeID="trashIcon"] {
|
||||
qproperty-icon: url(./Dark/trash.svg);
|
||||
}
|
||||
|
||||
* [themeID="revertIcon"] {
|
||||
qproperty-icon: url(./Dark/revert.svg);
|
||||
}
|
||||
|
@ -119,12 +119,7 @@ QListWidget QLineEdit {
|
||||
|
||||
QDockWidget::title {
|
||||
text-align: center;
|
||||
background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
||||
stop: 0 rgb(86,85,86),
|
||||
stop: 0.1 rgb(82,81,82),
|
||||
stop: 0.5 rgb(78,77,78),
|
||||
stop: 0.9 rgb(74,73,74),
|
||||
stop: 1 rgb(70,69,70));
|
||||
background-color: rgb(70,69,70);
|
||||
}
|
||||
|
||||
QDockWidget::close-button, QDockWidget::float-button {
|
||||
@ -158,21 +153,18 @@ QGroupBox {
|
||||
}
|
||||
|
||||
QScrollBar:vertical {
|
||||
background-color: rgb(58,57,58); /* dark */
|
||||
background-color: rgb(58,57,58);
|
||||
width: 14px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
QScrollBar::handle:vertical {
|
||||
background-color: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0,
|
||||
stop: 0 rgb(122,121,122), /* light */
|
||||
stop: 0.25 rgb(100, 99, 100),
|
||||
stop: 1 rgb(88,87,88)); /* kindaDark */
|
||||
background-color: rgb(76,76,76);
|
||||
min-height: 20px;
|
||||
margin: 2px;
|
||||
border-radius: 5px;
|
||||
border-width: 1px;
|
||||
border: 1px solid rgb(31,30,31); /* veryDark */
|
||||
border: 1px solid rgb(76,76,76);
|
||||
}
|
||||
|
||||
QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {
|
||||
@ -194,15 +186,12 @@ QScrollBar:horizontal {
|
||||
}
|
||||
|
||||
QScrollBar::handle:horizontal {
|
||||
background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
||||
stop: 0 rgb(122,121,122), /* light */
|
||||
stop: 0.25 rgb(100, 99, 100),
|
||||
stop: 1 rgb(88,87,88)); /* kindaDark */
|
||||
background-color: rgb(76,76,76);
|
||||
min-width: 20px;
|
||||
margin: 2px;
|
||||
border-radius: 5px;
|
||||
border-width: 1px;
|
||||
border: 1px solid rgb(31,30,31); /* veryDark */
|
||||
border: 1px solid rgb(76,76,76);
|
||||
}
|
||||
|
||||
QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal {
|
||||
@ -271,11 +260,11 @@ QTabWidget::pane { /* The tab widget frame */
|
||||
}
|
||||
|
||||
QTabWidget::tab-bar {
|
||||
alignment: center;
|
||||
alignment: left;
|
||||
}
|
||||
|
||||
QTabBar::tab {
|
||||
background-color: rgb(88,87,88); /* kindaDark */
|
||||
background-color: rgb(76,76,76);
|
||||
border: none;
|
||||
padding: 5px;
|
||||
min-width: 50px;
|
||||
@ -284,16 +273,16 @@ QTabBar::tab {
|
||||
|
||||
QTabBar::tab:top {
|
||||
border-bottom: 1px transparent;
|
||||
border-top-left-radius: 5px;
|
||||
border-top-right-radius: 5px;
|
||||
border-top-left-radius: 3px;
|
||||
border-top-right-radius: 3px;
|
||||
|
||||
}
|
||||
|
||||
QTabBar::tab:bottom {
|
||||
padding-top: 1px;
|
||||
margin-bottom: 4px;
|
||||
border-bottom-left-radius: 5px;
|
||||
border-bottom-right-radius: 5px;
|
||||
border-bottom-left-radius: 3px;
|
||||
border-bottom-right-radius: 3px;
|
||||
height: 14px;
|
||||
}
|
||||
|
||||
@ -313,25 +302,17 @@ QTabBar::tab:pressed {
|
||||
/* ComboBox */
|
||||
|
||||
QComboBox {
|
||||
background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
||||
stop: 0 rgb(86,85,86),
|
||||
stop: 0.1 rgb(82,81,82),
|
||||
stop: 0.5 rgb(78,77,78),
|
||||
stop: 0.9 rgb(74,73,74),
|
||||
stop: 1 rgb(70,69,70));
|
||||
background-color: rgb(76,76,76);
|
||||
border-style: solid;
|
||||
border: 1px;
|
||||
border-radius: 3px;
|
||||
border-color: rgb(31,30,31); /* veryDark */
|
||||
border-color: rgb(76,76,76); /* veryDark */
|
||||
padding: 2px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
QComboBox:hover {
|
||||
background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
||||
stop: 0 rgb(111, 110, 101),
|
||||
stop: 0.25 rgb(100, 99, 100),
|
||||
stop: 1 rgb(88,87,88));
|
||||
background-color: rgb(88,87,88);
|
||||
}
|
||||
|
||||
QComboBox::drop-down {
|
||||
@ -395,7 +376,7 @@ QSpinBox::up-button, QDoubleSpinBox::up-button {
|
||||
subcontrol-origin: margin;
|
||||
subcontrol-position: top right; /* position at the top right corner */
|
||||
|
||||
background-color: rgb(88,87,88); /* kindaDark */
|
||||
background-color: rgb(76,76,76);
|
||||
border: 1px solid rgb(31,30,31); /* veryDark */
|
||||
border-radius: 3px;
|
||||
border-width: 0;
|
||||
@ -407,7 +388,7 @@ QSpinBox::up-button, QDoubleSpinBox::up-button {
|
||||
QSpinBox::down-button, QDoubleSpinBox::down-button {
|
||||
subcontrol-origin: margin;
|
||||
subcontrol-position: bottom right; /* position at the top right corner */
|
||||
background-color: rgb(88,87,88); /* kindaDark */
|
||||
background-color: rgb(76,76,76);
|
||||
border: 1px solid rgb(31,30,31); /* veryDark */
|
||||
border-radius: 3px;
|
||||
border-width: 0;
|
||||
@ -447,7 +428,7 @@ QSpinBox::down-arrow, QDoubleSpinBox::down-arrow {
|
||||
|
||||
QPushButton {
|
||||
color: rgb(225,224,225); /* veryLight */
|
||||
background-color: rgb(88,87,88); /* kindaDark */
|
||||
background-color: rgb(76,76,76);
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
padding: 4px;
|
||||
@ -485,20 +466,15 @@ QPushButton[themeID="hotkeyButtons"] {
|
||||
/* Sliders */
|
||||
|
||||
QSlider::groove:horizontal {
|
||||
background-color: QLinearGradient(x1: 0, y1: 1, x2: 0, y2: 0,
|
||||
stop: 0 rgb(50, 49, 50), /* dark */
|
||||
stop: 0.75 rgb(88,87,88)); /* kindaDark */
|
||||
background-color: rgb(76,76,76);
|
||||
height: 4px;
|
||||
border: none;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
QSlider::handle:horizontal {
|
||||
background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
||||
stop: 0 rgb(240,239,240), /* lighter */
|
||||
stop: 0.25 rgb(200,199,200),
|
||||
stop: 1 rgb(162,161,162)); /* light */
|
||||
border: 1px solid rgb(58,57,58); /* dark */
|
||||
background-color: #d2d2d2;
|
||||
border: 1px solid rgb(58,57,58);
|
||||
border-radius: 3px;
|
||||
height: 10px;
|
||||
width: 18px;
|
||||
@ -506,10 +482,7 @@ QSlider::handle:horizontal {
|
||||
}
|
||||
|
||||
QSlider::handle:horizontal:pressed {
|
||||
background-color: QLinearGradient(x1: 0, y1: 1, x2: 0, y2: 0,
|
||||
stop: 0 rgb(240,239,240), /* lighter */
|
||||
stop: 0.25 rgb(200,199,200),
|
||||
stop: 1 rgb(162,161,162)); /* light */
|
||||
background-color: #d2d2d2;
|
||||
}
|
||||
|
||||
QSlider::sub-page:horizontal {
|
||||
@ -518,27 +491,20 @@ QSlider::sub-page:horizontal {
|
||||
}
|
||||
|
||||
QSlider::sub-page:horizontal:disabled {
|
||||
background-color: QLinearGradient(x1: 0, y1: 1, x2: 0, y2: 0,
|
||||
stop: 0 rgb(31,30,31), /* veryDark */
|
||||
stop: 0.75 rgb(50, 49, 50)); /* dark */
|
||||
background-color: rgb(50, 49, 50); /* dark */
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
QSlider::groove:vertical {
|
||||
background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
|
||||
stop: 0 rgb(50, 49, 50), /* dark */
|
||||
stop: 0.75 rgb(88,87,88)); /* kindaDark */
|
||||
background-color: rgb(76,76,76);
|
||||
width: 4px;
|
||||
border: none;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
QSlider::handle:vertical {
|
||||
background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
|
||||
stop: 0 rgb(240,239,240), /* lighter */
|
||||
stop: 0.25 rgb(200,199,200),
|
||||
stop: 1 rgb(162,161,162)); /* light */
|
||||
border: 1px solid rgb(58,57,58); /* dark */
|
||||
background-color: #d2d2d2;
|
||||
border: 1px solid rgb(58,57,58);
|
||||
border-radius: 3px;
|
||||
width: 10px;
|
||||
height: 18px;
|
||||
@ -546,10 +512,7 @@ QSlider::handle:vertical {
|
||||
}
|
||||
|
||||
QSlider::handle:vertical:pressed {
|
||||
background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
|
||||
stop: 0 rgb(240,239,240), /* lighter */
|
||||
stop: 0.25 rgb(200,199,200),
|
||||
stop: 1 rgb(162,161,162)); /* light */
|
||||
background-color: #d2d2d2;
|
||||
}
|
||||
|
||||
QSlider::add-page:vertical {
|
||||
@ -558,9 +521,7 @@ QSlider::add-page:vertical {
|
||||
}
|
||||
|
||||
QSlider::add-page:vertical:disabled {
|
||||
background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
|
||||
stop: 0 rgb(31,30,31), /* veryDark */
|
||||
stop: 0.75 rgb(50, 49, 50)); /* dark */
|
||||
background-color: rgb(50, 49, 50); /* dark */
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
@ -747,3 +708,11 @@ VisibilityCheckBox::indicator:checked {
|
||||
VisibilityCheckBox::indicator:unchecked {
|
||||
image: url(:res/images/invisible.svg);
|
||||
}
|
||||
|
||||
* [themeID="trashIcon"] {
|
||||
qproperty-icon: url(./Dark/trash.svg);
|
||||
}
|
||||
|
||||
* [themeID="revertIcon"] {
|
||||
qproperty-icon: url(./Dark/revert.svg);
|
||||
}
|
||||
|
1
UI/data/themes/Dark/revert.svg
Normal file
1
UI/data/themes/Dark/revert.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#d2d2d2" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-rotate-ccw"><polyline points="1 4 1 10 7 10"></polyline><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"></path></svg>
|
After Width: | Height: | Size: 313 B |
1
UI/data/themes/Dark/trash.svg
Normal file
1
UI/data/themes/Dark/trash.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#d2d2d2" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-trash-2"><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path><line x1="10" y1="11" x2="10" y2="17"></line><line x1="14" y1="11" x2="14" y2="17"></line></svg>
|
After Width: | Height: | Size: 444 B |
@ -1339,3 +1339,11 @@ VisibilityCheckBox::indicator:checked:hover {
|
||||
VisibilityCheckBox::indicator:unchecked:hover {
|
||||
image: url(:res/images/invisible.svg);
|
||||
}
|
||||
|
||||
* [themeID="trashIcon"] {
|
||||
qproperty-icon: url(./Dark/trash.svg);
|
||||
}
|
||||
|
||||
* [themeID="revertIcon"] {
|
||||
qproperty-icon: url(./Dark/revert.svg);
|
||||
}
|
||||
|
@ -191,3 +191,11 @@ VisibilityCheckBox::indicator:checked {
|
||||
VisibilityCheckBox::indicator:unchecked {
|
||||
image: url(:res/images/invisible.svg);
|
||||
}
|
||||
|
||||
* [themeID="trashIcon"] {
|
||||
qproperty-icon: url(:res/images/trash.svg);
|
||||
}
|
||||
|
||||
* [themeID="revertIcon"] {
|
||||
qproperty-icon: url(:res/images/revert.svg);
|
||||
}
|
||||
|
@ -1250,13 +1250,6 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QStackedWidget" name="outputModePages">
|
||||
<property name="currentIndex">
|
||||
@ -2030,13 +2023,6 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QStackedWidget" name="stackedWidget">
|
||||
<property name="currentIndex">
|
||||
@ -3497,13 +3483,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="advReplayBufferGroupBox">
|
||||
<property name="sizePolicy">
|
||||
|
1
UI/forms/images/revert.svg
Normal file
1
UI/forms/images/revert.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-rotate-ccw"><polyline points="1 4 1 10 7 10"></polyline><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"></path></svg>
|
After Width: | Height: | Size: 313 B |
1
UI/forms/images/trash.svg
Normal file
1
UI/forms/images/trash.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-trash-2"><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path><line x1="10" y1="11" x2="10" y2="17"></line><line x1="14" y1="11" x2="14" y2="17"></line></svg>
|
After Width: | Height: | Size: 444 B |
@ -14,6 +14,8 @@
|
||||
<file>images/locked.svg</file>
|
||||
<file>images/invisible.svg</file>
|
||||
<file>images/visible.svg</file>
|
||||
<file>images/trash.svg</file>
|
||||
<file>images/revert.svg</file>
|
||||
</qresource>
|
||||
<qresource prefix="/settings">
|
||||
<file>images/settings/output.svg</file>
|
||||
|
@ -272,13 +272,17 @@ void OBSHotkeyWidget::AddEdit(obs_key_combination combo, int idx)
|
||||
edit->setToolTip(toolTip);
|
||||
|
||||
auto revert = new QPushButton;
|
||||
revert->setProperty("themeID", "hotkeyButtons");
|
||||
revert->setText(QTStr("Revert"));
|
||||
revert->setProperty("themeID", "revertIcon");
|
||||
revert->setToolTip(QTStr("Revert"));
|
||||
revert->setFixedSize(24, 24);
|
||||
revert->setStyleSheet("background: transparent; border: none;");
|
||||
revert->setEnabled(false);
|
||||
|
||||
auto clear = new QPushButton;
|
||||
clear->setProperty("themeID", "hotkeyButtons");
|
||||
clear->setText(QTStr("Clear"));
|
||||
clear->setProperty("themeID", "trashIcon");
|
||||
clear->setToolTip(QTStr("Clear"));
|
||||
clear->setFixedSize(24, 24);
|
||||
clear->setStyleSheet("background: transparent; border: none;");
|
||||
clear->setEnabled(!obs_key_combination_is_empty(combo));
|
||||
|
||||
QObject::connect(edit, &OBSHotkeyEdit::KeyChanged,
|
||||
@ -289,15 +293,15 @@ void OBSHotkeyWidget::AddEdit(obs_key_combination combo, int idx)
|
||||
});
|
||||
|
||||
auto add = new QPushButton;
|
||||
add->setProperty("themeID", "hotkeyButtons");
|
||||
add->setText("+");
|
||||
add->setMinimumWidth(50);
|
||||
add->setProperty("themeID", "addIconSmall");
|
||||
add->setFixedSize(24, 24);
|
||||
add->setStyleSheet("background: transparent; border: none;");
|
||||
|
||||
auto remove = new QPushButton;
|
||||
remove->setProperty("themeID", "hotkeyButtons");
|
||||
remove->setText("-");
|
||||
remove->setProperty("themeID", "removeIconSmall");
|
||||
remove->setEnabled(removeButtons.size() > 0);
|
||||
remove->setMinimumWidth(50);
|
||||
remove->setFixedSize(24, 24);
|
||||
remove->setStyleSheet("background: transparent; border: none;");
|
||||
|
||||
auto CurrentIndex = [&, remove]
|
||||
{
|
||||
|
@ -333,12 +333,14 @@ void OBSPropertiesView::AddInt(obs_property_t *prop, QFormLayout *layout,
|
||||
int minVal = obs_property_int_min(prop);
|
||||
int maxVal = obs_property_int_max(prop);
|
||||
int stepVal = obs_property_int_step(prop);
|
||||
const char *suffix = obs_property_int_suffix(prop);
|
||||
|
||||
spin->setMinimum(minVal);
|
||||
spin->setMaximum(maxVal);
|
||||
spin->setSingleStep(stepVal);
|
||||
spin->setValue(val);
|
||||
spin->setToolTip(QT_UTF8(obs_property_long_description(prop)));
|
||||
spin->setSuffix(QT_UTF8(suffix));
|
||||
|
||||
WidgetInfo *info = new WidgetInfo(this, prop, spin);
|
||||
children.emplace_back(info);
|
||||
@ -382,12 +384,14 @@ void OBSPropertiesView::AddFloat(obs_property_t *prop, QFormLayout *layout,
|
||||
double minVal = obs_property_float_min(prop);
|
||||
double maxVal = obs_property_float_max(prop);
|
||||
double stepVal = obs_property_float_step(prop);
|
||||
const char *suffix = obs_property_float_suffix(prop);
|
||||
|
||||
spin->setMinimum(minVal);
|
||||
spin->setMaximum(maxVal);
|
||||
spin->setSingleStep(stepVal);
|
||||
spin->setValue(val);
|
||||
spin->setToolTip(QT_UTF8(obs_property_long_description(prop)));
|
||||
spin->setSuffix(QT_UTF8(suffix));
|
||||
|
||||
WidgetInfo *info = new WidgetInfo(this, prop, spin);
|
||||
children.emplace_back(info);
|
||||
|
@ -463,7 +463,10 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
||||
HookWidget(ui->autoRemux, CHECK_CHANGED, ADV_CHANGED);
|
||||
|
||||
ui->simpleOutputVBitrate->setSingleStep(50);
|
||||
ui->simpleOutputVBitrate->setSuffix(" Kbps");
|
||||
ui->advOutFFVBitrate->setSingleStep(50);
|
||||
ui->advOutFFVBitrate->setSuffix(" Kbps");
|
||||
ui->advOutFFABitrate->setSuffix(" Kbps");
|
||||
|
||||
#if !defined(_WIN32) && !defined(__APPLE__)
|
||||
delete ui->enableAutoUpdates;
|
||||
@ -725,6 +728,10 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
||||
this, SLOT(AdvOutRecCheckWarnings()));
|
||||
AdvOutRecCheckWarnings();
|
||||
|
||||
ui->buttonBox->button(QDialogButtonBox::Apply)->setIcon(QIcon());
|
||||
ui->buttonBox->button(QDialogButtonBox::Ok)->setIcon(QIcon());
|
||||
ui->buttonBox->button(QDialogButtonBox::Cancel)->setIcon(QIcon());
|
||||
|
||||
SimpleRecordingQualityChanged();
|
||||
|
||||
UpdateAutomaticReplayBufferCheckboxes();
|
||||
@ -2322,12 +2329,22 @@ void OBSBasicSettings::LoadAdvancedSettings()
|
||||
loading = false;
|
||||
}
|
||||
|
||||
#define TRUNCATE_TEXT_LENGTH 80
|
||||
|
||||
template <typename Func>
|
||||
static inline void LayoutHotkey(obs_hotkey_id id, obs_hotkey_t *key, Func &&fun,
|
||||
const map<obs_hotkey_id, vector<obs_key_combination_t>> &keys)
|
||||
{
|
||||
auto *label = new OBSHotkeyLabel;
|
||||
label->setText(obs_hotkey_get_description(key));
|
||||
QString text = QT_UTF8(obs_hotkey_get_description(key));
|
||||
|
||||
if (text.length() > TRUNCATE_TEXT_LENGTH) {
|
||||
label->setProperty("fullName", text);
|
||||
text = text.left(TRUNCATE_TEXT_LENGTH);
|
||||
text += "...'";
|
||||
}
|
||||
|
||||
label->setText(text);
|
||||
|
||||
OBSHotkeyWidget *hw = nullptr;
|
||||
|
||||
@ -2353,7 +2370,19 @@ static QLabel *makeLabel(T &t, Func &&getName)
|
||||
template <typename Func>
|
||||
static QLabel *makeLabel(const OBSSource &source, Func &&)
|
||||
{
|
||||
return new OBSSourceLabel(source);
|
||||
OBSSourceLabel *label = new OBSSourceLabel(source);
|
||||
label->setStyleSheet("font-weight: bold;");
|
||||
QString name = QT_UTF8(obs_source_get_name(source));
|
||||
|
||||
if (name.length() > TRUNCATE_TEXT_LENGTH) {
|
||||
label->setToolTip(name);
|
||||
name = name.left(TRUNCATE_TEXT_LENGTH);
|
||||
name += "...";
|
||||
}
|
||||
|
||||
label->setText(name);
|
||||
|
||||
return label;
|
||||
}
|
||||
|
||||
template <typename Func, typename T>
|
||||
@ -2365,13 +2394,8 @@ static inline void AddHotkeys(QFormLayout &layout,
|
||||
if (hotkeys.empty())
|
||||
return;
|
||||
|
||||
auto line = new QFrame();
|
||||
line->setFrameShape(QFrame::HLine);
|
||||
line->setFrameShadow(QFrame::Sunken);
|
||||
|
||||
layout.setItem(layout.rowCount(), QFormLayout::SpanningRole,
|
||||
new QSpacerItem(0, 10));
|
||||
layout.addRow(line);
|
||||
|
||||
using tuple_type =
|
||||
std::tuple<T, QPointer<QLabel>, QPointer<QWidget>>;
|
||||
@ -2632,7 +2656,12 @@ void OBSBasicSettings::LoadHotkeySettings(obs_hotkey_id ignoreKey)
|
||||
auto Update = [&](OBSHotkeyLabel *label, const QString &name,
|
||||
OBSHotkeyLabel *other, const QString &otherName)
|
||||
{
|
||||
label->setToolTip(tt.arg(otherName));
|
||||
QString string = other->property("fullName").value<QString>();
|
||||
|
||||
if (string.isEmpty() || string.isNull())
|
||||
string = otherName;
|
||||
|
||||
label->setToolTip(tt.arg(string));
|
||||
label->setText(name + " *");
|
||||
label->pairPartner = other;
|
||||
};
|
||||
@ -4323,7 +4352,6 @@ void OBSBasicSettings::AdvReplayBufferChanged()
|
||||
ui->advRBEstimate->setText(QTStr(ESTIMATE_UNKNOWN_STR));
|
||||
|
||||
ui->advReplayBufferGroupBox->setVisible(!lossless && replayBufferEnabled);
|
||||
ui->line_4->setVisible(!lossless && replayBufferEnabled);
|
||||
ui->advReplayBuf->setEnabled(!lossless);
|
||||
|
||||
UpdateAutomaticReplayBufferCheckboxes();
|
||||
|
@ -27,11 +27,13 @@ static inline void *get_property_data(struct obs_property *prop);
|
||||
struct float_data {
|
||||
double min, max, step;
|
||||
enum obs_number_type type;
|
||||
char *suffix;
|
||||
};
|
||||
|
||||
struct int_data {
|
||||
int min, max, step;
|
||||
enum obs_number_type type;
|
||||
char *suffix;
|
||||
};
|
||||
|
||||
struct list_item {
|
||||
@ -149,6 +151,16 @@ static inline void group_data_free(struct group_data *data) {
|
||||
obs_properties_destroy(data->content);
|
||||
}
|
||||
|
||||
static inline void int_data_free(struct int_data *data) {
|
||||
if (data->suffix)
|
||||
bfree(data->suffix);
|
||||
}
|
||||
|
||||
static inline void float_data_free(struct int_data *data) {
|
||||
if (data->suffix)
|
||||
bfree(data->suffix);
|
||||
}
|
||||
|
||||
struct obs_properties;
|
||||
|
||||
struct obs_property {
|
||||
@ -235,6 +247,10 @@ static void obs_property_destroy(struct obs_property *property)
|
||||
frame_rate_data_free(get_property_data(property));
|
||||
else if (property->type == OBS_PROPERTY_GROUP)
|
||||
group_data_free(get_property_data(property));
|
||||
else if (property->type == OBS_PROPERTY_INT)
|
||||
int_data_free(get_property_data(property));
|
||||
else if (property->type == OBS_PROPERTY_FLOAT)
|
||||
float_data_free(get_property_data(property));
|
||||
|
||||
bfree(property->name);
|
||||
bfree(property->desc);
|
||||
@ -855,6 +871,12 @@ enum obs_number_type obs_property_int_type(obs_property_t *p)
|
||||
return data ? data->type : OBS_NUMBER_SCROLLER;
|
||||
}
|
||||
|
||||
const char *obs_property_int_suffix(obs_property_t *p)
|
||||
{
|
||||
struct int_data *data = get_type_data(p, OBS_PROPERTY_INT);
|
||||
return data ? data->suffix : NULL;
|
||||
}
|
||||
|
||||
double obs_property_float_min(obs_property_t *p)
|
||||
{
|
||||
struct float_data *data = get_type_data(p, OBS_PROPERTY_FLOAT);
|
||||
@ -873,6 +895,12 @@ double obs_property_float_step(obs_property_t *p)
|
||||
return data ? data->step : 0;
|
||||
}
|
||||
|
||||
const char *obs_property_float_suffix(obs_property_t *p)
|
||||
{
|
||||
struct int_data *data = get_type_data(p, OBS_PROPERTY_FLOAT);
|
||||
return data ? data->suffix : NULL;
|
||||
}
|
||||
|
||||
enum obs_number_type obs_property_float_type(obs_property_t *p)
|
||||
{
|
||||
struct float_data *data = get_type_data(p, OBS_PROPERTY_FLOAT);
|
||||
@ -939,6 +967,26 @@ void obs_property_float_set_limits(obs_property_t *p,
|
||||
data->step = step;
|
||||
}
|
||||
|
||||
void obs_property_int_set_suffix(obs_property_t *p, const char *suffix)
|
||||
{
|
||||
struct int_data *data = get_type_data(p, OBS_PROPERTY_INT);
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
bfree(data->suffix);
|
||||
data->suffix = bstrdup(suffix);
|
||||
}
|
||||
|
||||
void obs_property_float_set_suffix(obs_property_t *p, const char *suffix)
|
||||
{
|
||||
struct float_data *data = get_type_data(p, OBS_PROPERTY_FLOAT);
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
bfree(data->suffix);
|
||||
data->suffix = bstrdup(suffix);
|
||||
}
|
||||
|
||||
void obs_property_list_clear(obs_property_t *p)
|
||||
{
|
||||
struct list_data *data = get_list_data(p);
|
||||
|
@ -286,10 +286,12 @@ EXPORT int obs_property_int_min(obs_property_t *p);
|
||||
EXPORT int obs_property_int_max(obs_property_t *p);
|
||||
EXPORT int obs_property_int_step(obs_property_t *p);
|
||||
EXPORT enum obs_number_type obs_property_int_type(obs_property_t *p);
|
||||
EXPORT const char * obs_property_int_suffix(obs_property_t *p);
|
||||
EXPORT double obs_property_float_min(obs_property_t *p);
|
||||
EXPORT double obs_property_float_max(obs_property_t *p);
|
||||
EXPORT double obs_property_float_step(obs_property_t *p);
|
||||
EXPORT enum obs_number_type obs_property_float_type(obs_property_t *p);
|
||||
EXPORT const char * obs_property_float_suffix(obs_property_t *p);
|
||||
EXPORT enum obs_text_type obs_property_text_type(obs_property_t *p);
|
||||
EXPORT enum obs_path_type obs_property_path_type(obs_property_t *p);
|
||||
EXPORT const char * obs_property_path_filter(obs_property_t *p);
|
||||
@ -301,6 +303,8 @@ EXPORT void obs_property_int_set_limits(obs_property_t *p,
|
||||
int min, int max, int step);
|
||||
EXPORT void obs_property_float_set_limits(obs_property_t *p,
|
||||
double min, double max, double step);
|
||||
EXPORT void obs_property_int_set_suffix(obs_property_t *p, const char *suffix);
|
||||
EXPORT void obs_property_float_set_suffix(obs_property_t *p, const char *suffix);
|
||||
|
||||
EXPORT void obs_property_list_clear(obs_property_t *p);
|
||||
|
||||
|
@ -874,14 +874,18 @@ static obs_properties_t *vt_h264_properties(void *unused)
|
||||
obs_properties_t *props = obs_properties_create();
|
||||
obs_property_t *p;
|
||||
|
||||
obs_properties_add_int(props, "bitrate", TEXT_BITRATE, 50, 10000000, 50);
|
||||
p = obs_properties_add_int(props, "bitrate",
|
||||
TEXT_BITRATE, 50, 10000000, 50);
|
||||
obs_property_int_set_suffix(p, " Kbps");
|
||||
|
||||
p = obs_properties_add_bool(props, "limit_bitrate",
|
||||
TEXT_USE_MAX_BITRATE);
|
||||
obs_property_set_modified_callback(p, limit_bitrate_modified);
|
||||
|
||||
obs_properties_add_int(props, "max_bitrate", TEXT_MAX_BITRATE, 50,
|
||||
p = obs_properties_add_int(props, "max_bitrate", TEXT_MAX_BITRATE, 50,
|
||||
10000000, 50);
|
||||
obs_property_int_set_suffix(p, " Kbps");
|
||||
|
||||
obs_properties_add_float(props, "max_bitrate_window",
|
||||
TEXT_MAX_BITRATE_WINDOW, 0.10f, 10.0f, 0.25f);
|
||||
|
||||
|
@ -451,10 +451,12 @@ obs_properties_t *nvenc_properties_internal(bool ffmpeg)
|
||||
|
||||
obs_property_set_modified_callback(p, rate_control_modified);
|
||||
|
||||
obs_properties_add_int(props, "bitrate",
|
||||
p = obs_properties_add_int(props, "bitrate",
|
||||
obs_module_text("Bitrate"), 50, 300000, 50);
|
||||
obs_properties_add_int(props, "max_bitrate",
|
||||
obs_property_int_set_suffix(p, " Kbps");
|
||||
p = obs_properties_add_int(props, "max_bitrate",
|
||||
obs_module_text("MaxBitrate"), 50, 300000, 50);
|
||||
obs_property_int_set_suffix(p, " Kbps");
|
||||
|
||||
obs_properties_add_int(props, "cqp", obs_module_text("NVENC.CQLevel"),
|
||||
1, 30, 1);
|
||||
|
@ -490,8 +490,10 @@ static obs_properties_t *vaapi_properties(void *unused)
|
||||
obs_property_list_add_int(list, "720p60/1080p30 (4.1)", 41);
|
||||
obs_property_list_add_int(list, "1080p60 (4.2)", 42);
|
||||
|
||||
obs_properties_add_int(props, "bitrate", obs_module_text("Bitrate"), 0,
|
||||
obs_property_t *p;
|
||||
p = obs_properties_add_int(props, "bitrate", obs_module_text("Bitrate"), 0,
|
||||
300000, 50);
|
||||
obs_property_int_set_suffix(p, " Kbps");
|
||||
|
||||
obs_properties_add_int(props, "keyint_sec",
|
||||
obs_module_text("Keyframe Interval (seconds)"), 0, 20,
|
||||
|
@ -260,10 +260,15 @@ static obs_properties_t *obs_qsv_props(void *unused)
|
||||
add_rate_controls(list, qsv_ratecontrols);
|
||||
obs_property_set_modified_callback(list, rate_control_modified);
|
||||
|
||||
obs_properties_add_int(props, "bitrate", TEXT_TARGET_BITRATE, 50,
|
||||
obs_property_t *p;
|
||||
p = obs_properties_add_int(props, "bitrate", TEXT_TARGET_BITRATE, 50,
|
||||
10000000, 50);
|
||||
obs_properties_add_int(props, "max_bitrate", TEXT_MAX_BITRATE, 50,
|
||||
obs_property_int_set_suffix(p, " Kbps");
|
||||
|
||||
p = obs_properties_add_int(props, "max_bitrate", TEXT_MAX_BITRATE, 50,
|
||||
10000000, 50);
|
||||
obs_property_int_set_suffix(p, " Kbps");
|
||||
|
||||
obs_properties_add_int(props, "accuracy", TEXT_ACCURACY, 0, 10000, 1);
|
||||
obs_properties_add_int(props, "convergence", TEXT_CONVERGENCE, 0, 10, 1);
|
||||
obs_properties_add_int(props, "qpi", "QPI", 1, 51, 1);
|
||||
|
@ -179,7 +179,9 @@ static obs_properties_t *obs_x264_props(void *unused)
|
||||
|
||||
obs_property_set_modified_callback(list, rate_control_modified);
|
||||
|
||||
obs_properties_add_int(props, "bitrate", TEXT_BITRATE, 50, 10000000, 50);
|
||||
p = obs_properties_add_int(props, "bitrate",
|
||||
TEXT_BITRATE, 50, 10000000, 50);
|
||||
obs_property_int_set_suffix(p, " Kbps");
|
||||
|
||||
p = obs_properties_add_bool(props, "use_bufsize", TEXT_CUSTOM_BUF);
|
||||
obs_property_set_modified_callback(p, use_bufsize_modified);
|
||||
|
Loading…
x
Reference in New Issue
Block a user