1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
from dataclasses import dataclass
from enum import IntFlag, IntEnum, auto, Flag
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from patchbay_manager import PatchbayManager
class JackPortFlag(IntFlag):
'Port Flags as defined by JACK'
IS_INPUT = 0x01
IS_OUTPUT = 0x02
IS_PHYSICAL = 0x04
CAN_MONITOR = 0x08
IS_TERMINAL = 0x10
IS_CONTROL_VOLTAGE = 0x100
class TransportViewMode(IntEnum):
HOURS_MINUTES_SECONDS = 0
BEAT_BAR_TICK = 1
FRAMES = 2
class ToolDisplayed(IntFlag):
UNDO_REDO = auto()
VIEWS_SELECTOR = auto()
HIDDENS_BOX = auto()
PORT_TYPES_VIEW = auto()
TRANSPORT_CLOCK = auto()
TRANSPORT_PLAY_STOP = auto()
TRANSPORT_TEMPO = auto()
ZOOM_SLIDER = auto()
BUFFER_SIZE = auto()
SAMPLERATE = auto()
LATENCY = auto()
XRUNS = auto()
DSP_LOAD = auto()
ALL = (UNDO_REDO
| VIEWS_SELECTOR
| HIDDENS_BOX
| PORT_TYPES_VIEW
| TRANSPORT_CLOCK
| TRANSPORT_PLAY_STOP
| TRANSPORT_TEMPO
| ZOOM_SLIDER
| BUFFER_SIZE
| SAMPLERATE
| LATENCY
| XRUNS
| DSP_LOAD)
def to_save_string(self) -> str:
'''return a string containing all flags names
separated with pipe symbol.'''
all_strs = list[str]()
for flag in ToolDisplayed:
if flag is ToolDisplayed.ALL:
continue
if self & flag:
all_strs.append(flag.name)
else:
all_strs.append('~' + flag.name)
return '|'.join(all_strs)
def filtered_by_string(self, string: str) -> 'ToolDisplayed':
'''returns another ToolDisplayed with value filtered
by string where string contains flags names separated with pipe symbol
as given by to_save_string method.'''
return_td = ToolDisplayed(self.value)
for disp_str in string.split('|'):
delete = False
if disp_str.startswith('~'):
delete = True
disp_str = disp_str[1:]
if disp_str in ToolDisplayed._member_names_:
if delete:
return_td &= ~ToolDisplayed[disp_str]
else:
return_td |= ToolDisplayed[disp_str]
return return_td
class CanvasOptimize(IntEnum):
NORMAL = 0
'''No particular optimization, objects are added to canvas and redrawn
directly.'''
FAST = 1
'''Objects are added to canvas, but boxes and connections
are not redrawn. Groups need to be redrawn once finished.'''
VERY_FAST = 2
'''Objects are not added to canvas (useful for sort operations)
objects need to be added to canvas and redrawn once finished'''
class CanvasOptimizeIt:
'''Context for 'with' statment. save the data at begin and at end
for undo/redo actions'''
def __init__(
self, mng: 'PatchbayManager', canvas_optimize=CanvasOptimize.FAST,
auto_redraw=False, prevent_overlap=True):
self.mng = mng
self._auto_redraw = auto_redraw
self._prevent_overlap = prevent_overlap
self._previous_optim = mng.canvas_optimize
if canvas_optimize > mng.canvas_optimize:
mng.canvas_optimize = canvas_optimize
mng.optimize_operation(True)
def __enter__(self):
...
def __exit__(self, *args, **kwargs):
self.mng.canvas_optimize = self._previous_optim
if self.mng.canvas_optimize is CanvasOptimize.NORMAL:
self.mng.optimize_operation(
False, auto_redraw=self._auto_redraw,
prevent_overlap=self._prevent_overlap)
|