From c3e146e2ee5ee70a45fb398e0d3cf367aa110293 Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Wed, 20 Jul 2022 17:09:57 +0100 Subject: [PATCH] Initial commit --- .gitignore | 112 ++++++++++++ .vscode/launch.json | 60 ++++++ .vscode/settings.json | 9 + Pipfile | 22 +++ Pipfile.lock | 210 +++++++++++++++++++++ app.py | 305 +++++++++++++++++++++++++++++++ arcade.png | Bin 0 -> 44031 bytes cfg/___empty.cfg | 5 + cfg/default.cfg | 5 + configfile.py | 137 ++++++++++++++ csvfile.py | 143 +++++++++++++++ exclude.py | 99 ++++++++++ gui.py | 413 ++++++++++++++++++++++++++++++++++++++++++ images/arcade.icns | Bin 0 -> 131980 bytes images/arcade.ico | Bin 0 -> 370070 bytes mame.py | 406 +++++++++++++++++++++++++++++++++++++++++ mess.py | 281 ++++++++++++++++++++++++++++ mfe.py | 11 ++ mfe_mac.ini | 34 ++++ readme.txt | 4 + requirements.txt | 6 + setup.py | 23 +++ utils.py | 135 ++++++++++++++ 23 files changed, 2420 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 app.py create mode 100644 arcade.png create mode 100644 cfg/___empty.cfg create mode 100644 cfg/default.cfg create mode 100644 configfile.py create mode 100644 csvfile.py create mode 100644 exclude.py create mode 100644 gui.py create mode 100644 images/arcade.icns create mode 100644 images/arcade.ico create mode 100644 mame.py create mode 100644 mess.py create mode 100644 mfe.py create mode 100644 mfe_mac.ini create mode 100644 readme.txt create mode 100644 requirements.txt create mode 100644 setup.py create mode 100644 utils.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed4a7e0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,112 @@ +mame.json +mame/* +mfe.ini +mame.dat +mess.dat +mame_exclude.txt + +.vscode/tags + +# Mac Files +.DS_Store + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2ab7d6a --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,60 @@ +{ + "version": "0.2.0", + "configurations": [{ + "name": "Python", + "type": "python", + "request": "launch", + "stopOnEntry": false, + "pythonPath": "${config:python.pythonPath}", + "program": "${workspaceRoot}/mfe.py", + "cwd": "${workspaceRoot}", + "env": {}, + "envFile": "${workspaceRoot}/.env", + "debugOptions": [ + "RedirectOutput" + ] + }, + { + "name": "Integrated Terminal/Console", + "type": "python", + "request": "launch", + "stopOnEntry": true, + "pythonPath": "${config:python.pythonPath}", + "program": "${file}", + "cwd": "", + "console": "integratedTerminal", + "env": {}, + "envFile": "${workspaceRoot}/.env", + "debugOptions": [ + "WaitOnAbnormalExit", + "WaitOnNormalExit" + ] + }, + { + "name": "External Terminal/Console", + "type": "python", + "request": "launch", + "stopOnEntry": true, + "pythonPath": "${config:python.pythonPath}", + "program": "${file}", + "cwd": "", + "console": "externalTerminal", + "env": {}, + "envFile": "${workspaceRoot}/.env", + "debugOptions": [ + "WaitOnAbnormalExit", + "WaitOnNormalExit" + ] + }, + { + "name": "Attach (Remote Debug)", + "type": "python", + "request": "attach", + "localRoot": "${workspaceRoot}", + "remoteRoot": "${workspaceRoot}", + "port": 3000, + "secret": "my_secret", + "host": "localhost" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..44cdbf3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "python.formatting.provider": "yapf", + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": ["--ignore", "E501,E722,C0103"], + "editor.formatOnPaste": true, + "editor.formatOnSave": true, + "editor.formatOnType": true, + "python.pythonPath": "/Users/rich/.local/share/virtualenvs/mfe-K8QhrIKQ/bin/python", +} \ No newline at end of file diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..ee43616 --- /dev/null +++ b/Pipfile @@ -0,0 +1,22 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +configobj = ">=5.0.6" +appdirs = ">=1.4.3" +lxml = ">=3.8.0" +titlecase = ">=0.11.0" +#pygame = {path = "./../pygame/dist/pygame-1.9.5.dev0-py3.7-macosx-10.14-x86_64.egg"} +#Pygame = ">=1.9.3" +pygame = {file = "file:///Users/rich/git/pygame/dist/pygame-1.9.5.dev0-cp37-cp37m-macosx_10_14_x86_64.whl"} + +[dev-packages] +pylint = "*" +flake8 = "*" +cx-freeze = {editable = true,git = "https://github.com/anthony-tuininga/cx_Freeze.git"} +yapf = "*" + +[requires] +python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..52d216a --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,210 @@ +{ + "_meta": { + "hash": { + "sha256": "d7ff85d4507b7eaaf2f2f6433e8450ffcf52bdd74a889e3051a38acd4cd3c62a" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "appdirs": { + "hashes": [ + "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", + "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e" + ], + "index": "pypi", + "version": "==1.4.3" + }, + "configobj": { + "hashes": [ + "sha256:a2f5650770e1c87fb335af19a9b7eb73fc05ccf22144eb68db7d00cd2bcb0902" + ], + "index": "pypi", + "version": "==5.0.6" + }, + "lxml": { + "hashes": [ + "sha256:02bc220d61f46e9b9d5a53c361ef95e9f5e1d27171cd461dddb17677ae2289a5", + "sha256:22f253b542a342755f6cfc047fe4d3a296515cf9b542bc6e261af45a80b8caf6", + "sha256:2f31145c7ff665b330919bfa44aacd3a0211a76ca7e7b441039d2a0b0451e415", + "sha256:36720698c29e7a9626a0dc802ef8885f8f0239bfd1689628ecd459a061f2807f", + "sha256:438a1b0203545521f6616132bfe0f4bca86f8a401364008b30e2b26ec408ce85", + "sha256:4815892904c336bbaf73dafd54f45f69f4021c22b5bad7332176bbf4fb830568", + "sha256:5be031b0f15ad63910d8e5038b489d95a79929513b3634ad4babf77100602588", + "sha256:5c93ae37c3c588e829b037fdfbd64a6e40c901d3f93f7beed6d724c44829a3ad", + "sha256:60842230678674cdac4a1cf0f707ef12d75b9a4fc4a565add4f710b5fcf185d5", + "sha256:62939a8bb6758d1bf923aa1c13f0bcfa9bf5b2fc0f5fa917a6e25db5fe0cfa4e", + "sha256:75830c06a62fe7b8fe3bbb5f269f0b308f19f3949ac81cfd40062f47c1455faf", + "sha256:81992565b74332c7c1aff6a913a3e906771aa81c9d0c68c68113cffcae45bc53", + "sha256:8c892fb0ee52c594d9a7751c7d7356056a9682674b92cc1c4dc968ff0f30c52f", + "sha256:9d862e3cf4fc1f2837dedce9c42269c8c76d027e49820a548ac89fdcee1e361f", + "sha256:a623965c086a6e91bb703d4da62dabe59fe88888e82c4117d544e11fd74835d6", + "sha256:a7783ab7f6a508b0510490cef9f857b763d796ba7476d9703f89722928d1e113", + "sha256:aab09fbe8abfa3b9ce62aaf45aca2d28726b1b9ee44871dbe644050a2fff4940", + "sha256:abf181934ac3ef193832fb973fd7f6149b5c531903c2ec0f1220941d73eee601", + "sha256:ae07fa0c115733fce1e9da96a3ac3fa24801742ca17e917e0c79d63a01eeb843", + "sha256:b9c78242219f674ab645ec571c9a95d70f381319a23911941cd2358a8e0521cf", + "sha256:bccb267678b870d9782c3b44d0cefe3ba0e329f9af8c946d32bf3778e7a4f271", + "sha256:c4df4d27f4c93b2cef74579f00b1d3a31a929c7d8023f870c4b476f03a274db4", + "sha256:caf0e50b546bb60dfa99bb18dfa6748458a83131ecdceaf5c071d74907e7e78a", + "sha256:d3266bd3ac59ac4edcd5fa75165dee80b94a3e5c91049df5f7c057ccf097551c", + "sha256:db0d213987bcd4e6d41710fb4532b22315b0d8fb439ff901782234456556aed1", + "sha256:dbbd5cf7690a40a9f0a9325ab480d0fccf46d16b378eefc08e195d84299bfae1", + "sha256:e16e07a0ec3a75b5ee61f2b1003c35696738f937dc8148fbda9fe2147ccb6e61", + "sha256:e175a006725c7faadbe69e791877d09936c0ef2cf49d01b60a6c1efcb0e8be6f", + "sha256:edd9c13a97f6550f9da2236126bb51c092b3b1ce6187f2bd966533ad794bbb5e", + "sha256:fa39ea60d527fbdd94215b5e5552f1c6a912624521093f1384a491a8ad89ad8b" + ], + "index": "pypi", + "version": "==4.2.5" + }, + "pygame": { + "file": "file:///Users/rich/git/pygame/dist/pygame-1.9.5.dev0-cp37-cp37m-macosx_10_14_x86_64.whl", + "hashes": [ + "sha256:9b811036eebebca68f166683f21427d1682f62159cb6de2b6724dec2be322c2a", + "sha256:9fba43308b121628a6c70edc7fac4b07ae5e30ccfe5bf36b914b3a2130e1671a", + "sha256:a8e217e5c39c5ea2900f450f2e8acdb97487053a13447f680608200a956e8fe3", + "sha256:b48da4cd1b70487791767fcae7e9e3ce8eaf4d340667b5eea14d49a4104e23d1" + ], + "version": "==1.9.5.dev0" + }, + "six": { + "hashes": [ + "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", + "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + ], + "version": "==1.11.0" + }, + "titlecase": { + "hashes": [ + "sha256:84de7a97fb702c400e5ba11c6b30849944b39db12e20fbf4515a23c7538a0611", + "sha256:95d643a0c08097c02933aced707adfe1c275c335019e8e514dea782a465c5b84" + ], + "index": "pypi", + "version": "==0.12.0" + } + }, + "develop": { + "astroid": { + "hashes": [ + "sha256:35b032003d6a863f5dcd7ec11abd5cd5893428beaa31ab164982403bcb311f22", + "sha256:6a5d668d7dc69110de01cdf7aeec69a679ef486862a0850cc0fd5571505b6b7e" + ], + "version": "==2.1.0" + }, + "cx-freeze": { + "editable": true, + "git": "https://github.com/anthony-tuininga/cx_Freeze.git", + "ref": "9e06b761740a9e93431ee7ea8d0b10f786446a6a" + }, + "flake8": { + "hashes": [ + "sha256:6a35f5b8761f45c5513e3405f110a86bea57982c3b75b766ce7b65217abe1670", + "sha256:c01f8a3963b3571a8e6bd7a4063359aff90749e160778e03817cd9b71c9e07d2" + ], + "index": "pypi", + "version": "==3.6.0" + }, + "isort": { + "hashes": [ + "sha256:1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af", + "sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8", + "sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497" + ], + "version": "==4.3.4" + }, + "lazy-object-proxy": { + "hashes": [ + "sha256:0ce34342b419bd8f018e6666bfef729aec3edf62345a53b537a4dcc115746a33", + "sha256:1b668120716eb7ee21d8a38815e5eb3bb8211117d9a90b0f8e21722c0758cc39", + "sha256:209615b0fe4624d79e50220ce3310ca1a9445fd8e6d3572a896e7f9146bbf019", + "sha256:27bf62cb2b1a2068d443ff7097ee33393f8483b570b475db8ebf7e1cba64f088", + "sha256:27ea6fd1c02dcc78172a82fc37fcc0992a94e4cecf53cb6d73f11749825bd98b", + "sha256:2c1b21b44ac9beb0fc848d3993924147ba45c4ebc24be19825e57aabbe74a99e", + "sha256:2df72ab12046a3496a92476020a1a0abf78b2a7db9ff4dc2036b8dd980203ae6", + "sha256:320ffd3de9699d3892048baee45ebfbbf9388a7d65d832d7e580243ade426d2b", + "sha256:50e3b9a464d5d08cc5227413db0d1c4707b6172e4d4d915c1c70e4de0bbff1f5", + "sha256:5276db7ff62bb7b52f77f1f51ed58850e315154249aceb42e7f4c611f0f847ff", + "sha256:61a6cf00dcb1a7f0c773ed4acc509cb636af2d6337a08f362413c76b2b47a8dd", + "sha256:6ae6c4cb59f199d8827c5a07546b2ab7e85d262acaccaacd49b62f53f7c456f7", + "sha256:7661d401d60d8bf15bb5da39e4dd72f5d764c5aff5a86ef52a042506e3e970ff", + "sha256:7bd527f36a605c914efca5d3d014170b2cb184723e423d26b1fb2fd9108e264d", + "sha256:7cb54db3535c8686ea12e9535eb087d32421184eacc6939ef15ef50f83a5e7e2", + "sha256:7f3a2d740291f7f2c111d86a1c4851b70fb000a6c8883a59660d95ad57b9df35", + "sha256:81304b7d8e9c824d058087dcb89144842c8e0dea6d281c031f59f0acf66963d4", + "sha256:933947e8b4fbe617a51528b09851685138b49d511af0b6c0da2539115d6d4514", + "sha256:94223d7f060301b3a8c09c9b3bc3294b56b2188e7d8179c762a1cda72c979252", + "sha256:ab3ca49afcb47058393b0122428358d2fbe0408cf99f1b58b295cfeb4ed39109", + "sha256:bd6292f565ca46dee4e737ebcc20742e3b5be2b01556dafe169f6c65d088875f", + "sha256:cb924aa3e4a3fb644d0c463cad5bc2572649a6a3f68a7f8e4fbe44aaa6d77e4c", + "sha256:d0fc7a286feac9077ec52a927fc9fe8fe2fabab95426722be4c953c9a8bede92", + "sha256:ddc34786490a6e4ec0a855d401034cbd1242ef186c20d79d2166d6a4bd449577", + "sha256:e34b155e36fa9da7e1b7c738ed7767fc9491a62ec6af70fe9da4a057759edc2d", + "sha256:e5b9e8f6bda48460b7b143c3821b21b452cb3a835e6bbd5dd33aa0c8d3f5137d", + "sha256:e81ebf6c5ee9684be8f2c87563880f93eedd56dd2b6146d8a725b50b7e5adb0f", + "sha256:eb91be369f945f10d3a49f5f9be8b3d0b93a4c2be8f8a5b83b0571b8123e0a7a", + "sha256:f460d1ceb0e4a5dcb2a652db0904224f367c9b3c1470d5a7683c0480e582468b" + ], + "version": "==1.3.1" + }, + "mccabe": { + "hashes": [ + "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", + "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + ], + "version": "==0.6.1" + }, + "pycodestyle": { + "hashes": [ + "sha256:cbc619d09254895b0d12c2c691e237b2e91e9b2ecf5e84c26b35400f93dcfb83", + "sha256:cbfca99bd594a10f674d0cd97a3d802a1fdef635d4361e1a2658de47ed261e3a" + ], + "version": "==2.4.0" + }, + "pyflakes": { + "hashes": [ + "sha256:9a7662ec724d0120012f6e29d6248ae3727d821bba522a0e6b356eff19126a49", + "sha256:f661252913bc1dbe7fcfcbf0af0db3f42ab65aabd1a6ca68fe5d466bace94dae" + ], + "version": "==2.0.0" + }, + "pylint": { + "hashes": [ + "sha256:689de29ae747642ab230c6d37be2b969bf75663176658851f456619aacf27492", + "sha256:771467c434d0d9f081741fec1d64dfb011ed26e65e12a28fe06ca2f61c4d556c" + ], + "index": "pypi", + "version": "==2.2.2" + }, + "six": { + "hashes": [ + "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", + "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + ], + "version": "==1.11.0" + }, + "wrapt": { + "hashes": [ + "sha256:d4d560d479f2c21e1b5443bbd15fe7ec4b37fe7e53d335d3b9b0a7b1226fe3c6" + ], + "version": "==1.10.11" + }, + "yapf": { + "hashes": [ + "sha256:8aa7f9abdb97b4da4d3227306b88477982daafef0a96cc41639754ca31f46d55", + "sha256:f2df5891481f94ddadfbf8ae8ae499080752cfb06005a31bbb102f3012f8b944" + ], + "index": "pypi", + "version": "==0.25.0" + } + } +} diff --git a/app.py b/app.py new file mode 100644 index 0000000..ed3b53d --- /dev/null +++ b/app.py @@ -0,0 +1,305 @@ +import sys +# from pprint import pprint + +import pygame + +import csvfile +import gui as guimodule +import mame +import mess +from configfile import cfg, config_write, get_emu, get_emulators, set_emu +from utils import addscanlines, image_from_data, run_emulator + +BLACK = (0, 0, 0) +WHITE = (255, 255, 255) +GREY = (70, 70, 70) +DARKGREY = (50, 50, 50) + + +class app(object): + def __init__(self): + if get_emu('EmulatorType') == 'MAME': + self.roms = mame.MameROMs(cfg['datadir'], cfg['HideMature'], + get_emu()) + if get_emu('EmulatorType') == 'MESS': + self.roms = mess.MessROMs(cfg['datadir'], get_emu()) + if get_emu('EmulatorType') == 'CSV': + self.roms = csvfile.csvROMs(cfg['datadir'], get_emu()) + + self.update_menus() + + pygame.init() + pygame.font.init() + + iconsurface = pygame.image.load("arcade.png") + pygame.display.set_icon(iconsurface) + + if cfg['FullScreen']: + self.screen = pygame.display.set_mode( + (cfg['ResolutionX'], cfg['ResolutionY']), pygame.FULLSCREEN) + else: + self.screen = pygame.display.set_mode((cfg['ResolutionX'], + cfg['ResolutionY'])) + + self.font = pygame.font.Font( + pygame.font.match_font(cfg['Font']), cfg['FontSize']) + + self.status_surface = pygame.Surface(( # pylint: disable=E1121 + cfg['ResolutionX'], self.font.get_height())) + + self.oldmouse = pygame.mouse.set_visible(False) + + pygame.key.set_repeat(100, 30) + + self.listwidth = int(cfg['ResolutionX'] / 2) + + self.gui = guimodule.gui(self.screen) + + self.gui.add_menu( + 0, + 0, + self.listwidth, + cfg['ResolutionY'] - self.font.get_height(), + border=False, + data=self.roms, + fg=(255, 255, 255), + bg=(0, 0, 0), + name='MainList', + startitem=get_emu('CurrentGame'), + itemattop=get_emu('GameAtTop')) + + self.gui.render() + + def update_menus(self): + rootmenu = [ + 'Show Artwork', 'Categories', 'Sort', + 'Hide Clones' if get_emu('ShowClones') else 'Show Clones', + 'Change Emulator', 'Quit' + ] + sortmenu = ['Name Asc', 'Name Dec', 'Year Asc', 'Year Dec'] + emulatormenu = get_emulators() + self.menus = { + 'rootmenu': rootmenu, + 'sortmenu': sortmenu, + 'emulatormenu': emulatormenu, + 'categorymenu': self.roms.categories + } + + def run(self): + keyup = False + quitcount = 0 + + while True: + event = self.gui.waitevent() + if event: + if event.type == pygame.QUIT: + break + if event.type == pygame.KEYDOWN: + keyup = False + if event.key == pygame.K_ESCAPE and self.gui.currentobject == 1: # Main List + quitcount += 1 + if quitcount == cfg['QuitKeyPresses']: + break + elif event.key == pygame.K_ESCAPE: + quitcount = 0 + if self.gui.currentobject > 1: + self.gui.deletelastobject() + else: + quitcount = 0 + if event.key in cfg[ + 'KeySelect'] and self.gui.currentobject == 1: + if sys.platform == 'darwin': + print('Running %s' % + self.roms[self.gui.getcurrentitem()].name) + run_emulator( + get_emu('EmulatorType'), get_emu('EXE'), + self.roms[self.gui.getcurrentitem()].name) + elif event.key in cfg[ + 'KeyGameHistory'] and self.gui.currentobject == 1: + history = self.roms.get_history( + self.roms[self.gui.getcurrentitem()]) + if history: + self.gui.add_notepad(-1, -1, 800, 600, history, + True, WHITE, DARKGREY, + 'history', 'Game History') + elif event.key in cfg[ + 'KeyGameInfo'] and self.gui.currentobject == 1: + info = self.roms.get_info( + self.roms[self.gui.getcurrentitem()]) + if info: + self.gui.add_notepad(-1, -1, 800, 600, info, True, + WHITE, DARKGREY, 'info', + 'Game Information') + elif event.key in cfg[ + 'KeyPopup'] and self.gui.currentobject == 1: + self.gui.add_menu(40, 40, -1, -1, + self.menus['rootmenu'], True, WHITE, + GREY, 'rootmenu', 0) + elif event.key in cfg[ + 'KeyPopup'] and self.gui.currentobject > 1: + self.gui.deletelastobject() + elif event.key in cfg['KeyShowArtwork']: + pass + # TODO: copy from below + elif event.key in cfg['KeySelect']: + currentitem = self.gui.getcurrentitem() + menuname = self.gui.getmenuname() + item = self.menus[menuname][currentitem] + if menuname == 'rootmenu': + if item == 'Quit': + break + elif item == 'Show Artwork': + print('hello') + aw = self.roms.get_artwork( + self.roms[self.gui.getcurrentitem(0)]) + if aw != []: + self.gui.add_image_notepad( + -1, -1, 800, 600, aw, True, WHITE, + DARKGREY, 'artwork', 'Artwork') + elif item == 'Categories': + self.gui.add_menu( + 80, 45, -1, + -(self.screen.get_height() - 45 - + (self.font.get_height() * 2) - 8), + self.menus['categorymenu'], True, WHITE, + GREY, 'categorymenu', 0) + elif item == 'Sort': + self.gui.add_menu(80, 45, -1, -1, + self.menus['sortmenu'], True, + WHITE, GREY, 'sortmenu', 0) + elif item == 'Show Clones': + set_emu('ShowClones', True) + self.update_menus() + self.roms.filter() + self.gui.deleteallmenus() + self.gui.setcurrentitem(0) + elif item == 'Hide Clones': + set_emu('ShowClones', False) + self.update_menus() + self.roms.filter() + self.gui.deleteallmenus() + self.gui.setcurrentitem(0) + elif item == 'Change Emulator': + self.gui.add_menu( + 80, 45, -1, + -(self.screen.get_height() - 45 - + (self.font.get_height() * 2) - 8), + self.menus['emulatormenu'], True, WHITE, + GREY, 'emulatormenu', 0) + elif menuname == 'sortmenu': + set_emu('Sort', item) + self.roms.filter() + self.gui.deleteallmenus() + elif menuname == 'categorymenu': + set_emu('Category', item) + self.roms.filter() + self.gui.deleteallmenus() + self.gui.setcurrentitem(0) + elif menuname == 'emulatormenu': + cfg['Emulator'] = item + if get_emu('EmulatorType') == 'MAME': + self.roms = mame.MameROMs( + cfg['datadir'], cfg['HideMature'], + get_emu()) + if get_emu('EmulatorType') == 'MESS': + self.roms = mess.MessROMs( + cfg['datadir'], get_emu()) + if get_emu('EmulatorType') == 'CSV': + self.roms = csvfile.csvROMs( + cfg['datadir'], get_emu()) + + self.update_menus() + self.gui.deleteallmenus() + self.gui.deletelastobject() + self.gui.add_menu( + 0, + 0, + self.listwidth, + cfg['ResolutionY'] - self.font.get_height(), + border=False, + data=self.roms, + fg=(255, 255, 255), + bg=(0, 0, 0), + name='MainList', + startitem=get_emu('CurrentGame'), + itemattop=get_emu('GameAtTop')) + + if event.type == pygame.KEYUP: + keyup = True + + if self.gui.currentobject == 1 and self.roms: + currentitem = self.gui.getcurrentitem() + + self.screen.fill(BLACK) + self.status_surface.fill((128, 128, 128)) + + if keyup: + pass + if cfg['AlwaysChangeSnap'] or keyup: + data = self.roms.get_snap(self.roms[currentitem], 'snap') + screenshot_surface = image_from_data(data, (508, 480)) + + if cfg['ScanLines']: + screenshot_surface = addscanlines(screenshot_surface) + + self.screen.blit( + screenshot_surface, + (self.listwidth + 2 + ( + (self.screen.get_width() - self.listwidth + 2) / 2) + - (screenshot_surface.get_width() / 2), 102)) + + data = self.roms.get_snap(self.roms[currentitem], + 'marquee') + marquee_surface = image_from_data(data, (640, 100)) + + self.screen.blit( + marquee_surface, + (self.listwidth + 2 + ( + (self.screen.get_width() - self.listwidth + 2) / 2) + - (marquee_surface.get_width() / 2), 0)) + + data = self.roms.get_snap(self.roms[currentitem], 'title') + title_surface = image_from_data( + data, (640, cfg['ResolutionY'] - + (screenshot_surface.get_height() + + marquee_surface.get_height() + 4 + + self.status_surface.get_height()))) + + self.screen.blit( + title_surface, (self.listwidth + 2 + ( + (self.screen.get_width() - self.listwidth + 2) / 2) + - (title_surface.get_width() / 2), + (screenshot_surface.get_height() + + marquee_surface.get_height() + 4))) + + size = self.font.size( + '%d / %d %s' % (currentitem + 1, len(self.roms), + get_emu('Sort')))[0] + + self.status_surface.blit( + self.font.render( + '%d / %d %s' % (currentitem + 1, len(self.roms), + get_emu('Sort')), True, BLACK, + (128, 128, 128)), (cfg['ResolutionX'] - size - 5, 0)) + self.status_surface.blit( + self.font.render( + '%s %s' % (self.roms[currentitem].year, + self.roms[currentitem].category), True, + BLACK, (128, 128, 128)), (5, 0)) + + try: + self.screen.blit( + self.status_surface, + (0, cfg['ResolutionY'] - self.font.get_height())) + except: + pass + + self.gui.render() + + pygame.mouse.set_visible(self.oldmouse) + pygame.key.set_repeat() + + set_emu('CurrentGame', self.gui.getcurrentitem()) + set_emu('GameAtTop', self.gui.getitemattop()) + + config_write() diff --git a/arcade.png b/arcade.png new file mode 100644 index 0000000000000000000000000000000000000000..322bbd6695871f9b3a0eedb97a2ed9a7f213e055 GIT binary patch literal 44031 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 literal 0 HcmV?d00001 diff --git a/cfg/___empty.cfg b/cfg/___empty.cfg new file mode 100644 index 0000000..bf38827 --- /dev/null +++ b/cfg/___empty.cfg @@ -0,0 +1,5 @@ + + + + + diff --git a/cfg/default.cfg b/cfg/default.cfg new file mode 100644 index 0000000..02f0986 --- /dev/null +++ b/cfg/default.cfg @@ -0,0 +1,5 @@ + + + + + diff --git a/configfile.py b/configfile.py new file mode 100644 index 0000000..a186ce2 --- /dev/null +++ b/configfile.py @@ -0,0 +1,137 @@ +from __future__ import print_function + +import os + +from appdirs import user_data_dir +from configobj import ConfigObj, flatten_errors, Section +from validate import Validator + +from exclude import MAME_EXCLUDE +from utils import get_pygame_keydict, get_keys + +CFG = '''ResolutionX = integer(default=1024) +ResolutionY = integer(default=768) +FullScreen = boolean(default=False) +Font = string(default='microsoftsansserif') +FontSize = integer(default=13) +QuitKeyPresses = integer(min=1,default=3) +ScanLines = boolean(default=True) +Key_Up = list(default=list('K_UP')) +Key_Down = list(default=list('K_DOWN')) +Key_PgUp = list(default=list('K_LEFT','K_PAGEUP')) +Key_PgDn = list(default=list('K_RIGHT','K_PAGEDOWN')) +Key_Home = list(default=list('K_HOME')) +Key_End = list(default=list('K_END')) +Key_Select = list(default=list('K_RETURN','K_1')) +Key_GameInfo = list(default=list('K_5')) +Key_GameHistory = list(default=list('K_6')) +Key_Popup = list(default=list('K_2')) +Key_ShowArtwork = list(default=list()) +AlwaysChangeSnap = boolean(default=True) +HideMature = boolean(default=True) +Emulator = string() +[__many__] +EXE = string() +Version = string(default=None) +ShowClones = boolean(default=True) +Category = string(default='All Games') +GameAtTop = integer(min=0,default=0) +CurrentGame = integer(min=0,default=0) +EmulatorType = option('MAME','MESS','CSV',default='MAME') +StatusFilter = list(default=list()) +Sort = option('Name Asc','Name Dec','Year Asc','Year Dec',default='Name Asc') +SnapDir = string(default=None) +CSVFile = string(default=None) +ArtworkDirs = list(default=list()) +''' + +appname = 'MFE' +appauthor = 'RMJ' + +datadir = user_data_dir(appname, appauthor) +datadir = os.getcwd() + +if not os.path.isdir(datadir): + os.makedirs(datadir) + +spec = CFG.split('\n') +cfg = ConfigObj( + os.path.join(datadir, 'mfe.ini'), configspec=spec, encoding='UTF8') + +validator = Validator() +result = cfg.validate(validator, copy=True, preserve_errors=True) + +stop = False +for entry in flatten_errors(cfg, result): + section_list, key, error = entry + if key is not None: + section_list.append(key) + else: + section_list.append('[missing section]') + section_string = ', '.join(section_list) + if error is False: + error = 'Missing value or section.' + print(section_string, ' = ', error) + stop = True + +cfg.write() + +if stop: + exit() + +cfg["datadir"] = datadir + +if not os.path.isfile(os.path.join(datadir, 'mame_exclude.txt')): + with open(os.path.join(datadir, "mame_exclude.txt"), "wt") as f: + f.write(MAME_EXCLUDE) + +keys = get_pygame_keydict() +cfg['KeyUp'] = get_keys(keys, cfg['Key_Up']) +cfg['KeyDown'] = get_keys(keys, cfg['Key_Down']) +cfg['KeyPgUp'] = get_keys(keys, cfg['Key_PgUp']) +cfg['KeyPgDn'] = get_keys(keys, cfg['Key_PgDn']) +cfg['KeyHome'] = get_keys(keys, cfg['Key_Home']) +cfg['KeyEnd'] = get_keys(keys, cfg['Key_End']) +cfg['KeySelect'] = get_keys(keys, cfg['Key_Select']) +cfg['KeyGameInfo'] = get_keys(keys, cfg['Key_GameInfo']) +cfg['KeyGameHistory'] = get_keys(keys, cfg['Key_GameHistory']) +cfg['KeyPopup'] = get_keys(keys, cfg['Key_Popup']) +cfg['KeyShowArtwork'] = get_keys(keys, cfg['Key_ShowArtwork']) + + +def config_write(): + Exclude = [ + 'KeyUp', 'KeyDown', 'KeyPgUp', 'KeyPgDn', 'KeySelect', 'KeyGameInfo', + 'KeyGameHistory', 'KeyPopup', 'KeyHome', 'KeyEnd', 'KeyShowArtwork', + 'datadir' + ] + + t = {} + for item in Exclude: + t[item] = cfg[item] + del cfg[item] + + cfg.write() + + for item in t: + cfg[item] = t[item] + + +def get_emu(option=None): + if option: + r = cfg[cfg['Emulator']][option] + else: + r = cfg[cfg['Emulator']] + return r + + +def set_emu(option, data): + cfg[cfg['Emulator']][option] = data + + +def get_emulators(): + r = [] + for k in cfg.keys(): + if isinstance(cfg[k], Section): + r.append(k) + return r diff --git a/csvfile.py b/csvfile.py new file mode 100644 index 0000000..8b08712 --- /dev/null +++ b/csvfile.py @@ -0,0 +1,143 @@ +import csv +import os +import zipfile + + +class csvROM(object): + ''' One CSV ROM ''' + + def __init__(self): + self.name = '' + self.cloneof = None + self.description = '' + self.year = '' + self.manufacturer = '' + self.status = '' + self.category = '' + self.snap = None + + def __str__(self): + return self.description + + def __repr__(self): + return '%s("%s", "%s", "%s", "%s", "%s", "%s", "%s")' % ( + self.__class__.__name__, self.name, self.cloneof, self.description, + self.year, self.manufacturer, self.status, self.category) + + +class csvROMs(object): + ''' A Collection of CSV Roms ''' + + def __init__(self, data_dir, cfg): + self.all_roms = [] + self.roms = [] + self.all_categories = [] + self.categories = [] + self.catdict = {} + self.len = 0 + self.data_dir = data_dir + self.cfg = cfg + self.emulator_dir = os.path.split(cfg['EXE'])[0] + + self.parse() + self.filter() + + self.snapdir = cfg['SnapDir'] + if os.path.isfile(os.path.join(self.snapdir, 'snap.zip')): + self.snapfile = zipfile.ZipFile( + os.path.join(self.snapdir, "snap.zip")) + else: + self.snapfile = None + + def __len__(self): + return self.len + + def __getitem__(self, item): + return self.roms[item] + + def filter(self): + self.roms = [] + + for rom in self.all_roms: + if self.cfg["Category"] == "All Games" or self.cfg["Category"] == rom.category: + self.roms.append(rom) + + if self.cfg["Sort"] == "Name Asc": + self.roms.sort(key=lambda x: x.description.lower(), reverse=False) + elif self.cfg["Sort"] == "Name Dec": + self.roms.sort(key=lambda x: x.description.lower(), reverse=True) + elif self.cfg["Sort"] == "Year Asc": + self.roms.sort(key=lambda x: x.year.lower(), reverse=False) + elif self.cfg["Sort"] == "Year Dec": + self.roms.sort(key=lambda x: x.year.lower(), reverse=True) + + self.len = len(self.roms) + + self.categories = self.all_categories + + def parse(self): + ''' Parse csv file ''' + if os.path.isfile(self.cfg['CSVFile']): + with open(self.cfg['CSVFile']) as f: + reader = csv.DictReader(f) + + for game in reader: + rom = csvROM() + rom.name = game['romname'] + rom.description = game[ + 'description'] if 'description' in game.keys( + ) else game['romname'] + rom.snap = game['snap'] if 'snap' in game.keys() else game[ + 'romname'] + rom.year = game[ + 'year'] if 'year' in game.keys() else 'Unknown Year' + rom.category = game[ + 'category'] if 'category' in game.keys() else 'Unknown' + self.all_roms.append(rom) + + self.all_categories.insert(0, 'All Games') + self.all_categories.append('Unknown') + + return True + + def get_snap(self, rom, type_of_image): # pylint : disable=R0912 + data = None + image_file = None + image_dir = None + + if type_of_image == 'snap': + image_dir = self.snapdir + image_file = self.snapfile + + if image_file: + try: + data = image_file.read(rom.name + ".png") + except: + try: + data = image_file.read(rom.cloneof + '.png') + except: + data = None + elif image_dir: + fn = os.path.join(image_dir, rom.name + '.png') + if os.path.isfile(fn): + with open(fn, 'rb') as f: + data = f.read() + elif rom.cloneof: + fn = os.path.join(image_dir, rom.cloneof + '.png') + if os.path.isfile(fn): + with open(fn, 'rb') as f: + data = f.read() + else: + data = None + else: + data = None + else: + data = None + + return data + + def get_info(self, rom): + return + + def get_history(self, rom): + return diff --git a/exclude.py b/exclude.py new file mode 100644 index 0000000..1ab7d39 --- /dev/null +++ b/exclude.py @@ -0,0 +1,99 @@ +MAME_EXCLUDE = """3D Printer +Astrological Computer +Audio Sequencer +Bank-teller Terminal +Barcode Printer +Bridge Machine +Business Computer / Terminal +Calculator / Pocket Computer +Cash Counter +Chess Machine +Clock +Credit Card Terminal +DVD Player +DVD Reader/Writer +Dame Machine +Development Computer +Devices +Document Processors +Dot-Matrix Display +Drum Machine +EPROM Programmer +Educational Game +Electromechanical / Change Money +Electromechanical / Coin Pusher +Electromechanical / Misc. +Electromechanical / Pinball +Electromechanical / Redemption +Electromechanical / Reels +Electromechanical / Utilities +Electronic Board Game +Electronic Typewriter +Engine Control Unit +Gambling Board +Game Console +Game Console Expansion +Graphic Tablet +Graphics Display Controller +Handheld Child Computers +Handheld Game +Handheld Game Console +Home Computer +In Circuit Emulator +JukeBox +Kit Computer +Laptop / Notebook / Portable +Laser Printer +Matrix Printer +Microcomputer +Misc. +Misc. * Mature * +Mobile Phone +Modem +Multi-cart Board +Network Processor +Not Classified +Pinball +Pinball * Mature * +Pinball / Pachinko +Pinball / Pachinko * Mature * +Player +Pocket Device / Pad / PDA +Portable Media Player +Print Club +Printer Handbook +Programming Machine +Punched Card Computer +Quiz / Chinese +Quiz / French +Quiz / German +Quiz / Italian +Quiz / Japanese +Quiz / Japanese * Mature * +Quiz / Japanese - Music +Quiz / Korean +Quiz / Spanish +Rhythm / Dance +Rhythm / Instruments +Rhythm / Misc. +Robot Control +Satellite Receiver +Single Board Computer +Speech Synthesizer +Synthesizer +System / BIOS +System / Device +Talking Calculator +Telephone / ComputerPhone +Test ROM +Thermal Printer +Toy cars +Training Board +Utilities / Test +Utilities / Update +VTR Control +Virtual Environment +Wavetables Generator +Word-processing Machine +Workstation / Server +""" \ No newline at end of file diff --git a/gui.py b/gui.py new file mode 100644 index 0000000..f554177 --- /dev/null +++ b/gui.py @@ -0,0 +1,413 @@ +import pygame +# pylint: disable=E0611 +from pygame.locals import KEYDOWN +# pylint: enable=E0611 + +from configfile import cfg +from utils import wrap_multi_line, image_from_data + +# pylint: disable=E1121,R0902,R0903,R0912,R0913 + +WHITE = (255, 255, 255) +BLACK = (0, 0, 0) + + +class baseobject(object): + def __init__(self, + surface, + x, + y, + width, + height, + data, + font, + border=False, + fg=WHITE, + bg=BLACK, + name=None, + title=None): + self.surface = surface + self.x = x + self.y = y + self.width = width + self.height = height + self.font = font + self.border = border + self.fontheight = self.font.get_height() + self.fg = fg + self.bg = bg + self.data = data + self.name = name + self.title = title + + if self.width < 1: + for item in self.data: + size = self.font.size(item)[0] + if size > self.width: + self.width = size + if self.width > self.surface.get_width(): + self.surface.get_width() + if self.border: + self.width += 8 + + if self.height < 1: + self.height = self.fontheight * (len(self.data)) + if self.border: + self.height += 8 + if self.height > self.surface.get_height(): + if self.border: + self.height = self.surface.get_height() - 8 - self.y + else: + self.height = self.surface.get_height - self.y + + if self.x == -1: + self.x = int((self.surface.get_width() / 2) - (self.width / 2)) + + if self.y == -1: + self.y = int((self.surface.get_height() / 2) - (self.height / 2)) + + if self.border: + if not self.title: + self.textx = self.x + 4 + self.texty = self.y + 4 + self.textwidth = self.width - 8 + self.textheight = self.height - 8 + else: + self.textx = self.x + 4 + self.texty = self.y + 4 + self.fontheight + self.textwidth = self.width - 8 + self.textheight = self.height - 8 - self.fontheight + else: + if not self.title: + self.textx = self.x + self.texty = self.y + self.textwidth = self.width + self.textheight = self.height + else: + self.textx = self.x + self.texty = self.y + self.fontheight + self.textwidth = self.width + self.textheight = self.height - self.fontheight + + +class menu(baseobject): + def __init__(self, + surface, + x, + y, + width, + height, + data, + font, + border=False, + fg=WHITE, + bg=BLACK, + name=None, + startitem=0, + itemattop=0): + baseobject.__init__(self, surface, x, y, width, height, data, font, + border, fg, bg, name) + self.currentitem = startitem + self.itemattop = itemattop + self.itemsperpage = int(self.textheight / self.fontheight) + self.isrom = True + if str(type(self.data[0])) == "": + self.isrom = False + + def processevent(self, event): # pylint: disable=R0912 + if event.type == KEYDOWN: + if event.key in cfg["KeyUp"] and self.currentitem > 0: + if self.currentitem == self.itemattop: + self.itemattop -= 1 + self.currentitem -= 1 + if event.key in cfg["KeyDown"] and self.currentitem < len( + self.data) - 1: + self.currentitem += 1 + if self.itemattop + self.itemsperpage <= self.currentitem: + self.itemattop += 1 + if event.key in cfg["KeyPgUp"] and self.currentitem > 0: + self.currentitem -= self.itemsperpage - 1 + while self.itemattop > self.currentitem: + self.itemattop -= 1 + if self.itemattop < 0: + self.itemattop = 0 + self.currentitem = 0 + if event.key in cfg["KeyPgDn"] and self.currentitem < len( + self.data) - 1: + self.currentitem += self.itemsperpage - 1 + while self.currentitem - self.itemattop >= self.itemsperpage: + self.itemattop += 1 + if self.itemattop + self.itemsperpage > len(self.data): + self.itemattop = len(self.data) - self.itemsperpage + self.currentitem = len(self.data) - 1 + if event.key in cfg["KeyHome"] and self.currentitem > 0: + self.currentitem = 0 + self.itemattop = 0 + if event.key in cfg["KeyEnd"] and self.currentitem < len( + self.data) - 1: + self.currentitem = len(self.data) - 1 + self.itemattop = self.currentitem - self.itemsperpage + 1 + + def render(self): + pygame.Surface.fill( + self.surface, + self.bg, + rect=pygame.Rect(self.x, self.y, self.width, self.height)) + + if self.border: + pygame.draw.rect(self.surface, self.fg, + pygame.Rect(self.x + 1, self.y + 1, + self.width - 2, self.height - 2), 1) + + for i in range(0, self.itemsperpage): + if i > len(self.data) - 1: + t = pygame.Surface((self.textwidth, self.fontheight)) + t.fill(self.bg) + self.surface.blit(t, (self.textx, + self.texty + i * self.fontheight)) + continue + + if self.isrom: + item = self.data[self.itemattop + i].description + else: + item = self.data[self.itemattop + i] + + if self.itemattop + i == self.currentitem: + s = self.font.render(item, True, self.bg, self.fg) + t = pygame.Surface((self.textwidth, self.fontheight)) + t.fill(self.fg) + t.blit(s, (0, 0)) + self.surface.blit(t, (self.textx, + self.texty + i * self.fontheight)) + else: + s = self.font.render(item, True, self.fg, self.bg) + t = pygame.Surface((self.textwidth, self.fontheight)) + t.fill(self.bg) + t.blit(s, (0, 0)) + self.surface.blit(t, (self.textx, + self.texty + i * self.fontheight)) + + +class notepad(baseobject): + def __init__(self, + surface, + x, + y, + width, + height, + data, + font, + border=False, + fg=WHITE, + bg=BLACK, + name="None", + title=None): + baseobject.__init__(self, surface, x, y, width, height, data, font, + border, fg, bg, name, title) + self.data = wrap_multi_line(data, self.font, self.textwidth) + self.lineattop = 0 + self.linesperpage = int(self.textheight / self.fontheight) + self.lasttopline = int(len(self.data) - self.linesperpage) + + def processevent(self, event): + if event.type == KEYDOWN: + if event.key in cfg["KeyDown"] and self.lineattop < self.lasttopline: + self.lineattop += 1 + elif event.key in cfg["KeyUp"] and self.lineattop > 0: + self.lineattop -= 1 + elif event.key in cfg["KeyPgDn"] and self.lineattop < self.lasttopline: + self.lineattop += self.linesperpage + if self.lineattop > self.lasttopline: + self.lineattop = self.lasttopline + elif event.key in cfg["KeyPgUp"] and self.lineattop > 0: + self.lineattop -= self.linesperpage + if self.lineattop < 0: + self.lineattop = 0 + elif event.key in cfg["KeyHome"] and self.lineattop > 0: + self.lineattop = 0 + elif event.key in cfg["KeyEnd"] and self.lineattop < self.lasttopline: + self.lineattop = self.lasttopline + + def render(self): + pygame.Surface.fill( + self.surface, + self.bg, + rect=pygame.Rect(self.x, self.y, self.width, self.height)) + if self.border: + pygame.draw.rect(self.surface, self.fg, + pygame.Rect(self.x + 1, self.y + 1, + self.width - 2, self.height - 2), 1) + if self.title: + x = (self.textwidth / 2) - ( + self.font.size('%s' % self.title)[0] / 2) + title_surface = pygame.Surface((self.textwidth, + self.fontheight)) + title_surface.fill(self.fg) + title_surface.blit( + self.font.render('%s' % self.title, True, BLACK, self.fg), + (x, 0)) + self.surface.blit(title_surface, + (self.textx, self.texty - self.fontheight)) + for c in range(0, self.linesperpage): + try: + itemsurface = self.font.render(self.data[c + self.lineattop], + True, self.fg, self.bg) + self.surface.blit(itemsurface, + (self.textx, + self.texty + c * self.fontheight)) + except: + pass + + +class image_notepad(baseobject): + def __init__(self, + surface, + x, + y, + width, + height, + data, + font, + border=False, + fg=WHITE, + bg=BLACK, + name="None", + title=None): + baseobject.__init__(self, surface, x, y, width, height, data, font, + border, fg, bg, name, title) + self.currentitem = 0 + self.data = data + + def processevent(self, event): + if event.type == KEYDOWN: + if event.key in cfg["KeyPgDn"]: + if self.currentitem < len(self.data) - 1: + self.currentitem += 1 + elif event.key in cfg["KeyPgUp"]: + if self.currentitem > 0: + self.currentitem -= 1 + + def render(self): + pygame.Surface.fill( + self.surface, + self.bg, + rect=pygame.Rect(self.x, self.y, self.width, self.height)) + if self.border: + pygame.draw.rect(self.surface, self.fg, + pygame.Rect(self.x + 1, self.y + 1, + self.width - 2, self.height - 2), 1) + x = (self.textwidth / 2) - (self.font.size('%s' % self.title)[0] / 2) + title_surface = pygame.Surface((self.textwidth, self.fontheight)) + title_surface.fill(self.fg) + title_surface.blit( + self.font.render('%s' % self.data[self.currentitem][0], True, + BLACK, self.fg), (x, 0)) + self.surface.blit(title_surface, (self.textx, + self.texty - self.fontheight)) + + image_surface = image_from_data(self.data[self.currentitem][1], + (self.textwidth, self.textheight)) + + w, h = image_surface.get_width(), image_surface.get_height() + + x = (self.textwidth / 2) - (w / 2) + self.textx + y = (self.textheight / 2) - (h / 2) + self.texty + + self.surface.blit(image_surface, (x, y)) + + +class gui(): + def __init__(self, surface): + self.surface = surface + self.objects = [] + self.font = pygame.font.Font( + pygame.font.match_font(cfg["Font"], bold=True), cfg["FontSize"]) + # self.fontheight = self.font.get_height() + self.currentobject = 0 + + def waitevent(self): + event = pygame.event.wait() + + if self.objects: + self.objects[-1].processevent(event) + + return event + + def add_menu(self, + x, + y, + width, + height, + data, + border=False, + fg=WHITE, + bg=BLACK, + name="None", + startitem=0, + itemattop=0): + self.currentobject += 1 + self.objects.append( + menu(self.surface, x, y, width, height, data, self.font, border, + fg, bg, name, startitem, itemattop)) + + def add_notepad(self, + x, + y, + width, + height, + data, + border=False, + fg=WHITE, + bg=BLACK, + name="None", + title=None): + self.currentobject += 1 + self.objects.append( + notepad(self.surface, x, y, width, height, data, self.font, border, + fg, bg, name, title)) + + def add_image_notepad(self, + x, + y, + width, + height, + data, + border=False, + fg=WHITE, + bg=BLACK, + name="None", + title=None): + self.currentobject += 1 + self.objects.append( + image_notepad(self.surface, x, y, width, height, data, self.font, + border, fg, bg, name, title)) + + def deletelastobject(self): + del self.objects[-1] + self.currentobject -= 1 + + def getmenuname(self): + return self.objects[-1].name + + def deleteallmenus(self): + while self.currentobject > 1: + self.deletelastobject() + + def getcurrentitem(self, objnum=None): + if objnum is None: + return self.objects[-1].currentitem + return self.objects[objnum].currentitem + + def getitemattop(self): + return self.objects[-1].itemattop + + # TODO: Fix me for itemattop on normal menus + def setcurrentitem(self, selected_item): + self.objects[-1].itemattop = selected_item + self.objects[-1].currentitem = selected_item + + def render(self): + for t in self.objects: + t.render() + + pygame.display.update() diff --git a/images/arcade.icns b/images/arcade.icns new file mode 100644 index 0000000000000000000000000000000000000000..ff19fd1593c3fe8c6a2e24a2c657f6f7a0fa7110 GIT binary patch literal 131980 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 literal 0 HcmV?d00001 diff --git a/images/arcade.ico b/images/arcade.ico new file mode 100644 index 0000000000000000000000000000000000000000..f7edfeb36252f3c8f94a774ada47df1a25c40f3f GIT binary patch literal 370070 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 literal 0 HcmV?d00001 diff --git a/mame.py b/mame.py new file mode 100644 index 0000000..0491bd1 --- /dev/null +++ b/mame.py @@ -0,0 +1,406 @@ +import os +import pickle +import re +import subprocess +import zipfile +from glob import glob + +from lxml import etree +from titlecase import titlecase + + +class MameROM(object): + ''' One Mame ROM ''' + + def __init__(self): + self.name = '' + self.cloneof = None + self.description = '' + self.year = '' + self.manufacturer = '' + self.status = '' + self.category = '' + + def __str__(self): + return self.description + + def __repr__(self): + return '%s("%s", "%s", "%s", "%s", "%s", "%s", "%s")' % ( + self.__class__.__name__, self.name, self.cloneof, self.description, + self.year, self.manufacturer, self.status, self.category) + + +class MameROMs(object): + ''' A Collection of MAME Roms ''' + + def __init__(self, data_dir, hide_mature, cfg): + self.all_roms = [] + self.roms = [] + self.all_categories = [] + self.categories = [] + self.catdict = {} + self.len = 0 + self.data_dir = data_dir + self.hide_mature = hide_mature + self.cfg = cfg + self.emulator_dir = os.path.split(cfg['EXE'])[0] + + self.parse() + self.filter() + + self.snapdir = os.path.join(self.emulator_dir, 'snap') + if os.path.isfile(os.path.join(self.snapdir, 'snap.zip')): + self.snapfile = zipfile.ZipFile( + os.path.join(self.snapdir, "snap.zip")) + else: + self.snapfile = None + self.snapdir = os.path.join(self.snapdir, 'snap') + + self.marqueesdir = os.path.join(self.emulator_dir, 'marquees') + if os.path.isfile(os.path.join(self.marqueesdir, 'marquees.zip')): + self.marqueesfile = zipfile.ZipFile( + os.path.join(self.marqueesdir, "marquees.zip")) + else: + self.marqueesfile = None + self.marqueesdir = os.path.join(self.marqueesdir, 'marquees') + + self.titlesdir = os.path.join(self.emulator_dir, 'titles') + if os.path.isfile(os.path.join(self.titlesdir, 'titles.zip')): + self.titlesfile = zipfile.ZipFile( + os.path.join(self.titlesdir, "titles.zip")) + else: + self.titlesfile = None + self.titlesdir = os.path.join(self.titlesdir, 'titles') + + infofn = os.path.join(self.emulator_dir, 'mameinfo.dat') + if not os.path.isfile(infofn): + self.info = None + else: + with open(infofn, 'rt', encoding='latin1') as f: + self.info = f.read() + + historyfn = os.path.join(self.emulator_dir, 'history.dat') + if not os.path.isfile(historyfn): + self.history = None + else: + with open(historyfn, 'rt', encoding='utf-8') as f: + self.history = f.read() + + self.artwork_dirs = {} + for item in cfg['ArtworkDirs']: + directory = os.path.join(self.emulator_dir, item) + if os.path.isdir(directory): + if os.path.isfile(os.path.join(directory, '%s.zip' % item)): + self.artwork_dirs[titlecase(item)] = { + "dof": os.path.join(directory, '%s.zip' % item), + 'type': 'file' + } + else: + self.artwork_dirs[titlecase(item)] = { + "dof": directory, + 'type': 'dir' + } + + def __len__(self): + return self.len + + def __getitem__(self, item): + return self.roms[item] + + def filter(self): + self.roms = [] + + for rom in self.all_roms: + if rom.status in self.cfg['StatusFilter']: + if self.cfg["Category"] == "All Games" or self.cfg["Category"] == rom.category: + if self.cfg["ShowClones"] or rom.cloneof is None: + if not self.hide_mature or '* Mature *' not in rom.category: + self.roms.append(rom) + + if self.cfg["Sort"] == "Name Asc": + self.roms.sort(key=lambda x: x.description.lower(), reverse=False) + elif self.cfg["Sort"] == "Name Dec": + self.roms.sort(key=lambda x: x.description.lower(), reverse=True) + elif self.cfg["Sort"] == "Year Asc": + self.roms.sort(key=lambda x: x.year.lower(), reverse=False) + elif self.cfg["Sort"] == "Year Dec": + self.roms.sort(key=lambda x: x.year.lower(), reverse=True) + + self.len = len(self.roms) + + if self.hide_mature: + self.categories = [] + for category in self.all_categories: + if '* Mature *' not in category: + self.categories.append(category) + else: + self.categories = self.all_categories + + def parse(self): + ''' Parse xml ''' + + mame_version = self.get_mame_version() + xmlfile = os.path.join(self.emulator_dir, 'mame.xml') + datfile = os.path.join(self.data_dir, 'mame.dat') + + if self.cfg['Version'] != mame_version: + self.cfg['Version'] = mame_version + + if os.path.isfile(xmlfile): + os.unlink(xmlfile) + + if os.path.isfile(datfile): + with open(datfile, 'rb') as i: + temp_mame_version = pickle.load(i) + + if temp_mame_version == mame_version: + self.all_categories = pickle.load(i) + self.all_roms = pickle.load(i) + return True + else: + os.unlink(datfile, 'mame.dat') + + tempcat = {} + catfile = open(os.path.join(self.emulator_dir, 'catver.ini')) + + found = False + for line in catfile: + line = line.strip() + if line == '[VerAdded]': + break + if line == '[Category]': + found = True + if found and line != '' and line[0] != ';' and line[0] != '[': + # zwackery=Platform / Run Jump + game, category = line.split('=') + tempcat[game] = category + if category not in self.all_categories: + self.all_categories.append(category) + self.catdict[category] = 0 + + self.all_categories.sort() + self.all_categories.insert(0, 'All Games') + self.all_categories.append('Unknown') + self.catdict['All Games'] = 1 + self.catdict['Unknown'] = 0 + + if not os.path.isfile(xmlfile): + try: + with open(xmlfile, 'w') as out: + retcode = subprocess.call( + [self.cfg['EXE'], '-listxml'], stdout=out) + if retcode != 0: + try: + os.unlink(xmlfile) + except: + pass + return False + except OSError: + try: + os.unlink(xmlfile) + except: + pass + return False + + # pylint: disable=no-member + + with open(os.path.join(self.data_dir, 'mame_exclude.txt'), 'rt') as f: + exclude = f.readlines() + exclude = [x.strip() for x in exclude] + + tree = etree.parse(xmlfile) + + rom = None + for child in tree.getiterator(): + if child.tag == 'machine': + if rom: + if rom.category not in exclude: + self.all_roms.append(rom) + self.catdict[rom.category] += 1 + rom = None + if 'runnable' in child.attrib and child.attrib['runnable'] == 'yes': + rom = MameROM() + rom.name = child.attrib['name'] + else: + rom = None + if rom and 'cloneof' in child.attrib: + rom.cloneof = child.attrib['cloneof'] + if rom and rom.name in tempcat: + rom.category = tempcat[rom.name] + elif rom and rom.cloneof in tempcat: + rom.category = tempcat[rom.cloneof] + elif rom: + rom.category = 'Unknown' + elif rom and child.tag == 'description': + rom.description = child.text + elif rom and child.tag == 'year': + rom.year = child.text + elif rom and child.tag == 'manufacturer': + rom.manufacturer = child.text + elif rom and child.tag == 'driver': + rom.status = child.attrib['status'] + + if rom: + if rom.category not in exclude: + self.all_roms.append(rom) + + for cat in self.catdict: + if self.catdict[cat] == 0: + del self.all_categories[self.all_categories.index(cat)] + + with open(datfile, 'wb') as output: + pickle.dump(mame_version, output) + pickle.dump(self.all_categories, output) + pickle.dump(self.all_roms, output) + + return True + + def get_mame_version(self): + mamerun = subprocess.run( + [self.cfg['EXE'], '-?'], stdout=subprocess.PIPE) + output = mamerun.stdout.decode('utf-8') + output = output[output.find('v'):] + output = output[:output.find(' ')] + + return output + + def get_info(self, rom): + if not self.info: + return + + search = re.search("\\$info=%s" % rom.name, self.info) + + if not search: + search = re.search("\\$info=%s" % rom.cloneof, self.info) + if not search: + return None + + start = search.start() + + info = self.info[start:self.info.find('$end', start)].splitlines() + + for i in range(len(info) - 1, -1, -1): + if info[i].startswith('$'): + del info[i] + + while info[0].strip() == '': + del info[0] + + while info[len(info) - 1].strip() == '': + del info[len(info) - 1] + + return '\n'.join(info) + + def get_history(self, rom): + if not self.history: + return + + search = re.search("\\$info=%s" % rom.name, self.history) + + if not search: + search = re.search("\\$info=%s" % rom.cloneof, self.history) + if not search: + return None + + start = search.start() + + info = self.history[start:self.history.find('$end', + start)].splitlines() + + for i in range(len(info) - 1, -1, -1): + if info[i].startswith('$'): + del info[i] + + while info[0].strip() == '': + del info[0] + + while info[len(info) - 1].strip() == '': + del info[len(info) - 1] + + return '\n'.join(info) + + def get_snap(self, rom, type_of_image): # pylint : disable=R0912 + data = None + image_file = None + image_dir = None + + if type_of_image == 'snap': + image_dir = self.snapdir + image_file = self.snapfile + if type_of_image == 'title': + image_dir = self.titlesdir + image_file = self.titlesfile + if type_of_image == 'marquee': + image_dir = self.marqueesdir + image_file = self.marqueesfile + + if image_file: + try: + data = image_file.read(rom.name + ".png") + except: + try: + data = image_file.read(rom.cloneof + '.png') + except: + data = None + elif image_dir: + fn = os.path.join(image_dir, rom.name + '.png') + if os.path.isfile(fn): + with open(fn, 'rb') as f: + data = f.read() + elif rom.cloneof: + fn = os.path.join(image_dir, rom.cloneof + '.png') + if os.path.isfile(fn): + with open(fn, 'rb') as f: + data = f.read() + else: + data = None + else: + data = None + else: + data = None + + return data + + def get_artwork(self, rom): + result = [] + + for item in self.artwork_dirs: + title = item + dof = self.artwork_dirs[title]['dof'] + + if self.artwork_dirs[title]['type'] == 'dir': + fn = None + if glob('%s/**/%s.*' % (dof, rom.name), recursive=True) != []: + fn = glob( + '%s/**/%s.*' % (dof, rom.name), recursive=True)[0] + elif glob( + '%s/**/%s.*' % + (dof, rom.cloneof), recursive=True) != []: + fn = glob( + '%s/**/%s.*' % (dof, rom.cloneof), recursive=True)[0] + if fn: + data = None + if os.path.splitext(fn)[1].lower() in [ + '.png', '.jpg', '.jpeg' + ]: + with open(fn, 'rb') as f: + data = f.read() + + if data: + result.append([title, data]) + else: + data = None + try: + with zipfile.ZipFile(dof) as f: + data = f.read('%s.png' % rom.name) + except: + try: + with zipfile.ZipFile(dof) as f: + data = f.read('%s.png' % rom.cloneof) + except: + data = None + + if data: + result.append([title, data]) + + return result diff --git a/mess.py b/mess.py new file mode 100644 index 0000000..dd73f2f --- /dev/null +++ b/mess.py @@ -0,0 +1,281 @@ +import glob +import os +import pickle +import re +import subprocess +from xml.sax.saxutils import unescape +import zipfile + +from lxml import etree + + +class MessROM(object): + ''' One Mame Software List ROM ''' + + def __init__(self): + self.name = '' + self.cloneof = None + self.description = '' + self.year = '' + self.manufacturer = '' + self.category = '' + + def __str__(self): + return self.description + # return '["%s", "%s", "%s", "%s", "%s" "%s", "%s"]' % ( + # self.name, self.cloneof, self.description, self.year, + # self.manufacturer, self.status, self.category) + + def __repr__(self): + return '%s("%s", "%s", "%s", "%s", "%s", "%s")' % ( + self.__class__.__name__, self.name, self.cloneof, self.description, + self.year, self.manufacturer, self.category) + + +class MessROMs(object): + ''' A Collection of MAME Software List Roms ''' + + def __init__(self, data_dir, cfg): + self.all_roms = [] + self.roms = [] + self.categories = [] + self.all_categories = [] + self.catdict = {} + self.len = 0 + self.data_dir = data_dir + self.cfg = cfg + self.emulator_dir = os.path.split(cfg['EXE'])[0] + + self.parse() + self.filter() + + self.snapdir = os.path.join(self.emulator_dir, 'snap') + if os.path.isfile(os.path.join(self.snapdir, 'snap.zip')): + self.snapfile = zipfile.ZipFile( + os.path.join(self.snapdir, "snap.zip")) + else: + self.snapfile = None + self.snapdir = os.path.join(self.snapdir, 'snap') + + infofn = os.path.join(self.emulator_dir, 'messinfo.dat') + if not os.path.isfile(infofn): + self.info = None + else: + with open(infofn, 'rt', encoding='latin1') as f: + self.info = f.read() + + historyfn = os.path.join(self.emulator_dir, 'history.dat') + if not os.path.isfile(historyfn): + self.history = None + else: + with open(historyfn, 'rt', encoding='utf-8') as f: + self.history = f.read() + + def __len__(self): + return self.len + + def __getitem__(self, item): + return self.roms[item] + + def filter(self): + self.roms = [] + + for rom in self.all_roms: + if self.cfg["Category"] == "All Games" or self.cfg["Category"] == rom.category: + if self.cfg["ShowClones"] or rom.cloneof is None: + self.roms.append(rom) + + if self.cfg["Sort"] == "Name Asc": + self.roms.sort(key=lambda x: x.description.lower(), reverse=False) + elif self.cfg["Sort"] == "Name Dec": + self.roms.sort(key=lambda x: x.description.lower(), reverse=True) + elif self.cfg["Sort"] == "Year Asc": + self.roms.sort(key=lambda x: x.year.lower(), reverse=False) + elif self.cfg["Sort"] == "Year Dec": + self.roms.sort(key=lambda x: x.year.lower(), reverse=True) + + self.len = len(self.roms) + + self.categories = self.all_categories + + def parse(self): + """ Parse xml """ + + mess_version = self.get_mess_version() + datfile = os.path.join(self.data_dir, 'mess.dat') + + if self.cfg['Version'] != mess_version: + self.cfg['Version'] = mess_version + + if os.path.isfile(datfile): + os.unlink(datfile) + + if os.path.isfile(datfile): + with open(datfile, 'rb') as i: + temp_mess_version = pickle.load(i) + + if temp_mess_version == mess_version: + self.all_categories = pickle.load(i) + self.all_roms = pickle.load(i) + return True + else: + os.unlink(datfile) + + self.all_categories = [] + self.catdict = {} + + files = glob.glob(os.path.join(self.emulator_dir, "hash", '*.xml')) + for file in files: + with open(file, 'rt', encoding='utf-8') as f: + line = None + while True: + line = f.readline().strip() + if line.startswith('=1.9.3 +configobj>=5.0.6 +appdirs>=1.4.3 +lxml>=3.8.0 +titlecase>=0.11.0 +cx_Freeze>=5.0.2 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..592f497 --- /dev/null +++ b/setup.py @@ -0,0 +1,23 @@ +import os.path +import sys +from cx_Freeze import setup, Executable + +build_exe_options = { + "packages": ["os", "pygame", "lxml"], + "excludes": ["tkinter", "numpy"], + "include_files": ["arcade.png"] +} + +base = None +if sys.platform == "win32": + base = "Win32GUI" + +setup( + name="mfe", + version="0.1", + description="MAME FrontEnd", + options={"build_exe": build_exe_options}, + executables=[ + Executable( + "mfe.py", base=base, icon=os.path.join('images', 'arcade.ico')) + ]) diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..e599e37 --- /dev/null +++ b/utils.py @@ -0,0 +1,135 @@ +from itertools import chain +import io +import os +import subprocess + +import pygame +import pygame.locals + + +def get_pygame_keydict(): + result = {} + + pygame_keys = [ + item for item in dir(pygame.locals) if item.startswith('K_') + ] + + for key in pygame_keys: + result[key] = getattr(pygame.locals, key) + + return result + + +def get_keys(keys_dict, a): + result = [] + for key in a: + result.append(keys_dict[key]) + return result + + +def aspect_scale(img, bx, by): + """ Scales 'img' to fit into box bx/by. + This method will retain the original image's aspect ratio """ + ix, iy = img.get_size() + if ix > iy: + # fit to width + scale_factor = bx / float(ix) + sy = scale_factor * iy + if sy > by: + scale_factor = by / float(iy) + sx = scale_factor * ix + sy = by + else: + sx = bx + else: + # fit to height + scale_factor = by / float(iy) + sx = scale_factor * ix + if sx > bx: + scale_factor = bx / float(ix) + sx = bx + sy = scale_factor * iy + else: + sy = by + + return pygame.transform.scale(img, (int(sx), int(sy))) + + +def image_from_data(data, image_size): + if data: + with io.BytesIO(data) as f: + surface = pygame.image.load(f) + surface = aspect_scale(surface, image_size[0], image_size[1]) + else: + surface = pygame.Surface(image_size) # pylint: disable=E1121 + + return surface + + +def addscanlines(surface): + width = surface.get_width() + for y in range(surface.get_height()): + if y % 2: + pygame.draw.line(surface, (0, 0, 0), (0, y), (width, y)) + + return surface + + +def truncline(text, font, maxwidth): + real = len(text) + stext = text + l = font.size(text)[0] + cut = 0 + a = 0 + done = 1 + while l > maxwidth: + a = a + 1 + n = text.rsplit(None, a)[0] + if stext == n: + cut += 1 + stext = n[:-cut] + else: + stext = n + l = font.size(stext)[0] + real = len(stext) + done = 0 + return real, done, stext + + +def wrapline(text, font, maxwidth): + done = 0 + wrapped = [] + + while not done: + nl, done, stext = truncline(text, font, maxwidth) + wrapped.append(stext.strip()) + text = text[nl:] + return wrapped + + +def wrap_multi_line(text, font, maxwidth): + """ returns text taking new lines into account. + """ + if type(text) is str: + lines = chain(*(wrapline(line, font, maxwidth) + for line in text.splitlines())) + else: + lines = chain(*(wrapline(line, font, maxwidth) for line in text)) + + return list(lines) + + +def run_emulator(emu_type, exe, rom): + old_path = os.getcwd() + os.chdir(os.path.split(exe)[0]) + + if emu_type == 'MAME': + subprocess.run([exe, rom]) + elif emu_type == 'MESS': + subprocess.run([exe, rom]) + elif emu_type == 'CSV': + subprocess.run([exe.replace('', rom)]) + + os.chdir(old_path) + + return True