예제 #1
0
 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
예제 #2
0
 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')
     ]
예제 #3
0
 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
예제 #4
0
    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
예제 #5
0
 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)
예제 #6
0
    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')]
예제 #7
0
    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
예제 #8
0
 def as_sync_rows(self):
     yield [HorizontalSeparator()]
     yield self.get_basic_info_row()
     yield from self.get_sync_rows()