Add logo and load authors and playlists
This commit is contained in:
parent
cb979e162b
commit
5a97e5e102
@ -1,11 +1,15 @@
|
|||||||
import qtawesome as qta
|
import qtawesome as qta
|
||||||
from PyQt5 import QtGui, QtWidgets
|
from PyQt5 import QtGui, QtWidgets
|
||||||
|
|
||||||
from playtypus.mainwindow import MainWindow
|
from playtypus.mainwindow import MainWindow
|
||||||
|
from playtypus.resources import init_resources, cleanup_resources
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""Main"""
|
"""Main"""
|
||||||
|
init_resources()
|
||||||
app = QtWidgets.QApplication([])
|
app = QtWidgets.QApplication([])
|
||||||
|
app.setWindowIcon(QtGui.QIcon(":/icon/playtypus.png"))
|
||||||
# Set up icon colours
|
# Set up icon colours
|
||||||
palette = app.palette()
|
palette = app.palette()
|
||||||
qta.set_defaults(color=palette.color(QtGui.QPalette.Active,
|
qta.set_defaults(color=palette.color(QtGui.QPalette.Active,
|
||||||
@ -15,4 +19,6 @@ def main():
|
|||||||
# Create the main window and run the app
|
# Create the main window and run the app
|
||||||
main_window = MainWindow()
|
main_window = MainWindow()
|
||||||
main_window.show()
|
main_window.show()
|
||||||
return app.exec()
|
result = app.exec()
|
||||||
|
cleanup_resources()
|
||||||
|
return result
|
||||||
|
@ -4,7 +4,7 @@ from PyQt5 import QtCore, QtWidgets
|
|||||||
|
|
||||||
from playtypus.ui_mainwindow import UiMainWindow
|
from playtypus.ui_mainwindow import UiMainWindow
|
||||||
from playtypus.settingsdialog import SettingsDialog
|
from playtypus.settingsdialog import SettingsDialog
|
||||||
from playtypus.threads import AlbumWorker
|
from playtypus.threads import AlbumWorker, ArtistWorker, PlaylistWorker, RadioWorker
|
||||||
|
|
||||||
|
|
||||||
class MainWindow(QtWidgets.QMainWindow, UiMainWindow):
|
class MainWindow(QtWidgets.QMainWindow, UiMainWindow):
|
||||||
@ -102,7 +102,8 @@ class MainWindow(QtWidgets.QMainWindow, UiMainWindow):
|
|||||||
self.funkwhale.login(username, password)
|
self.funkwhale.login(username, password)
|
||||||
if self.is_funkwhale_active:
|
if self.is_funkwhale_active:
|
||||||
self.load_albums()
|
self.load_albums()
|
||||||
# self.load_artists()
|
self.load_artists()
|
||||||
|
self.load_playlists()
|
||||||
|
|
||||||
def load_albums(self):
|
def load_albums(self):
|
||||||
if not self.is_funkwhale_active:
|
if not self.is_funkwhale_active:
|
||||||
@ -114,9 +115,23 @@ class MainWindow(QtWidgets.QMainWindow, UiMainWindow):
|
|||||||
def load_artists(self):
|
def load_artists(self):
|
||||||
if not self.is_funkwhale_active:
|
if not self.is_funkwhale_active:
|
||||||
return
|
return
|
||||||
self.artistListWidget.clear()
|
worker = ArtistWorker()
|
||||||
for artist in self.funkwhale.artists.list()['results']:
|
worker.window = self
|
||||||
self.artistListWidget.addItem(QtWidgets.QListWidgetItem(artist['name']))
|
self.run_thread(worker, 'get-artists')
|
||||||
|
|
||||||
|
def load_playlists(self):
|
||||||
|
if not self.is_funkwhale_active:
|
||||||
|
return
|
||||||
|
worker = PlaylistWorker()
|
||||||
|
worker.window = self
|
||||||
|
self.run_thread(worker, 'get-playlists')
|
||||||
|
|
||||||
|
def load_radios(self):
|
||||||
|
if not self.is_funkwhale_active:
|
||||||
|
return
|
||||||
|
worker = RadioWorker()
|
||||||
|
worker.window = self
|
||||||
|
self.run_thread(worker, 'get-radios')
|
||||||
|
|
||||||
def on_settings_action_triggered(self):
|
def on_settings_action_triggered(self):
|
||||||
self.settings_dialog.server_url = self.settings.value('funkwhale/server_url', '')
|
self.settings_dialog.server_url = self.settings.value('funkwhale/server_url', '')
|
||||||
|
3625
playtypus/resources.py
Normal file
3625
playtypus/resources.py
Normal file
File diff suppressed because it is too large
Load Diff
@ -23,29 +23,6 @@ class ThreadWorker(QtCore.QObject):
|
|||||||
raise NotImplementedError('Your class needs to override this method and run self.quit.emit() when complete')
|
raise NotImplementedError('Your class needs to override this method and run self.quit.emit() when complete')
|
||||||
|
|
||||||
|
|
||||||
class AlbumArtWorker(ThreadWorker):
|
|
||||||
album_item = None
|
|
||||||
artwork_url = None
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
if not self.album_item:
|
|
||||||
self.error.emit('No album QListWidgetItem set', 'The album_item attribute was not set')
|
|
||||||
self.quit.emit()
|
|
||||||
return
|
|
||||||
if not self.artwork_url:
|
|
||||||
self.error.emit('No artwork URL set', 'The artwork_url attribute was not set')
|
|
||||||
self.quit.emit()
|
|
||||||
return
|
|
||||||
response = requests.get(self.artwork_url)
|
|
||||||
if response.status_code == 200:
|
|
||||||
pixmap = QtGui.QPixmap()
|
|
||||||
pixmap.loadFromData(response.content)
|
|
||||||
self.album_item.setIcon(QtGui.QIcon(pixmap))
|
|
||||||
else:
|
|
||||||
print(response.text)
|
|
||||||
self.quit.emit()
|
|
||||||
|
|
||||||
|
|
||||||
class AlbumWorker(ThreadWorker):
|
class AlbumWorker(ThreadWorker):
|
||||||
"""
|
"""
|
||||||
A thread worker to fetch the album art
|
A thread worker to fetch the album art
|
||||||
@ -66,6 +43,7 @@ class AlbumWorker(ThreadWorker):
|
|||||||
'artist': album['artist']['name']
|
'artist': album['artist']['name']
|
||||||
}
|
}
|
||||||
album_item = QtWidgets.QListWidgetItem(self.ALBUM_TEMPLATE.format(**details))
|
album_item = QtWidgets.QListWidgetItem(self.ALBUM_TEMPLATE.format(**details))
|
||||||
|
album_item.setData(QtCore.Qt.UserRole, album)
|
||||||
self.window.albumListWidget.addItem(album_item)
|
self.window.albumListWidget.addItem(album_item)
|
||||||
if album['cover'] and album['cover'].get('urls') and album['cover']['urls'].get('medium_square_crop'):
|
if album['cover'] and album['cover'].get('urls') and album['cover']['urls'].get('medium_square_crop'):
|
||||||
artwork_worker = AlbumArtWorker()
|
artwork_worker = AlbumArtWorker()
|
||||||
@ -76,3 +54,109 @@ class AlbumWorker(ThreadWorker):
|
|||||||
album_item.setIcon(qta.icon('mdi.album'))
|
album_item.setIcon(qta.icon('mdi.album'))
|
||||||
self.window.update_album_total(self.window.albumListWidget.count())
|
self.window.update_album_total(self.window.albumListWidget.count())
|
||||||
self.quit.emit()
|
self.quit.emit()
|
||||||
|
|
||||||
|
|
||||||
|
class AlbumArtWorker(ThreadWorker):
|
||||||
|
album_item = None
|
||||||
|
artwork_url = None
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
if not self.album_item:
|
||||||
|
self.error.emit('No album QListWidgetItem set', 'The album_item attribute was not set')
|
||||||
|
self.quit.emit()
|
||||||
|
return
|
||||||
|
if not self.artwork_url:
|
||||||
|
self.error.emit('No artwork URL set', 'The artwork_url attribute was not set')
|
||||||
|
self.quit.emit()
|
||||||
|
return
|
||||||
|
response = requests.get(self.artwork_url)
|
||||||
|
if response.status_code == 200:
|
||||||
|
pixmap = QtGui.QPixmap()
|
||||||
|
pixmap.loadFromData(response.content)
|
||||||
|
self.album_item.setIcon(QtGui.QIcon(pixmap))
|
||||||
|
else:
|
||||||
|
self.album_item.setIcon(qta.icon('mdi.album'))
|
||||||
|
self.quit.emit()
|
||||||
|
|
||||||
|
|
||||||
|
class ArtistWorker(ThreadWorker):
|
||||||
|
window = None
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
if not self.window:
|
||||||
|
self.error.emit('No window set', 'The window attribute was not set')
|
||||||
|
self.quit.emit()
|
||||||
|
return
|
||||||
|
self.window.artistListWidget.clear()
|
||||||
|
for artist in self.window.funkwhale.artists.list()['results']:
|
||||||
|
artist_item = QtWidgets.QListWidgetItem(artist['name'])
|
||||||
|
artist_item.setData(QtCore.Qt.UserRole, artist)
|
||||||
|
self.window.artistListWidget.addItem(artist_item)
|
||||||
|
if artist['cover'] and artist['cover'].get('urls') and artist['cover']['urls'].get('medium_square_crop'):
|
||||||
|
artwork_worker = ArtistArtWorker()
|
||||||
|
artwork_worker.artist_item = artist_item
|
||||||
|
artwork_worker.artwork_url = artist['cover']['urls']['medium_square_crop']
|
||||||
|
self.window.run_thread(artwork_worker, 'artist-{}'.format(artist['name']))
|
||||||
|
else:
|
||||||
|
artist_item.setIcon(qta.icon('mdi.account'))
|
||||||
|
self.window.update_artist_total(self.window.artistListWidget.count())
|
||||||
|
self.quit.emit()
|
||||||
|
|
||||||
|
|
||||||
|
class ArtistArtWorker(ThreadWorker):
|
||||||
|
artist_item = None
|
||||||
|
artwork_url = None
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
if not self.artist_item:
|
||||||
|
self.error.emit('No artist QListWidgetItem set', 'The artist_item attribute was not set')
|
||||||
|
self.quit.emit()
|
||||||
|
return
|
||||||
|
if not self.artwork_url:
|
||||||
|
self.error.emit('No artwork URL set', 'The artwork_url attribute was not set')
|
||||||
|
self.quit.emit()
|
||||||
|
return
|
||||||
|
response = requests.get(self.artwork_url)
|
||||||
|
if response.status_code == 200:
|
||||||
|
pixmap = QtGui.QPixmap()
|
||||||
|
pixmap.loadFromData(response.content)
|
||||||
|
self.artist_item.setIcon(QtGui.QIcon(pixmap))
|
||||||
|
else:
|
||||||
|
self.artist_item.setIcon(qta.icon('mdi.account'))
|
||||||
|
self.quit.emit()
|
||||||
|
|
||||||
|
|
||||||
|
class PlaylistWorker(ThreadWorker):
|
||||||
|
window = None
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
if not self.window:
|
||||||
|
self.error.emit('No window set', 'The window attribute was not set')
|
||||||
|
self.quit.emit()
|
||||||
|
return
|
||||||
|
self.window.playlistListWidget.clear()
|
||||||
|
for playlist in self.window.funkwhale.playlists.list()['results']:
|
||||||
|
playlist_item = QtWidgets.QListWidgetItem(playlist['name'])
|
||||||
|
playlist_item.setIcon(qta.icon('mdi.playlist-music'))
|
||||||
|
playlist_item.setData(QtCore.Qt.UserRole, playlist)
|
||||||
|
self.window.playlistListWidget.addItem(playlist_item)
|
||||||
|
self.window.update_playlist_total(self.window.playlistListWidget.count())
|
||||||
|
self.quit.emit()
|
||||||
|
|
||||||
|
|
||||||
|
class RadioWorker(ThreadWorker):
|
||||||
|
window = None
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
if not self.window:
|
||||||
|
self.error.emit('No window set', 'The window attribute was not set')
|
||||||
|
self.quit.emit()
|
||||||
|
return
|
||||||
|
self.window.radioListWidget.clear()
|
||||||
|
for radio in self.window.funkwhale.radios.list()['results']:
|
||||||
|
radio_item = QtWidgets.QListWidgetItem(radio['name'])
|
||||||
|
radio_item.setIcon(qta.icon('mdi.radio-music'))
|
||||||
|
radio_item.setData(QtCore.Qt.UserRole, radio)
|
||||||
|
self.window.radioListWidget.addItem(radio_item)
|
||||||
|
self.window.update_radio_total(self.window.radioListWidget.count())
|
||||||
|
self.quit.emit()
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import qtawesome as qta
|
import qtawesome as qta
|
||||||
from PyQt5 import QtCore, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
LIST_WIDGET_STYLES = """
|
LIST_WIDGET_STYLES = """
|
||||||
QListWidget {
|
QListWidget {
|
||||||
@ -11,6 +11,7 @@ QListWidget {
|
|||||||
|
|
||||||
class UiMainWindow(object):
|
class UiMainWindow(object):
|
||||||
def setup_ui(self):
|
def setup_ui(self):
|
||||||
|
self.setWindowIcon(QtGui.QIcon(":/icon/playtypus.png"))
|
||||||
self.setObjectName("MainWindow")
|
self.setObjectName("MainWindow")
|
||||||
self.resize(719, 574)
|
self.resize(719, 574)
|
||||||
self.setStyleSheet(LIST_WIDGET_STYLES)
|
self.setStyleSheet(LIST_WIDGET_STYLES)
|
||||||
@ -72,6 +73,7 @@ class UiMainWindow(object):
|
|||||||
self.viewListWidget.setObjectName("viewListWidget")
|
self.viewListWidget.setObjectName("viewListWidget")
|
||||||
self.stackedWidget = QtWidgets.QStackedWidget(self.splitter)
|
self.stackedWidget = QtWidgets.QStackedWidget(self.splitter)
|
||||||
self.stackedWidget.setObjectName("stackedWidget")
|
self.stackedWidget.setObjectName("stackedWidget")
|
||||||
|
# Albums page
|
||||||
self.albumPage = QtWidgets.QWidget()
|
self.albumPage = QtWidgets.QWidget()
|
||||||
self.albumPage.setObjectName("albumPage")
|
self.albumPage.setObjectName("albumPage")
|
||||||
self.albumPageLayout = QtWidgets.QVBoxLayout(self.albumPage)
|
self.albumPageLayout = QtWidgets.QVBoxLayout(self.albumPage)
|
||||||
@ -100,6 +102,7 @@ class UiMainWindow(object):
|
|||||||
self.albumListWidget.setIconSize(QtCore.QSize(100, 100))
|
self.albumListWidget.setIconSize(QtCore.QSize(100, 100))
|
||||||
self.albumPageLayout.addWidget(self.albumListWidget)
|
self.albumPageLayout.addWidget(self.albumListWidget)
|
||||||
self.stackedWidget.addWidget(self.albumPage)
|
self.stackedWidget.addWidget(self.albumPage)
|
||||||
|
# Artists page
|
||||||
self.artistPage = QtWidgets.QWidget()
|
self.artistPage = QtWidgets.QWidget()
|
||||||
self.artistPage.setObjectName("artistPage")
|
self.artistPage.setObjectName("artistPage")
|
||||||
self.artistPageLayout = QtWidgets.QVBoxLayout(self.artistPage)
|
self.artistPageLayout = QtWidgets.QVBoxLayout(self.artistPage)
|
||||||
@ -116,34 +119,84 @@ class UiMainWindow(object):
|
|||||||
self.artistPageTitleLayout.addWidget(self.artistPageIconLabel)
|
self.artistPageTitleLayout.addWidget(self.artistPageIconLabel)
|
||||||
self.artistPageTitleLabel = QtWidgets.QLabel(self.artistPage)
|
self.artistPageTitleLabel = QtWidgets.QLabel(self.artistPage)
|
||||||
self.artistPageTitleLayout.addWidget(self.artistPageTitleLabel)
|
self.artistPageTitleLayout.addWidget(self.artistPageTitleLabel)
|
||||||
|
self.artistPageTotalLabel = QtWidgets.QLabel(self.artistPage)
|
||||||
|
self.artistPageTotalLabel.setAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
|
||||||
|
self.artistPageTotalLabel.setIndent(4)
|
||||||
|
self.artistPageTotalLabel.setText('0')
|
||||||
|
self.artistPageTitleLayout.addWidget(self.artistPageTotalLabel)
|
||||||
self.artistPageLayout.addLayout(self.artistPageTitleLayout)
|
self.artistPageLayout.addLayout(self.artistPageTitleLayout)
|
||||||
self.artistListWidget = QtWidgets.QListWidget(self.artistPage)
|
self.artistListWidget = QtWidgets.QListWidget(self.artistPage)
|
||||||
self.artistListWidget.setObjectName("artistListWidget")
|
self.artistListWidget.setObjectName("artistListWidget")
|
||||||
self.artistListWidget.setSortingEnabled(True)
|
self.artistListWidget.setSortingEnabled(True)
|
||||||
self.artistListWidget.setViewMode(QtWidgets.QListView.IconMode)
|
self.artistListWidget.setIconSize(QtCore.QSize(100, 100))
|
||||||
self.artistListWidget.setMovement(QtWidgets.QListView.Static)
|
|
||||||
self.artistPageLayout.addWidget(self.artistListWidget)
|
self.artistPageLayout.addWidget(self.artistListWidget)
|
||||||
self.stackedWidget.addWidget(self.artistPage)
|
self.stackedWidget.addWidget(self.artistPage)
|
||||||
self.trackPage = QtWidgets.QWidget()
|
# Playlists page
|
||||||
self.trackPage.setObjectName("trackPage")
|
self.playlistPage = QtWidgets.QWidget()
|
||||||
self.trackPageLayout = QtWidgets.QVBoxLayout(self.trackPage)
|
self.playlistPage.setObjectName("playlistPage")
|
||||||
self.trackPageLayout.setContentsMargins(0, 0, 0, 0)
|
self.playlistPageLayout = QtWidgets.QVBoxLayout(self.playlistPage)
|
||||||
self.trackPageLayout.setSpacing(0)
|
self.playlistPageLayout.setContentsMargins(0, 0, 0, 0)
|
||||||
self.trackPageLayout.setObjectName("trackPageLayout")
|
self.playlistPageLayout.setSpacing(0)
|
||||||
self.trackListWidget = QtWidgets.QListWidget(self.trackPage)
|
self.playlistPageLayout.setObjectName("playlistPageLayout")
|
||||||
self.trackListWidget.setObjectName("trackListWidget")
|
self.playlistPageTitleLayout = QtWidgets.QHBoxLayout()
|
||||||
self.trackListWidget.setSortingEnabled(True)
|
self.playlistPageTitleLayout.setContentsMargins(0, 0, 0, 0)
|
||||||
self.trackListWidget.setViewMode(QtWidgets.QListView.IconMode)
|
self.playlistPageTitleLayout.setSpacing(0)
|
||||||
self.trackListWidget.setMovement(QtWidgets.QListView.Static)
|
self.playlistPageTitleLayout.setObjectName("playlistPageTitleLayout")
|
||||||
self.trackPageLayout.addWidget(self.trackListWidget)
|
self.playlistPageIconLabel = QtWidgets.QLabel(self.playlistPage)
|
||||||
self.stackedWidget.addWidget(self.trackPage)
|
self.playlistPageIconLabel.setMaximumSize(36, 36)
|
||||||
self.playlistListWidget = QtWidgets.QListWidget(self.splitter)
|
self.playlistPageIconLabel.setPixmap(qta.icon('mdi.playlist-music').pixmap(32))
|
||||||
|
self.playlistPageTitleLayout.addWidget(self.playlistPageIconLabel)
|
||||||
|
self.playlistPageTitleLabel = QtWidgets.QLabel(self.playlistPage)
|
||||||
|
self.playlistPageTitleLayout.addWidget(self.playlistPageTitleLabel)
|
||||||
|
self.playlistPageTotalLabel = QtWidgets.QLabel(self.playlistPage)
|
||||||
|
self.playlistPageTotalLabel.setAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
|
||||||
|
self.playlistPageTotalLabel.setIndent(4)
|
||||||
|
self.playlistPageTotalLabel.setText('0')
|
||||||
|
self.playlistPageTitleLayout.addWidget(self.playlistPageTotalLabel)
|
||||||
|
self.playlistPageLayout.addLayout(self.playlistPageTitleLayout)
|
||||||
|
self.playlistListWidget = QtWidgets.QListWidget(self.playlistPage)
|
||||||
|
self.playlistListWidget.setObjectName("playlistListWidget")
|
||||||
|
self.playlistListWidget.setSortingEnabled(True)
|
||||||
|
self.playlistListWidget.setIconSize(QtCore.QSize(64, 64))
|
||||||
|
self.playlistPageLayout.addWidget(self.playlistListWidget)
|
||||||
|
self.stackedWidget.addWidget(self.playlistPage)
|
||||||
|
# Radio page
|
||||||
|
self.radioPage = QtWidgets.QWidget()
|
||||||
|
self.radioPage.setObjectName("radioPage")
|
||||||
|
self.radioPageLayout = QtWidgets.QVBoxLayout(self.radioPage)
|
||||||
|
self.radioPageLayout.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.radioPageLayout.setSpacing(0)
|
||||||
|
self.radioPageLayout.setObjectName("radioPageLayout")
|
||||||
|
self.radioPageTitleLayout = QtWidgets.QHBoxLayout()
|
||||||
|
self.radioPageTitleLayout.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.radioPageTitleLayout.setSpacing(0)
|
||||||
|
self.radioPageTitleLayout.setObjectName("radioPageTitleLayout")
|
||||||
|
self.radioPageIconLabel = QtWidgets.QLabel(self.radioPage)
|
||||||
|
self.radioPageIconLabel.setMaximumSize(36, 36)
|
||||||
|
self.radioPageIconLabel.setPixmap(qta.icon('mdi.radio').pixmap(32))
|
||||||
|
self.radioPageTitleLayout.addWidget(self.radioPageIconLabel)
|
||||||
|
self.radioPageTitleLabel = QtWidgets.QLabel(self.radioPage)
|
||||||
|
self.radioPageTitleLayout.addWidget(self.radioPageTitleLabel)
|
||||||
|
self.radioPageTotalLabel = QtWidgets.QLabel(self.radioPage)
|
||||||
|
self.radioPageTotalLabel.setAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
|
||||||
|
self.radioPageTotalLabel.setIndent(4)
|
||||||
|
self.radioPageTotalLabel.setText('0')
|
||||||
|
self.radioPageTitleLayout.addWidget(self.radioPageTotalLabel)
|
||||||
|
self.radioPageLayout.addLayout(self.radioPageTitleLayout)
|
||||||
|
self.radioListWidget = QtWidgets.QListWidget(self.radioPage)
|
||||||
|
self.radioListWidget.setObjectName("radioListWidget")
|
||||||
|
self.radioListWidget.setSortingEnabled(True)
|
||||||
|
self.radioListWidget.setIconSize(QtCore.QSize(64, 64))
|
||||||
|
self.radioPageLayout.addWidget(self.radioListWidget)
|
||||||
|
self.stackedWidget.addWidget(self.radioPage)
|
||||||
|
# Playlist
|
||||||
|
self.playlistWidget = QtWidgets.QListWidget(self.splitter)
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.MinimumExpanding)
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.MinimumExpanding)
|
||||||
sizePolicy.setHorizontalStretch(0)
|
sizePolicy.setHorizontalStretch(0)
|
||||||
sizePolicy.setVerticalStretch(0)
|
sizePolicy.setVerticalStretch(0)
|
||||||
sizePolicy.setHeightForWidth(self.playlistListWidget.sizePolicy().hasHeightForWidth())
|
sizePolicy.setHeightForWidth(self.playlistWidget.sizePolicy().hasHeightForWidth())
|
||||||
self.playlistListWidget.setSizePolicy(sizePolicy)
|
self.playlistWidget.setSizePolicy(sizePolicy)
|
||||||
self.playlistListWidget.setObjectName("playlistListWidget")
|
self.playlistWidget.setObjectName("playlistWidget")
|
||||||
self.centralLayout.addWidget(self.splitter)
|
self.centralLayout.addWidget(self.splitter)
|
||||||
self.setCentralWidget(self.centralwidget)
|
self.setCentralWidget(self.centralwidget)
|
||||||
self.statusbar = QtWidgets.QStatusBar(self)
|
self.statusbar = QtWidgets.QStatusBar(self)
|
||||||
@ -152,8 +205,9 @@ class UiMainWindow(object):
|
|||||||
|
|
||||||
self.albumsListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.album'), '')
|
self.albumsListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.album'), '')
|
||||||
self.artistsListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.account'), '')
|
self.artistsListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.account'), '')
|
||||||
self.tracksListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.music'), '')
|
self.playlistsListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.playlist-music'), '')
|
||||||
for item in [self.albumsListItem, self.artistsListItem, self.tracksListItem]:
|
self.radiosListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.music'), '')
|
||||||
|
for item in [self.albumsListItem, self.artistsListItem, self.playlistsListItem, self.radiosListItem]:
|
||||||
self.viewListWidget.addItem(item)
|
self.viewListWidget.addItem(item)
|
||||||
|
|
||||||
self.splitter.setStretchFactor(1, 1)
|
self.splitter.setStretchFactor(1, 1)
|
||||||
@ -173,9 +227,12 @@ class UiMainWindow(object):
|
|||||||
self.settingsAction.setText(_translate("MainWindow", "&Configure"))
|
self.settingsAction.setText(_translate("MainWindow", "&Configure"))
|
||||||
self.albumsListItem.setText(_translate("MainWindow", "Albums"))
|
self.albumsListItem.setText(_translate("MainWindow", "Albums"))
|
||||||
self.albumPageTitleLabel.setText(_translate("MainWindow", "Albums"))
|
self.albumPageTitleLabel.setText(_translate("MainWindow", "Albums"))
|
||||||
self.artistPageTitleLabel.setText(_translate("MainWindow", "Artists"))
|
|
||||||
self.artistsListItem.setText(_translate("MainWindow", "Artists"))
|
self.artistsListItem.setText(_translate("MainWindow", "Artists"))
|
||||||
self.tracksListItem.setText(_translate("MainWindow", "Tracks"))
|
self.artistPageTitleLabel.setText(_translate("MainWindow", "Artists"))
|
||||||
|
self.radiosListItem.setText(_translate("MainWindow", "Radio"))
|
||||||
|
self.radioPageTitleLabel.setText(_translate("MainWindow", "Radio"))
|
||||||
|
self.playlistsListItem.setText(_translate("MainWindow", "Playlists"))
|
||||||
|
self.playlistPageTitleLabel.setText(_translate("MainWindow", "Playlists"))
|
||||||
|
|
||||||
def on_menu_button_clicked(self):
|
def on_menu_button_clicked(self):
|
||||||
pos = self.mapToGlobal(self.menuButton.geometry().bottomRight())
|
pos = self.mapToGlobal(self.menuButton.geometry().bottomRight())
|
||||||
@ -187,3 +244,12 @@ class UiMainWindow(object):
|
|||||||
|
|
||||||
def update_album_total(self, value):
|
def update_album_total(self, value):
|
||||||
self.albumPageTotalLabel.setText(str(value))
|
self.albumPageTotalLabel.setText(str(value))
|
||||||
|
|
||||||
|
def update_artist_total(self, value):
|
||||||
|
self.artistPageTotalLabel.setText(str(value))
|
||||||
|
|
||||||
|
def update_playlist_total(self, value):
|
||||||
|
self.playlistPageTotalLabel.setText(str(value))
|
||||||
|
|
||||||
|
def update_radio_total(self, value):
|
||||||
|
self.radioPageTotalLabel.setText(str(value))
|
||||||
|
@ -66,7 +66,8 @@
|
|||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset theme="expand"/>
|
<iconset theme="expand">
|
||||||
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoRaise">
|
<property name="autoRaise">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -79,7 +80,8 @@
|
|||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset theme="media-skip-backward"/>
|
<iconset theme="media-skip-backward">
|
||||||
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoRaise">
|
<property name="autoRaise">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -92,7 +94,8 @@
|
|||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset theme="media-playback-start"/>
|
<iconset theme="media-playback-start">
|
||||||
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoRaise">
|
<property name="autoRaise">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -105,7 +108,8 @@
|
|||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset theme="media-skip-forward"/>
|
<iconset theme="media-skip-forward">
|
||||||
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoRaise">
|
<property name="autoRaise">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -135,7 +139,8 @@
|
|||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset theme="media-playlist-normal"/>
|
<iconset theme="media-playlist-normal">
|
||||||
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoRaise">
|
<property name="autoRaise">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -148,7 +153,8 @@
|
|||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset theme="media-repeat-none"/>
|
<iconset theme="media-repeat-none">
|
||||||
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoRaise">
|
<property name="autoRaise">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -161,7 +167,8 @@
|
|||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset theme="player-volume"/>
|
<iconset theme="player-volume">
|
||||||
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="checkable">
|
<property name="checkable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -184,7 +191,8 @@
|
|||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset theme="menu_new"/>
|
<iconset theme="menu_new">
|
||||||
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="popupMode">
|
<property name="popupMode">
|
||||||
<enum>QToolButton::DelayedPopup</enum>
|
<enum>QToolButton::DelayedPopup</enum>
|
||||||
@ -323,7 +331,7 @@
|
|||||||
</action>
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="resources/pyfunkwhale.qrc"/>
|
<include location="playtypus.qrc"/>
|
||||||
</resources>
|
</resources>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
BIN
resources/playtypus.png
Normal file
BIN
resources/playtypus.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 56 KiB |
5
resources/playtypus.qrc
Normal file
5
resources/playtypus.qrc
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="icon">
|
||||||
|
<file>playtypus.png</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
443
resources/playtypus.svg
Normal file
443
resources/playtypus.svg
Normal file
@ -0,0 +1,443 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
viewBox="0 0 63 85"
|
||||||
|
version="1.1"
|
||||||
|
id="svg1241"
|
||||||
|
sodipodi:docname="playtypus.svg"
|
||||||
|
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
|
||||||
|
inkscape:export-filename="/home/rsnyman/Personal/playtypus/resources/playtypus.png"
|
||||||
|
inkscape:export-xdpi="578.25885"
|
||||||
|
inkscape:export-ydpi="578.25885"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview1243"
|
||||||
|
pagecolor="#505050"
|
||||||
|
bordercolor="#ffffff"
|
||||||
|
borderopacity="1"
|
||||||
|
inkscape:pageshadow="0"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="8"
|
||||||
|
inkscape:cx="47.5625"
|
||||||
|
inkscape:cy="45"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1015"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg1241" />
|
||||||
|
<defs
|
||||||
|
id="defs1198">
|
||||||
|
<radialGradient
|
||||||
|
id="imagebot_38"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
cx="414.68"
|
||||||
|
cy="-8.8805"
|
||||||
|
r="123.55"
|
||||||
|
gradientTransform="matrix(-1.2579198e-6,0.1929662,-0.42035682,0,27.525934,-18.800836)">
|
||||||
|
<stop
|
||||||
|
id="imagebot_112"
|
||||||
|
stop-color="#ffb142"
|
||||||
|
offset="0" />
|
||||||
|
<stop
|
||||||
|
id="imagebot_111"
|
||||||
|
stop-color="#ffb141"
|
||||||
|
offset=".88679" />
|
||||||
|
<stop
|
||||||
|
id="imagebot_110"
|
||||||
|
stop-color="#c87600"
|
||||||
|
offset="1" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="imagebot_17"
|
||||||
|
y2="750.53673"
|
||||||
|
y1="750.53673"
|
||||||
|
x2="655.41374"
|
||||||
|
x1="643.89647"
|
||||||
|
gradientTransform="matrix(0.26231617,0,0,0.28832116,-138.38207,-184.8834)"
|
||||||
|
gradientUnits="userSpaceOnUse">
|
||||||
|
<stop
|
||||||
|
id="imagebot_52"
|
||||||
|
stop-color="#fbb045"
|
||||||
|
offset="0" />
|
||||||
|
<stop
|
||||||
|
id="imagebot_51"
|
||||||
|
stop-color="#c77829"
|
||||||
|
offset="1" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="imagebot_2"
|
||||||
|
label="Icon">
|
||||||
|
<g
|
||||||
|
id="imagebot_39"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="5"
|
||||||
|
transform="translate(322.27 221.14)"
|
||||||
|
display="none"
|
||||||
|
stroke="#010101"
|
||||||
|
label="Icon"
|
||||||
|
fill="#fff">
|
||||||
|
<path
|
||||||
|
id="imagebot_41"
|
||||||
|
d="m201.31 36.735c6.69-16.214 17.98-18.409 17.98-18.409s-6.27 8.458-0.59 6.105c8.81-3.644 36.8 7.773 36.8 7.773s-37.09-8.633-54.19 4.531z" />
|
||||||
|
<path
|
||||||
|
id="imagebot_40"
|
||||||
|
d="m185.96 35.223c-6.69-16.214-17.98-18.409-17.98-18.409s6.28 8.457 0.59 6.105c-8.8-3.643-36.8 7.773-36.8 7.773s37.1-8.634 54.19 4.531z" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
id="imagebot_28"
|
||||||
|
d="m7.523 2.6889c3.826 0.597 12.122-2.584 14.009 7.5881 0.943 5.086 0.875 14.468-0.494 21.946-1.37 7.477-2.226 14.768 0.771 19.106 2.216 3.207-9.731-4.816-18.147-25.37-4.0923-9.994-7.7945-13.541-6.9051-16.477 0.8895-2.9359 7.31-6.8105 10.766-6.7931z"
|
||||||
|
transform="rotate(-8 15.501 41.96) matrix(1 0 0 1 6.1071 14.623)"
|
||||||
|
label="Icon"
|
||||||
|
stroke="#010101"
|
||||||
|
fill="#7f3f00" />
|
||||||
|
<title
|
||||||
|
id="title1204">Icon</title>
|
||||||
|
<line
|
||||||
|
id="imagebot_193"
|
||||||
|
stroke-linejoin="null"
|
||||||
|
y2="53.058"
|
||||||
|
stroke-opacity="null"
|
||||||
|
transform="translate(-.41943 -1.6777) matrix(1 0 0 1 -4.1943 13.841)"
|
||||||
|
y1="9.0178"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="null"
|
||||||
|
x2="34.121"
|
||||||
|
x1="8.3265"
|
||||||
|
fill="none" />
|
||||||
|
<line
|
||||||
|
id="imagebot_195"
|
||||||
|
stroke-linejoin="null"
|
||||||
|
y2="59.979"
|
||||||
|
stroke-opacity="null"
|
||||||
|
fill-opacity="null"
|
||||||
|
transform="translate(.20972 2.3069)"
|
||||||
|
y1="15.729"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="null"
|
||||||
|
stroke-dasharray="null"
|
||||||
|
x2="26.781"
|
||||||
|
x1="11.053"
|
||||||
|
fill="none" />
|
||||||
|
<line
|
||||||
|
id="imagebot_196"
|
||||||
|
stroke-linejoin="null"
|
||||||
|
y2="58.511"
|
||||||
|
stroke-opacity="null"
|
||||||
|
fill-opacity="null"
|
||||||
|
transform="translate(-1.6777 4.8234)"
|
||||||
|
y1="12.583"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="null"
|
||||||
|
stroke-dasharray="null"
|
||||||
|
x2="26.991"
|
||||||
|
x1="21.958"
|
||||||
|
fill="none" />
|
||||||
|
<line
|
||||||
|
id="imagebot_207"
|
||||||
|
stroke-linejoin="null"
|
||||||
|
y2="34.603"
|
||||||
|
fill="none"
|
||||||
|
stroke-opacity="null"
|
||||||
|
fill-opacity="null"
|
||||||
|
y1="44.669"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="null"
|
||||||
|
stroke-dasharray="null"
|
||||||
|
x2="21.958"
|
||||||
|
x1="23.007"
|
||||||
|
stroke-width="null" />
|
||||||
|
<path
|
||||||
|
id="imagebot_209"
|
||||||
|
stroke-linejoin="null"
|
||||||
|
d="m3.7127 32.506c0.2098 0 0.5157 0.064 0.6292-0.21 0.1605-0.387 0.0626-0.199 0.4194-0.419 0.3989-0.247 0.2487-0.565 0.6292-0.839 0.2406-0.174 0.4194-0.42 0.8388-0.839 0.2097-0.21 0.4087-0.272 0.6292-0.629 0.2465-0.399 0.6291-0.42 0.8388-0.629 0.2097-0.21 0.4846-0.322 0.8389-0.629 0.501-0.435 0.7746-0.516 1.0486-0.63 0.3875-0.16 0.6492-0.382 1.0482-0.629 0.357-0.22 0.42-0.419 0.629-0.419 0.42 0 0.662-0.259 1.049-0.42 0.274-0.113 0.451-0.049 0.839-0.209 0.274-0.114 0.629-0.21 0.839-0.21 0.419 0 0.66 0.11 0.839 0 0.399-0.247 0.839-0.419 1.048-0.419h0.839 1.258 1.259 1.468 1.048 0.839 1.258 0.63 0.209 0.42"
|
||||||
|
stroke-opacity="null"
|
||||||
|
fill-opacity="null"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="null"
|
||||||
|
stroke-dasharray="null"
|
||||||
|
stroke-width="null"
|
||||||
|
fill="none" />
|
||||||
|
<circle
|
||||||
|
id="imagebot_210"
|
||||||
|
stroke-linejoin="null"
|
||||||
|
stroke-width="null"
|
||||||
|
stroke-opacity="null"
|
||||||
|
fill-opacity="null"
|
||||||
|
stroke-linecap="null"
|
||||||
|
cy="25.376"
|
||||||
|
cx="19.441"
|
||||||
|
stroke-dasharray="null"
|
||||||
|
r="0INVALID"
|
||||||
|
fill="#010101" />
|
||||||
|
<path
|
||||||
|
id="imagebot_211"
|
||||||
|
stroke-linejoin="null"
|
||||||
|
d="m9.1653 40.265c0.2097 0 0.3379-0.404 0.8387-0.839 0.354-0.307 0.21-0.629 0.42-0.838 0.209-0.21 0.738-0.747 1.258-1.468 0.274-0.381 0.839-1.049 1.258-1.468 0.21-0.21 0.598-0.666 0.839-0.839 0.38-0.274 0.646-0.275 1.258-0.42 0.457-0.107 0.775-0.306 1.049-0.419 0.387-0.161 0.637-0.109 1.258-0.21 0.655-0.106 0.839-0.419 1.049-0.419h1.678 1.048 1.258 1.468 1.049c0.21 0 0.565 0.096 0.839 0.209 0.387 0.161 0.839 0 1.048 0h0.21 0.42"
|
||||||
|
stroke-opacity="null"
|
||||||
|
fill-opacity="null"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="null"
|
||||||
|
stroke-dasharray="null"
|
||||||
|
stroke-width="null"
|
||||||
|
fill="none" />
|
||||||
|
<path
|
||||||
|
id="imagebot_213"
|
||||||
|
stroke-linejoin="null"
|
||||||
|
d="m13.779 48.234c0-0.209 0.306-0.145 0.419-0.419 0.081-0.194 0.21-0.419 0.63-0.419 0.209 0 0.629-0.42 0.839-0.42 0.209 0 0.634-0.371 0.838-0.419 0.457-0.108 0.669-0.355 1.049-0.629 0.241-0.174 0.677-0.389 1.258-0.63 0.274-0.113 0.425-0.371 0.629-0.419 0.457-0.108 0.711-0.612 1.259-0.839 0.193-0.08 0.592-0.102 1.048-0.21 0.204-0.048 0.629-0.209 1.049-0.209h1.048 1.468 0.839c0.42 0 0.629 0.419 0.839 0.419h0.21"
|
||||||
|
stroke-opacity="null"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="null"
|
||||||
|
fill="none" />
|
||||||
|
</g>
|
||||||
|
<rect
|
||||||
|
id="imagebot_48"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
label="Outline"
|
||||||
|
height="83.764999"
|
||||||
|
width="83.764999"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-linecap="round"
|
||||||
|
y="-361.5835"
|
||||||
|
x="-30.3738"
|
||||||
|
stroke-width="0.835"
|
||||||
|
display="none"
|
||||||
|
fill="none" />
|
||||||
|
<rect
|
||||||
|
id="imagebot_47"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
y="-361.5835"
|
||||||
|
label="Outline"
|
||||||
|
height="83.764999"
|
||||||
|
width="83.764999"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-linecap="round"
|
||||||
|
x="69.630196"
|
||||||
|
stroke-width="0.835"
|
||||||
|
display="none"
|
||||||
|
fill="none" />
|
||||||
|
<rect
|
||||||
|
id="imagebot_46"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
y="-257.58249"
|
||||||
|
label="Outline"
|
||||||
|
height="83.764999"
|
||||||
|
width="83.764999"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-linecap="round"
|
||||||
|
x="-30.3738"
|
||||||
|
stroke-width="0.835"
|
||||||
|
display="none"
|
||||||
|
fill="none" />
|
||||||
|
<rect
|
||||||
|
id="imagebot_45"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
label="Outline"
|
||||||
|
height="83.764999"
|
||||||
|
width="83.764999"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-linecap="round"
|
||||||
|
y="-257.58249"
|
||||||
|
x="69.630196"
|
||||||
|
stroke-width="0.835"
|
||||||
|
display="none"
|
||||||
|
fill="none" />
|
||||||
|
<rect
|
||||||
|
id="imagebot_44"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
y="-303.58249"
|
||||||
|
label="Outline"
|
||||||
|
height="83.764999"
|
||||||
|
width="83.764999"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-linecap="round"
|
||||||
|
x="173.63022"
|
||||||
|
stroke-width="0.835"
|
||||||
|
display="none"
|
||||||
|
fill="none" />
|
||||||
|
<rect
|
||||||
|
id="imagebot_43"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
label="Outline"
|
||||||
|
height="83.764999"
|
||||||
|
width="83.764999"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-linecap="round"
|
||||||
|
y="-303.58249"
|
||||||
|
x="277.63022"
|
||||||
|
stroke-width="0.835"
|
||||||
|
display="none"
|
||||||
|
fill="none" />
|
||||||
|
<path
|
||||||
|
id="imagebot_174"
|
||||||
|
d="M 23.75375,71.44025 C 13.375928,72.50846 1.476716,80.90308 6.207052,82.73738 c 4.730336,1.8343 18.459532,2.5896 21.053448,0.45318 1.333644,-1.10058 3.718234,-3.84124 3.998774,-6.43084 0.28054,2.5896 2.658656,5.33026 3.9923,6.43084 2.593916,2.13642 16.329586,1.38112 21.059922,-0.45318 C 61.041832,80.90308 49.140462,72.50846 38.764798,71.44025 33.42159,71.94738 31.50097,73.7601 31.259274,75.8102 31.017578,73.7601 29.096958,71.94738 23.75375,71.44025 Z"
|
||||||
|
fill-rule="evenodd"
|
||||||
|
label="Icon"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-width="1.079"
|
||||||
|
fill="url(#imagebot_38)"
|
||||||
|
style="fill:url(#imagebot_38)" />
|
||||||
|
<path
|
||||||
|
id="imagebot_175"
|
||||||
|
d="M 23.755908,71.442408 C 18.663028,71.96896 13.207604,74.25644 9.526056,76.6734 c 5.574114,2.56802 12.391236,4.16494 19.77807,4.33758 0.947362,-1.23006 1.795456,-2.76224 1.957306,-4.25126 0.159692,1.46744 0.986206,2.97804 1.92062,4.22968 C 40.450196,80.68728 47.12489,79.00404 52.556576,76.39286 48.890134,74.0838 43.6613,71.94738 38.766956,71.442408 33.423748,71.94738 31.50097,73.7601 31.261432,75.8102 31.019736,73.7601 29.099116,71.94738 23.755908,71.442408 Z"
|
||||||
|
fill-opacity="0.31373"
|
||||||
|
fill-rule="evenodd"
|
||||||
|
label="Icon"
|
||||||
|
style="stroke-width:0.2158" />
|
||||||
|
<path
|
||||||
|
id="imagebot_176"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M 54.997,56.299 C 55.001,69.356 44.417,79.944 31.36,79.944 18.302,79.944 7.718,69.356 7.722,56.299 7.7184,43.242 18.302,32.655 31.36,32.655 44.417,32.654 55.001,43.242 54.997,56.299 Z"
|
||||||
|
label="Icon"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="round"
|
||||||
|
fill="#00bfbf"
|
||||||
|
style="fill:#009fe3;fill-opacity:1" />
|
||||||
|
<path
|
||||||
|
id="imagebot_177"
|
||||||
|
d="m 53.57731,48.196432 c 0.01726,0.364702 0.0259,0.73372 0.0259,1.10058 0,13.047268 -10.587148,23.643048 -23.636574,23.643048 -10.198708,0 -18.901922,-6.480474 -22.212294,-15.5376 0.57187,12.540138 10.934586,22.5511 23.614994,22.5511 13.049426,0 23.636574,-10.59578 23.636574,-23.643048 0,-2.84856 -0.502814,-5.582746 -1.428596,-8.11408 z"
|
||||||
|
fill-opacity="0.3137"
|
||||||
|
label="Icon"
|
||||||
|
fill="#010101"
|
||||||
|
style="stroke-width:0.2158;fill:#010101;fill-opacity:0.25999999" />
|
||||||
|
<path
|
||||||
|
id="imagebot_178"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="m 20.59699,43.759768 c 5.349682,-3.845556 3.877926,-12.652354 3.877926,-12.652354 l 12.686882,-0.746668 c 0,0 -0.325858,9.288032 5.133882,13.200486"
|
||||||
|
label="Icon"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-width="0.8632"
|
||||||
|
fill="#00bfbf"
|
||||||
|
style="fill:#009fe3;fill-opacity:1" />
|
||||||
|
<path
|
||||||
|
id="imagebot_179"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M 41.979524,10.271546 C 39.169808,8.294818 35.604792,7.133814 31.416114,7.133814 c -3.80887,0 -7.060976,0.90636 -9.698052,2.479542 -3.014726,2.084628 -5.43816,5.11446 -6.922864,8.711846 -0.684086,2.004782 -1.040156,4.18652 -1.040156,6.471842 0,9.747686 12.112854,17.661072 17.661072,17.661072 5.766176,0 17.66323,-7.913386 17.66323,-17.661072 0,-2.354378 -0.394914,-4.600856 -1.145898,-6.655272 -1.33796,-3.157154 -3.401008,-5.867602 -5.953922,-7.870226 z"
|
||||||
|
label="Icon"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-width="0.8632"
|
||||||
|
fill="#00bfbf"
|
||||||
|
style="fill:#009fe3;fill-opacity:1" />
|
||||||
|
<path
|
||||||
|
id="imagebot_180"
|
||||||
|
d="m 31.390762,23.64954 c -3.066378,0 -6.402267,3.212134 -6.267511,5.241718 1.839826,7.18605 -5.953998,10.486187 6.669027,10.486187 12.620276,0 3.426643,-6.47927 5.733989,-10.653944 -0.132005,-2.367848 -4.133422,-5.244468 -6.135505,-5.073961 z"
|
||||||
|
label="Icon"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-width="1.10005"
|
||||||
|
fill="url(#imagebot_17)"
|
||||||
|
style="fill:url(#imagebot_17)" />
|
||||||
|
<g
|
||||||
|
id="imagebot_181"
|
||||||
|
transform="matrix(0.2158,0,0,0.2158,-10.42572,7.74843)"
|
||||||
|
label="Icon">
|
||||||
|
<path
|
||||||
|
id="imagebot_182"
|
||||||
|
d="m 171.65,31.18 c -15.75,0 -28.54,14.788 -28.54,33.009 0,18.221 12.79,33.008 28.54,33.008 9.26,0 17.47,-5.112 22.68,-13.022 5.21,7.916 13.44,13.022 22.7,13.022 15.75,0 28.54,-14.788 28.54,-33.008 0,-18.222 -12.79,-33.009 -28.54,-33.009 -9.25,0 -17.49,5.108 -22.7,13.023 C 189.12,36.295 180.9,31.18 171.65,31.18 Z"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-width="5"
|
||||||
|
fill="#ffffff" />
|
||||||
|
<g
|
||||||
|
id="imagebot_183">
|
||||||
|
<path
|
||||||
|
id="imagebot_184"
|
||||||
|
d="m 192.53,66.423 c 0,4.563 -3.7,8.261 -8.26,8.261 -4.56,0 -8.26,-3.699 -8.26,-8.261 0,-4.563 3.7,-8.262 8.26,-8.262 4.56,0 8.26,3.699 8.26,8.262 z"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-width="3.1693"
|
||||||
|
fill="#010101" />
|
||||||
|
<path
|
||||||
|
id="imagebot_185"
|
||||||
|
d="m 183.43,63.529 c 0,1.184 -0.96,2.143 -2.14,2.143 -1.19,0 -2.15,-0.959 -2.15,-2.143 0,-1.184 0.96,-2.144 2.15,-2.144 1.18,0 2.14,0.961 2.14,2.144 z"
|
||||||
|
fill="#ffffff" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="imagebot_186">
|
||||||
|
<path
|
||||||
|
id="imagebot_187"
|
||||||
|
d="m 213.45,66.423 c 0,4.563 -3.7,8.261 -8.26,8.261 -4.56,0 -8.26,-3.699 -8.26,-8.261 0,-4.563 3.7,-8.262 8.26,-8.262 4.56,0 8.26,3.699 8.26,8.262 z"
|
||||||
|
stroke="#010101"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-width="3.1693"
|
||||||
|
fill="#010101" />
|
||||||
|
<path
|
||||||
|
id="imagebot_188"
|
||||||
|
d="m 204.35,63.529 c 0,1.184 -0.96,2.143 -2.14,2.143 -1.19,0 -2.14,-0.959 -2.14,-2.143 0,-1.184 0.95,-2.144 2.14,-2.144 1.18,0.001 2.14,0.961 2.14,2.144 z"
|
||||||
|
fill="#ffffff" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<metadata
|
||||||
|
id="metadata1239">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work>
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<cc:license
|
||||||
|
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
|
||||||
|
<dc:publisher>
|
||||||
|
<cc:Agent
|
||||||
|
rdf:about="http://openclipart.org/">
|
||||||
|
<dc:title>Openclipart</dc:title>
|
||||||
|
</cc:Agent>
|
||||||
|
</dc:publisher>
|
||||||
|
<dc:date>2013-04-27T21:31:33</dc:date>
|
||||||
|
<dc:description>Teal platypus remix of Cartoon Beaver</dc:description>
|
||||||
|
<dc:source>https://openclipart.org/detail/177496/cartoon-platypus-teal-by-apaulcalypse-177496</dc:source>
|
||||||
|
<dc:creator>
|
||||||
|
<cc:Agent>
|
||||||
|
<dc:title>aPAULcalypse</dc:title>
|
||||||
|
</cc:Agent>
|
||||||
|
</dc:creator>
|
||||||
|
<dc:subject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>animal</rdf:li>
|
||||||
|
<rdf:li>blue</rdf:li>
|
||||||
|
<rdf:li>cartoon</rdf:li>
|
||||||
|
<rdf:li>cute</rdf:li>
|
||||||
|
<rdf:li>mammal</rdf:li>
|
||||||
|
<rdf:li>platypus</rdf:li>
|
||||||
|
<rdf:li>remix</rdf:li>
|
||||||
|
<rdf:li>teal</rdf:li>
|
||||||
|
<rdf:li>water</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</dc:subject>
|
||||||
|
</cc:Work>
|
||||||
|
<cc:License
|
||||||
|
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||||
|
</cc:License>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<path
|
||||||
|
sodipodi:type="star"
|
||||||
|
style="fill:#000000;fill-opacity:1;stroke-width:18.8976;stroke-linejoin:round"
|
||||||
|
id="path10949"
|
||||||
|
inkscape:flatsided="true"
|
||||||
|
sodipodi:sides="3"
|
||||||
|
sodipodi:cx="31.4475"
|
||||||
|
sodipodi:cy="58.2995"
|
||||||
|
sodipodi:r1="15.647996"
|
||||||
|
sodipodi:r2="7.823998"
|
||||||
|
sodipodi:arg1="0"
|
||||||
|
sodipodi:arg2="1.0471976"
|
||||||
|
inkscape:rounded="0"
|
||||||
|
inkscape:randomized="0"
|
||||||
|
d="m 47.095496,58.2995 -23.471994,13.551562 0,-27.103124 z"
|
||||||
|
inkscape:transform-center-x="-3.9119989" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 16 KiB |
@ -1,23 +0,0 @@
|
|||||||
<RCC>
|
|
||||||
<qresource prefix="playback">
|
|
||||||
<file>media-playback-start.svg</file>
|
|
||||||
<file>media-playback-pause.svg</file>
|
|
||||||
<file>media-playback-stop.svg</file>
|
|
||||||
<file>media-playlist-normal.svg</file>
|
|
||||||
<file>media-playlist-repeat.svg</file>
|
|
||||||
<file>media-playlist-shuffle.svg</file>
|
|
||||||
<file>media-repeat-none.svg</file>
|
|
||||||
<file>media-repeat-single.svg</file>
|
|
||||||
<file>media-seek-backward.svg</file>
|
|
||||||
<file>media-seek-forward.svg</file>
|
|
||||||
<file>media-skip-backward.svg</file>
|
|
||||||
<file>media-skip-forward.svg</file>
|
|
||||||
<file>media-album-track.svg</file>
|
|
||||||
<file>media-album-cover-manager-amarok.svg</file>
|
|
||||||
<file>media-playlist-append.svg</file>
|
|
||||||
</qresource>
|
|
||||||
<qresource prefix="general">
|
|
||||||
<file>menu_new.svg</file>
|
|
||||||
<file>speaker.svg</file>
|
|
||||||
</qresource>
|
|
||||||
</RCC>
|
|
Loading…
Reference in New Issue
Block a user