Add logo and load authors and playlists

This commit is contained in:
Raoul Snyman 2021-07-01 13:55:09 -07:00
parent cb979e162b
commit 5a97e5e102
10 changed files with 4314 additions and 85 deletions

View File

@ -1,11 +1,15 @@
import qtawesome as qta
from PyQt5 import QtGui, QtWidgets
from playtypus.mainwindow import MainWindow
from playtypus.resources import init_resources, cleanup_resources
def main():
"""Main"""
init_resources()
app = QtWidgets.QApplication([])
app.setWindowIcon(QtGui.QIcon(":/icon/playtypus.png"))
# Set up icon colours
palette = app.palette()
qta.set_defaults(color=palette.color(QtGui.QPalette.Active,
@ -15,4 +19,6 @@ def main():
# Create the main window and run the app
main_window = MainWindow()
main_window.show()
return app.exec()
result = app.exec()
cleanup_resources()
return result

View File

@ -4,7 +4,7 @@ from PyQt5 import QtCore, QtWidgets
from playtypus.ui_mainwindow import UiMainWindow
from playtypus.settingsdialog import SettingsDialog
from playtypus.threads import AlbumWorker
from playtypus.threads import AlbumWorker, ArtistWorker, PlaylistWorker, RadioWorker
class MainWindow(QtWidgets.QMainWindow, UiMainWindow):
@ -102,7 +102,8 @@ class MainWindow(QtWidgets.QMainWindow, UiMainWindow):
self.funkwhale.login(username, password)
if self.is_funkwhale_active:
self.load_albums()
# self.load_artists()
self.load_artists()
self.load_playlists()
def load_albums(self):
if not self.is_funkwhale_active:
@ -114,9 +115,23 @@ class MainWindow(QtWidgets.QMainWindow, UiMainWindow):
def load_artists(self):
if not self.is_funkwhale_active:
return
self.artistListWidget.clear()
for artist in self.funkwhale.artists.list()['results']:
self.artistListWidget.addItem(QtWidgets.QListWidgetItem(artist['name']))
worker = ArtistWorker()
worker.window = self
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):
self.settings_dialog.server_url = self.settings.value('funkwhale/server_url', '')

3625
playtypus/resources.py Normal file

File diff suppressed because it is too large Load Diff

View File

@ -23,29 +23,6 @@ class ThreadWorker(QtCore.QObject):
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):
"""
A thread worker to fetch the album art
@ -66,6 +43,7 @@ class AlbumWorker(ThreadWorker):
'artist': album['artist']['name']
}
album_item = QtWidgets.QListWidgetItem(self.ALBUM_TEMPLATE.format(**details))
album_item.setData(QtCore.Qt.UserRole, album)
self.window.albumListWidget.addItem(album_item)
if album['cover'] and album['cover'].get('urls') and album['cover']['urls'].get('medium_square_crop'):
artwork_worker = AlbumArtWorker()
@ -76,3 +54,109 @@ class AlbumWorker(ThreadWorker):
album_item.setIcon(qta.icon('mdi.album'))
self.window.update_album_total(self.window.albumListWidget.count())
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()

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
import qtawesome as qta
from PyQt5 import QtCore, QtWidgets
from PyQt5 import QtCore, QtGui, QtWidgets
LIST_WIDGET_STYLES = """
QListWidget {
@ -11,6 +11,7 @@ QListWidget {
class UiMainWindow(object):
def setup_ui(self):
self.setWindowIcon(QtGui.QIcon(":/icon/playtypus.png"))
self.setObjectName("MainWindow")
self.resize(719, 574)
self.setStyleSheet(LIST_WIDGET_STYLES)
@ -72,6 +73,7 @@ class UiMainWindow(object):
self.viewListWidget.setObjectName("viewListWidget")
self.stackedWidget = QtWidgets.QStackedWidget(self.splitter)
self.stackedWidget.setObjectName("stackedWidget")
# Albums page
self.albumPage = QtWidgets.QWidget()
self.albumPage.setObjectName("albumPage")
self.albumPageLayout = QtWidgets.QVBoxLayout(self.albumPage)
@ -100,6 +102,7 @@ class UiMainWindow(object):
self.albumListWidget.setIconSize(QtCore.QSize(100, 100))
self.albumPageLayout.addWidget(self.albumListWidget)
self.stackedWidget.addWidget(self.albumPage)
# Artists page
self.artistPage = QtWidgets.QWidget()
self.artistPage.setObjectName("artistPage")
self.artistPageLayout = QtWidgets.QVBoxLayout(self.artistPage)
@ -116,34 +119,84 @@ class UiMainWindow(object):
self.artistPageTitleLayout.addWidget(self.artistPageIconLabel)
self.artistPageTitleLabel = QtWidgets.QLabel(self.artistPage)
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.artistListWidget = QtWidgets.QListWidget(self.artistPage)
self.artistListWidget.setObjectName("artistListWidget")
self.artistListWidget.setSortingEnabled(True)
self.artistListWidget.setViewMode(QtWidgets.QListView.IconMode)
self.artistListWidget.setMovement(QtWidgets.QListView.Static)
self.artistListWidget.setIconSize(QtCore.QSize(100, 100))
self.artistPageLayout.addWidget(self.artistListWidget)
self.stackedWidget.addWidget(self.artistPage)
self.trackPage = QtWidgets.QWidget()
self.trackPage.setObjectName("trackPage")
self.trackPageLayout = QtWidgets.QVBoxLayout(self.trackPage)
self.trackPageLayout.setContentsMargins(0, 0, 0, 0)
self.trackPageLayout.setSpacing(0)
self.trackPageLayout.setObjectName("trackPageLayout")
self.trackListWidget = QtWidgets.QListWidget(self.trackPage)
self.trackListWidget.setObjectName("trackListWidget")
self.trackListWidget.setSortingEnabled(True)
self.trackListWidget.setViewMode(QtWidgets.QListView.IconMode)
self.trackListWidget.setMovement(QtWidgets.QListView.Static)
self.trackPageLayout.addWidget(self.trackListWidget)
self.stackedWidget.addWidget(self.trackPage)
self.playlistListWidget = QtWidgets.QListWidget(self.splitter)
# Playlists page
self.playlistPage = QtWidgets.QWidget()
self.playlistPage.setObjectName("playlistPage")
self.playlistPageLayout = QtWidgets.QVBoxLayout(self.playlistPage)
self.playlistPageLayout.setContentsMargins(0, 0, 0, 0)
self.playlistPageLayout.setSpacing(0)
self.playlistPageLayout.setObjectName("playlistPageLayout")
self.playlistPageTitleLayout = QtWidgets.QHBoxLayout()
self.playlistPageTitleLayout.setContentsMargins(0, 0, 0, 0)
self.playlistPageTitleLayout.setSpacing(0)
self.playlistPageTitleLayout.setObjectName("playlistPageTitleLayout")
self.playlistPageIconLabel = QtWidgets.QLabel(self.playlistPage)
self.playlistPageIconLabel.setMaximumSize(36, 36)
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.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.playlistListWidget.sizePolicy().hasHeightForWidth())
self.playlistListWidget.setSizePolicy(sizePolicy)
self.playlistListWidget.setObjectName("playlistListWidget")
sizePolicy.setHeightForWidth(self.playlistWidget.sizePolicy().hasHeightForWidth())
self.playlistWidget.setSizePolicy(sizePolicy)
self.playlistWidget.setObjectName("playlistWidget")
self.centralLayout.addWidget(self.splitter)
self.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(self)
@ -152,8 +205,9 @@ class UiMainWindow(object):
self.albumsListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.album'), '')
self.artistsListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.account'), '')
self.tracksListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.music'), '')
for item in [self.albumsListItem, self.artistsListItem, self.tracksListItem]:
self.playlistsListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.playlist-music'), '')
self.radiosListItem = QtWidgets.QListWidgetItem(qta.icon('mdi.music'), '')
for item in [self.albumsListItem, self.artistsListItem, self.playlistsListItem, self.radiosListItem]:
self.viewListWidget.addItem(item)
self.splitter.setStretchFactor(1, 1)
@ -173,9 +227,12 @@ class UiMainWindow(object):
self.settingsAction.setText(_translate("MainWindow", "&Configure"))
self.albumsListItem.setText(_translate("MainWindow", "Albums"))
self.albumPageTitleLabel.setText(_translate("MainWindow", "Albums"))
self.artistPageTitleLabel.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):
pos = self.mapToGlobal(self.menuButton.geometry().bottomRight())
@ -187,3 +244,12 @@ class UiMainWindow(object):
def update_album_total(self, 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))

View File

@ -66,7 +66,8 @@
<string>...</string>
</property>
<property name="icon">
<iconset theme="expand"/>
<iconset theme="expand">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
@ -79,7 +80,8 @@
<string>...</string>
</property>
<property name="icon">
<iconset theme="media-skip-backward"/>
<iconset theme="media-skip-backward">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
@ -92,7 +94,8 @@
<string>...</string>
</property>
<property name="icon">
<iconset theme="media-playback-start"/>
<iconset theme="media-playback-start">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
@ -105,7 +108,8 @@
<string>...</string>
</property>
<property name="icon">
<iconset theme="media-skip-forward"/>
<iconset theme="media-skip-forward">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
@ -135,7 +139,8 @@
<string>...</string>
</property>
<property name="icon">
<iconset theme="media-playlist-normal"/>
<iconset theme="media-playlist-normal">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
@ -148,7 +153,8 @@
<string>...</string>
</property>
<property name="icon">
<iconset theme="media-repeat-none"/>
<iconset theme="media-repeat-none">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
@ -161,7 +167,8 @@
<string>...</string>
</property>
<property name="icon">
<iconset theme="player-volume"/>
<iconset theme="player-volume">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="checkable">
<bool>true</bool>
@ -184,7 +191,8 @@
<string>...</string>
</property>
<property name="icon">
<iconset theme="menu_new"/>
<iconset theme="menu_new">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="popupMode">
<enum>QToolButton::DelayedPopup</enum>
@ -323,7 +331,7 @@
</action>
</widget>
<resources>
<include location="resources/pyfunkwhale.qrc"/>
<include location="playtypus.qrc"/>
</resources>
<connections/>
</ui>

BIN
resources/playtypus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

5
resources/playtypus.qrc Normal file
View File

@ -0,0 +1,5 @@
<RCC>
<qresource prefix="icon">
<file>playtypus.png</file>
</qresource>
</RCC>

443
resources/playtypus.svg Normal file
View 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

View File

@ -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>