"""
class JDXIDimensions
Class to store dimensions of a Roland JDXi instrument
# Example usage:
----------------
>>> print(JDXiUIDimensions.INSTRUMENT.HEIGHT)
400
>>> print(JDXiUIDimensions.INSTRUMENT.WIDTH)
1000
"""
from dataclasses import dataclass
from typing import Optional
from PySide6.QtCore import QMargins
@dataclass(frozen=True)
[docs]
class Margins:
[docs]
def __iter__(self):
"""Make Margins iterable so it can be unpacked with *margins."""
return iter((self.left, self.top, self.right, self.bottom))
[docs]
class Dimensions:
"""Dimensions"""
[docs]
MIN_WIDTH: Optional[int] = None
[docs]
MIN_HEIGHT: Optional[int] = None
[docs]
MAX_WIDTH: Optional[int] = None
[docs]
MAX_HEIGHT: Optional[int] = None
[docs]
INIT_WIDTH: Optional[int] = None
[docs]
INIT_HEIGHT: Optional[int] = None
[docs]
MARGINS: tuple = (5, 5, 5, 5)
@classmethod
[docs]
def right(cls) -> int:
return cls.X + cls.WIDTH
@classmethod
[docs]
def bottom(cls) -> int:
return cls.Y + cls.HEIGHT
[docs]
class DigitalDimensions(Dimensions):
"""Digital Dimensions"""
[docs]
MIN_CONTROL_WIDTH: int = 20
[docs]
MIN_CONTROL_HEIGHT: int = 14
[docs]
class AnalogDimensions(Dimensions):
"""Analog Editor Dimensions"""
[docs]
MIN_CONTROL_WIDTH: int = 20
[docs]
MIN_CONTROL_HEIGHT: int = 14
[docs]
class ComboBoxDimensions(Dimensions):
"""Combo Box Dimensions"""
[docs]
class IconDimensions(Dimensions):
"""Icon Dimensions"""
[docs]
SCALE_SMALL: float = 0.7
[docs]
class SmallIconDimensions(Dimensions):
"""Dimensions of an Icon"""
[docs]
class DigitalEditorDimensions(Dimensions):
"""Digital Filter Dimensions"""
[docs]
MARGINS = Margins(5, 15, 5, 5)
[docs]
MIN_WIDTH: Optional[int] = 850
[docs]
MIN_HEIGHT: Optional[int] = 300
[docs]
INIT_WIDTH: Optional[int] = 1030
[docs]
INIT_HEIGHT: Optional[int] = 600
[docs]
class BasicEditorDimensions(Dimensions):
"""Basic Editor Dimensions"""
[docs]
IMAGE_HEIGHT: int = 150
[docs]
class DrumEditorDimensions(Dimensions):
"""Drum Editor Dimensions"""
[docs]
PARTIAL_TAB_MIN_WIDTH = (
400 # Minimum width for drum partial tabs to match WMT width
)
[docs]
MIN_HEIGHT: Optional[int] = 300
[docs]
class LfoIconDimensions(Dimensions):
"""Lfo Icon Dimensions"""
[docs]
class SplashScreenDimensions(Dimensions):
"""Splash screen dimensions (matches splash_screen_540_850.png)"""
[docs]
IMAGE_HEIGHT: int = 540
[docs]
class ChartMetrics:
"""Chart Metrics"""
[docs]
class InstrumentDimensions(Dimensions):
"""Instrument Dimensions"""
[docs]
class EditorDimensions(Dimensions):
"""EditorDimensions"""
[docs]
class ArpDimensions(Dimensions):
"""ArpDimensions"""
[docs]
class AnalogEditorDimensions(EditorDimensions):
"""Analog Editor Dimensions"""
[docs]
class LEDDisplayDimensions(Dimensions):
"""LED digital area (enlarged for 2 rows)"""
[docs]
X = InstrumentDimensions.MARGIN + 20
[docs]
Y = InstrumentDimensions.MARGIN + 35
[docs]
class DigitalTitleDimensions(Dimensions):
"""
Digital Title Dimensions
LED title area (enlarged for 2 rows)"""
[docs]
class TitleDimensions(Dimensions):
"""Title above digital (moved down)"""
[docs]
X = InstrumentDimensions.MARGIN + 20
[docs]
Y = InstrumentDimensions.MARGIN
[docs]
class KeyboardDimensions(Dimensions):
"""Keyboard Dimensions"""
# Keyboard
[docs]
class SequencerGridDimensions(Dimensions):
"""Sequencer Grid Dimensions"""
# --- Sequencer grid
[docs]
class SequencerContainerDimensions(Dimensions):
"""Sequencer container"""
[docs]
X = InstrumentDimensions.MARGIN + 520
[docs]
Y = InstrumentDimensions.MARGIN + 155
[docs]
class SequencerDimensions(Dimensions):
"""Sequencer Dimensions"""
# --- Sequencer steps
[docs]
LARGE_SQUARE_SIZE: int = 40
# Sequencer above keyboard
[docs]
Y_WINDOWS = (
InstrumentDimensions.HEIGHT - KeyboardDimensions.HEIGHT + 20
) # Windows has a menu across the top
[docs]
Y_NON_WINDOWS = (
InstrumentDimensions.HEIGHT - KeyboardDimensions.HEIGHT + 20
) # Keep same distance above keyboard
[docs]
WIDTH: int = 440 # # Use roughly half keyboard width
[docs]
X = InstrumentDimensions.WIDTH - InstrumentDimensions.MARGIN - WIDTH
[docs]
GRID: SequencerGridDimensions = SequencerGridDimensions
# --- Sequencer container
[docs]
CONTAINER: SequencerContainerDimensions = SequencerContainerDimensions
[docs]
class SliderContainerDimensions(Dimensions):
"""Slider Container Dimensions"""
[docs]
HEIGHT: int = 120 + 20 # Height = SliderDimensions Height
[docs]
class SliderDimensions(Dimensions):
"""Slider Dimensions"""
[docs]
Y: int = InstrumentDimensions.MARGIN
[docs]
CONTAINER: SliderContainerDimensions = SliderContainerDimensions
[docs]
class PartsDimensions(Dimensions):
"""Parts container"""
[docs]
X = LEDDisplayDimensions.right() + 10
[docs]
Y = InstrumentDimensions.MARGIN
[docs]
class MidiConfig(Dimensions):
"""Midi Config Dimensions"""
[docs]
class SliderValueLabelDimensions(Dimensions):
"""Slider label dimensions"""
[docs]
class VerticalSliderDimensions(Dimensions):
"""Slider Dimensions"""
[docs]
label = SliderValueLabelDimensions
[docs]
class HorizontalSliderDimensions(Dimensions):
"""Slider Dimensions"""
[docs]
label = SliderValueLabelDimensions
[docs]
class PatchManagerDimensions(Dimensions):
"""Patch manager Dimensions"""
[docs]
class GroupBoxDimensions(Dimensions):
"""group box dimensions"""
[docs]
MARGINS = QMargins(0, 0, 0, 0)
[docs]
class JDXiUIDimensions(Dimensions):
"""
A class to store dimensions for the JD-Xi editor UI.
"""
[docs]
group = GroupBoxDimensions
# --- Icons
[docs]
patch = PatchManagerDimensions
[docs]
slider_vertical = VerticalSliderDimensions
[docs]
slider_horizontal = HorizontalSliderDimensions
[docs]
Icon: IconDimensions = IconDimensions
[docs]
Combo: ComboBoxDimensions = ComboBoxDimensions
[docs]
LFOIcon: LfoIconDimensions = LfoIconDimensions
# --- Splash screen
[docs]
SPLASH: SplashScreenDimensions = SplashScreenDimensions
# Config
[docs]
Config: MidiConfig = MidiConfig
# --- Editor Windows
[docs]
INSTRUMENT: InstrumentDimensions = InstrumentDimensions
[docs]
EDITOR: EditorDimensions = EditorDimensions
[docs]
EDITOR_DIGITAL: DigitalEditorDimensions = DigitalEditorDimensions
[docs]
EDITOR_BASIC: BasicEditorDimensions = BasicEditorDimensions
[docs]
EDITOR_ANALOG: AnalogEditorDimensions = AnalogEditorDimensions
[docs]
EDITOR_DRUM: DrumEditorDimensions = DrumEditorDimensions
[docs]
ANALOG = AnalogDimensions
[docs]
ARPEGGIATOR: ArpDimensions = ArpDimensions
# --- Widgets
[docs]
CHART: ChartMetrics = ChartMetrics
[docs]
LED: LEDDisplayDimensions = LEDDisplayDimensions
[docs]
DIGITAL_TITLE: DigitalTitleDimensions = DigitalTitleDimensions
[docs]
TITLE: TitleDimensions = TitleDimensions
[docs]
KEYBOARD: KeyboardDimensions = KeyboardDimensions
[docs]
SEQUENCER: SequencerDimensions = SequencerDimensions
[docs]
SLIDER: SliderDimensions = SliderDimensions
[docs]
PARTS: PartsDimensions = PartsDimensions
[docs]
OCTAVE: OctaveButtonDimensions = OctaveButtonDimensions
[docs]
PROGRAM: ProgramButtonDimensions = ProgramButtonDimensions
[docs]
TONE: ToneButtonDimensions = ToneButtonDimensions
[docs]
EFFECTS: EffectsButtonDimensions = EffectsButtonDimensions