diff --git a/src/noggit/ui/Help.cpp b/src/noggit/ui/Help.cpp index 2eba294d..5535b631 100755 --- a/src/noggit/ui/Help.cpp +++ b/src/noggit/ui/Help.cpp @@ -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); diff --git a/src/noggit/ui/texturing_tool.cpp b/src/noggit/ui/texturing_tool.cpp index acf359b2..bdac7180 100755 --- a/src/noggit/ui/texturing_tool.cpp +++ b/src/noggit/ui/texturing_tool.cpp @@ -98,11 +98,34 @@ 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); @@ -772,9 +795,12 @@ namespace Noggit _render_exclusion_map->setToolTip("Render chunk units where effect doodads are disabled as white, rest as black"); _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); diff --git a/src/noggit/ui/texturing_tool.hpp b/src/noggit/ui/texturing_tool.hpp index 996f98dc..574fce20 100755 --- a/src/noggit/ui/texturing_tool.hpp +++ b/src/noggit/ui/texturing_tool.hpp @@ -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;