def as_all_tag_rows(self, editable: bool = True): cover = Column([[self.cover_image_thumbnail]], key=f'col::{self.path_str}::cover') tag_rows, ele_binds = self.get_tag_rows(editable) tags = Column(tag_rows, key=f'col::{self.path_str}::tags') layout = [[HorizontalSeparator()], self.get_basic_info_row(), self.get_metadata_row(), [cover, tags]] return layout, ele_binds
def as_info_rows(self, editable: bool = True, keys: Collection[str] = None): yield [HorizontalSeparator()] yield self.get_basic_info_row() yield [ Column(self.get_info_rows(editable, keys), key=f'col::{self.path_str}::tags') ]
def _prepare_album_column(self, spinner: Spinner): spinner.update() album_data = [ Column([[self.album_formatter.cover_image_thumbnail]], key='col::album_cover'), Column(self.album_formatter.get_album_data_rows(self.editing), key='col::album_data'), ] spinner.update() alb_col_rows = [album_data, [HorizontalSeparator()], *self._prepare_button_rows()] album_column = Column( alb_col_rows, vertical_alignment='top', element_justification='center', key='col::album_container' ) return album_column
def get_render_args(self) -> RenderArgs: full_layout, kwargs = super().get_render_args() ele_binds = {} win_w, win_h = self._window_size max_h = win_h - 66 with Spinner() as spinner: layout = [[]] albums, formatters = (self.src_album, self.dst_album), (self.src_formatter, self.dst_formatter) for loc, album, formatter in zip(('src', 'dst'), albums, formatters): path_key = f'path::{loc}' path = ExtInput(album.path.as_posix(), key=path_key, disabled=True, size=(150, 1), tooltip='Click to change album') ele_binds[path_key] = {'<Button-1>': ':::album_clicked'} rows = [ # menu = 20px; 46 px from menu to 1st track's horizontal separator [Text('Album Path:'), path], [HorizontalSeparator()], *chain.from_iterable( tb.as_sync_rows() for tb in spinner(formatter)), # 86 px each ] col_w = (win_w - 159) // 2 if (len(album) * 86) > max_h: col_kwargs = dict(scrollable=True, vertical_scroll_only=True) col_w -= 17 else: col_kwargs = {} layout[0].append( Column(rows, key=f'col::track_data::{loc}', size=(col_w, max_h), **col_kwargs)) workflow = self.as_workflow(layout, back_tooltip='Cancel Changes', next_tooltip='Review & Save Changes') full_layout.append(workflow) return full_layout, kwargs, ele_binds
def __init__(self, rows: int = 50, img_size: tuple[int, int] = None, sort_by: Iterable[str] = None, **kwargs): self.img_size = img_size self.rows = [ResultRow(img_size) for _ in range(rows)] header_sizes = { 'cover': (4, 1), 'image': (4, 1), **FIELD_SIZES, 'rating': (5, 1), 'play': (4, 1) } self.headers: dict[str, ExtText] = { header.strip(): ExtText( header.title(), size=size, key=f'header:{header}', justification='right' if header in ('duration', 'plays', 'play') else None, ) for header, size in header_sizes.items() } self.header_column = Column([[h.pin for h in self.headers.values()]], key='headers', pad=(0, 0)) self.result_type = None self.results: Optional[list[Result]] = None self.result_count = 0 self.last_page_count = 0 self.sort_by = sort_by or ('title', ) self._num = next(self.__counter) kwargs.setdefault('key', f'result_table:{self._num}') for key, val in self._default_params.items(): kwargs.setdefault(key, val) layout = [ [Image(size=(kwargs['size'][0], 1), pad=(0, 0))], [self.header_column], [HorizontalSeparator()], *(tr.row for tr in self.rows), ] super().__init__(layout, **kwargs)
def as_diff_rows(self, new_track_info: TrackInfo, title_case: bool = False, add_genre: bool = False): yield [HorizontalSeparator()] new_name = new_track_info.expected_name(self.track) if self.track.path.name != new_name: yield from get_a_to_b('File Rename:', self.track.path.name, new_name, self.path_str, 'file_name') else: yield [ Text('File:'), ExtInput(self.track.path.name, disabled=True, key=f'src::{self.path_str}::file_name'), Text('(no change)'), ] if diff_rows := self.get_diff_rows(new_track_info, title_case, add_genre): yield [Column(diff_rows, key=f'col::{self.path_str}::diff')]
def get_render_args(self) -> RenderArgs: full_layout, kwargs = super().get_render_args() with Spinner() as spinner: album_path = self.album.path.as_posix() layout = [ [Text('Album Path:'), ExtInput(album_path, disabled=True, size=(150, 1), path=album_path)], [HorizontalSeparator()] ] album_column = self._prepare_album_column(spinner) track_column = self._prepare_track_column(spinner) data_col = Column([[album_column, track_column]], key='col::all_data', justification='center', pad=(0, 0)) layout.append([data_col]) workflow = self.as_workflow( layout, back_tooltip='Cancel Changes' if self.editing else 'View previous album', next_tooltip='Review & Save Changes' if self.editing else 'View next album', back_visible=bool(self.editing or self._album_index), next_visible=bool(self.editing or self._album_index < len(self._albums) - 1), ) full_layout.append(workflow) return full_layout, kwargs
def as_sync_rows(self): yield [HorizontalSeparator()] yield self.get_basic_info_row() yield from self.get_sync_rows()