Reorganize folders of graphics sources

This commit is contained in:
Dominik Schürmann 2015-01-14 14:52:23 +01:00
parent b4edb88f45
commit f397d4f995
209 changed files with 596 additions and 78 deletions

81
Graphics/android-icon-copier/.gitignore vendored Normal file
View File

@ -0,0 +1,81 @@
# Python
*.py[cod]
# Options
/options.json
# Packages
*.egg
*.egg-info
/dist
/build
/eggs
/parts
/bin
/var
/sdist
/develop-eggs
/lib
/lib64
.installed.cfg
# Installer logs
pip-log.txt
# Unit test / coverage reports
.coverage
.tox
nosetests.xml
# Translations
*.mo
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
### Generic
*.log
*.sqlite?
### Compiled binaries
*.class
*.jar
*.o
*.bin
*.a
*.lib
*.so
*.out
*.obj
*.exe
*.dll
*.com
### *nix OS / apps
*.swp
*~
### Mac OS generated
__MACOSX
Icon?
*.DS_Store
*.DS_Store?
._*
.Spotlight*
.Trashes
### Windows generated
ehthumbs.db
thumbs.db
Thumbs.db

View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2015 Lucas Tan
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,109 @@
[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-android--icon--copier-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/1325)
What is this
============
A commandline tool to copy Android Material Design and FontAwesome icons to your
project folders: `drawable-ldpi`, `drawable-mdpi`, and etc.
How it works
============
It downloads from these repos:
- Material design: https://github.com/google/material-design-icons
- FontAwesome and "Classic" Android: https://github.com/svenkapudija/Android-Action-Bar-Icons
Resolution supported
====================
| l | m | h | xh | xxh | xxxh |
--------|---|---|---|----|-----|------|
FA | Y | Y | Y | Y | Y | - |
Classic | - | Y | Y | Y | Y | - |
Material| - | Y | Y | Y | Y | Y |
Sizes supported
===============
Material: 18, 24, 36, 48 dp.
FA and Classic: 32 dp only.
Usage
=====
<pre>
Usage:
Material : ./copy {proj path} {category} {color} {icon name} [size]
Classic and FA: ./copy {proj path} {fa/classic} {color} {icon name}
</pre>
`[]` denotes optional args.
**Args are case sensitive!**
- `proj path`: Path to project folder relative to `base path`.
- `base path` can be defined in options file (see below).
- Auto-detects new or old project structure: `MyProject/src/main/res` or
`MyProject/res`.
- `category`: Either "classic", "fa", or Material category.
- `color`: Color of icon: Either "white", "grey" or "black".
- For Classic and FA, "white" refers to the Holo Dark theme (dark background).
"Grey" refers to the Holo Light theme.
- For Material, "grey" refers to grey600.
- `icon name`: Name of icon (must replace spaces and dashes with underscores).
- Without any prefix. Examples: FontAwesome "thumbs_up", Classic "search".
- `size` (integer): for Material only, Size in dp, defaults to 24 which is the
action bar icon size for material design.
Examples
--------
- `./copy MyProject maps white place`
- Downloads to `BasePath/MyProject/{src/main}/res/drawable-{m,h,xh,xxh,xxh}dpi
- `./copy MyProject maps white place 48`
- `./copy Path/to/MyProject fa grey thumbs_up`
Windows users need to use `python copy` instead (I think).
Filename mapping
================
The tool also supports filename mapping of destination png files. (see options)
Mapping vars:
- `cat`: category
- `name`: name as specified in commandline.
- `color`: color as specified: white, black, grey.
- `size`: integer only.
- `bg`: derived from color. black => bright, white => dark, grey => light.
- `bgSuffix`: "_dark" if bg is dark else empty string.
Options file
============
Named `options.json` in same dir. Sample:
```json
{
"basePath": "~/Documents",
"filenameMap": {
"classic": "ic_action_{name}{bgSuffix}.png",
"fa": "ic_action_fa_{name}{bgSuffix}.png",
"material": "ic_{name}_{color}_{size}dp.png"
}
}
```
~ is expanded to the user home dir.
`./copy Path/to/MyProject fa white thumbs_up` results in the
target filename of `ic_action_fa_thumbs_up_dark.png`.
Installation
============
- Python >= 2.7 (older or newer ver might work, you may try.)
- Python Requests package: `pip install requests`
- Git clone this repo or download the script.
Icon cheatsheet
===============
- Material: http://google.github.io/material-design-icons/
- FA: http://fortawesome.github.io/Font-Awesome/icons/ (icons in 4.2 not supported)
- Classic: coming soon.
License
=======
This project is under the MIT License. (see LICENSE)
Please refer to the respective icon library for its licensing info.

View File

@ -0,0 +1,146 @@
# Maps icon name to the dir name.
CLASSIC_MAP = {
'about': '13_extra_actions_about',
'accept': '01_core_accept',
'accounts': '10_device_access_accounts',
'add_alarm': '10_device_access_add_alarm',
'add_group': '06_social_add_group',
'add_person': '06_social_add_person',
'add_to_queue': '09_media_add_to_queue',
'airplane_mode_off': '10_device_access_airplane_mode_off',
'airplane_mode_on': '10_device_access_airplane_mode_on',
'alarms': '10_device_access_alarms',
'attachment': '05_content_attachment',
'back': '02_navigation_back',
'backspace': '05_content_backspace',
'bad': '03_rating_bad',
'battery': '10_device_access_battery',
'bightness_low': '10_device_access_bightness_low',
'bluetooth': '10_device_access_bluetooth',
'bluetooth_connected': '10_device_access_bluetooth_connected',
'bluetooth_searching': '10_device_access_bluetooth_searching',
'brightness_auto': '10_device_access_brightness_auto',
'brightness_high': '10_device_access_brightness_high',
'brightness_medium': '10_device_access_brightness_medium',
'call': '01_core_call',
'camera': '08_camera_camera',
'cancel': '01_core_cancel',
'cast': '09_media_cast',
'cc_bcc': '06_social_cc_bcc',
'chat': '06_social_chat',
'cloud': '04_collections_cloud',
'collapse': '02_navigation_collapse',
'collection': '04_collections_collection',
'computer': '11_hardware_computer',
'copy': '01_core_copy',
'crop': '08_camera_crop',
'cut': '01_core_cut',
'data_usage': '10_device_access_data_usage',
'dial_pad': '10_device_access_dial_pad',
'directions': '07_location_directions',
'discard': '01_core_discard',
'dock': '11_hardware_dock',
'download': '09_media_download',
'edit': '01_core_edit',
'email': '05_content_email',
'end_call': '10_device_access_end_call',
'error': '12_alerts_and_states_error',
'event': '05_content_event',
'expand': '02_navigation_expand',
'fast_forward': '09_media_fast_forward',
'favorite': '03_rating_favorite',
'flash_automatic': '08_camera_flash_automatic',
'flash_off': '08_camera_flash_off',
'flash_on': '08_camera_flash_on',
'forward': '06_social_forward',
'full_screen': '09_media_full_screen',
'gamepad': '11_hardware_gamepad',
'go_to_today': '04_collections_go_to_today',
'good': '03_rating_good',
'group': '06_social_group',
'half_important': '03_rating_half_important',
'headphones': '11_hardware_headphones',
'headset': '11_hardware_headset',
'help': '13_extra_actions_help',
'import_export': '05_content_import_export',
'important': '03_rating_important',
'keyboard': '11_hardware_keyboard',
'labels': '04_collections_labels',
'location_found': '07_location_location_found',
'location_off': '07_location_location_off',
'location_searching': '07_location_location_searching',
'make_available_offline': '09_media_make_available_offline',
'map': '07_location_map',
'merge': '05_content_merge',
'mic': '08_camera_mic',
'mic_muted': '08_camera_mic_muted',
'mouse': '11_hardware_mouse',
'network_cell': '10_device_access_network_cell',
'network_wifi': '10_device_access_network_wifi',
'new': '01_core_new',
'new_account': '10_device_access_new_account',
'new_attachment': '05_content_new_attachment',
'new_email': '05_content_new_email',
'new_event': '05_content_new_event',
'new_label': '04_collections_new_label',
'new_picture': '05_content_new_picture',
'next': '09_media_next',
'next_item': '02_navigation_next_item',
'not_important': '03_rating_not_important',
'not_secure': '10_device_access_not_secure',
'overflow': '01_core_overflow',
'paste': '01_core_paste',
'pause': '09_media_pause',
'pause_over_video': '09_media_pause_over_video',
'person': '06_social_person',
'phone': '11_hardware_phone',
'picture': '05_content_picture',
'place': '07_location_place',
'play': '09_media_play',
'play_over_video': '09_media_play_over_video',
'previous': '09_media_previous',
'previous_item': '02_navigation_previous_item',
'read': '05_content_read',
'refresh': '01_core_refresh',
'remove': '01_core_remove',
'repeat': '09_media_repeat',
'replay': '09_media_replay',
'reply': '06_social_reply',
'reply_all': '06_social_reply_all',
'return_from_full_screen': '09_media_return_from_full_screen',
'rewind': '09_media_rewind',
'ring_volume': '10_device_access_ring_volume',
'rotate_left': '08_camera_rotate_left',
'rotate_right': '08_camera_rotate_right',
'save': '05_content_save',
'screen_locked_to_landscape': '10_device_access_screen_locked_to_landscape',
'screen_locked_to_portrait': '10_device_access_screen_locked_to_portrait',
'screen_rotation': '10_device_access_screen_rotation',
'sd_storage': '10_device_access_sd_storage',
'search': '01_core_search',
'secure': '10_device_access_secure',
'select_all': '01_core_select_all',
'send_now': '06_social_send_now',
'settings': '13_extra_actions_settings',
'share': '01_core_share',
'shuffle': '09_media_shuffle',
'slideshow': '09_media_slideshow',
'sort_by_size': '04_collections_sort_by_size',
'split': '05_content_split',
'stop': '09_media_stop',
'storage': '10_device_access_storage',
'switch_camera': '08_camera_switch_camera',
'switch_video': '08_camera_switch_video',
'time': '10_device_access_time',
'undo': '01_core_undo',
'unread': '05_content_unread',
'upload': '09_media_upload',
'usb': '10_device_access_usb',
'video': '08_camera_video',
'view_as_grid': '04_collections_view_as_grid',
'view_as_list': '04_collections_view_as_list',
'volume_muted': '09_media_volume_muted',
'volume_on': '09_media_volume_on',
'warning': '12_alerts_and_states_warning',
'web_site': '07_location_web_site',
}

162
Graphics/android-icon-copier/copy Executable file
View File

@ -0,0 +1,162 @@
#!/usr/bin/env python
import os
import sys
import shutil
import requests
from os.path import expanduser
import classic
resolutions = {
'material': ("m", "h", "xh", "xxh", "xxxh"),
'fa': ("l", "m", "h", "xh", "xxh"),
'classic': ("m", "h", "xh", "xxh"),
}
class AppError(Exception):
pass
def make_filename(filename_format, cat, name, color, size):
args = {
'cat': cat or '',
'name': name,
'color': color,
'size': size,
}
bg = {'white': 'dark', 'grey': 'light', 'black': 'bright'}.get(color) or ''
bg_suffix = '_dark' if bg == 'dark' else ''
args['bgSuffix'] = bg_suffix
args['bg'] = bg
return filename_format.format(**args)
def download_url(url, target_path):
print("Downloading {} to {} ...".format(url, target_path))
print("")
#r = requests.get(url, stream=True)
r = requests.get(url)
if r.status_code != 200:
raise AppError("url not found, perhaps invalid name, size or color")
with open(target_path, 'wb') as fd:
for chunk in r.iter_content(4096):
fd.write(chunk)
def make_material_icon_url(cat, res, name, color, size):
if color == 'grey':
color = 'grey600'
elif color not in ('white', 'black'):
raise AppError('invalid color')
return ('https://raw.githubusercontent.com/google/material-design-icons/master/' +
'{}/drawable-{}dpi/ic_{}_{}_{}dp.png').format(cat, res, name, color, size)
def make_fa_icon_url(res, name, color):
if color == 'white':
holo = 'dark'
elif color == 'grey':
holo = 'light'
else:
raise AppError('invalid color')
return ('https://raw.githubusercontent.com/svenkapudija/Android-Action-Bar-Icons/' +
'master/Font Awesome/holo_{2}/ic_fa_{1}/drawable-{0}dpi/ic_fa_{1}.png').format(res, name, holo)
def make_classic_icon_url(res, name, color):
dirname = classic.CLASSIC_MAP.get(name)
if not dirname:
raise AppError('invalid name')
if color == 'white':
holo = 'dark'
elif color == 'grey':
holo = 'light'
else:
raise AppError('invalid color')
return ('https://raw.githubusercontent.com/svenkapudija/Android-Action-Bar-Icons/' +
'master/Android Stock/holo_{2}/{3}/drawable-{0}dpi/ic_action_{1}.png').format(res, name, holo, dirname)
def make_target_path(base_path, proj, res, filename):
res_path1 = os.path.join(base_path, proj, 'src', 'main', 'res')
res_path2 = os.path.join(base_path, proj, 'res')
if os.path.isdir(res_path1):
res_path = res_path1
elif os.path.isdir(res_path2):
res_path = res_path2
else:
raise AppError('missing res dir')
res_specific_path = os.path.join(res_path, 'drawable-' + res + 'dpi')
try:
os.mkdir(res_specific_path)
except OSError:
pass
return os.path.join(res_specific_path, filename)
def do_material(options, proj_path, cat, name, color, size):
base_path = expanduser(options['basePath'])
filename_map = options['filenameMap']
for res in resolutions['material']:
filename = make_filename(filename_map['material'], cat, name, color, size)
target_path = make_target_path(base_path, proj_path, res, filename)
url = make_material_icon_url(cat, res, name, color, size)
download_url(url, target_path)
def do_classic_or_fa(options, proj_path, cat, name, color):
base_path = expanduser(options['basePath'])
filename_map = options['filenameMap']
for res in resolutions[cat]:
filename = make_filename(filename_map[cat], cat, name, color, size=32)
target_path = make_target_path(base_path, proj_path, res, filename)
url = globals()['make_' + cat + '_icon_url'](res, name, color)
download_url(url, target_path)
def print_usage():
print("Usage:")
print("Material : ./copy <proj path> <category> <color> <icon name> [size]")
print("Classic & FA: ./copy <proj path> <fa/classic> <color> <icon name>")
print("")
def main():
import json
if len(sys.argv) < 5:
print_usage()
return
option_filename = 'options.json'
if not os.path.exists(option_filename):
option_filename = 'options.templ.json'
print("WARNING: using the template options file")
print("You should create your own options.json")
with open(option_filename, 'r') as fd:
options = json.load(fd)
proj_path = sys.argv[1]
cat = sys.argv[2]
color = sys.argv[3]
name = sys.argv[4]
if cat == 'classic' or cat == 'fa':
do_classic_or_fa(options, proj_path, cat, name, color)
else:
size = sys.argv[5] if len(sys.argv) >= 6 else 0
size = int(size) or 24
do_material(options, proj_path, cat, name, color, size)
if __name__ == "__main__":
try:
main()
except AppError as e:
print(e.message)

View File

@ -0,0 +1,8 @@
{
"basePath": "~/Documents",
"filenameMap": {
"classic": "ic_action_{name}{bgSuffix}.png",
"fa": "ic_action_fa_{name}{bgSuffix}.png",
"material": "ic_{name}_{color}_{size}dp.png"
}
}

View File

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

View File

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 95 KiB

View File

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 197 KiB

View File

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 182 KiB

View File

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

Before

Width:  |  Height:  |  Size: 475 KiB

After

Width:  |  Height:  |  Size: 475 KiB

View File

Before

Width:  |  Height:  |  Size: 579 KiB

After

Width:  |  Height:  |  Size: 579 KiB

View File

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Some files were not shown because too many files have changed in this diff Show More