mirror of
https://github.com/litruv/PNGTuber-Plus.git
synced 2026-07-24 02:26:02 +10:00
221 lines
6.0 KiB
Markdown
221 lines
6.0 KiB
Markdown
# Slider Components Documentation
|
|
|
|
This document explains the new slider component system that replaces the individual sliders in the sprite viewer with reusable, consistent components.
|
|
|
|
## Components Overview
|
|
|
|
### 1. LabeledSlider (Base Component)
|
|
**File:** `ui_scenes/components/LabeledSlider.tscn`
|
|
**Script:** `ui_scenes/components/LabeledSlider.gd`
|
|
|
|
The base slider component that combines a label and slider into one reusable unit.
|
|
|
|
**Key Features:**
|
|
- Automatic label updates with current value
|
|
- Configurable value formatting
|
|
- Optional value suffix (%, Hz, etc.)
|
|
- Consistent styling
|
|
- Signal emission on value changes
|
|
|
|
**Properties:**
|
|
- `label_text`: Base text for the label
|
|
- `min_value`, `max_value`, `step`: Slider configuration
|
|
- `value`: Current value
|
|
- `show_value_in_label`: Whether to display value in label
|
|
- `value_format`: Format string for value display (e.g., "%.1f")
|
|
- `value_suffix`: Suffix to add after value (e.g., "%", "Hz")
|
|
- `editable`: Whether the slider can be modified
|
|
|
|
### 2. WobbleSlider (Specialized Component)
|
|
**File:** `ui_scenes/components/WobbleSlider.tscn`
|
|
**Script:** `ui_scenes/components/WobbleSlider.gd`
|
|
|
|
Extends LabeledSlider specifically for wobble parameters.
|
|
|
|
**Key Features:**
|
|
- Automatic synchronization with sprite wobble parameters
|
|
- Visual feedback for sync group status
|
|
- Integrated with wobble sync system
|
|
- Parameter-specific configuration
|
|
|
|
**Properties:**
|
|
- `parameter_name`: The wobble parameter this controls ("xFrq", "xAmp", etc.)
|
|
- All LabeledSlider properties
|
|
|
|
### 3. ParameterSlider (Generic Component)
|
|
**File:** `ui_scenes/components/ParameterSlider.tscn`
|
|
**Script:** `ui_scenes/components/ParameterSlider.gd`
|
|
|
|
Extends LabeledSlider for general sprite parameters.
|
|
|
|
**Key Features:**
|
|
- Generic parameter binding to sprite properties
|
|
- Automatic update method calling for specific parameters
|
|
- Property path configuration
|
|
|
|
**Properties:**
|
|
- `sprite_property`: The sprite property to bind to
|
|
- `parameter_name`: Display name for the parameter
|
|
- All LabeledSlider properties
|
|
|
|
### 4. WobbleControlPanel (Composite Component)
|
|
**File:** `ui_scenes/components/WobbleControlPanel.tscn`
|
|
**Script:** `ui_scenes/components/WobbleControlPanel.gd`
|
|
|
|
A complete panel containing all wobble sliders.
|
|
|
|
**Key Features:**
|
|
- Pre-configured wobble sliders
|
|
- Centralized sprite management
|
|
- Integrated sync feedback
|
|
- Easy integration with existing wobble sync controls
|
|
|
|
### 5. SliderManager (Management System)
|
|
**Script:** `ui_scenes/components/SliderManager.gd`
|
|
|
|
Manages collections of slider components.
|
|
|
|
**Key Features:**
|
|
- Centralized slider updates
|
|
- Consistent styling application
|
|
- Bulk operations on sliders
|
|
- Integration with sprite viewer
|
|
|
|
## Usage Examples
|
|
|
|
### Basic LabeledSlider
|
|
```gdscript
|
|
# In your scene
|
|
@onready var my_slider: LabeledSlider = $LabeledSlider
|
|
|
|
func _ready():
|
|
my_slider.label_text = "Volume"
|
|
my_slider.min_value = 0.0
|
|
my_slider.max_value = 100.0
|
|
my_slider.value_suffix = "%"
|
|
my_slider.value_changed.connect(_on_volume_changed)
|
|
|
|
func _on_volume_changed(value: float):
|
|
print("Volume changed to: ", value)
|
|
```
|
|
|
|
### WobbleSlider Configuration
|
|
```gdscript
|
|
# In scene setup
|
|
@onready var x_freq_slider: WobbleSlider = $XFrequencySlider
|
|
|
|
func _ready():
|
|
x_freq_slider.label_text = "X Frequency"
|
|
x_freq_slider.parameter_name = "xFrq"
|
|
x_freq_slider.min_value = 0.0
|
|
x_freq_slider.max_value = 10.0
|
|
x_freq_slider.step = 0.1
|
|
x_freq_slider.value_format = "%.1f"
|
|
x_freq_slider.value_suffix = " Hz"
|
|
|
|
func set_sprite(sprite):
|
|
x_freq_slider.set_target_sprite(sprite)
|
|
```
|
|
|
|
### Using WobbleControlPanel
|
|
```gdscript
|
|
# Replace individual wobble sliders with the panel
|
|
@onready var wobble_panel: WobbleControlPanel = $WobbleControlPanel
|
|
|
|
func setImage():
|
|
if Global.heldSprite:
|
|
wobble_panel.set_target_sprite(Global.heldSprite)
|
|
wobble_panel.update_from_sprite()
|
|
```
|
|
|
|
### SliderManager Integration
|
|
```gdscript
|
|
# In sprite viewer
|
|
var slider_manager: SliderManager
|
|
|
|
func _ready():
|
|
slider_manager = SliderManager.new(self)
|
|
_setup_sliders()
|
|
|
|
func _setup_sliders():
|
|
# Add sliders to manager
|
|
slider_manager.add_slider($DragSlider)
|
|
slider_manager.add_slider($OpacitySlider)
|
|
# etc.
|
|
|
|
func setImage():
|
|
if slider_manager:
|
|
slider_manager.update_all_sliders(Global.heldSprite)
|
|
```
|
|
|
|
## Migration from Legacy Sliders
|
|
|
|
### Step 1: Replace Scene Nodes
|
|
Replace individual HSlider + Label combinations with LabeledSlider instances:
|
|
|
|
**Before:**
|
|
```
|
|
- Node2D
|
|
- Label (for "x frequency: 5.0")
|
|
- HSlider (for value input)
|
|
```
|
|
|
|
**After:**
|
|
```
|
|
- Node2D
|
|
- LabeledSlider (handles both label and slider)
|
|
```
|
|
|
|
### Step 2: Update Script References
|
|
**Before:**
|
|
```gdscript
|
|
$WobbleControl/xFrqLabel.text = "x frequency: " + str(value)
|
|
$WobbleControl/xFrq.value = value
|
|
```
|
|
|
|
**After:**
|
|
```gdscript
|
|
$WobbleControl/XFrequencySlider.set_value(value)
|
|
# Label updates automatically
|
|
```
|
|
|
|
### Step 3: Connect Signals
|
|
**Before:**
|
|
```gdscript
|
|
func _on_x_frq_value_changed(value):
|
|
Global.heldSprite.xFrq = value
|
|
```
|
|
|
|
**After:**
|
|
```gdscript
|
|
# Handled automatically by WobbleSlider component
|
|
# Or connect to the component's value_changed signal
|
|
```
|
|
|
|
## Benefits
|
|
|
|
1. **Consistency**: All sliders look and behave the same way
|
|
2. **Maintainability**: Changes to slider behavior only need to be made in one place
|
|
3. **Reusability**: Components can be used across different parts of the application
|
|
4. **Type Safety**: Proper class inheritance with specific functionality
|
|
5. **Reduced Code**: Less repetitive slider setup code
|
|
6. **Better Organization**: Clear separation of concerns
|
|
|
|
## Integration Notes
|
|
|
|
- The new system is designed to be backwards compatible
|
|
- Legacy slider code is maintained as fallback
|
|
- Components can be gradually adopted
|
|
- SliderManager provides centralized control
|
|
- Easy to extend for new parameter types
|
|
|
|
## Custom Styling
|
|
|
|
To apply consistent styling across all sliders, modify the base LabeledSlider component or use the SliderManager's styling methods:
|
|
|
|
```gdscript
|
|
func apply_custom_theme():
|
|
for slider in slider_manager.sliders:
|
|
slider.slider.add_theme_stylebox_override("slider", custom_style)
|
|
```
|