Procházet zdrojové kódy

Code fixes
Do not use backend anymore

Ander před 11 roky
rodič
revize
d8839a5559

+ 5 - 9
mopidy_touchscreen/__init__.py

@@ -2,11 +2,9 @@ from __future__ import unicode_literals
 
 import logging
 import os
-
 from mopidy import config, ext
 
 from .touch_screen import TouchScreen
-from .touch_screen_backend import TouchScreenBackend
 
 
 __version__ = '0.2.2'
@@ -21,7 +19,8 @@ class Extension(ext.Extension):
     version = __version__
 
     def get_default_config(self):
-        conf_file = os.path.join(os.path.dirname(__file__), 'ext.conf')
+        conf_file = os.path.join(os.path.dirname(__file__),
+                                 'ext.conf')
         return config.read(conf_file)
 
     def get_config_schema(self):
@@ -37,13 +36,10 @@ class Extension(ext.Extension):
         schema['gpio_up'] = config.Integer()
         schema['gpio_down'] = config.Integer()
         schema['gpio_enter'] = config.Integer()
-	schema['sdl_fbdev'] = config.String()
-	schema['sdl_mousdrv'] = config.String()
-	schema['sdl_mousedev'] = config.String()
+        schema['sdl_fbdev'] = config.String()
+        schema['sdl_mousdrv'] = config.String()
+        schema['sdl_mousedev'] = config.String()
         return schema
 
     def setup(self, registry):
         registry.add('frontend', TouchScreen)
-
-        # Backend used for controling volume
-        registry.add('backend', TouchScreenBackend)

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 685 - 596
mopidy_touchscreen/fonts/icomoon/demo.html


+ 1069 - 1069
mopidy_touchscreen/fonts/icomoon/selection.json

@@ -1,1071 +1,1071 @@
 {
-	"IcoMoonType": "selection",
-	"icons": [
-		{
-			"icon": {
-				"paths": [
-					"M320 192l704-192v64 128 544c0 88.366-100.29 160-224 160s-224-71.634-224-160c0-88.366 100.29-160 224-160 34.358 0 66.902 5.532 96 15.406v-329.588l-448 122.182v480c0 88.366-100.288 160-224 160-123.712 0-224-71.634-224-160 0-88.366 100.288-160 224-160 34.358 0 66.902 5.532 96 15.406v-335.406-192z"
-				],
-				"tags": [
-					"music",
-					"song",
-					"audio",
-					"sound"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 16,
-				"order": 1,
-				"prevSize": 32,
-				"code": 58880,
-				"name": "music",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 16
-		},
-		{
-			"icon": {
-				"paths": [
-					"M192 578.286v443.43c10.454 1.496 21.134 2.286 32 2.286h32v-448.002h-32c-10.866 0-21.546 0.79-32 2.286zM768 576v448h32c10.868 0 21.546-0.79 32-2.286v-443.428c-10.454-1.496-21.132-2.286-32-2.286h-32zM1024 512c0-282.77-229.23-512-512-512s-512 229.23-512 512c0 61.418 10.828 120.306 30.656 174.874-19.472 33.202-30.656 71.852-30.656 113.126 0 89.354 52.326 166.478 128 202.432v-404.864c-20.126 9.562-38.58 22.060-54.858 36.904-5.992-29.22-9.142-59.478-9.142-90.472 0-247.424 200.576-448 448-448s448 200.576 448 448c0 30.994-3.148 61.252-9.142 90.472-16.28-14.844-34.73-27.342-54.858-36.904v404.864c75.676-35.954 128-113.078 128-202.432 0-41.274-11.184-79.924-30.656-113.126 19.828-54.568 30.656-113.456 30.656-174.874z"
-				],
-				"tags": [
-					"headphones",
-					"headset",
-					"music",
-					"song",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 17,
-				"order": 2,
-				"prevSize": 32,
-				"code": 58881,
-				"name": "headphones",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 17
-		},
-		{
-			"icon": {
-				"paths": [
-					"M640 576c105.87 0 201.87 43.066 271.402 112.598l-90.468 90.468c-46.354-46.356-110.356-75.066-180.934-75.066s-134.578 28.71-180.934 75.066l-90.468-90.468c69.532-69.532 165.532-112.598 271.402-112.598zM187.452 507.452c120.88-120.88 281.598-187.452 452.548-187.452s331.668 66.572 452.55 187.452l-90.51 90.508c-96.706-96.704-225.28-149.96-362.040-149.96-136.762 0-265.334 53.256-362.038 149.962l-90.51-90.51zM988.784 134.438c106.702 45.132 202.516 109.728 284.782 191.996v0l-90.508 90.508c-145.056-145.056-337.92-224.942-543.058-224.942-205.14 0-398 79.886-543.058 224.942l-90.51-90.51c82.268-82.266 178.082-146.862 284.784-191.994 110.504-46.738 227.852-70.438 348.784-70.438 120.932 0 238.278 23.7 348.784 70.438zM576 896c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64z"
-				],
-				"width": 1280,
-				"tags": [
-					"connection",
-					"broadcast",
-					"wifi",
-					"wave",
-					"feed"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 28,
-				"order": 3,
-				"prevSize": 32,
-				"code": 58882,
-				"name": "connection",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 28
-		},
-		{
-			"icon": {
-				"paths": [
-					"M896 128v832h-672c-53.022 0-96-42.98-96-96 0-53.018 42.978-96 96-96h608v-768h-640c-70.398 0-128 57.6-128 128v768c0 70.4 57.602 128 128 128h768v-896h-64zM256 832h576v64h-576z"
-				],
-				"tags": [
-					"book",
-					"reading"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 31,
-				"order": 5,
-				"prevSize": 32,
-				"code": 58883,
-				"name": "book",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 31
-		},
-		{
-			"icon": {
-				"paths": [
-					"M576.234 289.27l242.712-81.432 203.584 606.784-242.712 81.432zM0 896h256v-704h-256v704zM64 320h128v64h-128v-64zM320 896h256v-704h-256v704zM384 320h128v64h-128v-64z"
-				],
-				"tags": [
-					"books",
-					"library",
-					"archive"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 32,
-				"order": 4,
-				"prevSize": 32,
-				"code": 58884,
-				"name": "books",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 32
-		},
-		{
-			"icon": {
-				"paths": [
-					"M864 0h-768c-52.8 0-96 43.2-96 96v832c0 52.8 43.2 96 96 96h768c52.8 0 96-43.2 96-96v-832c0-52.8-43.2-96-96-96zM832 896h-704v-768h704v768zM256 448h448v64h-448zM256 576h448v64h-448zM256 704h448v64h-448zM256 320h448v64h-448z"
-				],
-				"tags": [
-					"file",
-					"list",
-					"paper",
-					"page",
-					"document"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 34,
-				"order": 6,
-				"prevSize": 32,
-				"code": 58885,
-				"name": "file",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 34
-		},
-		{
-			"icon": {
-				"paths": [
-					"M0 320h1024l-64 640h-896l-64-640zM928 192l32 64h-896l64-128h352l32 64h416z"
-				],
-				"tags": [
-					"folder",
-					"directory",
-					"category",
-					"browse"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 46,
-				"order": 7,
-				"prevSize": 32,
-				"code": 58886,
-				"name": "folder",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 46
-		},
-		{
-			"icon": {
-				"paths": [
-					"M832 960l192-512h-832l-192 512zM128 384l-128 576v-832h288l128 128h416v128z"
-				],
-				"tags": [
-					"folder-open",
-					"directory",
-					"category",
-					"browse"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 47,
-				"order": 8,
-				"prevSize": 32,
-				"code": 58887,
-				"name": "folder-open",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 47
-		},
-		{
-			"icon": {
-				"paths": [
-					"M704 0h-384l-192 128v256h768v-256l-192-128zM640 320h-64v-42.666c0-11.734-9.6-21.334-21.334-21.334h-85.332c-11.732 0-21.334 9.6-21.334 21.334l-0 42.666h-64v-106.666c0-11.734 9.602-21.334 21.334-21.334h213.33c11.734 0 21.336 9.6 21.336 21.334v106.666zM128 704.002h768v-256.002h-768v256.002zM384 533.332c0-11.734 9.602-21.332 21.334-21.332h213.33c11.734 0 21.336 9.598 21.336 21.332v106.668h-64v-42.668c0-11.734-9.6-21.332-21.334-21.332h-85.332c-11.732 0-21.334 9.598-21.334 21.332l-0 42.668h-64v-106.668zM128 1024h768v-255.998h-768v255.998zM384 853.332c0-11.734 9.602-21.332 21.334-21.332h213.33c11.734 0 21.336 9.598 21.336 21.332v106.668h-64v-42.668c0-11.734-9.6-21.332-21.334-21.332h-85.332c-11.732 0-21.334 9.598-21.334 21.332l-0 42.668h-64v-106.668z"
-				],
-				"tags": [
-					"cabinet",
-					"storage",
-					"drawer",
-					"archive",
-					"office"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 88,
-				"order": 9,
-				"prevSize": 32,
-				"code": 58888,
-				"name": "cabinet",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 88
-		},
-		{
-			"icon": {
-				"paths": [
-					"M1024 384h-384l143.53-143.53c-72.53-72.526-168.96-112.47-271.53-112.47-102.57 0-199 39.944-271.53 112.47-72.526 72.53-112.47 168.96-112.47 271.53 0 102.57 39.944 199 112.47 271.53 72.53 72.526 168.96 112.47 271.53 112.47 102.57 0 199-39.944 271.528-112.472 6.056-6.054 11.86-12.292 17.456-18.668l96.32 84.282c-93.846 107.166-231.664 174.858-385.304 174.858-282.77 0-512-229.23-512-512 0-282.77 229.23-512 512-512 141.386 0 269.368 57.326 362.016 149.984l149.984-149.984v384z"
-				],
-				"tags": [
-					"spinner",
-					"loading",
-					"busy",
-					"wait",
-					"wheel",
-					"repeat"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 125,
-				"order": 12,
-				"prevSize": 32,
-				"code": 58889,
-				"name": "spinner",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 125
-		},
-		{
-			"icon": {
-				"paths": [
-					"M933.79 610.25c-53.726-93.054-21.416-212.304 72.152-266.488l-100.626-174.292c-28.75 16.854-62.176 26.518-97.846 26.518-107.536 0-194.708-87.746-194.708-195.99l-201.258 0c0.266 33.41-8.074 67.282-25.958 98.252-53.724 93.056-173.156 124.702-266.862 70.758l-100.624 174.292c28.97 16.472 54.050 40.588 71.886 71.478 53.638 92.908 21.512 211.92-71.708 266.224l100.626 174.292c28.65-16.696 61.916-26.254 97.4-26.254 107.196 0 194.144 87.192 194.7 194.958h201.254c-0.086-33.074 8.272-66.57 25.966-97.218 53.636-92.906 172.776-124.594 266.414-71.012l100.626-174.29c-28.78-16.466-53.692-40.498-71.434-71.228zM512 719.332c-114.508 0-207.336-92.824-207.336-207.334 0-114.508 92.826-207.334 207.336-207.334 114.508 0 207.332 92.826 207.332 207.334-0.002 114.51-92.824 207.334-207.332 207.334z"
-				],
-				"tags": [
-					"cog",
-					"preferences",
-					"settings",
-					"gear",
-					"generate",
-					"control",
-					"options"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 142,
-				"order": 10,
-				"prevSize": 32,
-				"code": 58890,
-				"name": "cog",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 142
-		},
-		{
-			"icon": {
-				"paths": [
-					"M640 146.588v135.958c36.206 15.804 69.5 38.408 98.274 67.18 60.442 60.44 93.726 140.8 93.726 226.274s-33.286 165.834-93.726 226.274c-60.44 60.44-140.798 93.726-226.274 93.726s-165.834-33.286-226.274-93.726c-60.44-60.44-93.726-140.8-93.726-226.274s33.286-165.834 93.726-226.274c28.774-28.774 62.068-51.378 98.274-67.182v-135.956c-185.048 55.080-320 226.472-320 429.412 0 247.424 200.578 448 448 448 247.424 0 448-200.576 448-448 0-202.94-134.95-374.332-320-429.412zM448 0h128v512h-128z"
-				],
-				"tags": [
-					"switch",
-					"power",
-					"turn off",
-					"off",
-					"shutdown"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 177,
-				"order": 11,
-				"prevSize": 32,
-				"code": 58891,
-				"name": "switch",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 177
-		},
-		{
-			"icon": {
-				"paths": [
-					"M0 0h256v256h-256zM384 64h640v128h-640zM0 384h256v256h-256zM384 448h640v128h-640zM0 768h256v256h-256zM384 832h640v128h-640z"
-				],
-				"tags": [
-					"list",
-					"bullet",
-					"ul",
-					"todo",
-					"menu"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 180,
-				"order": 13,
-				"prevSize": 32,
-				"code": 58892,
-				"name": "list",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 180
-		},
-		{
-			"icon": {
-				"paths": [
-					"M384 64h640v128h-640v-128zM384 448h640v128h-640v-128zM384 832h640v128h-640v-128zM0 128c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128zM0 512c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128zM0 896c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128z"
-				],
-				"tags": [
-					"list",
-					"bullet",
-					"ul",
-					"todo",
-					"menu"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 181,
-				"order": 14,
-				"prevSize": 32,
-				"code": 58893,
-				"name": "list2",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 181
-		},
-		{
-			"icon": {
-				"paths": [
-					"M384 832h640v128h-640zM384 448h640v128h-640zM384 64h640v128h-640zM192 0v256h-64v-192h-64v-64zM128 526v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM256 704v320h-192v-64h128v-64h-128v-64h128v-64h-128v-64z"
-				],
-				"tags": [
-					"numbered-list",
-					"list",
-					"items",
-					"nl"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 182,
-				"order": 15,
-				"prevSize": 32,
-				"code": 58894,
-				"name": "numbered-list",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 182
-		},
-		{
-			"icon": {
-				"paths": [
-					"M64 192h896v192h-896zM64 448h896v192h-896zM64 704h896v192h-896z"
-				],
-				"tags": [
-					"menu",
-					"list",
-					"items",
-					"lines",
-					"options"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 184,
-				"order": 16,
-				"prevSize": 32,
-				"code": 58895,
-				"name": "menu",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 184
-		},
-		{
-			"icon": {
-				"paths": [
-					"M1024 736 736 0h-448l-288 288v448l288 288h448l288-288v-448l-288-288zM576 832h-128v-128h128v128zM576 576h-128v-384h128v384z"
-				],
-				"tags": [
-					"spam",
-					"notice",
-					"notification",
-					"exclamation"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 252,
-				"order": 17,
-				"prevSize": 32,
-				"code": 58896,
-				"name": "spam",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 252
-		},
-		{
-			"icon": {
-				"paths": [
-					"M1014.662 822.66c-0.004-0.004-0.008-0.008-0.012-0.010l-310.644-310.65 310.644-310.65c0.004-0.004 0.008-0.006 0.012-0.010 3.344-3.346 5.762-7.254 7.312-11.416 4.246-11.376 1.824-24.682-7.324-33.83l-146.746-146.746c-9.148-9.146-22.45-11.566-33.828-7.32-4.16 1.55-8.070 3.968-11.418 7.31 0 0.004-0.004 0.006-0.008 0.010l-310.648 310.652-310.648-310.65c-0.004-0.004-0.006-0.006-0.010-0.010-3.346-3.342-7.254-5.76-11.414-7.31-11.38-4.248-24.682-1.826-33.83 7.32l-146.748 146.748c-9.148 9.148-11.568 22.452-7.322 33.828 1.552 4.16 3.97 8.072 7.312 11.416 0.004 0.002 0.006 0.006 0.010 0.010l310.65 310.648-310.65 310.652c-0.002 0.004-0.006 0.006-0.008 0.010-3.342 3.346-5.76 7.254-7.314 11.414-4.248 11.376-1.826 24.682 7.322 33.83l146.748 146.746c9.15 9.148 22.452 11.568 33.83 7.322 4.16-1.552 8.070-3.97 11.416-7.312 0.002-0.004 0.006-0.006 0.010-0.010l310.648-310.65 310.648 310.65c0.004 0.002 0.008 0.006 0.012 0.008 3.348 3.344 7.254 5.762 11.414 7.314 11.378 4.246 24.684 1.826 33.828-7.322l146.746-146.748c9.148-9.148 11.57-22.454 7.324-33.83-1.552-4.16-3.97-8.068-7.314-11.414z"
-				],
-				"tags": [
-					"close",
-					"cancel",
-					"quit",
-					"remove",
-					"cross"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 253,
-				"order": 18,
-				"prevSize": 32,
-				"code": 58897,
-				"name": "close",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 253
-		},
-		{
-			"icon": {
-				"paths": [
-					"M864 128l-480 480-224-224-160 160 384 384 640-640z"
-				],
-				"tags": [
-					"checkmark",
-					"tick",
-					"correct",
-					"accept",
-					"ok"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 254,
-				"order": 19,
-				"prevSize": 32,
-				"code": 58898,
-				"name": "checkmark",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 254
-		},
-		{
-			"icon": {
-				"paths": [
-					"M0 416v192c0 17.672 14.328 32 32 32h960c17.672 0 32-14.328 32-32v-192c0-17.672-14.328-32-32-32h-960c-17.672 0-32 14.328-32 32z"
-				],
-				"tags": [
-					"minus",
-					"minimize",
-					"subtract"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 257,
-				"order": 20,
-				"prevSize": 32,
-				"code": 58899,
-				"name": "minus",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 257
-		},
-		{
-			"icon": {
-				"paths": [
-					"M992 384h-352v-352c0-17.672-14.328-32-32-32h-192c-17.672 0-32 14.328-32 32v352h-352c-17.672 0-32 14.328-32 32v192c0 17.672 14.328 32 32 32h352v352c0 17.672 14.328 32 32 32h192c17.672 0 32-14.328 32-32v-352h352c17.672 0 32-14.328 32-32v-192c0-17.672-14.328-32-32-32z"
-				],
-				"tags": [
-					"plus",
-					"add",
-					"sum"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 258,
-				"order": 21,
-				"prevSize": 32,
-				"code": 58900,
-				"name": "plus",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 258
-		},
-		{
-			"icon": {
-				"paths": [
-					"M192 128l640 384-640 384z"
-				],
-				"tags": [
-					"play",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 266,
-				"order": 22,
-				"prevSize": 32,
-				"code": 58901,
-				"name": "play",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 266
-		},
-		{
-			"icon": {
-				"paths": [
-					"M128 128h320v768h-320zM576 128h320v768h-320z"
-				],
-				"tags": [
-					"pause",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 267,
-				"order": 23,
-				"prevSize": 32,
-				"code": 58902,
-				"name": "pause",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 267
-		},
-		{
-			"icon": {
-				"paths": [
-					"M128 128h768v768h-768z"
-				],
-				"tags": [
-					"stop",
-					"media control",
-					"audio",
-					"square"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 268,
-				"order": 24,
-				"prevSize": 32,
-				"code": 58903,
-				"name": "stop",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 268
-		},
-		{
-			"icon": {
-				"paths": [
-					"M576 160v320l320-320v704l-320-320v320l-352-352z"
-				],
-				"tags": [
-					"backward",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 269,
-				"order": 25,
-				"prevSize": 32,
-				"code": 58904,
-				"name": "backward",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 269
-		},
-		{
-			"icon": {
-				"paths": [
-					"M512 864v-320l-320 320v-704l320 320v-320l352 352z"
-				],
-				"tags": [
-					"forward",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 270,
-				"order": 26,
-				"prevSize": 32,
-				"code": 58905,
-				"name": "forward",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 270
-		},
-		{
-			"icon": {
-				"paths": [
-					"M128 896v-768h128v352l320-320v320l320-320v704l-320-320v320l-320-320v352z"
-				],
-				"tags": [
-					"first",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 271,
-				"order": 27,
-				"prevSize": 32,
-				"code": 58906,
-				"name": "first",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 271
-		},
-		{
-			"icon": {
-				"paths": [
-					"M896 128v768h-128v-352l-320 320v-320l-320 320v-704l320 320v-320l320 320v-352z"
-				],
-				"tags": [
-					"last",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 272,
-				"order": 28,
-				"prevSize": 32,
-				"code": 58907,
-				"name": "last",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 272
-		},
-		{
-			"icon": {
-				"paths": [
-					"M256 896v-768h128v352l320-320v704l-320-320v352z"
-				],
-				"tags": [
-					"previous",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 273,
-				"order": 29,
-				"prevSize": 32,
-				"code": 58908,
-				"name": "previous",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 273
-		},
-		{
-			"icon": {
-				"paths": [
-					"M768 128v768h-128v-352l-320 320v-704l320 320v-352z"
-				],
-				"tags": [
-					"next",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 274,
-				"order": 30,
-				"prevSize": 32,
-				"code": 58909,
-				"name": "next",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 274
-		},
-		{
-			"icon": {
-				"paths": [
-					"M0 768h1024v128h-1024zM512 128l512 512h-1024z"
-				],
-				"tags": [
-					"eject",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 275,
-				"order": 31,
-				"prevSize": 32,
-				"code": 58910,
-				"name": "eject",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 275
-		},
-		{
-			"icon": {
-				"paths": [
-					"M890.040 922.040c-12.286 0-24.568-4.686-33.942-14.058-18.744-18.746-18.744-49.136 0-67.882 87.638-87.642 135.904-204.16 135.904-328.1 0-123.938-48.266-240.458-135.904-328.098-18.744-18.746-18.744-49.138 0-67.882 18.744-18.744 49.138-18.744 67.882 0 105.77 105.772 164.022 246.4 164.022 395.98 0 149.582-58.252 290.208-164.022 395.98-9.372 9.374-21.656 14.060-33.94 14.060zM719.53 831.53c-12.286 0-24.568-4.686-33.942-14.058-18.744-18.744-18.744-49.136 0-67.882 131.006-131.006 131.006-344.17 0-475.176-18.744-18.746-18.744-49.138 0-67.882 18.744-18.742 49.138-18.744 67.882 0 81.594 81.592 126.53 190.076 126.53 305.468 0 115.39-44.936 223.876-126.53 305.47-9.372 9.374-21.656 14.060-33.94 14.060zM549.020 741.020c-12.286 0-24.568-4.686-33.942-14.058-18.746-18.746-18.746-49.136 0-67.882 81.1-81.1 81.1-213.058 0-294.156-18.746-18.746-18.746-49.138 0-67.882 18.746-18.744 49.136-18.744 67.882 0 118.53 118.53 118.53 311.392 0 429.922-9.372 9.37-21.656 14.056-33.94 14.056zM401.332 78.668c25.668-25.668 46.668-16.968 46.668 19.332v828c0 36.3-21 44.998-46.668 19.33l-241.332-241.33h-160v-384h160l241.332-241.332z"
-				],
-				"width": 1088,
-				"tags": [
-					"volume-high",
-					"speaker",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 276,
-				"order": 32,
-				"prevSize": 32,
-				"code": 58911,
-				"name": "volume-high",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 276
-		},
-		{
-			"icon": {
-				"paths": [
-					"M719.53 831.53c-12.286 0-24.568-4.686-33.942-14.058-18.744-18.744-18.744-49.136 0-67.882 131.006-131.006 131.006-344.17 0-475.176-18.744-18.746-18.744-49.138 0-67.882 18.744-18.742 49.138-18.744 67.882 0 81.594 81.592 126.53 190.076 126.53 305.468 0 115.39-44.936 223.876-126.53 305.47-9.372 9.374-21.656 14.060-33.94 14.060zM549.020 741.020c-12.286 0-24.568-4.686-33.942-14.058-18.746-18.746-18.746-49.136 0-67.882 81.1-81.1 81.1-213.058 0-294.156-18.746-18.746-18.746-49.138 0-67.882 18.746-18.744 49.136-18.744 67.882 0 118.53 118.53 118.53 311.392 0 429.922-9.372 9.37-21.656 14.056-33.94 14.056zM401.332 78.668c25.668-25.668 46.668-16.968 46.668 19.332v828c0 36.3-21 44.998-46.668 19.33l-241.332-241.33h-160v-384h160l241.332-241.332z"
-				],
-				"tags": [
-					"volume-medium",
-					"speaker",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 277,
-				"order": 33,
-				"prevSize": 32,
-				"code": 58912,
-				"name": "volume-medium",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 277
-		},
-		{
-			"icon": {
-				"paths": [
-					"M549.020 741.020c-12.286 0-24.568-4.686-33.942-14.058-18.746-18.746-18.746-49.136 0-67.882 81.1-81.1 81.1-213.058 0-294.156-18.746-18.746-18.746-49.138 0-67.882 18.746-18.744 49.136-18.744 67.882 0 118.53 118.53 118.53 311.392 0 429.922-9.372 9.37-21.656 14.056-33.94 14.056zM401.332 78.668c25.668-25.668 46.668-16.968 46.668 19.332v828c0 36.3-21 44.998-46.668 19.33l-241.332-241.33h-160v-384h160l241.332-241.332z"
-				],
-				"tags": [
-					"volume-low",
-					"speaker",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 278,
-				"order": 34,
-				"prevSize": 32,
-				"code": 58913,
-				"name": "volume-low",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 278
-		},
-		{
-			"icon": {
-				"paths": [
-					"M401.332 78.668c25.668-25.668 46.668-16.968 46.668 19.332v828c0 36.3-21 44.998-46.668 19.33l-241.332-241.33h-160v-384h160l241.332-241.332z"
-				],
-				"tags": [
-					"volume-mute",
-					"speaker",
-					"media control",
-					"audio",
-					"mute"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 279,
-				"order": 35,
-				"prevSize": 32,
-				"code": 58914,
-				"name": "volume-mute",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 279
-		},
-		{
-			"icon": {
-				"paths": [
-					"M401.332 78.668c25.668-25.668 46.668-16.968 46.668 19.332v828c0 36.3-21 44.998-46.668 19.33l-241.332-241.33h-160v-384h160l241.332-241.332zM960 619.148v84.852h-84.852l-107.148-107.148-107.148 107.148h-84.852v-84.852l107.148-107.148-107.148-107.148v-84.852h84.852l107.148 107.148 107.148-107.148h84.852v84.852l-107.148 107.148z"
-				],
-				"tags": [
-					"volume-mute",
-					"speaker",
-					"media control",
-					"audio",
-					"mute"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 280,
-				"order": 36,
-				"prevSize": 32,
-				"code": 58915,
-				"name": "volume-mute2",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 280
-		},
-		{
-			"icon": {
-				"paths": [
-					"M428.164 63.918c11.976 0 19.836 11.878 19.838 34.082v828c0 22.206-7.856 34.082-19.836 34.082-7.604 0-16.868-4.788-26.834-14.752l-241.332-241.33h-160v-384h160l241.332-241.332c9.966-9.966 19.228-14.75 26.832-14.75zM1024 576h-192v192h-128v-192h-192v-128h192v-192h128v192h192z"
-				],
-				"tags": [
-					"volume-increase",
-					"speaker",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 281,
-				"order": 37,
-				"prevSize": 32,
-				"code": 58916,
-				"name": "volume-increase",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 281
-		},
-		{
-			"icon": {
-				"paths": [
-					"M428.164 63.918c11.976 0 19.836 11.878 19.838 34.082v828c0 22.206-7.856 34.082-19.836 34.082-7.604 0-16.868-4.788-26.834-14.752l-241.332-241.33h-160v-384h160l241.332-241.332c9.966-9.966 19.228-14.75 26.832-14.75zM512 448h512v128h-512z"
-				],
-				"tags": [
-					"volume-decrease",
-					"speaker",
-					"media control",
-					"audio"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 282,
-				"order": 38,
-				"prevSize": 32,
-				"code": 58917,
-				"name": "volume-decrease",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 282
-		},
-		{
-			"icon": {
-				"paths": [
-					"M128 320h640v192l256-256-256-256v192h-768v384h128zM896 704h-640v-192l-256 256 256 256v-192h768v-384h-128z"
-				],
-				"tags": [
-					"loop",
-					"repeat",
-					"reload",
-					"refresh",
-					"update",
-					"upgrade",
-					"synchronize",
-					"media control",
-					"arrows"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 283,
-				"order": 39,
-				"prevSize": 32,
-				"code": 58918,
-				"name": "loop",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 283
-		},
-		{
-			"icon": {
-				"paths": [
-					"M874.022 149.98c-92.652-92.656-220.636-149.98-362.022-149.98-219.488 0-406.69 138.128-479.498 332.188l119.876 44.954c54.604-145.546 195.006-249.142 359.622-249.142 106.040 0 202.020 43 271.506 112.494l-143.506 143.506h384v-384l-149.978 149.98zM512 896c-106.040 0-202.026-42.992-271.512-112.488l143.512-143.512h-384v384l149.994-149.994c92.646 92.662 220.618 149.994 362.006 149.994 219.49 0 406.692-138.128 479.5-332.188l-119.876-44.954c-54.604 145.546-195.006 249.142-359.624 249.142z"
-				],
-				"tags": [
-					"loop",
-					"repeat",
-					"reload",
-					"refresh",
-					"update",
-					"upgrade",
-					"synchronize",
-					"media control",
-					"arrows"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 284,
-				"order": 40,
-				"prevSize": 32,
-				"code": 58919,
-				"name": "loop2",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 284
-		},
-		{
-			"icon": {
-				"paths": [
-					"M320 640v-192h192l-256-256-256 256h192v320h384l-128-128zM832 576v-320h-384l128 128h128v192h-192l256 256 256-256z"
-				],
-				"tags": [
-					"loop",
-					"repeat",
-					"reload",
-					"refresh",
-					"update",
-					"upgrade",
-					"synchronize",
-					"media control",
-					"arrows"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 285,
-				"order": 41,
-				"prevSize": 32,
-				"code": 58920,
-				"name": "loop3",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 285
-		},
-		{
-			"icon": {
-				"paths": [
-					"M1024 256l-256-256v192c-130.772 0-230.752 31.208-305.65 95.408-5.25 4.5-10.284 9.1-15.162 13.774 27.52 38.164 48.716 77.516 67.772 115.090 48.322-58.402 118.054-96.272 253.040-96.272v192 0 192c-216.446 0-265.126-97.36-326.756-220.622-34.306-68.612-69.78-139.56-135.592-195.97-74.9-64.2-174.88-95.408-305.652-95.408v128c216.446 0 265.126 97.36 326.756 220.622 34.306 68.612 69.78 139.56 135.592 195.97 74.9 64.2 174.882 95.408 305.652 95.408v192l256-256-256-256 256-256zM0 704v128c130.772 0 230.75-31.208 305.65-95.408 5.25-4.498 10.284-9.1 15.162-13.776-27.52-38.162-48.718-77.516-67.772-115.090-48.32 58.402-118.052 96.274-253.040 96.274z"
-				],
-				"tags": [
-					"shuffle",
-					"media control",
-					"random"
-				],
-				"grid": 16
-			},
-			"properties": {
-				"id": 286,
-				"order": 42,
-				"prevSize": 32,
-				"code": 58921,
-				"name": "shuffle",
-				"ligatures": ""
-			},
-			"setIdx": 0,
-			"iconIdx": 286
-		}
-	],
-	"height": 1024,
-	"metadata": {
-		"name": "icomoon"
-	},
-	"preferences": {
-		"fontPref": {
-			"prefix": "icon-",
-			"metadata": {
-				"fontFamily": "icomoon"
-			},
-			"showGlyphs": true,
-			"metrics": {
-				"emSize": 512,
-				"baseline": 6.25,
-				"whitespace": 50
-			},
-			"resetPoint": 58880,
-			"showQuickUse": true,
-			"quickUsageToken": false,
-			"showMetrics": true,
-			"showMetadata": false
-		},
-		"imagePref": {
-			"color": 0,
-			"height": 32,
-			"columns": 16,
-			"margin": 16,
-			"png": false,
-			"sprites": true
-		},
-		"historySize": 100,
-		"showCodes": true,
-		"gridSize": 16,
-		"showLiga": false,
-		"showGrid": true,
-		"showGlyphs": true,
-		"showQuickUse": true,
-		"search": ""
-	}
+  "IcoMoonType": "selection",
+  "icons": [
+    {
+      "icon": {
+        "paths": [
+          "M320 192l704-192v64 128 544c0 88.366-100.29 160-224 160s-224-71.634-224-160c0-88.366 100.29-160 224-160 34.358 0 66.902 5.532 96 15.406v-329.588l-448 122.182v480c0 88.366-100.288 160-224 160-123.712 0-224-71.634-224-160 0-88.366 100.288-160 224-160 34.358 0 66.902 5.532 96 15.406v-335.406-192z"
+        ],
+        "tags": [
+          "music",
+          "song",
+          "audio",
+          "sound"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 16,
+        "order": 1,
+        "prevSize": 32,
+        "code": 58880,
+        "name": "music",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 16
+    },
+    {
+      "icon": {
+        "paths": [
+          "M192 578.286v443.43c10.454 1.496 21.134 2.286 32 2.286h32v-448.002h-32c-10.866 0-21.546 0.79-32 2.286zM768 576v448h32c10.868 0 21.546-0.79 32-2.286v-443.428c-10.454-1.496-21.132-2.286-32-2.286h-32zM1024 512c0-282.77-229.23-512-512-512s-512 229.23-512 512c0 61.418 10.828 120.306 30.656 174.874-19.472 33.202-30.656 71.852-30.656 113.126 0 89.354 52.326 166.478 128 202.432v-404.864c-20.126 9.562-38.58 22.060-54.858 36.904-5.992-29.22-9.142-59.478-9.142-90.472 0-247.424 200.576-448 448-448s448 200.576 448 448c0 30.994-3.148 61.252-9.142 90.472-16.28-14.844-34.73-27.342-54.858-36.904v404.864c75.676-35.954 128-113.078 128-202.432 0-41.274-11.184-79.924-30.656-113.126 19.828-54.568 30.656-113.456 30.656-174.874z"
+        ],
+        "tags": [
+          "headphones",
+          "headset",
+          "music",
+          "song",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 17,
+        "order": 2,
+        "prevSize": 32,
+        "code": 58881,
+        "name": "headphones",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 17
+    },
+    {
+      "icon": {
+        "paths": [
+          "M640 576c105.87 0 201.87 43.066 271.402 112.598l-90.468 90.468c-46.354-46.356-110.356-75.066-180.934-75.066s-134.578 28.71-180.934 75.066l-90.468-90.468c69.532-69.532 165.532-112.598 271.402-112.598zM187.452 507.452c120.88-120.88 281.598-187.452 452.548-187.452s331.668 66.572 452.55 187.452l-90.51 90.508c-96.706-96.704-225.28-149.96-362.040-149.96-136.762 0-265.334 53.256-362.038 149.962l-90.51-90.51zM988.784 134.438c106.702 45.132 202.516 109.728 284.782 191.996v0l-90.508 90.508c-145.056-145.056-337.92-224.942-543.058-224.942-205.14 0-398 79.886-543.058 224.942l-90.51-90.51c82.268-82.266 178.082-146.862 284.784-191.994 110.504-46.738 227.852-70.438 348.784-70.438 120.932 0 238.278 23.7 348.784 70.438zM576 896c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64z"
+        ],
+        "width": 1280,
+        "tags": [
+          "connection",
+          "broadcast",
+          "wifi",
+          "wave",
+          "feed"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 28,
+        "order": 3,
+        "prevSize": 32,
+        "code": 58882,
+        "name": "connection",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 28
+    },
+    {
+      "icon": {
+        "paths": [
+          "M896 128v832h-672c-53.022 0-96-42.98-96-96 0-53.018 42.978-96 96-96h608v-768h-640c-70.398 0-128 57.6-128 128v768c0 70.4 57.602 128 128 128h768v-896h-64zM256 832h576v64h-576z"
+        ],
+        "tags": [
+          "book",
+          "reading"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 31,
+        "order": 5,
+        "prevSize": 32,
+        "code": 58883,
+        "name": "book",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 31
+    },
+    {
+      "icon": {
+        "paths": [
+          "M576.234 289.27l242.712-81.432 203.584 606.784-242.712 81.432zM0 896h256v-704h-256v704zM64 320h128v64h-128v-64zM320 896h256v-704h-256v704zM384 320h128v64h-128v-64z"
+        ],
+        "tags": [
+          "books",
+          "library",
+          "archive"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 32,
+        "order": 4,
+        "prevSize": 32,
+        "code": 58884,
+        "name": "books",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 32
+    },
+    {
+      "icon": {
+        "paths": [
+          "M864 0h-768c-52.8 0-96 43.2-96 96v832c0 52.8 43.2 96 96 96h768c52.8 0 96-43.2 96-96v-832c0-52.8-43.2-96-96-96zM832 896h-704v-768h704v768zM256 448h448v64h-448zM256 576h448v64h-448zM256 704h448v64h-448zM256 320h448v64h-448z"
+        ],
+        "tags": [
+          "file",
+          "list",
+          "paper",
+          "page",
+          "document"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 34,
+        "order": 6,
+        "prevSize": 32,
+        "code": 58885,
+        "name": "file",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 34
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 320h1024l-64 640h-896l-64-640zM928 192l32 64h-896l64-128h352l32 64h416z"
+        ],
+        "tags": [
+          "folder",
+          "directory",
+          "category",
+          "browse"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 46,
+        "order": 7,
+        "prevSize": 32,
+        "code": 58886,
+        "name": "folder",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 46
+    },
+    {
+      "icon": {
+        "paths": [
+          "M832 960l192-512h-832l-192 512zM128 384l-128 576v-832h288l128 128h416v128z"
+        ],
+        "tags": [
+          "folder-open",
+          "directory",
+          "category",
+          "browse"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 47,
+        "order": 8,
+        "prevSize": 32,
+        "code": 58887,
+        "name": "folder-open",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 47
+    },
+    {
+      "icon": {
+        "paths": [
+          "M704 0h-384l-192 128v256h768v-256l-192-128zM640 320h-64v-42.666c0-11.734-9.6-21.334-21.334-21.334h-85.332c-11.732 0-21.334 9.6-21.334 21.334l-0 42.666h-64v-106.666c0-11.734 9.602-21.334 21.334-21.334h213.33c11.734 0 21.336 9.6 21.336 21.334v106.666zM128 704.002h768v-256.002h-768v256.002zM384 533.332c0-11.734 9.602-21.332 21.334-21.332h213.33c11.734 0 21.336 9.598 21.336 21.332v106.668h-64v-42.668c0-11.734-9.6-21.332-21.334-21.332h-85.332c-11.732 0-21.334 9.598-21.334 21.332l-0 42.668h-64v-106.668zM128 1024h768v-255.998h-768v255.998zM384 853.332c0-11.734 9.602-21.332 21.334-21.332h213.33c11.734 0 21.336 9.598 21.336 21.332v106.668h-64v-42.668c0-11.734-9.6-21.332-21.334-21.332h-85.332c-11.732 0-21.334 9.598-21.334 21.332l-0 42.668h-64v-106.668z"
+        ],
+        "tags": [
+          "cabinet",
+          "storage",
+          "drawer",
+          "archive",
+          "office"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 88,
+        "order": 9,
+        "prevSize": 32,
+        "code": 58888,
+        "name": "cabinet",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 88
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1024 384h-384l143.53-143.53c-72.53-72.526-168.96-112.47-271.53-112.47-102.57 0-199 39.944-271.53 112.47-72.526 72.53-112.47 168.96-112.47 271.53 0 102.57 39.944 199 112.47 271.53 72.53 72.526 168.96 112.47 271.53 112.47 102.57 0 199-39.944 271.528-112.472 6.056-6.054 11.86-12.292 17.456-18.668l96.32 84.282c-93.846 107.166-231.664 174.858-385.304 174.858-282.77 0-512-229.23-512-512 0-282.77 229.23-512 512-512 141.386 0 269.368 57.326 362.016 149.984l149.984-149.984v384z"
+        ],
+        "tags": [
+          "spinner",
+          "loading",
+          "busy",
+          "wait",
+          "wheel",
+          "repeat"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 125,
+        "order": 12,
+        "prevSize": 32,
+        "code": 58889,
+        "name": "spinner",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 125
+    },
+    {
+      "icon": {
+        "paths": [
+          "M933.79 610.25c-53.726-93.054-21.416-212.304 72.152-266.488l-100.626-174.292c-28.75 16.854-62.176 26.518-97.846 26.518-107.536 0-194.708-87.746-194.708-195.99l-201.258 0c0.266 33.41-8.074 67.282-25.958 98.252-53.724 93.056-173.156 124.702-266.862 70.758l-100.624 174.292c28.97 16.472 54.050 40.588 71.886 71.478 53.638 92.908 21.512 211.92-71.708 266.224l100.626 174.292c28.65-16.696 61.916-26.254 97.4-26.254 107.196 0 194.144 87.192 194.7 194.958h201.254c-0.086-33.074 8.272-66.57 25.966-97.218 53.636-92.906 172.776-124.594 266.414-71.012l100.626-174.29c-28.78-16.466-53.692-40.498-71.434-71.228zM512 719.332c-114.508 0-207.336-92.824-207.336-207.334 0-114.508 92.826-207.334 207.336-207.334 114.508 0 207.332 92.826 207.332 207.334-0.002 114.51-92.824 207.334-207.332 207.334z"
+        ],
+        "tags": [
+          "cog",
+          "preferences",
+          "settings",
+          "gear",
+          "generate",
+          "control",
+          "options"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 142,
+        "order": 10,
+        "prevSize": 32,
+        "code": 58890,
+        "name": "cog",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 142
+    },
+    {
+      "icon": {
+        "paths": [
+          "M640 146.588v135.958c36.206 15.804 69.5 38.408 98.274 67.18 60.442 60.44 93.726 140.8 93.726 226.274s-33.286 165.834-93.726 226.274c-60.44 60.44-140.798 93.726-226.274 93.726s-165.834-33.286-226.274-93.726c-60.44-60.44-93.726-140.8-93.726-226.274s33.286-165.834 93.726-226.274c28.774-28.774 62.068-51.378 98.274-67.182v-135.956c-185.048 55.080-320 226.472-320 429.412 0 247.424 200.578 448 448 448 247.424 0 448-200.576 448-448 0-202.94-134.95-374.332-320-429.412zM448 0h128v512h-128z"
+        ],
+        "tags": [
+          "switch",
+          "power",
+          "turn off",
+          "off",
+          "shutdown"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 177,
+        "order": 11,
+        "prevSize": 32,
+        "code": 58891,
+        "name": "switch",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 177
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 0h256v256h-256zM384 64h640v128h-640zM0 384h256v256h-256zM384 448h640v128h-640zM0 768h256v256h-256zM384 832h640v128h-640z"
+        ],
+        "tags": [
+          "list",
+          "bullet",
+          "ul",
+          "todo",
+          "menu"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 180,
+        "order": 13,
+        "prevSize": 32,
+        "code": 58892,
+        "name": "list",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 180
+    },
+    {
+      "icon": {
+        "paths": [
+          "M384 64h640v128h-640v-128zM384 448h640v128h-640v-128zM384 832h640v128h-640v-128zM0 128c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128zM0 512c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128zM0 896c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128z"
+        ],
+        "tags": [
+          "list",
+          "bullet",
+          "ul",
+          "todo",
+          "menu"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 181,
+        "order": 14,
+        "prevSize": 32,
+        "code": 58893,
+        "name": "list2",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 181
+    },
+    {
+      "icon": {
+        "paths": [
+          "M384 832h640v128h-640zM384 448h640v128h-640zM384 64h640v128h-640zM192 0v256h-64v-192h-64v-64zM128 526v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM256 704v320h-192v-64h128v-64h-128v-64h128v-64h-128v-64z"
+        ],
+        "tags": [
+          "numbered-list",
+          "list",
+          "items",
+          "nl"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 182,
+        "order": 15,
+        "prevSize": 32,
+        "code": 58894,
+        "name": "numbered-list",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 182
+    },
+    {
+      "icon": {
+        "paths": [
+          "M64 192h896v192h-896zM64 448h896v192h-896zM64 704h896v192h-896z"
+        ],
+        "tags": [
+          "menu",
+          "list",
+          "items",
+          "lines",
+          "options"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 184,
+        "order": 16,
+        "prevSize": 32,
+        "code": 58895,
+        "name": "menu",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 184
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1024 736 736 0h-448l-288 288v448l288 288h448l288-288v-448l-288-288zM576 832h-128v-128h128v128zM576 576h-128v-384h128v384z"
+        ],
+        "tags": [
+          "spam",
+          "notice",
+          "notification",
+          "exclamation"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 252,
+        "order": 17,
+        "prevSize": 32,
+        "code": 58896,
+        "name": "spam",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 252
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1014.662 822.66c-0.004-0.004-0.008-0.008-0.012-0.010l-310.644-310.65 310.644-310.65c0.004-0.004 0.008-0.006 0.012-0.010 3.344-3.346 5.762-7.254 7.312-11.416 4.246-11.376 1.824-24.682-7.324-33.83l-146.746-146.746c-9.148-9.146-22.45-11.566-33.828-7.32-4.16 1.55-8.070 3.968-11.418 7.31 0 0.004-0.004 0.006-0.008 0.010l-310.648 310.652-310.648-310.65c-0.004-0.004-0.006-0.006-0.010-0.010-3.346-3.342-7.254-5.76-11.414-7.31-11.38-4.248-24.682-1.826-33.83 7.32l-146.748 146.748c-9.148 9.148-11.568 22.452-7.322 33.828 1.552 4.16 3.97 8.072 7.312 11.416 0.004 0.002 0.006 0.006 0.010 0.010l310.65 310.648-310.65 310.652c-0.002 0.004-0.006 0.006-0.008 0.010-3.342 3.346-5.76 7.254-7.314 11.414-4.248 11.376-1.826 24.682 7.322 33.83l146.748 146.746c9.15 9.148 22.452 11.568 33.83 7.322 4.16-1.552 8.070-3.97 11.416-7.312 0.002-0.004 0.006-0.006 0.010-0.010l310.648-310.65 310.648 310.65c0.004 0.002 0.008 0.006 0.012 0.008 3.348 3.344 7.254 5.762 11.414 7.314 11.378 4.246 24.684 1.826 33.828-7.322l146.746-146.748c9.148-9.148 11.57-22.454 7.324-33.83-1.552-4.16-3.97-8.068-7.314-11.414z"
+        ],
+        "tags": [
+          "close",
+          "cancel",
+          "quit",
+          "remove",
+          "cross"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 253,
+        "order": 18,
+        "prevSize": 32,
+        "code": 58897,
+        "name": "close",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 253
+    },
+    {
+      "icon": {
+        "paths": [
+          "M864 128l-480 480-224-224-160 160 384 384 640-640z"
+        ],
+        "tags": [
+          "checkmark",
+          "tick",
+          "correct",
+          "accept",
+          "ok"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 254,
+        "order": 19,
+        "prevSize": 32,
+        "code": 58898,
+        "name": "checkmark",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 254
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 416v192c0 17.672 14.328 32 32 32h960c17.672 0 32-14.328 32-32v-192c0-17.672-14.328-32-32-32h-960c-17.672 0-32 14.328-32 32z"
+        ],
+        "tags": [
+          "minus",
+          "minimize",
+          "subtract"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 257,
+        "order": 20,
+        "prevSize": 32,
+        "code": 58899,
+        "name": "minus",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 257
+    },
+    {
+      "icon": {
+        "paths": [
+          "M992 384h-352v-352c0-17.672-14.328-32-32-32h-192c-17.672 0-32 14.328-32 32v352h-352c-17.672 0-32 14.328-32 32v192c0 17.672 14.328 32 32 32h352v352c0 17.672 14.328 32 32 32h192c17.672 0 32-14.328 32-32v-352h352c17.672 0 32-14.328 32-32v-192c0-17.672-14.328-32-32-32z"
+        ],
+        "tags": [
+          "plus",
+          "add",
+          "sum"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 258,
+        "order": 21,
+        "prevSize": 32,
+        "code": 58900,
+        "name": "plus",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 258
+    },
+    {
+      "icon": {
+        "paths": [
+          "M192 128l640 384-640 384z"
+        ],
+        "tags": [
+          "play",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 266,
+        "order": 22,
+        "prevSize": 32,
+        "code": 58901,
+        "name": "play",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 266
+    },
+    {
+      "icon": {
+        "paths": [
+          "M128 128h320v768h-320zM576 128h320v768h-320z"
+        ],
+        "tags": [
+          "pause",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 267,
+        "order": 23,
+        "prevSize": 32,
+        "code": 58902,
+        "name": "pause",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 267
+    },
+    {
+      "icon": {
+        "paths": [
+          "M128 128h768v768h-768z"
+        ],
+        "tags": [
+          "stop",
+          "media control",
+          "audio",
+          "square"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 268,
+        "order": 24,
+        "prevSize": 32,
+        "code": 58903,
+        "name": "stop",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 268
+    },
+    {
+      "icon": {
+        "paths": [
+          "M576 160v320l320-320v704l-320-320v320l-352-352z"
+        ],
+        "tags": [
+          "backward",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 269,
+        "order": 25,
+        "prevSize": 32,
+        "code": 58904,
+        "name": "backward",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 269
+    },
+    {
+      "icon": {
+        "paths": [
+          "M512 864v-320l-320 320v-704l320 320v-320l352 352z"
+        ],
+        "tags": [
+          "forward",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 270,
+        "order": 26,
+        "prevSize": 32,
+        "code": 58905,
+        "name": "forward",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 270
+    },
+    {
+      "icon": {
+        "paths": [
+          "M128 896v-768h128v352l320-320v320l320-320v704l-320-320v320l-320-320v352z"
+        ],
+        "tags": [
+          "first",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 271,
+        "order": 27,
+        "prevSize": 32,
+        "code": 58906,
+        "name": "first",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 271
+    },
+    {
+      "icon": {
+        "paths": [
+          "M896 128v768h-128v-352l-320 320v-320l-320 320v-704l320 320v-320l320 320v-352z"
+        ],
+        "tags": [
+          "last",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 272,
+        "order": 28,
+        "prevSize": 32,
+        "code": 58907,
+        "name": "last",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 272
+    },
+    {
+      "icon": {
+        "paths": [
+          "M256 896v-768h128v352l320-320v704l-320-320v352z"
+        ],
+        "tags": [
+          "previous",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 273,
+        "order": 29,
+        "prevSize": 32,
+        "code": 58908,
+        "name": "previous",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 273
+    },
+    {
+      "icon": {
+        "paths": [
+          "M768 128v768h-128v-352l-320 320v-704l320 320v-352z"
+        ],
+        "tags": [
+          "next",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 274,
+        "order": 30,
+        "prevSize": 32,
+        "code": 58909,
+        "name": "next",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 274
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 768h1024v128h-1024zM512 128l512 512h-1024z"
+        ],
+        "tags": [
+          "eject",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 275,
+        "order": 31,
+        "prevSize": 32,
+        "code": 58910,
+        "name": "eject",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 275
+    },
+    {
+      "icon": {
+        "paths": [
+          "M890.040 922.040c-12.286 0-24.568-4.686-33.942-14.058-18.744-18.746-18.744-49.136 0-67.882 87.638-87.642 135.904-204.16 135.904-328.1 0-123.938-48.266-240.458-135.904-328.098-18.744-18.746-18.744-49.138 0-67.882 18.744-18.744 49.138-18.744 67.882 0 105.77 105.772 164.022 246.4 164.022 395.98 0 149.582-58.252 290.208-164.022 395.98-9.372 9.374-21.656 14.060-33.94 14.060zM719.53 831.53c-12.286 0-24.568-4.686-33.942-14.058-18.744-18.744-18.744-49.136 0-67.882 131.006-131.006 131.006-344.17 0-475.176-18.744-18.746-18.744-49.138 0-67.882 18.744-18.742 49.138-18.744 67.882 0 81.594 81.592 126.53 190.076 126.53 305.468 0 115.39-44.936 223.876-126.53 305.47-9.372 9.374-21.656 14.060-33.94 14.060zM549.020 741.020c-12.286 0-24.568-4.686-33.942-14.058-18.746-18.746-18.746-49.136 0-67.882 81.1-81.1 81.1-213.058 0-294.156-18.746-18.746-18.746-49.138 0-67.882 18.746-18.744 49.136-18.744 67.882 0 118.53 118.53 118.53 311.392 0 429.922-9.372 9.37-21.656 14.056-33.94 14.056zM401.332 78.668c25.668-25.668 46.668-16.968 46.668 19.332v828c0 36.3-21 44.998-46.668 19.33l-241.332-241.33h-160v-384h160l241.332-241.332z"
+        ],
+        "width": 1088,
+        "tags": [
+          "volume-high",
+          "speaker",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 276,
+        "order": 32,
+        "prevSize": 32,
+        "code": 58911,
+        "name": "volume-high",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 276
+    },
+    {
+      "icon": {
+        "paths": [
+          "M719.53 831.53c-12.286 0-24.568-4.686-33.942-14.058-18.744-18.744-18.744-49.136 0-67.882 131.006-131.006 131.006-344.17 0-475.176-18.744-18.746-18.744-49.138 0-67.882 18.744-18.742 49.138-18.744 67.882 0 81.594 81.592 126.53 190.076 126.53 305.468 0 115.39-44.936 223.876-126.53 305.47-9.372 9.374-21.656 14.060-33.94 14.060zM549.020 741.020c-12.286 0-24.568-4.686-33.942-14.058-18.746-18.746-18.746-49.136 0-67.882 81.1-81.1 81.1-213.058 0-294.156-18.746-18.746-18.746-49.138 0-67.882 18.746-18.744 49.136-18.744 67.882 0 118.53 118.53 118.53 311.392 0 429.922-9.372 9.37-21.656 14.056-33.94 14.056zM401.332 78.668c25.668-25.668 46.668-16.968 46.668 19.332v828c0 36.3-21 44.998-46.668 19.33l-241.332-241.33h-160v-384h160l241.332-241.332z"
+        ],
+        "tags": [
+          "volume-medium",
+          "speaker",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 277,
+        "order": 33,
+        "prevSize": 32,
+        "code": 58912,
+        "name": "volume-medium",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 277
+    },
+    {
+      "icon": {
+        "paths": [
+          "M549.020 741.020c-12.286 0-24.568-4.686-33.942-14.058-18.746-18.746-18.746-49.136 0-67.882 81.1-81.1 81.1-213.058 0-294.156-18.746-18.746-18.746-49.138 0-67.882 18.746-18.744 49.136-18.744 67.882 0 118.53 118.53 118.53 311.392 0 429.922-9.372 9.37-21.656 14.056-33.94 14.056zM401.332 78.668c25.668-25.668 46.668-16.968 46.668 19.332v828c0 36.3-21 44.998-46.668 19.33l-241.332-241.33h-160v-384h160l241.332-241.332z"
+        ],
+        "tags": [
+          "volume-low",
+          "speaker",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 278,
+        "order": 34,
+        "prevSize": 32,
+        "code": 58913,
+        "name": "volume-low",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 278
+    },
+    {
+      "icon": {
+        "paths": [
+          "M401.332 78.668c25.668-25.668 46.668-16.968 46.668 19.332v828c0 36.3-21 44.998-46.668 19.33l-241.332-241.33h-160v-384h160l241.332-241.332z"
+        ],
+        "tags": [
+          "volume-mute",
+          "speaker",
+          "media control",
+          "audio",
+          "mute"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 279,
+        "order": 35,
+        "prevSize": 32,
+        "code": 58914,
+        "name": "volume-mute",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 279
+    },
+    {
+      "icon": {
+        "paths": [
+          "M401.332 78.668c25.668-25.668 46.668-16.968 46.668 19.332v828c0 36.3-21 44.998-46.668 19.33l-241.332-241.33h-160v-384h160l241.332-241.332zM960 619.148v84.852h-84.852l-107.148-107.148-107.148 107.148h-84.852v-84.852l107.148-107.148-107.148-107.148v-84.852h84.852l107.148 107.148 107.148-107.148h84.852v84.852l-107.148 107.148z"
+        ],
+        "tags": [
+          "volume-mute",
+          "speaker",
+          "media control",
+          "audio",
+          "mute"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 280,
+        "order": 36,
+        "prevSize": 32,
+        "code": 58915,
+        "name": "volume-mute2",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 280
+    },
+    {
+      "icon": {
+        "paths": [
+          "M428.164 63.918c11.976 0 19.836 11.878 19.838 34.082v828c0 22.206-7.856 34.082-19.836 34.082-7.604 0-16.868-4.788-26.834-14.752l-241.332-241.33h-160v-384h160l241.332-241.332c9.966-9.966 19.228-14.75 26.832-14.75zM1024 576h-192v192h-128v-192h-192v-128h192v-192h128v192h192z"
+        ],
+        "tags": [
+          "volume-increase",
+          "speaker",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 281,
+        "order": 37,
+        "prevSize": 32,
+        "code": 58916,
+        "name": "volume-increase",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 281
+    },
+    {
+      "icon": {
+        "paths": [
+          "M428.164 63.918c11.976 0 19.836 11.878 19.838 34.082v828c0 22.206-7.856 34.082-19.836 34.082-7.604 0-16.868-4.788-26.834-14.752l-241.332-241.33h-160v-384h160l241.332-241.332c9.966-9.966 19.228-14.75 26.832-14.75zM512 448h512v128h-512z"
+        ],
+        "tags": [
+          "volume-decrease",
+          "speaker",
+          "media control",
+          "audio"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 282,
+        "order": 38,
+        "prevSize": 32,
+        "code": 58917,
+        "name": "volume-decrease",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 282
+    },
+    {
+      "icon": {
+        "paths": [
+          "M128 320h640v192l256-256-256-256v192h-768v384h128zM896 704h-640v-192l-256 256 256 256v-192h768v-384h-128z"
+        ],
+        "tags": [
+          "loop",
+          "repeat",
+          "reload",
+          "refresh",
+          "update",
+          "upgrade",
+          "synchronize",
+          "media control",
+          "arrows"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 283,
+        "order": 39,
+        "prevSize": 32,
+        "code": 58918,
+        "name": "loop",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 283
+    },
+    {
+      "icon": {
+        "paths": [
+          "M874.022 149.98c-92.652-92.656-220.636-149.98-362.022-149.98-219.488 0-406.69 138.128-479.498 332.188l119.876 44.954c54.604-145.546 195.006-249.142 359.622-249.142 106.040 0 202.020 43 271.506 112.494l-143.506 143.506h384v-384l-149.978 149.98zM512 896c-106.040 0-202.026-42.992-271.512-112.488l143.512-143.512h-384v384l149.994-149.994c92.646 92.662 220.618 149.994 362.006 149.994 219.49 0 406.692-138.128 479.5-332.188l-119.876-44.954c-54.604 145.546-195.006 249.142-359.624 249.142z"
+        ],
+        "tags": [
+          "loop",
+          "repeat",
+          "reload",
+          "refresh",
+          "update",
+          "upgrade",
+          "synchronize",
+          "media control",
+          "arrows"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 284,
+        "order": 40,
+        "prevSize": 32,
+        "code": 58919,
+        "name": "loop2",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 284
+    },
+    {
+      "icon": {
+        "paths": [
+          "M320 640v-192h192l-256-256-256 256h192v320h384l-128-128zM832 576v-320h-384l128 128h128v192h-192l256 256 256-256z"
+        ],
+        "tags": [
+          "loop",
+          "repeat",
+          "reload",
+          "refresh",
+          "update",
+          "upgrade",
+          "synchronize",
+          "media control",
+          "arrows"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 285,
+        "order": 41,
+        "prevSize": 32,
+        "code": 58920,
+        "name": "loop3",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 285
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1024 256l-256-256v192c-130.772 0-230.752 31.208-305.65 95.408-5.25 4.5-10.284 9.1-15.162 13.774 27.52 38.164 48.716 77.516 67.772 115.090 48.322-58.402 118.054-96.272 253.040-96.272v192 0 192c-216.446 0-265.126-97.36-326.756-220.622-34.306-68.612-69.78-139.56-135.592-195.97-74.9-64.2-174.88-95.408-305.652-95.408v128c216.446 0 265.126 97.36 326.756 220.622 34.306 68.612 69.78 139.56 135.592 195.97 74.9 64.2 174.882 95.408 305.652 95.408v192l256-256-256-256 256-256zM0 704v128c130.772 0 230.75-31.208 305.65-95.408 5.25-4.498 10.284-9.1 15.162-13.776-27.52-38.162-48.718-77.516-67.772-115.090-48.32 58.402-118.052 96.274-253.040 96.274z"
+        ],
+        "tags": [
+          "shuffle",
+          "media control",
+          "random"
+        ],
+        "grid": 16
+      },
+      "properties": {
+        "id": 286,
+        "order": 42,
+        "prevSize": 32,
+        "code": 58921,
+        "name": "shuffle",
+        "ligatures": ""
+      },
+      "setIdx": 0,
+      "iconIdx": 286
+    }
+  ],
+  "height": 1024,
+  "metadata": {
+    "name": "icomoon"
+  },
+  "preferences": {
+    "fontPref": {
+      "prefix": "icon-",
+      "metadata": {
+        "fontFamily": "icomoon"
+      },
+      "showGlyphs": true,
+      "metrics": {
+        "emSize": 512,
+        "baseline": 6.25,
+        "whitespace": 50
+      },
+      "resetPoint": 58880,
+      "showQuickUse": true,
+      "quickUsageToken": false,
+      "showMetrics": true,
+      "showMetadata": false
+    },
+    "imagePref": {
+      "color": 0,
+      "height": 32,
+      "columns": 16,
+      "margin": 16,
+      "png": false,
+      "sprites": true
+    },
+    "historySize": 100,
+    "showCodes": true,
+    "gridSize": 16,
+    "showLiga": false,
+    "showGrid": true,
+    "showGlyphs": true,
+    "showQuickUse": true,
+    "search": ""
+  }
 }

+ 4 - 2
mopidy_touchscreen/gpio_inpput_manager.py

@@ -18,7 +18,8 @@ class GPIOManager():
 
         # Right Button
         GPIO.setup(pins['right'], GPIO.IN, pull_up_down=GPIO.PUD_UP)
-        GPIO.add_event_detect(pins['right'], GPIO.BOTH, callback=right,
+        GPIO.add_event_detect(pins['right'], GPIO.BOTH,
+                              callback=right,
                               bouncetime=30)
 
         # Up Button
@@ -33,7 +34,8 @@ class GPIOManager():
 
         # Enter Button
         GPIO.setup(pins['enter'], GPIO.IN, pull_up_down=GPIO.PUD_UP)
-        GPIO.add_event_detect(pins['enter'], GPIO.BOTH, callback=right,
+        GPIO.add_event_detect(pins['enter'], GPIO.BOTH,
+                              callback=right,
                               bouncetime=30)
 
 

+ 26 - 13
mopidy_touchscreen/input_manager.py

@@ -34,19 +34,24 @@ class InputManager():
 
         if event.type == pygame.MOUSEBUTTONUP:
             if event.button == 4:
-                touch_event = InputEvent(InputManager.swipe, self.down_pos,
-                                         self.up_pos, True, InputManager.up)
+                touch_event = InputEvent(InputManager.swipe,
+                                         self.down_pos,
+                                         self.up_pos, True,
+                                         InputManager.up)
                 return touch_event
             elif event.button == 5:
-                touch_event = InputEvent(InputManager.swipe, self.down_pos,
-                                         self.up_pos, True, InputManager.down)
+                touch_event = InputEvent(InputManager.swipe,
+                                         self.down_pos,
+                                         self.up_pos, True,
+                                         InputManager.down)
                 return touch_event
             elif event.button == 1 and self.down_button == 1:
                 touch_event = self.mouse_up(event)
                 return touch_event
             elif event.button == 3 and self.down_button == 3:
                 touch_event = InputEvent(InputManager.long_click,
-                                         self.down_pos, self.up_pos, None, None)
+                                         self.down_pos, self.up_pos,
+                                         None, None)
                 return touch_event
             else:
                 return None
@@ -78,7 +83,8 @@ class InputManager():
             else:
                 return None
             if direction is not None:
-                return InputEvent(InputManager.key, None, None, None, direction)
+                return InputEvent(InputManager.key, None, None, None,
+                                  direction)
 
     def mouse_down(self, event):
         self.down_pos = event.pos
@@ -87,26 +93,33 @@ class InputManager():
 
     def mouse_up(self, event):
         self.up_pos = event.pos
-        if abs(self.down_pos[0] - self.up_pos[0]) < self.max_move_margin:
-            if abs(self.down_pos[1] - self.up_pos[1]) < self.max_move_margin:
+        if abs(self.down_pos[0] - self.up_pos[
+            0]) < self.max_move_margin:
+            if abs(self.down_pos[1] - self.up_pos[
+                1]) < self.max_move_margin:
                 if time.time() - InputManager.long_click_min_time > \
                         self.down_time:
-                    return InputEvent(InputManager.long_click, self.down_pos,
+                    return InputEvent(InputManager.long_click,
+                                      self.down_pos,
                                       self.up_pos, None, None)
                 else:
-                    return InputEvent(InputManager.click, self.down_pos,
+                    return InputEvent(InputManager.click,
+                                      self.down_pos,
                                       self.up_pos, None, None)
-            elif abs(self.down_pos[1] - self.up_pos[1]) > self.min_swipe_move:
+            elif abs(self.down_pos[1] - self.up_pos[
+                1]) > self.min_swipe_move:
                 return InputEvent(InputManager.swipe, self.down_pos,
                                   self.up_pos, True, None)
         elif self.down_pos[1] - self.up_pos[1] < self.max_move_margin:
-            if abs(self.down_pos[0] - self.up_pos[0]) > self.min_swipe_move:
+            if abs(self.down_pos[0] - self.up_pos[
+                0]) > self.min_swipe_move:
                 return InputEvent(InputManager.swipe, self.down_pos,
                                   self.up_pos, False, None)
 
 
 class InputEvent():
-    def __init__(self, event_type, down_pos, current_pos, vertical, direction):
+    def __init__(self, event_type, down_pos, current_pos, vertical,
+                 direction):
         self.type = event_type
         self.down_pos = down_pos
         self.current_pos = current_pos

+ 13 - 9
mopidy_touchscreen/library_screen.py

@@ -1,5 +1,4 @@
 import logging
-
 import mopidy.models
 
 from .list_view import ListView
@@ -15,7 +14,8 @@ class LibraryScreen():
         self.manager = manager
         self.list_view = ListView((0, self.base_size), (
             self.size[0], self.size[1] - 2 * self.base_size),
-            self.base_size, manager.fonts['base'])
+                                  self.base_size,
+                                  manager.fonts['base'])
         self.directory_list = []
         self.current_directory = None
         self.library = None
@@ -23,7 +23,7 @@ class LibraryScreen():
         self.lookup_uri(None)
 
     def get_dirty_area(self):
-	return self.list_view.get_dirty_area()
+        return self.list_view.get_dirty_area()
 
     def go_inside_directory(self, uri):
         self.directory_list.append(self.current_directory)
@@ -46,7 +46,7 @@ class LibraryScreen():
             self.lookup_uri(directory)
 
     def update(self, screen, update_all):
-	self.list_view.render(screen)
+        self.list_view.render(screen)
 
     def touch_event(self, touch_event):
         clicked = self.list_view.touch_event(touch_event)
@@ -56,7 +56,8 @@ class LibraryScreen():
                     if clicked == 0:
                         self.go_up_directory()
                     else:
-                        self.play_uri(self.library[clicked - 1].uri, False)
+                        self.play_uri(self.library[clicked - 1].uri,
+                                      False)
                 else:
                     self.play_uri(self.library[clicked].uri, False)
             else:
@@ -65,16 +66,19 @@ class LibraryScreen():
                         self.go_up_directory()
                     else:
                         if self.library[
-                                clicked - 1].type == mopidy.models.Ref.TRACK:
-                            self.play_uri(self.library[clicked - 1].uri, True)
+                                    clicked - 1].type == mopidy.models.Ref.TRACK:
+                            self.play_uri(
+                                self.library[clicked - 1].uri, True)
                         else:
                             self.go_inside_directory(
                                 self.library[clicked - 1].uri)
                 else:
-                    if self.library[clicked].type == mopidy.models.Track:
+                    if self.library[
+                        clicked].type == mopidy.models.Track:
                         self.play_uri(self.library[clicked].uri, True)
                     else:
-                        self.go_inside_directory(self.library[clicked].uri)
+                        self.go_inside_directory(
+                            self.library[clicked].uri)
 
     def play_uri(self, uri, track):
         self.manager.core.tracklist.clear()

+ 18 - 14
mopidy_touchscreen/list_view.py

@@ -1,6 +1,7 @@
 import logging
 
-from .screen_objects import ScreenObjectsManager, ScrollBar, TouchAndTextItem
+from .screen_objects import ScreenObjectsManager, ScrollBar, \
+    TouchAndTextItem
 from .input_manager import InputManager
 
 logger = logging.getLogger(__name__)
@@ -21,20 +22,20 @@ class ListView():
         self.set_list([])
         self.selected = []
 
-    def get_dirty_area(self):
-	return self.screen_objects.get_dirty_area()
-
     # Sets the list for the lisview. It should be an iterable of strings
     def set_list(self, item_list):
-	self.screen_objects.clear()
+        self.screen_objects.clear()
         self.list = item_list
         self.list_size = len(item_list)
         if self.max_rows < self.list_size:
             self.scrollbar = True
             scroll_bar = ScrollBar(
-                (self.pos[0] + self.size[0] - self.base_size, self.pos[1]),
-                (self.base_size, self.size[1]), self.list_size, self.max_rows)
-            self.screen_objects.set_touch_object("scrollbar", scroll_bar)
+                (self.pos[0] + self.size[0] - self.base_size,
+                 self.pos[1]),
+                (self.base_size, self.size[1]), self.list_size,
+                self.max_rows)
+            self.screen_objects.set_touch_object("scrollbar",
+                                                 scroll_bar)
         else:
             self.scrollbar = False
         self.load_new_item_position(0)
@@ -55,13 +56,12 @@ class ListView():
         while i < self.list_size and z < self.max_rows:
             item = TouchAndTextItem(self.font, self.list[i], (
                 self.pos[0], self.pos[1] + self.base_size * z),
-                (width, -1))
+                                    (width, -1))
             self.screen_objects.set_touch_object(str(i), item)
             i += 1
             z += 1
 
 
-
     def render(self, surface):
         self.screen_objects.render(surface)
 
@@ -95,14 +95,16 @@ class ListView():
                 if self.current_item + self.max_rows > self.list_size:
                     self.current_item = self.list_size - self.max_rows
                 self.load_new_item_position(self.current_item)
-                self.screen_objects.get_touch_object("scrollbar").set_item(
+                self.screen_objects.get_touch_object(
+                    "scrollbar").set_item(
                     self.current_item)
             elif direction == -1:
                 self.current_item -= self.max_rows
                 if self.current_item < 0:
                     self.current_item = 0
                 self.load_new_item_position(self.current_item)
-                self.screen_objects.get_touch_object("scrollbar").set_item(
+                self.screen_objects.get_touch_object(
+                    "scrollbar").set_item(
                     self.current_item)
             self.set_selected(self.selected)
 
@@ -110,13 +112,15 @@ class ListView():
     def set_selected(self, selected):
         for number in self.selected:
             try:
-                self.screen_objects.get_touch_object(str(number)).set_active(
+                self.screen_objects.get_touch_object(
+                    str(number)).set_active(
                     False)
             except KeyError:
                 pass
         for number in selected:
             try:
-                self.screen_objects.get_touch_object(str(number)).set_active(
+                self.screen_objects.get_touch_object(
+                    str(number)).set_active(
                     True)
             except KeyError:
                 pass

+ 47 - 38
mopidy_touchscreen/main_screen.py

@@ -6,13 +6,14 @@ import time
 import urllib
 import urllib2
 from threading import Thread
-
 import pygame
 
-from .screen_objects import (Progressbar, ScreenObjectsManager, TextItem,
+from .screen_objects import (Progressbar, ScreenObjectsManager,
+                             TextItem,
                              TouchAndTextItem)
 from .input_manager import InputManager
 
+
 logger = logging.getLogger(__name__)
 
 
@@ -27,9 +28,7 @@ class MainScreen():
         self.cache = cache
         self.image = None
         self.artists = None
-	self.dirty_area = []
-	self.track_duration = "00:00"
-	self.image_now_loaded = False
+        self.track_duration = "00:00"
         self.touch_text_manager = ScreenObjectsManager()
         current_track = self.core.playback.current_track.get()
         if current_track is None:
@@ -42,18 +41,13 @@ class MainScreen():
             self.touch_text_manager.get_touch_object(
                 "time_progress").set_value(
                 self.core.playback.time_position.get() / 1000)
-            self.touch_text_manager.get_touch_object("time_progress").set_text(
+            self.touch_text_manager.get_touch_object(
+                "time_progress").set_text(
                 time.strftime('%M:%S', time.gmtime(
                     self.core.playback.time_position.get() / 1000)) + "/" + self.track_duration)
-	    if update_all:
-		if self.image is not None:
-                    screen.blit(self.image, (self.base_size / 2, self.base_size + self.base_size / 2))
-		    self.image_now_loaded = False
-	    elif self.image_now_loaded:
-		self.dirty_area.append(pygame.Rect(self.base_size / 2, self.base_size + self.base_size / 2, self.image.get_rect().width,self.image.get_rect().height))
-		screen.blit(self.image, (self.base_size / 2, self.base_size + self.base_size / 2))
-		self.image_now_loaded = False
-	self.touch_text_manager.render(screen)
+            screen.blit(self.image, (
+            self.base_size / 2, self.base_size + self.base_size / 2))
+        self.touch_text_manager.render(screen)
         return screen
 
     def track_started(self, track):
@@ -61,7 +55,8 @@ class MainScreen():
         x = self.base_size * 5
         width = self.size[0] - self.base_size / 2 - x
 
-	self.track_duration = time.strftime('%M:%S', time.gmtime(track.length / 1000))
+        self.track_duration = time.strftime('%M:%S', time.gmtime(
+            track.length / 1000))
 
         # Load all artists
         self.artists = []
@@ -69,7 +64,8 @@ class MainScreen():
             self.artists.append(artist)
 
         # Track name
-        label = TextItem(self.fonts['base'], MainScreen.get_track_name(track),
+        label = TextItem(self.fonts['base'],
+                         MainScreen.get_track_name(track),
                          (x, self.base_size * 2),
                          (width, self.size[1]))
         self.touch_text_manager.set_object("track_name", label)
@@ -83,7 +79,8 @@ class MainScreen():
 
         # Artist
         label = TextItem(self.fonts['base'], self.get_artist_string(),
-                         (x, self.base_size * 4), (width, self.size[1]))
+                         (x, self.base_size * 4),
+                         (width, self.size[1]))
         self.touch_text_manager.set_object("artist_name", label)
 
         # Previous track button
@@ -94,17 +91,24 @@ class MainScreen():
 
         size_2 = self.fonts['icon'].size(u"\ue61d")[0]
         button = TouchAndTextItem(self.fonts['icon'], u"\ue61d",
-                                  (self.size[0] - size_2, self.base_size * 6),
+                                  (self.size[0] - size_2,
+                                   self.base_size * 6),
                                   None)
         self.touch_text_manager.set_touch_object("next", button)
 
         # Progress
-        progress = Progressbar(self.fonts['base'],time.strftime('%M:%S', time.gmtime(0)) + "/" + time.strftime('%M:%S',time.gmtime(0)),
+        progress = Progressbar(self.fonts['base'],
+                               time.strftime('%M:%S', time.gmtime(
+                                   0)) + "/" + time.strftime('%M:%S',
+                                                             time.gmtime(
+                                                                 0)),
                                (size_1, self.base_size * 6),
                                (
-                               self.size[0] - size_1 - size_2, self.base_size),
+                                   self.size[0] - size_1 - size_2,
+                                   self.base_size),
                                track.length / 1000, False)
-        self.touch_text_manager.set_touch_object("time_progress", progress)
+        self.touch_text_manager.set_touch_object("time_progress",
+                                                 progress)
 
         self.track = track
         if not self.is_image_in_cache():
@@ -113,10 +117,6 @@ class MainScreen():
         else:
             self.load_image()
 
-    def get_dirty_area(self):
-	dirty = self.touch_text_manager.get_dirty_area() + self.dirty_area
-	self.dirty_area = []
-	return dirty
 
     def get_artist_string(self):
         artists_string = ''
@@ -175,28 +175,36 @@ class MainScreen():
 
             current = TextItem(self.fonts['base'],
                                MainScreen.get_track_name(self.track),
-                               (self.base_size / 2, self.base_size * 2),
+                               (self.base_size / 2,
+                                self.base_size * 2),
                                (width, -1))
             self.touch_text_manager.set_object("track_name", current)
 
             current = TextItem(self.fonts['base'],
-                               MainScreen.get_track_album_name(self.track),
-                               (self.base_size / 2, self.base_size * 3),
+                               MainScreen.get_track_album_name(
+                                   self.track),
+                               (self.base_size / 2,
+                                self.base_size * 3),
                                (width, -1))
             self.touch_text_manager.set_object("album_name", current)
 
-            current = TextItem(self.fonts['base'], self.get_artist_string(),
-                               (self.base_size / 2, self.base_size * 4),
+            current = TextItem(self.fonts['base'],
+                               self.get_artist_string(),
+                               (self.base_size / 2,
+                                self.base_size * 4),
                                (width, -1))
             self.touch_text_manager.set_object("artist_name", current)
 
     def track_playback_ended(self, tl_track, time_position):
-	if self.image is not None:
-	    self.dirty_area.append(pygame.Rect(self.base_size / 2, self.base_size + self.base_size / 2, self.image.get_rect().width,self.image.get_rect().height))
+        if self.image is not None:
+            self.dirty_area.append(pygame.Rect(self.base_size / 2,
+                                               self.base_size + self.base_size / 2,
+                                               self.image.get_rect().width,
+                                               self.image.get_rect().height))
             self.image = None
 
-	self.track_duration = "00:00"
-	
+        self.track_duration = "00:00"
+
 
         # There is no cover so it will use all the screen size for the text
         width = self.size[0] - self.base_size
@@ -223,7 +231,7 @@ class MainScreen():
                 self.get_cover_folder() +
                 self.get_image_file_name()).convert(),
             (size, size))
-	self.image_now_loaded = True
+        self.image_now_loaded = True
 
     def touch_event(self, event):
         if event.type == InputManager.click:
@@ -233,9 +241,10 @@ class MainScreen():
                 for key in objects:
                     if key == "time_progress":
                         value = self.touch_text_manager.get_touch_object(
-                            key).get_pos_value(event.current_pos) * 1000
+                            key).get_pos_value(
+                            event.current_pos) * 1000
                         self.core.playback.seek(value)
-			
+
                     elif key == "previous":
                         self.core.playback.previous()
                     elif key == "next":

+ 18 - 13
mopidy_touchscreen/menu_screen.py

@@ -1,6 +1,5 @@
 import os
 import socket
-
 import mopidy
 
 from .screen_objects import ScreenObjectsManager, TouchAndTextItem
@@ -16,29 +15,38 @@ class MenuScreen():
         self.screen_objects = ScreenObjectsManager()
 
         # Exit mopidy button
-        button = TouchAndTextItem(self.manager.fonts['icon'], u"\ue611",
+        button = TouchAndTextItem(self.manager.fonts['icon'],
+                                  u"\ue611",
                                   (0, self.base_size), None)
         self.screen_objects.set_touch_object("exit_icon", button)
-        button = TouchAndTextItem(self.manager.fonts['base'], "Exit Mopidy",
-                                  (button.get_right_pos(), self.base_size),
+        button = TouchAndTextItem(self.manager.fonts['base'],
+                                  "Exit Mopidy",
+                                  (button.get_right_pos(),
+                                   self.base_size),
                                   None)
         self.screen_objects.set_touch_object("exit", button)
 
         # Shutdown button
-        button = TouchAndTextItem(self.manager.fonts['icon'], u"\ue60b",
+        button = TouchAndTextItem(self.manager.fonts['icon'],
+                                  u"\ue60b",
                                   (0, self.base_size * 2), None)
         self.screen_objects.set_touch_object("shutdown_icon", button)
-        button = TouchAndTextItem(self.manager.fonts['base'], "Shutdown",
-                                  (button.get_right_pos(), self.base_size * 2),
+        button = TouchAndTextItem(self.manager.fonts['base'],
+                                  "Shutdown",
+                                  (button.get_right_pos(),
+                                   self.base_size * 2),
                                   None)
         self.screen_objects.set_touch_object("shutdown", button)
 
         # Restart button
-        button = TouchAndTextItem(self.manager.fonts['icon'], u"\ue609",
+        button = TouchAndTextItem(self.manager.fonts['icon'],
+                                  u"\ue609",
                                   (0, self.base_size * 3), None)
         self.screen_objects.set_touch_object("restart_icon", button)
-        button = TouchAndTextItem(self.manager.fonts['base'], "Restart",
-                                  (button.get_right_pos(), self.base_size * 3),
+        button = TouchAndTextItem(self.manager.fonts['base'],
+                                  "Restart",
+                                  (button.get_right_pos(),
+                                   self.base_size * 3),
                                   None)
         self.screen_objects.set_touch_object("restart", button)
 
@@ -50,9 +58,6 @@ class MenuScreen():
     def update(self, screen, update_all):
         self.screen_objects.render(screen)
 
-    def get_dirty_area(self):
-	return self.screen_objects.get_dirty_area()
-
     def touch_event(self, event):
         if event.type == InputManager.click:
             clicked = self.screen_objects.get_touch_objects_in_pos(

+ 5 - 6
mopidy_touchscreen/playlist_screen.py

@@ -8,16 +8,14 @@ class PlaylistScreen():
         self.manager = manager
         self.list_view = ListView((0, self.base_size), (
             self.size[0], self.size[1] - 2 * self.base_size),
-            self.base_size, manager.fonts['base'])
+                                  self.base_size,
+                                  manager.fonts['base'])
         self.playlists_strings = []
         self.playlists = []
         self.playlists_loaded()
 
-    def get_dirty_area(self):
-	return self.list_view.get_dirty_area()
-
     def update(self, screen, update_all):
-	self.list_view.render(screen)
+        self.list_view.render(screen)
 
     def playlists_loaded(self):
         self.playlists_strings = []
@@ -31,5 +29,6 @@ class PlaylistScreen():
         clicked = self.list_view.touch_event(touch_event)
         if clicked is not None:
             self.manager.core.tracklist.clear()
-            self.manager.core.tracklist.add(uri=self.playlists[clicked].uri)
+            self.manager.core.tracklist.add(
+                uri=self.playlists[clicked].uri)
             self.manager.core.playback.play()

+ 75 - 48
mopidy_touchscreen/screen_manager.py

@@ -1,6 +1,5 @@
 import logging
 import traceback
-
 import mopidy
 import mopidy.core
 import pygame
@@ -10,31 +9,35 @@ from .library_screen import LibraryScreen
 from .main_screen import MainScreen
 from .menu_screen import MenuScreen
 from .playlist_screen import PlaylistScreen
-from .screen_objects import Progressbar, ScreenObjectsManager, TouchAndTextItem
+from .screen_objects import Progressbar, ScreenObjectsManager, \
+    TouchAndTextItem
 from .input_manager import InputManager
 from .tracklist import Tracklist
 
+
 logger = logging.getLogger(__name__)
 
 
 class ScreenManager():
-    def __init__(self, size, core, backend, cache):
+    def __init__(self, size, core, cache):
         self.size = size
         self.core = core
-        self.backend = backend
         self.fonts = {}
         self.current_screen = 0
         self.base_size = self.size[1] / 8
-        font = resource_filename(Requirement.parse("mopidy-touchscreen"),
-                                 "mopidy_touchscreen/icomoon.ttf")
-        self.fonts['base'] = pygame.font.SysFont("verdana", self.base_size)
+        font = resource_filename(
+            Requirement.parse("mopidy-touchscreen"),
+            "mopidy_touchscreen/icomoon.ttf")
+        self.fonts['base'] = pygame.font.SysFont("verdana",
+                                                 self.base_size)
         self.fonts['icon'] = pygame.font.Font(font, self.base_size)
         try:
-            self.screens = [MainScreen(size, self, cache, core, self.fonts),
-                            Tracklist(size, self.base_size, self),
-                            LibraryScreen(size, self.base_size, self),
-                            PlaylistScreen(size, self.base_size, self),
-                            MenuScreen(size, self.base_size, self)]
+            self.screens = [
+                MainScreen(size, self, cache, core, self.fonts),
+                Tracklist(size, self.base_size, self),
+                LibraryScreen(size, self.base_size, self),
+                PlaylistScreen(size, self.base_size, self),
+                MenuScreen(size, self.base_size, self)]
         except:
             traceback.print_exc()
         self.track = None
@@ -42,8 +45,8 @@ class ScreenManager():
         self.top_bar_objects = ScreenObjectsManager()
         self.down_bar_objects = ScreenObjectsManager()
         self.selected_zone = self.top_bar_objects
-	self.dirty_area = []
-	self.screen_changed = True
+        self.dirty_area = []
+        self.screen_changed = True
 
         # Top bar
         self.top_bar = pygame.Surface((self.size[0], self.base_size),
@@ -51,38 +54,45 @@ class ScreenManager():
         self.top_bar.fill((0, 0, 0, 128))
 
         # Play/pause
-        button = TouchAndTextItem(self.fonts['icon'], u"\ue615 ", (0, 0), None)
+        button = TouchAndTextItem(self.fonts['icon'], u"\ue615 ",
+                                  (0, 0), None)
         self.top_bar_objects.set_touch_object("pause_play", button)
         x = button.get_right_pos()
 
         # Random
-        button = TouchAndTextItem(self.fonts['icon'], u"\ue629 ", (x, 0), None)
+        button = TouchAndTextItem(self.fonts['icon'], u"\ue629 ",
+                                  (x, 0), None)
         self.top_bar_objects.set_touch_object("random", button)
         x = button.get_right_pos()
 
         # Repeat
-        button = TouchAndTextItem(self.fonts['icon'], u"\ue626", (x, 0), None)
+        button = TouchAndTextItem(self.fonts['icon'], u"\ue626",
+                                  (x, 0), None)
         self.top_bar_objects.set_touch_object("repeat", button)
         x = button.get_right_pos()
 
         # Single
-        button = TouchAndTextItem(self.fonts['base'], " 1 ", (x, 0), None)
+        button = TouchAndTextItem(self.fonts['base'], " 1 ", (x, 0),
+                                  None)
         self.top_bar_objects.set_touch_object("single", button)
         x = button.get_right_pos()
 
         # Internet
-        button = TouchAndTextItem(self.fonts['icon'], u"\ue602 ", (x, 0), None)
+        button = TouchAndTextItem(self.fonts['icon'], u"\ue602 ",
+                                  (x, 0), None)
         self.top_bar_objects.set_touch_object("internet", button)
         x = button.get_right_pos()
 
         # Mute
-        button = TouchAndTextItem(self.fonts['icon'], u"\ue61f ", (x, 0), None)
+        button = TouchAndTextItem(self.fonts['icon'], u"\ue61f ",
+                                  (x, 0), None)
         self.top_bar_objects.set_touch_object("mute", button)
         x = button.get_right_pos()
 
         # Volume
         progress = Progressbar(self.fonts['base'], "100", (x, 0),
-                               (self.size[0] - x, self.base_size), 100, True)
+                               (self.size[0] - x, self.base_size),
+                               100, True)
         self.top_bar_objects.set_touch_object("volume", progress)
         progress.set_value(self.core.playback.volume.get())
 
@@ -92,25 +102,29 @@ class ScreenManager():
 
         # Main button
         button = TouchAndTextItem(self.fonts['icon'], u" \ue600",
-                                  (0, self.base_size * 7), button_size)
+                                  (0, self.base_size * 7),
+                                  button_size)
         self.down_bar_objects.set_touch_object("menu_0", button)
         x = button.get_right_pos()
 
         # Tracklist button
         button = TouchAndTextItem(self.fonts['icon'], u" \ue60d",
-                                  (x, self.base_size * 7), button_size)
+                                  (x, self.base_size * 7),
+                                  button_size)
         self.down_bar_objects.set_touch_object("menu_1", button)
         x = button.get_right_pos()
 
         # Library button
         button = TouchAndTextItem(self.fonts['icon'], u" \ue604",
-                                  (x, self.base_size * 7), button_size)
+                                  (x, self.base_size * 7),
+                                  button_size)
         self.down_bar_objects.set_touch_object("menu_2", button)
         x = button.get_right_pos()
 
         # Playlist button
         button = TouchAndTextItem(self.fonts['icon'], u" \ue605",
-                                  (x, self.base_size * 7), button_size)
+                                  (x, self.base_size * 7),
+                                  button_size)
         self.down_bar_objects.set_touch_object("menu_3", button)
         x = button.get_right_pos()
 
@@ -121,7 +135,8 @@ class ScreenManager():
 
         # Down bar
         self.down_bar = pygame.Surface(
-            (self.size[0], self.size[1] - self.base_size * 7), pygame.SRCALPHA)
+            (self.size[0], self.size[1] - self.base_size * 7),
+            pygame.SRCALPHA)
         self.down_bar.fill((0, 0, 0, 128))
 
         self.options_changed()
@@ -135,13 +150,14 @@ class ScreenManager():
 
     def update(self):
         surface = pygame.Surface(self.size)
-        surface.fill([200,200,200])
-        self.screens[self.current_screen].update(surface, self.screen_changed)
+        surface.fill([200, 200, 200])
+        self.screens[self.current_screen].update(surface,
+                                                 self.screen_changed)
         surface.blit(self.top_bar, (0, 0))
         surface.blit(self.down_bar, (0, self.base_size * 7))
         self.top_bar_objects.render(surface)
         self.down_bar_objects.render(surface)
-	self.screen_changed = False
+        self.screen_changed = False
         return surface
 
     def track_started(self, track):
@@ -150,12 +166,13 @@ class ScreenManager():
         self.screens[1].track_started(track)
 
     def get_dirty_area(self):
-	self.dirty_area = self.dirty_area + self.top_bar_objects.get_dirty_area()
+        self.dirty_area = self.dirty_area + self.top_bar_objects.get_dirty_area()
         self.dirty_area = self.dirty_area + self.down_bar_objects.get_dirty_area()
-        self.dirty_area = self.dirty_area + self.screens[self.current_screen].get_dirty_area()
-	dirty_area = self.dirty_area
-	self.dirty_area = []
-	return dirty_area
+        self.dirty_area = self.dirty_area + self.screens[
+            self.current_screen].get_dirty_area()
+        dirty_area = self.dirty_area
+        self.dirty_area = []
+        return dirty_area
 
     def track_playback_ended(self, tl_track, time_position):
         self.screens[0].track_playback_ended(tl_track, time_position)
@@ -166,8 +183,9 @@ class ScreenManager():
             if event.type == InputManager.click:
                 objects = self.top_bar_objects.get_touch_objects_in_pos(
                     event.current_pos)
-                objects.extend(self.down_bar_objects.get_touch_objects_in_pos(
-                    event.current_pos))
+                objects.extend(
+                    self.down_bar_objects.get_touch_objects_in_pos(
+                        event.current_pos))
                 self.click_on_objects(objects, event)
             elif event.type == InputManager.key and event.direction == InputManager.enter:
                 objects = [self.selected_zone.selected_key]
@@ -175,7 +193,8 @@ class ScreenManager():
             elif event.type == InputManager.key:
                 if event.direction == InputManager.enter:
                     logger.error(self.selected_zone.selected_key)
-                    self.click_on_objects([self.selected_zone.selected_key], event)
+                    self.click_on_objects(
+                        [self.selected_zone.selected_key], event)
                 else:
                     self.change_selection(event, None)
             self.screens[self.current_screen].touch_event(event)
@@ -183,16 +202,20 @@ class ScreenManager():
     def volume_changed(self, volume):
         if not self.core.playback.mute.get():
             if volume > 80:
-                self.top_bar_objects.get_touch_object("mute").set_text(
+                self.top_bar_objects.get_touch_object(
+                    "mute").set_text(
                     u"\ue61f", False)
             elif volume > 50:
-                self.top_bar_objects.get_touch_object("mute").set_text(
+                self.top_bar_objects.get_touch_object(
+                    "mute").set_text(
                     u"\ue620", False)
             elif volume > 20:
-                self.top_bar_objects.get_touch_object("mute").set_text(
+                self.top_bar_objects.get_touch_object(
+                    "mute").set_text(
                     u"\ue621", False)
             else:
-                self.top_bar_objects.get_touch_object("mute").set_text(
+                self.top_bar_objects.get_touch_object(
+                    "mute").set_text(
                     u"\ue622", False)
         self.top_bar_objects.get_touch_object("volume").set_value(
             volume)
@@ -227,13 +250,12 @@ class ScreenManager():
                 elif key[:-1] == "menu_":
                     self.change_screen(int(key[-1:]))
 
-    def change_volume(self,event):
+    def change_volume(self, event):
         manager = self.top_bar_objects
         volume = manager.get_touch_object("volume")
         pos = event.current_pos
         value = volume.get_pos_value(pos)
-        self.backend.tell(
-            {'action': 'volume', 'value': value})
+        self.core.playback.volume = value
         self.volume_changed(value)
 
     def playback_state_changed(self, old_state, new_state):
@@ -265,13 +287,14 @@ class ScreenManager():
             self.core.tracklist.single.get())
 
     def change_screen(self, new_screen):
-	self.screen_changed = True
+        self.screen_changed = True
         self.down_bar_objects.get_touch_object(
             "menu_" + str(self.current_screen)).set_active(False)
         self.current_screen = new_screen
         self.down_bar_objects.get_touch_object(
             "menu_" + str(new_screen)).set_active(True)
-        self.dirty_area.append(pygame.Rect(0,0,self.size[0],self.size[1]))
+        self.dirty_area.append(
+            pygame.Rect(0, 0, self.size[0], self.size[1]))
 
     def playlists_loaded(self):
         self.screens[3].playlists_loaded()
@@ -287,13 +310,17 @@ class ScreenManager():
 
     def change_selection(self, event, pos):
         if self.selected_zone == self.top_bar_objects:
-            if not self.top_bar_objects.change_selected(event.direction, pos) and event.direction == InputManager.down:
+            if not self.top_bar_objects.change_selected(
+                    event.direction,
+                    pos) and event.direction == InputManager.down:
                 pos = self.top_bar_objects.selected.pos
                 self.selected_zone = self.down_bar_objects
                 self.top_bar_objects.set_selected(None)
                 self.change_selection(event, pos)
         elif self.selected_zone == self.down_bar_objects:
-            if not self.down_bar_objects.change_selected(event.direction, pos) and event.direction == InputManager.up:
+            if not self.down_bar_objects.change_selected(
+                    event.direction,
+                    pos) and event.direction == InputManager.up:
                 pos = self.down_bar_objects.selected.pos
                 self.selected_zone = self.top_bar_objects
                 self.down_bar_objects.set_selected(None)

+ 70 - 80
mopidy_touchscreen/screen_objects.py

@@ -1,6 +1,5 @@
 import logging
 import math
-
 import pygame
 
 from .input_manager import InputManager
@@ -15,23 +14,13 @@ class ScreenObjectsManager():
         self.text_objects = {}
         self.selected = None
         self.selected_key = None
-	self.dirty_area = []
 
     def clear(self):
-	for key in self.touch_objects:
-	    self.dirty_area.append(self.touch_objects[key].rect_in_pos)
-	for key in self.text_objects:
-	    self.dirty_area.append(self.text_objects[key].rect_in_pos)
-	self.touch_objects = {}
+        self.touch_objects = {}
         self.text_objects = {}
 
     def set_object(self, key, add_object):
-	try:
-	    self.dirty_area.append(self.text_objects[key].rect_in_pos)
-	except KeyError:
-	    pass
         self.text_objects[key] = add_object
-	self.dirty_area.append(add_object.rect_in_pos)
 
     def get_object(self, key):
         return self.text_objects[key]
@@ -45,19 +34,12 @@ class ScreenObjectsManager():
 
     def render(self, surface):
         for key in self.text_objects:
-            if self.text_objects[key].update():
-		self.dirty_area.append(self.text_objects[key].rect_in_pos)
+            self.text_objects[key].update()
             self.text_objects[key].render(surface)
         for key in self.touch_objects:
-            if self.touch_objects[key].update():
-		self.dirty_area.append(self.touch_objects[key].rect_in_pos)
+            self.touch_objects[key].update()
             self.touch_objects[key].render(surface)
 
-    def get_dirty_area(self):
-	dirty_area = self.dirty_area
-	self.dirty_area = []
-	return dirty_area
-
     def get_touch_objects_in_pos(self, pos):
         touched_objects = []
         for key in self.touch_objects:
@@ -89,16 +71,20 @@ class ScreenObjectsManager():
         if pos is None:
             pos = self.selected.pos
         if direction == InputManager.right:
-            bests = self.find_nearest_objects(self.find_in_quadrant(False, True, pos), True, pos)
+            bests = self.find_nearest_objects(
+                self.find_in_quadrant(False, True, pos), True, pos)
             best_key = self.find_best_object(bests, False, True, pos)
         elif direction == InputManager.left:
-            bests = self.find_nearest_objects(self.find_in_quadrant(False, False, pos), True, pos)
+            bests = self.find_nearest_objects(
+                self.find_in_quadrant(False, False, pos), True, pos)
             best_key = self.find_best_object(bests, False, False, pos)
         elif direction == InputManager.down:
-            bests = self.find_nearest_objects(self.find_in_quadrant(True, True, pos), False, pos)
+            bests = self.find_nearest_objects(
+                self.find_in_quadrant(True, True, pos), False, pos)
             best_key = self.find_best_object(bests, True, True, pos)
         elif direction == InputManager.up:
-            bests = self.find_nearest_objects(self.find_in_quadrant(True, False, pos), False, pos)
+            bests = self.find_nearest_objects(
+                self.find_in_quadrant(True, False, pos), False, pos)
             best_key = self.find_best_object(bests, True, False, pos)
         if best_key is None:
             return False
@@ -175,7 +161,8 @@ class ScreenObjectsManager():
                     if best_pos is None:
                         best_pos = objects[key].pos[1]
                         best_key = key
-                    elif objects[key].pos[1] >= pos[1] and objects[key].pos[1] < best_pos:
+                    elif objects[key].pos[1] >= pos[1] and \
+                                    objects[key].pos[1] < best_pos:
                         best_pos = objects[key].pos[1]
                         best_key = key
             else:
@@ -183,7 +170,8 @@ class ScreenObjectsManager():
                     if best_pos is None:
                         best_pos = objects[key].pos[1]
                         best_key = key
-                    elif objects[key].pos[1] <= pos[1] and objects[key].pos[1] > best_pos:
+                    elif objects[key].pos[1] <= pos[1] and \
+                                    objects[key].pos[1] > best_pos:
                         best_pos = objects[key].pos[1]
                         best_key = key
         else:
@@ -192,7 +180,8 @@ class ScreenObjectsManager():
                     if best_pos is None:
                         best_pos = objects[key].pos[0]
                         best_key = key
-                    elif objects[key].pos[0] >= pos[0] and objects[key].pos[0] < best_pos:
+                    elif objects[key].pos[0] >= pos[0] and \
+                                    objects[key].pos[0] < best_pos:
                         best_pos = objects[key].pos[0]
                         best_key = key
             else:
@@ -200,35 +189,28 @@ class ScreenObjectsManager():
                     if best_pos is None:
                         best_pos = objects[key].pos[0]
                         best_key = key
-                    elif objects[key].pos[0] <= pos[0] and objects[key].pos[0] > best_pos:
+                    elif objects[key].pos[0] <= pos[0] and \
+                                    objects[key].pos[0] > best_pos:
                         best_pos = objects[key].pos[0]
                         best_key = key
         return best_key
 
 
-
-
-
-
 class BaseItem():
     def __init__(self, pos, size):
         self.pos = pos
         self.size = size
-	self.dirty = True
         self.rect = pygame.Rect(0, 0, self.size[0], self.size[1])
-        self.rect_in_pos = pygame.Rect(self.pos[0], self.pos[1], self.size[0],
+        self.rect_in_pos = pygame.Rect(self.pos[0], self.pos[1],
+                                       self.size[0],
                                        self.size[1])
 
     def get_right_pos(self):
         return self.pos[0] + self.size[0]
-    
-    # Returns if must be redraw
+
+
     def update(self):
-        if self.dirty:
-	    self.dirty = False
-	    return True
-	else:
-	    return False
+        pass
 
 
 class TextItem(BaseItem):
@@ -246,12 +228,14 @@ class TextItem(BaseItem):
         else:
             BaseItem.__init__(self, pos, self.font.size(text))
         if size is not None:
-            if self.pos[0] + self.box.get_rect().width > pos[0] + size[0]:
+            if self.pos[0] + self.box.get_rect().width > pos[0] + \
+                    size[0]:
                 self.fit_horizontal = False
                 self.step = 0
             else:
                 self.fit_horizontal = True
-            if self.pos[1] + self.box.get_rect().height > pos[1] + size[1]:
+            if self.pos[1] + self.box.get_rect().height > pos[1] + \
+                    size[1]:
                 self.fit_vertical = False
             else:
                 self.fit_vertical = True
@@ -262,30 +246,30 @@ class TextItem(BaseItem):
     def update(self):
         if not self.fit_horizontal:
             if self.step > self.box.get_rect().width:
-		self.step = -self.size[0]
+                self.step = -self.size[0]
             else:
-		self.step = self.step + 1
-	    return True
-	else:
-	    return BaseItem.update(self)
+                self.step = self.step + 1
+            return True
+        else:
+            return BaseItem.update(self)
 
     def render(self, surface):
         if self.fit_horizontal:
             surface.blit(self.box, self.pos, area=self.rect)
         else:
-            surface.blit(self.box, self.pos, area=pygame.Rect(self.step, 0, self.size[0], self.size[1]))
-        
+            surface.blit(self.box, self.pos,
+                         area=pygame.Rect(self.step, 0, self.size[0],
+                                          self.size[1]))
+
 
     def set_text(self, text, change_size):
-	if text != self.text:
-	    self.dirty = True
+        if text != self.text:
             if change_size:
-                TextItem.__init__(self, self.font, text, self.pos, None)
+                TextItem.__init__(self, self.font, text, self.pos,
+                                  None)
             else:
-                TextItem.__init__(self, self.font, text, self.pos, self.size)
-	    return True
-	else:
-	    return False
+                TextItem.__init__(self, self.font, text, self.pos,
+                                  self.size)
 
 
 class TouchObject(BaseItem):
@@ -298,11 +282,9 @@ class TouchObject(BaseItem):
         return self.rect_in_pos.collidepoint(pos)
 
     def set_active(self, active):
-	self.dirty = True
         self.active = active
 
     def set_selected(self, selected):
-	self.dirty = True
         self.selected = selected
 
 
@@ -312,21 +294,25 @@ class TouchAndTextItem(TouchObject, TextItem):
         TouchObject.__init__(self, pos, self.size)
         self.active_color = (0, 150, 255)
         self.selected_color = (150, 0, 255)
-        self.active_box = self.font.render(text, True, self.active_color)
-        self.selected_box = self.font.render(text, True, self.selected_color)
+        self.active_box = self.font.render(text, True,
+                                           self.active_color)
+        self.selected_box = self.font.render(text, True,
+                                             self.selected_color)
 
     def update(self):
-        return TextItem.update(self)
+        TextItem.update(self)
 
     def set_text(self, text, change_size):
-	self.dirty = True
         TextItem.set_text(self, text, change_size)
-        self.active_box = self.font.render(text, True, self.active_color)
-        self.selected_box = self.font.render(text, True, self.selected_color)
+        self.active_box = self.font.render(text, True,
+                                           self.active_color)
+        self.selected_box = self.font.render(text, True,
+                                             self.selected_color)
 
     def render(self, surface):
         if not self.fit_horizontal:
-                self.rect = pygame.Rect(self.step, 0, self.size[0], self.size[1])
+            self.rect = pygame.Rect(self.step, 0, self.size[0],
+                                    self.size[1])
         if self.selected:
             surface.blit(self.selected_box, self.pos, area=self.rect)
         elif self.active:
@@ -347,14 +333,16 @@ class Progressbar(TouchObject):
         self.value_text = value_text
         if value_text:
             self.text = TextItem(font, str(max_value), pos, None)
-            self.text.pos = (self.pos[0] + self.size[0] / 2 - self.text.size[0] /
-                         2, self.text.pos[1])
+            self.text.pos = (
+            self.pos[0] + self.size[0] / 2 - self.text.size[0] /
+            2, self.text.pos[1])
             self.text.set_text(str(self.value), True)
         else:
             self.text = TextItem(font, text, pos, None)
-            self.text.pos = (self.pos[0] + self.size[0] / 2 - self.text.size[0] /
-                         2, self.text.pos[1])
-		
+            self.text.pos = (
+            self.pos[0] + self.size[0] / 2 - self.text.size[0] /
+            2, self.text.pos[1])
+
 
     def render(self, surface):
         surface.blit(self.surface, self.pos)
@@ -362,12 +350,12 @@ class Progressbar(TouchObject):
 
     def set_value(self, value):
         if value != self.value:
-	    self.dirty = True
             self.value = value
             if self.value_text:
                 self.set_text(str(self.value))
-                self.text.pos = (self.pos[0] + self.size[0] / 2 - self.text.size[0] /
-                         2, self.text.pos[1])
+                self.text.pos = (
+                self.pos[0] + self.size[0] / 2 - self.text.size[0] /
+                2, self.text.pos[1])
             self.surface.fill(self.back_color)
             pos_pixel = value * self.size[0] / self.max
             rect = pygame.Rect(0, 0, pos_pixel, self.size[1])
@@ -378,12 +366,13 @@ class Progressbar(TouchObject):
         return x * self.max / self.size[0]
 
     def set_text(self, text):
-        self.dirty = self.text.set_text(text, True)
+        self.text.set_text(text, True)
 
 
 class ScrollBar(TouchObject):
     def __init__(self, pos, size, max_value, items_on_screen):
-        BaseItem.__init__(self, pos, (pos[0] + size[0], pos[1] + size[1]))
+        BaseItem.__init__(self, pos,
+                          (pos[0] + size[0], pos[1] + size[1]))
         self.pos = pos
         self.size = size
         self.max = max_value
@@ -403,7 +392,8 @@ class ScrollBar(TouchObject):
 
     def render(self, surface):
         surface.blit(self.back_bar, self.pos)
-        surface.blit(self.bar, (self.pos[0], self.pos[1] + self.bar_pos))
+        surface.blit(self.bar,
+                     (self.pos[0], self.pos[1] + self.bar_pos))
 
     def touch(self, pos):
         if pos[1] < self.pos[1] + self.bar_pos:
@@ -414,7 +404,7 @@ class ScrollBar(TouchObject):
             return 0
 
     def set_item(self, current_item):
-	self.dirty = True
         self.current_item = current_item
-        self.bar_pos = float(self.current_item) / float(self.max) * float(
+        self.bar_pos = float(self.current_item) / float(
+            self.max) * float(
             self.size[1])

+ 15 - 10
mopidy_touchscreen/touch_screen.py

@@ -9,32 +9,35 @@ from mopidy import core
 
 from .screen_manager import ScreenManager
 
+
 logger = logging.getLogger(__name__)
 
 
 class TouchScreen(pykka.ThreadingActor, core.CoreListener):
     def __init__(self, config, core):
         super(TouchScreen, self).__init__()
-        self.backend = \
-            pykka.ActorRegistry.get_by_class_name("TouchScreenBackend")[0]
         self.core = core
         self.running = False
         self.screen_size = (config['touchscreen']['screen_width'],
                             config['touchscreen']['screen_height'])
         self.cache_dir = config['touchscreen']['cache_dir']
         self.fullscreen = config['touchscreen']['fullscreen']
-	os.environ["SDL_FBDEV"] = config['touchscreen']['sdl_fbdev']
-	os.environ["SDL_MOUSEDRV"] = config['touchscreen']['sdl_mousdrv']
-	os.environ["SDL_MOUSEDEV"] = config['touchscreen']['sdl_mousedev']
+        os.environ["SDL_FBDEV"] = config['touchscreen']['sdl_fbdev']
+        os.environ["SDL_MOUSEDRV"] = config['touchscreen'][
+            'sdl_mousdrv']
+        os.environ["SDL_MOUSEDEV"] = config['touchscreen'][
+            'sdl_mousedev']
         pygame.init()
         self.cursor = config['touchscreen']['cursor']
-        self.screen_manager = ScreenManager(self.screen_size, self.core,
-                                            self.backend, self.cache_dir)
+        self.screen_manager = ScreenManager(self.screen_size,
+                                            self.core,
+                                            self.cache_dir)
 
         # Raspberry pi GPIO
         self.gpio = config['touchscreen']['gpio']
         if self.gpio:
             from .gpio_inpput_manager import GPIOManager
+
             pins = {}
             pins['left'] = config['touchscreen']['gpio_left']
             pins['right'] = config['touchscreen']['gpio_right']
@@ -54,7 +57,7 @@ class TouchScreen(pykka.ThreadingActor, core.CoreListener):
         while self.running:
             clock.tick(15)
             screen.blit(self.screen_manager.update(), (0, 0))
-            pygame.display.update(self.screen_manager.get_dirty_area())
+            pygame.display.flip()
             for event in pygame.event.get():
                 if event.type == pygame.QUIT:
                     self.running = False
@@ -86,7 +89,8 @@ class TouchScreen(pykka.ThreadingActor, core.CoreListener):
         self.screen_manager.volume_changed(volume)
 
     def playback_state_changed(self, old_state, new_state):
-        self.screen_manager.playback_state_changed(old_state, new_state)
+        self.screen_manager.playback_state_changed(old_state,
+                                                   new_state)
 
     def tracklist_changed(self):
         try:
@@ -95,7 +99,8 @@ class TouchScreen(pykka.ThreadingActor, core.CoreListener):
             traceback.print_exc()
 
     def track_playback_ended(self, tl_track, time_position):
-        self.screen_manager.track_playback_ended(tl_track, time_position)
+        self.screen_manager.track_playback_ended(tl_track,
+                                                 time_position)
 
     def options_changed(self):
         try:

+ 0 - 21
mopidy_touchscreen/touch_screen_backend.py

@@ -1,21 +0,0 @@
-import logging
-
-import pykka
-from mopidy import backend
-
-logger = logging.getLogger(__name__)
-
-
-class TouchScreenBackend(pykka.ThreadingActor, backend.Backend):
-    def __init__(self, config, audio):
-        super(TouchScreenBackend, self).__init__()
-        self.audio = audio
-
-    def on_receive(self, message):
-        action = message['action']
-        if action == 'volume':
-            self.audio.set_volume(message['value'])
-        elif action == "mute":
-            self.audio.set_mute(message['value'])
-        elif action == "random":
-            self.audio.set_random(message['value'])

+ 3 - 5
mopidy_touchscreen/tracklist.py

@@ -9,16 +9,14 @@ class Tracklist():
         self.manager = manager
         self.list_view = ListView((0, self.base_size), (
             self.size[0], self.size[1] - 2 * self.base_size),
-            self.base_size, manager.fonts['base'])
+                                  self.base_size,
+                                  manager.fonts['base'])
         self.tracks = []
         self.tracks_strings = []
         self.update_list()
 
-    def get_dirty_area(self):
-	return self.list_view.get_dirty_area()
-
     def update(self, screen, update_all):
-	self.list_view.render(screen)
+        self.list_view.render(screen)
 
     def tracklist_changed(self):
         self.update_list()

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů