restore texture opacity slider visual

This commit is contained in:
T1ti
2024-07-04 04:07:35 +02:00
parent 03d52ba229
commit 386c15d17a
3 changed files with 108 additions and 9 deletions

View File

@@ -209,10 +209,10 @@ namespace Noggit
generate_hotkey_row({FontNoggit::ctrl, FontNoggit::shift, FontNoggit::alt, FontNoggit::lmb }, "\a+\a+\a+\aErase textures", texture_layout);
generate_hotkey_row({FontNoggit::shift, FontNoggit::lmb }, "\a+\aDraw texture or fills if chunk is empty", texture_layout);
generate_hotkey_row({FontNoggit::alt, FontNoggit::lmb_drag }, "\a+\aChange radius", texture_layout);
generate_hotkey_row({FontNoggit::alt, FontNoggit::rmb_drag }, "\a+\aChange hardness", texture_layout);
generate_hotkey_row({FontNoggit::space, FontNoggit::lmb_drag }, "\a+\aChange pressure", texture_layout);
generate_hotkey_row({FontNoggit::space, FontNoggit::mmb }, "\a+\aChange strength (gradient)", texture_layout);
generate_hotkey_row({FontNoggit::space, FontNoggit::r }, "\a+\aToggle min and max strength (gradient)", texture_layout);
generate_hotkey_row({FontNoggit::alt, FontNoggit::rmb_drag }, "\a+\aChange hardness (falloff)", texture_layout);
generate_hotkey_row({FontNoggit::space, FontNoggit::lmb_drag }, "\a+\aChange pressure (strength)", texture_layout);
generate_hotkey_row({FontNoggit::space, FontNoggit::mmb }, "\a+\aChange opacity (gradient)", texture_layout);
generate_hotkey_row({FontNoggit::space, FontNoggit::r }, "\a+\aToggle min and max oapcity (gradient)", texture_layout);
generate_hotkey_row({FontNoggit::t }, "\aToggle spray brush", texture_layout);
generate_hotkey_row({FontNoggit::alt, FontNoggit::mmb }, "\a+\aChange spray radius", texture_layout);
generate_hotkey_row({FontNoggit::shift, FontNoggit::mmb }, "\a+\aChange spray pressure", texture_layout);

View File

@@ -98,12 +98,35 @@ namespace Noggit
_pressure_slider->setValue (0.9f);
slider_layout_left->addWidget (_pressure_slider);
_brush_level_slider = new QSlider (Qt::Orientation::Vertical, tool_widget);
slider_layout_right->addWidget(new QLabel("Opacity:", tool_widget));
_brush_level_slider = new OpacitySlider(Qt::Orientation::Vertical, tool_widget);
_brush_level_slider->setRange (0, 255);
_brush_level_slider->setToolTip("Opacity");
_brush_level_slider->setSliderPosition (_brush_level);
_brush_level_slider->setObjectName("texturing_brush_level_slider");
// TODO : couldn't figure out how to make QSlider::groove:vertical::background-color work, the themes broke it. so made a scuffed subclass of QSlider with a custom paintevent
/*
QString _brush_level_slider_style =
"QSlider#texturing_brush_level_slider::groove:vertical { \n "
" background-color: qlineargradient(x1:0.5, y1:0, x2:0.5, y2:1, stop: 0 black, stop: 1 white) !important; \n "
" width: 35px; \n"
" margin: 0 0 0 0; \n "
"} \n "
"QSlider#texturing_brush_level_slider::handle:vertical { \n"
" background-color: red; \n"
" height: 5px; \n"
"} \n"
"QSlider#texturing_brush_level_slider::vertical { \n"
" width: 35px; \n"
"} \n"
;
_brush_level_slider->setStyleSheet(_brush_level_slider_style);
*/
slider_layout_right->addWidget(_brush_level_slider, 0, Qt::AlignHCenter);
_brush_level_spin = new QSpinBox(tool_widget);
@@ -773,8 +796,11 @@ namespace Noggit
_render_type_group->addButton(_render_exclusion_map);
render_layout->addWidget(_render_exclusion_map, 0, 1);
_render_placement_map = new QRadioButton("Selected Texture state", this); // if chunk contains texture/Effect : render as green or red if the effect layer is active or not
_render_placement_map->setToolTip("Render chunk unit as red if texture is present in the chunk and NOT the current active layer, render as green if it's active. \nThis defines which of the 4 textures' set is currently active, this is determined by which has the highest opacity.");
// if chunk contains texture/Effect : render as green or red if the effect layer is active or not
_render_placement_map = new QRadioButton("Selected Texture state", this);
_render_placement_map->setToolTip("Render chunk unit as red if texture is present in the chunk and NOT the current \
active layer, render as green if it's active. \nThis defines which of the 4 textures' set is currently active,\
this is determined by which has the highest opacity.");
_render_type_group->addButton(_render_placement_map);
render_layout->addWidget(_render_placement_map, 1, 0);

View File

@@ -35,6 +35,79 @@ namespace Noggit
class current_texture;
class texture_swapper;
class OpacitySlider : public QSlider{
public:
OpacitySlider(Qt::Orientation orientation, QWidget * parent = nullptr)
: QSlider(orientation, parent) {
setFixedWidth(35);
}
protected:
void paintEvent(QPaintEvent * event) override {
// QSlider::paintEvent(event);
// chat-gpt code, can probably be improved...
QPainter p(this);
QStyleOptionSlider opt;
initStyleOption(&opt);
opt.subControls = QStyle::SC_SliderGroove | QStyle::SC_SliderHandle;
if (tickPosition() != NoTicks)
opt.subControls |= QStyle::SC_SliderTickmarks;
if (isSliderDown()) {
opt.activeSubControls = QStyle::SC_SliderHandle;
opt.state |= QStyle::State_Sunken;
}
else {
opt.activeSubControls = QStyle::SC_None;
}
// Draw the groove with a linear gradient
QRect grooveRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this);
grooveRect.setLeft((width() - 35) / 2);
grooveRect.setRight((width() + 35) / 2);
QLinearGradient gradient(grooveRect.topLeft(), grooveRect.bottomLeft());
gradient.setColorAt(0, Qt::black);
gradient.setColorAt(1, Qt::white);
p.fillRect(grooveRect.adjusted(0, 0, -1, -1), gradient);
// Draw the handle with red color
QRect handleRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
handleRect.setLeft((width() - 35) / 2);
handleRect.setRight((width() + 35) / 2);
handleRect.setHeight(5); // Set handle height to 5
p.setBrush(Qt::red);
p.setPen(Qt::NoPen);
p.drawRect(handleRect);
// Draw the ticks if needed
if (tickPosition() != NoTicks) {
opt.subControls = QStyle::SC_SliderTickmarks;
style()->drawComplexControl(QStyle::CC_Slider, &opt, &p, this);
}
// QSlider::paintEvent() source code :
/*
Q_D(QSlider);
QPainter p(this);
QStyleOptionSlider opt;
initStyleOption(&opt);
opt.subControls = QStyle::SC_SliderGroove | QStyle::SC_SliderHandle;
if (d->tickPosition != NoTicks)
opt.subControls |= QStyle::SC_SliderTickmarks;
if (d->pressedControl) {
opt.activeSubControls = d->pressedControl;
opt.state |= QStyle::State_Sunken;
}
else {
opt.activeSubControls = d->hoverControl;
}
style()->drawComplexControl(QStyle::CC_Slider, &opt, &p, this);
*/
}
};
enum class texturing_mode
{
paint,
@@ -310,7 +383,7 @@ namespace Noggit
texturing_mode _texturing_mode; // use getTexturingMode() to check for ground effect mode
private:
QSlider* _brush_level_slider;
OpacitySlider* _brush_level_slider;
Noggit::Ui::Tools::UiCommon::ExtendedSlider* _hardness_slider;
Noggit::Ui::Tools::UiCommon::ExtendedSlider* _radius_slider;
Noggit::Ui::Tools::UiCommon::ExtendedSlider* _pressure_slider;