class Downloads(QWidget): def __init__(self): super(Downloads, self).__init__() self.history = get_download_history() self.history.reverse() self.layout = QStackedLayout() self.layout.setMargin(0) self.page_widget = QScrollArea() self.page_widget.setWidgetResizable(True) widget = QWidget(self.page_widget) widget.setMinimumWidth(350) self.page_widget.setWidget(widget) self.page_layout = QVBoxLayout(widget, alignment=Qt.AlignTop) self.page_layout.setMargin(0) self.page_layout.setContentsMargins(25, 25, 25, 25) self.layout.addWidget(self.page_widget) self.layout.setCurrentWidget(self.page_widget) if len(self.history) == 0: self.history_empty_label = QLabel('No downloads', alignment=Qt.AlignCenter) self.layout.addWidget(self.history_empty_label) self.layout.setCurrentWidget(self.history_empty_label) for item in self.history: self.page_layout.addWidget(DownloadItem(item=item)) self.setLayout(self.layout)
class HomeFeed(QWidget): def __init__(self): super(HomeFeed, self).__init__() self.run_get_feed_thread() self.feed = [] self.page = 1 self.loading = False self.layout = QStackedLayout() self.layout.setMargin(0) self.loading_label = QLabel('Loading...', alignment=Qt.AlignCenter) self.layout.addWidget(self.loading_label) self.layout.setCurrentWidget(self.loading_label) self.page_widget = QScrollArea() self.page_widget.setWidgetResizable(True) self.page_widget.viewport().installEventFilter(self) widget = QWidget(self.page_widget) widget.setMinimumWidth(350) self.page_widget.setWidget(widget) self.flow_layout = FlowLayout(widget) self.flow_layout.setContentsMargins(25, 25, 25, 25) self.layout.addWidget(self.page_widget) self.setLayout(self.layout) def run_get_feed_thread(self): self.thread = RunThread(self.get_feed, self.on_feed_receive) def eventFilter(self, source, event): if (event.type() == QEvent.Wheel and source is self.page_widget.viewport() and not self.loading): scrollbar = self.page_widget.verticalScrollBar() y = scrollbar.value() bottom = scrollbar.maximum() if y >= bottom: self.page += 1 self.loading = True self.run_get_feed_thread() return super(HomeFeed, self).eventFilter(source, event) def get_feed(self): spider = CoreRadioSpider() self.feed = spider.get_home_feed(page=self.page) return True def on_feed_receive(self): if len(self.feed) > 0: for item in self.feed: preview_widget = SongPreview(artwork=item['artwork'], title=item['title'], url=item['href']) self.flow_layout.addWidget(preview_widget) self.loading = False self.layout.setCurrentWidget(self.page_widget) else: self.loading_label.setText( "Something wen't wrong, please try again")
class SongDetailPage(QWidget): def __init__(self, url=None): super(SongDetailPage, self).__init__() self.url = url self.loading = False self.artwork_content = None self.artwork_size = 400 self.song = None self.layout = QStackedLayout() self.layout.setMargin(0) self.loading_label = QLabel('Loading...', alignment=Qt.AlignCenter) self.layout.addWidget(self.loading_label) self.layout.setCurrentWidget(self.loading_label) self.page_widget = QScrollArea() self.page_widget.setWidgetResizable(True) widget = QWidget(self.page_widget) widget.setMinimumWidth(800) self.page_widget.setWidget(widget) self.page_layout = QVBoxLayout(widget, alignment=Qt.AlignTop) self.page_layout.setContentsMargins(25, 25, 25, 25) self.layout.addWidget(self.page_widget) self.setLayout(self.layout) self.thread = RunThread(self.get_song_info, self.on_song_info) def render_song_info(self): # Header self.page_layout.addWidget(Header(song=self.song)) # Title title = H2(self.song['title']) title.setWordWrap(True) title.setStyleSheet('padding-top: 20px;') self.page_layout.addWidget(title) # Inner container that contains Image + Songlist inner_container = QWidget() inner_container_layout = QHBoxLayout(alignment=Qt.AlignTop | Qt.AlignLeft) inner_container_layout.setMargin(0) inner_container_layout.setSpacing(25) inner_container_layout.setContentsMargins(0, 25, 0, 0) inner_container.setLayout(inner_container_layout) self.page_layout.addWidget(inner_container) # Image self.artwork_label = QLabel() self.artwork_label.setStyleSheet( css('background-color: {{color}};', color=colors.PLACEHOLDER_COLOR)) self.artwork_label.setFixedWidth(self.artwork_size) self.artwork_label.setFixedHeight(self.artwork_size) inner_container_layout.addWidget(self.artwork_label, alignment=Qt.AlignTop) self.get_artwork_thread = RunThread(self.fetch_artwork, self.on_artwork_loaded) # Songlist inner_container_layout.addWidget( Songlist(songlist=self.song['songlist']), alignment=Qt.AlignTop) def fetch_artwork(self): time.sleep(1) logging.info('GET {}'.format(self.song['artwork'])) try: response = requests.get(self.song['artwork']) self.artwork_content = response.content except Exception: return True return True def on_artwork_loaded(self): if self.artwork_content: imgWidget = QImage() imgWidget.loadFromData(self.artwork_content) picture = QPixmap(imgWidget) picture = picture.scaled(self.artwork_size, self.artwork_size, Qt.KeepAspectRatio) self.artwork_label.setPixmap(picture) else: logging.warn('[FAILED] GET {}'.format(self.song['artwork'])) def get_song_info(self): self.loading = True spider = CoreRadioSpider() self.song = spider.get_song_info(url=self.url) return True def on_song_info(self): if self.song is not None: self.render_song_info() self.loading = False self.layout.setCurrentWidget(self.page_widget) else: self.loading_label.setText( "Something wen't wrong, please try again")