diff --git a/.gitignore b/.gitignore index 7eea436..6746903 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ ########## Custom pngs +themes ########## Python diff --git a/builder/applbuild/configure.py b/builder/applbuild/configure.py index e91a892..5e107d6 100644 --- a/builder/applbuild/configure.py +++ b/builder/applbuild/configure.py @@ -1,6 +1,56 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +from pathlib import Path +from typing import Any, Dict, List, Tuple, Union -def gg() -> None: - print("sdsd") \ No newline at end of file +from clickgen.util import LikePath, PNGProvider + +from applbuild.constants import * + + +def get_config(bitmaps_dir: LikePath) -> Dict[str, Any]: + """Return configuration of `macOSBigSur` pointers. + + :bitmaps_dir: (str | Path) Path to .png file's directory. + """ + + png = PNGProvider(bitmaps_dir) + config: Dict[str, Any] = {} + + for key, item in X_CURSORS_CFG.items(): + x_hot: int = item.get("x_hot", 0) + y_hot: int = item.get("y_hot", 0) + hotspot: Tuple[int, int] = (x_hot, y_hot) + + delay: int = item.get("delay", X_DELAY) + p: Union[List[Path], Path] = png.get(key) + + data = { + "png": p, + "hotspot": hotspot, + "delay": delay, + } + + win_data = WIN_CURSORS_CFG.get(key) + + if win_data: + win_key = win_data.get("to") + + position = win_data.get("position", "center") + canvas_size: Tuple[int, int] = win_data.get("canvas_size", CANVAS_SIZE) + size: Tuple[int, int] = win_data.get("size", SIZE) + win_delay: int = win_data.get("delay", WIN_DELAY) + + config[key] = { + **data, + "win_key": win_key, + "position": position, + "canvas_size": canvas_size, + "size": size, + "win_delay": win_delay, + } + else: + config[key] = data + + return config diff --git a/builder/applbuild/constants.py b/builder/applbuild/constants.py new file mode 100644 index 0000000..14367a2 --- /dev/null +++ b/builder/applbuild/constants.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from typing import Dict, List, Tuple + +# Info +THEME_NAME = "macOSBigSur" +COMMENT = "macOS Big Sur Pointers" +AUTHOR = "Kaiz Khatri" +URL = "https://github.com/ful1e5/apple_cursor" + +# XCursor +X_DELAY: int = 10 +X_SIZES: List[Tuple[int, int]] = [(24, 24), (32, 32)] + + +# Windows Cursor +CANVAS_SIZE = (32, 32) +SIZE = (24, 24) +WIN_DELAY = 3 + +X_CURSORS_CFG: Dict[str, Dict[str, int]] = { + # + # Static + # + "all_scroll.png": {"xhot": 100, "yhot": 100}, + "bottom_left_corner.png": {"xhot": 100, "yhot": 100}, + "fd_double_arrow.png": {"xhot": 100, "yhot": 100}, + "top_right_corner.png": {"xhot": 100, "yhot": 100}, + "bottom_right_corner.png": {"xhot": 100, "yhot": 100}, + "bd_double_arrow.png": {"xhot": 100, "yhot": 100}, + "top_left_corner.png": {"xhot": 100, "yhot": 100}, + "bottom_tee.png": {"xhot": 141, "yhot": 99}, + "center_ptr.png": {"xhot": 61, "yhot": 100}, + "circle.png": {"xhot": 47, "yhot": 39}, + "crossed_circle.png": {"xhot": 47, "yhot": 39}, + "dnd_no_drop.png": {"xhot": 47, "yhot": 39}, + "context_menu.png": {"xhot": 61, "yhot": 58}, + "copy.png": {"xhot": 47, "yhot": 39}, + "dnd_copy.png": {"xhot": 47, "yhot": 39}, + "cross.png": {"xhot": 100, "yhot": 100}, + "tcross.png": {"xhot": 100, "yhot": 100}, + "crosshair.png": {"xhot": 100, "yhot": 100}, + "dotbox.png": {"xhot": 100, "yhot": 100}, + "hand1.png": {"xhot": 94, "yhot": 105}, + "hand2.png": {"xhot": 66, "yhot": 34}, + "left_ptr.png": {"xhot": 68, "yhot": 41}, + "left_side.png": {"xhot": 100, "yhot": 100}, + "right_side.png": {"xhot": 100, "yhot": 100}, + "left_tee.png": {"xhot": 100, "yhot": 58}, + "link.png": {"xhot": 61, "yhot": 105}, + "dnd_link.png": {"xhot": 61, "yhot": 105}, + "ll_angle.png": {"xhot": 141, "yhot": 58}, + "lr_angle.png": {"xhot": 141, "yhot": 138}, + "move.png": {"xhot": 80, "yhot": 106}, + "dnd_move.png": {"xhot": 80, "yhot": 106}, + "dnd_none.png": {"xhot": 80, "yhot": 106}, + "grabbing.png": {"xhot": 80, "yhot": 106}, + "pointer_move.png": {"xhot": 80, "yhot": 106}, + "pencil.png": {"xhot": 141, "yhot": 58}, + "plus.png": {"xhot": 100, "yhot": 100}, + "question_arrow.png": {"xhot": 105, "yhot": 105}, + "dnd_ask.png": {"xhot": 105, "yhot": 105}, + "right_ptr.png": {"xhot": 61, "yhot": 138}, + "right_tee.png": {"xhot": 100, "yhot": 138}, + "sb_down_arrow.png": {"xhot": 133, "yhot": 99}, + "sb_h_double_arrow.png": {"xhot": 100, "yhot": 100}, + "sb_left_arrow.png": {"xhot": 100, "yhot": 68}, + "sb_right_arrow.png": {"xhot": 100, "yhot": 138}, + "sb_up_arrow.png": {"xhot": 68, "yhot": 99}, + "sb_v_double_arrow.png": {"xhot": 100, "yhot": 100}, + "top_side.png": {"xhot": 100, "yhot": 100}, + "bottom_side.png": {"xhot": 100, "yhot": 100}, + "top_tee.png": {"xhot": 61, "yhot": 99}, + "ul_angle.png": {"xhot": 61, "yhot": 65}, + "ur_angle.png": {"xhot": 61, "yhot": 138}, + "vertical_text.png": {"xhot": 100, "yhot": 102}, + "wayland_cursor.png": {"xhot": 100, "yhot": 100}, + "x_cursor.png": {"xhot": 100, "yhot": 100}, + "xterm.png": {"xhot": 97, "yhot": 97}, + "zoom_in.png": {"xhot": 76, "yhot": 78}, + "zoom_out.png": {"xhot": 76, "yhot": 78}, + # + # Animated + # + # Note: Animated cursors not need any extension & frames number + "wait": {"xhot": 104, "yhot": 105}, + "left_ptr_watch": {"xhot": 104, "yhot": 105}, +} + +WIN_CURSORS_CFG: Dict[str, Dict[str, str]] = { + # + # Static + # + "right_ptr.png": {"to": "Alternate", "position": "top_left"}, + "cross.png": {"to": "Cross"}, + "left_ptr.png": {"to": "Default", "position": "top_left"}, + "fd_double_arrow.png": {"to": "Diagonal_1"}, + "bd_double_arrow.png": {"to": "Diagonal_2"}, + "pencil.png": {"to": "Handwriting"}, + "question_arrow.png": {"to": "Help", "position.png": "top_left"}, + "sb_h_double_arrow.png": {"to": "Horizontal"}, + "xterm.png": {"to": "IBeam", "position": "top_left"}, + "hand2.png": {"to": "Link", "position": "top_left"}, + "hand1.png": {"to": "Move"}, + "circle.png": {"to": "Unavailiable", "position": "top_left"}, + "sb_v_double_arrow.png": {"to": "Vertical"}, + # + # Animated + # + # Note: Animated cursors not need any extension & frames number + "wait": {"to": "Busy", "size": (28, 28)}, + "left_ptr_watch": {"to": "Work", "position": "top_left", "size": (28, 28)}, +} diff --git a/builder/applbuild/generator.py b/builder/applbuild/generator.py index 2a8499b..f541cbd 100644 --- a/builder/applbuild/generator.py +++ b/builder/applbuild/generator.py @@ -1,6 +1,114 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +from pathlib import Path +from typing import Any -def build() -> None: - print("hdddddd") \ No newline at end of file +from clickgen.builders import WindowsCursor, XCursor +from clickgen.core import CursorAlias +from clickgen.packagers import WindowsPackager, XPackager +from clickgen.util import LikePath, add_missing_xcursors + +from applbuild.configure import get_config +from applbuild.constants import * + +# +# 📝 Note: All CONSTANT variables are imported from `applbuild.constants` module. +# + + +def xbuild(bitmaps_dir: LikePath, x_out_dir: Path) -> None: + """Build `macOSBigSur` cursor theme for only `X11`(UNIX) platform. + + :bitmaps_dir: (str | Path) Path to .png file's directory. + + :x_out_dir: (Path) Path to output directory, Where X11 cursor theme package store. Created automatically if not exists. + """ + + config = get_config(bitmaps_dir) + + # Building + for _, item in config.items(): + png = item["png"] + hotspot = item["hotspot"] + delay = item["delay"] + + with CursorAlias.from_bitmap(png, hotspot) as alias: + x_cfg = alias.create(X_SIZES, delay) + XCursor.create(x_cfg, x_out_dir) + + add_missing_xcursors(x_out_dir / "cursors", rename=True, force=True) + XPackager(x_out_dir, THEME_NAME, COMMENT) + + +def wbuild(bitmaps_dir: LikePath, win_out_dir: Path) -> None: + """Build `macOSBigSur` cursor theme for only `Windows` platforms. + + :bitmaps_dir: (str | Path) Path to .png file's directory. + + :win_out_dir: (Path) Path to output directory, Where Windows Cursor theme package store. Created automatically if not exists. + """ + + config = get_config(bitmaps_dir) + + # Building + for _, item in config.items(): + png = item["png"] + hotspot = item["hotspot"] + delay = item["delay"] + + with CursorAlias.from_bitmap(png, hotspot) as alias: + alias = alias.create(X_SIZES, delay) + + if item.get("win_key"): + position = item["position"] + size = item["size"] + win_key = item["win_key"] + canvas_size = item["canvas_size"] + + win_cfg = alias.reproduce(size, canvas_size, position, delay=3).rename( + win_key + ) + WindowsCursor.create(win_cfg, win_out_dir) + + WindowsPackager(win_out_dir, THEME_NAME, COMMENT, AUTHOR, URL) + + +def build(bitmaps_dir: LikePath, x_out_dir: Path, win_out_dir: Path) -> None: + """Build `macOSBigSur` cursor theme for `X11` & `Windows` platforms. + + :bitmaps_dir: (str | Path) Path to .png file's directory. + + :x_out_dir: (Path) Path to output directory, Where X11 cursor theme package store. Created automatically if not exists. + + :win_out_dir: (Path) Path to output directory, Where Windows Cursor theme package store. Created automatically if not exists. + """ + + def win_build(item: Any, alias: CursorAlias) -> None: + position = item["position"] + size = item["size"] + win_key = item["win_key"] + canvas_size = item["canvas_size"] + + win_cfg = alias.reproduce(size, canvas_size, position, delay=3).rename(win_key) + WindowsCursor.create(win_cfg, win_out_dir) + + config = get_config(bitmaps_dir) + + # Building + for _, item in config.items(): + png = item["png"] + hotspot = item["hotspot"] + delay = item["delay"] + + with CursorAlias.from_bitmap(png, hotspot) as alias: + x_cfg = alias.create(X_SIZES, delay) + XCursor.create(x_cfg, x_out_dir) + + if item.get("win_key"): + win_build(item, alias) + + add_missing_xcursors(x_out_dir / "cursors", rename=True, force=True) + + XPackager(x_out_dir, THEME_NAME, COMMENT) + WindowsPackager(win_out_dir, THEME_NAME, COMMENT, AUTHOR, URL) diff --git a/builder/build.py b/builder/build.py index b8d965c..0de4c56 100644 --- a/builder/build.py +++ b/builder/build.py @@ -1,6 +1,11 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -from applbuild.generator import build +from pathlib import Path -build() \ No newline at end of file +from applbuild.generator import xbuild + +bitmaps_dir = Path("../pngs") +x_out_dir = Path("../themes") / "macOSBigSur" + +xbuild(bitmaps_dir, x_out_dir) diff --git a/builder/setup.py b/builder/setup.py index 5d377fd..46853fb 100644 --- a/builder/setup.py +++ b/builder/setup.py @@ -5,7 +5,7 @@ from setuptools import setup setup( name="applbuild", - version="1.0.7", + version="1.0.8", description="Generate 'macOSBigSur' cursor theme from PNGs file", url="https://github.com/ful1e5/apple_cursor", packages=["applbuild"],