diff --git a/mopidy_touchscreen/__init__.py b/mopidy_touchscreen/__init__.py index 940fb49..62f493b 100644 --- a/mopidy_touchscreen/__init__.py +++ b/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) diff --git a/mopidy_touchscreen/fonts/icomoon/demo.html b/mopidy_touchscreen/fonts/icomoon/demo.html index d657467..c150fa4 100644 --- a/mopidy_touchscreen/fonts/icomoon/demo.html +++ b/mopidy_touchscreen/fonts/icomoon/demo.html @@ -3,7 +3,8 @@ IcoMoon Demo - + @@ -15,609 +16,697 @@
-

Grid Size: 16

+

Grid Size: 16

-
-
- icon-music -
-
- - -
-
- liga: - -
-
-
-
- icon-headphones -
-
- - -
-
- liga: - -
-
-
-
- icon-connection -
-
- - -
-
- liga: - -
-
-
-
- icon-book -
-
- - -
-
- liga: - -
-
-
-
- icon-books -
-
- - -
-
- liga: - -
-
-
-
- icon-file -
-
- - -
-
- liga: - -
-
-
-
- icon-folder -
-
- - -
-
- liga: - -
-
-
-
- icon-folder-open -
-
- - -
-
- liga: - -
-
-
-
- icon-cabinet -
-
- - -
-
- liga: - -
-
-
-
- icon-spinner -
-
- - -
-
- liga: - -
-
-
-
- icon-cog -
-
- - -
-
- liga: - -
-
-
-
- icon-switch -
-
- - -
-
- liga: - -
-
-
-
- icon-list -
-
- - -
-
- liga: - -
-
-
-
- icon-list2 -
-
- - -
-
- liga: - -
-
-
-
- icon-numbered-list -
-
- - -
-
- liga: - -
-
-
-
- icon-menu -
-
- - -
-
- liga: - -
-
-
-
- icon-spam -
-
- - -
-
- liga: - -
-
-
-
- icon-close -
-
- - -
-
- liga: - -
-
-
-
- icon-checkmark -
-
- - -
-
- liga: - -
-
-
-
- icon-minus -
-
- - -
-
- liga: - -
-
-
-
- icon-plus -
-
- - -
-
- liga: - -
-
-
-
- icon-play -
-
- - -
-
- liga: - -
-
-
-
- icon-pause -
-
- - -
-
- liga: - -
-
-
-
- icon-stop -
-
- - -
-
- liga: - -
-
-
-
- icon-backward -
-
- - -
-
- liga: - -
-
-
-
- icon-forward -
-
- - -
-
- liga: - -
-
-
-
- icon-first -
-
- - -
-
- liga: - -
-
-
-
- icon-last -
-
- - -
-
- liga: - -
-
-
-
- icon-previous -
-
- - -
-
- liga: - -
-
-
-
- icon-next -
-
- - -
-
- liga: - -
-
-
-
- icon-eject -
-
- - -
-
- liga: - -
-
-
-
- icon-volume-high -
-
- - -
-
- liga: - -
-
-
-
- icon-volume-medium -
-
- - -
-
- liga: - -
-
-
-
- icon-volume-low -
-
- - -
-
- liga: - -
-
-
-
- icon-volume-mute -
-
- - -
-
- liga: - -
-
-
-
- icon-volume-mute2 -
-
- - -
-
- liga: - -
-
-
-
- icon-volume-increase -
-
- - -
-
- liga: - -
-
-
-
- icon-volume-decrease -
-
- - -
-
- liga: - -
-
-
-
- icon-loop -
-
- - -
-
- liga: - -
-
-
-
- icon-loop2 -
-
- - -
-
- liga: - -
-
-
-
- icon-loop3 -
-
- - -
-
- liga: - -
-
-
-
- icon-shuffle -
-
- - -
-
- liga: - -
-
+
+
+ icon-music +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-headphones +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-connection +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-book +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-books +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-file +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-folder +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-folder-open +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-cabinet +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-spinner +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-cog +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-switch +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-list +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-list2 +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-numbered-list +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-menu +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-spam +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-close +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-checkmark +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-minus +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-plus +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-play +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-pause +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-stop +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-backward +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-forward +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-first +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-last +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-previous +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-next +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-eject +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-volume-high +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-volume-medium +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-volume-low +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-volume-mute +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-volume-mute2 +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-volume-increase +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-volume-decrease +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-loop +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-loop2 +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-loop3 +
+
+ + +
+
+ liga: + +
+
+
+
+ icon-shuffle +
+
+ + +
+
+ liga: + +
+

Font Test Drive

@@ -629,7 +718,8 @@
-

Generated by IcoMoon

+

Generated by IcoMoon +

diff --git a/mopidy_touchscreen/fonts/icomoon/selection.json b/mopidy_touchscreen/fonts/icomoon/selection.json index d38b459..0c7d406 100644 --- a/mopidy_touchscreen/fonts/icomoon/selection.json +++ b/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": "" + } } \ No newline at end of file diff --git a/mopidy_touchscreen/gpio_inpput_manager.py b/mopidy_touchscreen/gpio_inpput_manager.py index 0423828..dc6ea6e 100644 --- a/mopidy_touchscreen/gpio_inpput_manager.py +++ b/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) diff --git a/mopidy_touchscreen/input_manager.py b/mopidy_touchscreen/input_manager.py index 7e47842..5d76127 100644 --- a/mopidy_touchscreen/input_manager.py +++ b/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 diff --git a/mopidy_touchscreen/library_screen.py b/mopidy_touchscreen/library_screen.py index 7380578..cb1361c 100644 --- a/mopidy_touchscreen/library_screen.py +++ b/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() diff --git a/mopidy_touchscreen/list_view.py b/mopidy_touchscreen/list_view.py index eab3aef..bdad9ed 100644 --- a/mopidy_touchscreen/list_view.py +++ b/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 diff --git a/mopidy_touchscreen/main_screen.py b/mopidy_touchscreen/main_screen.py index d6b49be..b452cf8 100644 --- a/mopidy_touchscreen/main_screen.py +++ b/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": diff --git a/mopidy_touchscreen/menu_screen.py b/mopidy_touchscreen/menu_screen.py index 08dfb61..6bd09d7 100644 --- a/mopidy_touchscreen/menu_screen.py +++ b/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( diff --git a/mopidy_touchscreen/playlist_screen.py b/mopidy_touchscreen/playlist_screen.py index ac24045..d40ef16 100644 --- a/mopidy_touchscreen/playlist_screen.py +++ b/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() diff --git a/mopidy_touchscreen/screen_manager.py b/mopidy_touchscreen/screen_manager.py index fcc7187..9e92c51 100644 --- a/mopidy_touchscreen/screen_manager.py +++ b/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) diff --git a/mopidy_touchscreen/screen_objects.py b/mopidy_touchscreen/screen_objects.py index 122b81b..c7fe782 100644 --- a/mopidy_touchscreen/screen_objects.py +++ b/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]) diff --git a/mopidy_touchscreen/touch_screen.py b/mopidy_touchscreen/touch_screen.py index 79deb44..e8a07a1 100644 --- a/mopidy_touchscreen/touch_screen.py +++ b/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: diff --git a/mopidy_touchscreen/touch_screen_backend.py b/mopidy_touchscreen/touch_screen_backend.py deleted file mode 100644 index c58e2e9..0000000 --- a/mopidy_touchscreen/touch_screen_backend.py +++ /dev/null @@ -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']) diff --git a/mopidy_touchscreen/tracklist.py b/mopidy_touchscreen/tracklist.py index b60c296..6f3ee52 100644 --- a/mopidy_touchscreen/tracklist.py +++ b/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()