Preliminary msi support
Added a proper icon Fix output directory for packaged builds Added a button to open the ouput directory, and a button to open documentation for packaged builds.
This commit is contained in:
		
							parent
							
								
									91c7fdaf2d
								
							
						
					
					
						commit
						0de4a5857c
					
				|  | @ -3,4 +3,7 @@ dist | |||
| build | ||||
| .idea | ||||
| *.sfc | ||||
| *_Spoiler.txt | ||||
| *_Spoiler.txt | ||||
| bundle/components.wxs | ||||
| *.wixobj | ||||
| README.html | ||||
|  |  | |||
							
								
								
									
										41
									
								
								Gui.py
								
								
								
								
							
							
						
						
									
										41
									
								
								Gui.py
								
								
								
								
							|  | @ -1,14 +1,18 @@ | |||
| from Main import main, __version__ as ESVersion | ||||
| from Main import main, __version__ as ESVersion, get_output_path | ||||
| from argparse import Namespace | ||||
| import random | ||||
| 
 | ||||
| from tkinter import Checkbutton, OptionMenu, Tk, LEFT, RIGHT, BOTTOM, TOP, StringVar, IntVar, Frame, Label, W, E, Entry, Spinbox, Button, filedialog, messagebox | ||||
| import subprocess | ||||
| import os | ||||
| import sys | ||||
| from tkinter import Checkbutton, OptionMenu, Tk, LEFT, RIGHT, BOTTOM, TOP, StringVar, IntVar, Frame, Label, W, E, X, Entry, Spinbox, Button, filedialog, messagebox, PhotoImage | ||||
| 
 | ||||
| 
 | ||||
| def guiMain(args=None): | ||||
|     mainWindow = Tk() | ||||
|     mainWindow.wm_title("Entrance Shuffle %s" % ESVersion) | ||||
| 
 | ||||
|     set_icon(mainWindow) | ||||
| 
 | ||||
|     topFrame = Frame(mainWindow) | ||||
|     rightHalfFrame = Frame(topFrame) | ||||
|     checkBoxFrame = Frame(rightHalfFrame) | ||||
|  | @ -164,6 +168,7 @@ def guiMain(args=None): | |||
|     heartbeepFrame.pack(expand=True, anchor=E) | ||||
| 
 | ||||
|     bottomFrame = Frame(mainWindow) | ||||
|     farBottomFrame = Frame(mainWindow) | ||||
| 
 | ||||
|     seedLabel = Label(bottomFrame, text='Seed #') | ||||
|     seedVar = StringVar() | ||||
|  | @ -212,15 +217,29 @@ def guiMain(args=None): | |||
| 
 | ||||
|     generateButton = Button(bottomFrame, text='Generate Patched Rom', command=generateRom) | ||||
| 
 | ||||
|     def open_output(): | ||||
|         open_file(get_output_path()) | ||||
| 
 | ||||
|     openOutputButton = Button(farBottomFrame, text='Open Output Directory', command=open_output) | ||||
| 
 | ||||
|     if os.path.exists('README.html'): | ||||
|         def open_readme(): | ||||
|             open_file('README.html') | ||||
|         openReadmeButton = Button(farBottomFrame, text='Open Documentation', command=open_readme) | ||||
|         openReadmeButton.pack(side=LEFT) | ||||
| 
 | ||||
|     seedLabel.pack(side=LEFT) | ||||
|     seedEntry.pack(side=LEFT) | ||||
|     countLabel.pack(side=LEFT) | ||||
|     countLabel.pack(side=LEFT, padx=(5,0)) | ||||
|     countSpinbox.pack(side=LEFT) | ||||
|     generateButton.pack(side=LEFT) | ||||
|     generateButton.pack(side=LEFT, padx=(5,0)) | ||||
| 
 | ||||
|     openOutputButton.pack(side=RIGHT) | ||||
| 
 | ||||
|     drowDownFrame.pack(side=LEFT) | ||||
|     rightHalfFrame.pack(side=RIGHT) | ||||
|     topFrame.pack(side=TOP) | ||||
|     farBottomFrame.pack(side=BOTTOM, fill=X, padx=5, pady=5) | ||||
|     bottomFrame.pack(side=BOTTOM) | ||||
| 
 | ||||
|     if args is not None: | ||||
|  | @ -254,6 +273,18 @@ def guiMain(args=None): | |||
| 
 | ||||
|     mainWindow.mainloop() | ||||
| 
 | ||||
| def open_file(filename): | ||||
|     if sys.platform == 'win32': | ||||
|         os.startfile(filename) | ||||
|     else: | ||||
|         open_Command = 'open' if sys.plaform == 'darwin' else 'xdg-open' | ||||
|         subprocess.call([open_command, filename]) | ||||
| 
 | ||||
| def set_icon(window): | ||||
|     er16 = PhotoImage(file='data/ER16.gif') | ||||
|     er32 = PhotoImage(file='data/ER32.gif') | ||||
|     er48 = PhotoImage(file='data/ER32.gif') | ||||
|     window.tk.call('wm', 'iconphoto', window._w, er16, er32, er48) | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     guiMain() | ||||
|  |  | |||
							
								
								
									
										43
									
								
								Main.py
								
								
								
								
							
							
						
						
									
										43
									
								
								Main.py
								
								
								
								
							|  | @ -12,6 +12,8 @@ import random | |||
| import time | ||||
| import logging | ||||
| import json | ||||
| import sys | ||||
| import os | ||||
| 
 | ||||
| __version__ = '0.5.0-dev' | ||||
| 
 | ||||
|  | @ -105,16 +107,53 @@ def main(args, seed=None): | |||
|         if args.jsonout: | ||||
|             print(json.dumps({'patch': rom.patches, 'spoiler': world.spoiler.to_json()})) | ||||
|         else: | ||||
|             rom.write_to_file(args.jsonout or '%s.sfc' % outfilebase) | ||||
|             rom.write_to_file(args.jsonout or os.path.join(get_output_path(),'%s.sfc' % outfilebase)) | ||||
| 
 | ||||
|     if args.create_spoiler and not args.jsonout: | ||||
|         world.spoiler.to_file('%s_Spoiler.txt' % outfilebase) | ||||
|         world.spoiler.to_file(os.path.join(get_output_path(),'%s_Spoiler.txt' % outfilebase)) | ||||
| 
 | ||||
|     logger.info('Done. Enjoy.') | ||||
|     logger.debug('Total Time: %s' % (time.clock() - start)) | ||||
| 
 | ||||
|     return world | ||||
| 
 | ||||
| def get_output_path(): | ||||
|     if get_output_path.cached_path is not None: | ||||
|         return get_output_path.cached_path | ||||
| 
 | ||||
|     if not hasattr(sys, 'frozen'): | ||||
|         get_output_path.cached_path = '.' | ||||
|         return get_output_path.cached_path | ||||
|     else: | ||||
|         # has been packaged, so cannot use CWD for output. | ||||
|         if sys.platform == 'win32': | ||||
|             #windows | ||||
|             import ctypes.wintypes | ||||
|             CSIDL_PERSONAL = 5       # My Documents | ||||
|             SHGFP_TYPE_CURRENT = 0   # Get current, not default value | ||||
| 
 | ||||
|             buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) | ||||
|             ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf) | ||||
| 
 | ||||
|             documents = buf.value | ||||
| 
 | ||||
|         elif sys.platform == 'darwin': | ||||
|             from AppKit import NSSearchPathForDirectoriesInDomains | ||||
|             # http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSSearchPathForDirectoriesInDomains | ||||
|             NSDocumentDirectory = 9 | ||||
|             NSUserDomainMask = 1 | ||||
|             # True for expanding the tilde into a fully qualified path | ||||
|             documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, True)[0] | ||||
|         else: | ||||
|             raise NotImplementedError('Not supported yet') | ||||
| 
 | ||||
|         get_output_path.cached_path = os.path.join(documents, 'ALttPEntranceRandomizer') | ||||
|         if not os.path.exists(get_output_path.cached_path): | ||||
|             os.mkdir(get_output_path.cached_path) | ||||
|         return get_output_path.cached_path | ||||
| 
 | ||||
| get_output_path.cached_path = None | ||||
| 
 | ||||
| def copy_world(world): | ||||
|     # ToDo: Not good yet | ||||
|     ret = World(world.shuffle, world.logic, world.mode, world.difficulty, world.timer, world.progressive, world.goal, world.algorithm, world.place_dungeon_items, world.check_beatable_only, world.shuffle_ganon, world.quickswap, world.fastmenu, world.disable_music, world.keysanity) | ||||
|  |  | |||
							
								
								
									
										10
									
								
								appveyor.yml
								
								
								
								
							
							
						
						
									
										10
									
								
								appveyor.yml
								
								
								
								
							|  | @ -11,22 +11,24 @@ install: | |||
|   - '%PYTHON%\Scripts\pip install pyinstaller' | ||||
|   - '%PYTHON%\Scripts\pip install markdown' | ||||
|   - '%PYTHON%\python.exe -m markdown README.md > README.html' | ||||
|   - 'copy LICENSE LICENSE.txt' | ||||
|   - '%PYTHON%\Scripts\pyinstaller bundle\EntranceRandomizer.spec' | ||||
|   - 'mkdir dist\EntranceRandomizer\ext' | ||||
|   - 'move dist\EntranceRandomizer\*.pyd dist\EntranceRandomizer\ext' | ||||
|   - 'move dist\EntranceRandomizer\tcl*.dll dist\EntranceRandomizer\ext' | ||||
|   - 'move dist\EntranceRandomizer\tk*.dll dist\EntranceRandomizer\ext' | ||||
|   - '"%WIX%\bin\heat.exe" dir "dist\EntranceRandomizer" -sfrag -srd -suid -dr INSTALLDIR -cg ERFiles -ag -template fragment -t bundle\components.xslt -out build\components.wxs' | ||||
|   - '"%WIX%\bin\candle.exe" -out build\ bundle\*.wxs build\*.wxs' | ||||
|   - '"%WIX%\bin\light.exe" -ext WixUIExtension build\*.wixobj -o dist\EntranceRandomizer.msi -b dist\EntranceRandomizer' | ||||
| build: off | ||||
| artifacts: | ||||
| - path: dist/EntranceRandomizer/ | ||||
|   name: EntranceRandomizer-$(ProjectVersion)-win32 | ||||
| - path: dist/EntranceRandomizer.msi | ||||
|   name: EntranceRandomizer-$(ProjectVersion)-win32.msi | ||||
| deploy: | ||||
| - provider: GitHub | ||||
|   tag: $(APPVEYOR_REPO_TAG_NAME) | ||||
|   auth_token: | ||||
|     secure: wQH+KnogyjYcDdo/srOQeoYEVIbH1uoYA5Iajdy/sR0Tbme7gOt15u2FBIkTg9/x | ||||
|   artifact: /.*-win32.zip/ | ||||
|   artifact: /.*-win32.*/ | ||||
|   force_update: false | ||||
|   on: | ||||
|     appveyor_repo_tag: true | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ block_cipher = None | |||
| a = Analysis(['../EntranceRandomizer.py'], | ||||
|              pathex=['bundle'], | ||||
|              binaries=[], | ||||
|              datas=[('../data/', 'data/'), ('../README.html', '.'), ('../LICENSE.txt', '.')], | ||||
|              datas=[('../data/', 'data/'), ('../README.html', '.')], | ||||
|              hiddenimports=[], | ||||
|              hookspath=[], | ||||
|              runtime_hooks=['bundle/_rt_hook.py'], | ||||
|  | @ -24,6 +24,7 @@ exe = EXE(pyz, | |||
|           debug=False, | ||||
|           strip=False, | ||||
|           upx=False, | ||||
|           icon='data/ER.ico', | ||||
|           console=is_win ) | ||||
| coll = COLLECT(exe, | ||||
|                a.binaries, | ||||
|  | @ -34,5 +35,5 @@ coll = COLLECT(exe, | |||
|                name='EntranceRandomizer') | ||||
| app = BUNDLE(coll, | ||||
|              name ='EntranceRandomizer.app', | ||||
|              icon = None, | ||||
|              icon = 'data/ER.icns', | ||||
|              bundle_identifier = None) | ||||
|  |  | |||
|  | @ -0,0 +1,35 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <xsl:stylesheet version="1.0" | ||||
|             xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | ||||
|             xmlns:msxsl="urn:schemas-microsoft-com:xslt" | ||||
|             exclude-result-prefixes="msxsl" | ||||
|             xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"> | ||||
| 
 | ||||
|   <xsl:output method="xml" indent="no"/> | ||||
| 
 | ||||
|   <xsl:strip-space elements="*"/> | ||||
| 
 | ||||
|   <xsl:template match="@*|node()"> | ||||
|     <xsl:copy> | ||||
|       <xsl:apply-templates select="@*|node()"/> | ||||
|     </xsl:copy> | ||||
|   </xsl:template> | ||||
| 
 | ||||
|   <xsl:template match="wix:File[@Source='SourceDir\EntranceRandomizer.exe']"> | ||||
|       <xsl:copy-of select="." /> | ||||
|       <wix:Shortcut Id="ProgramShortcut" | ||||
|                Name="ALttP Entrance Randomizer" | ||||
|                Advertise="yes" | ||||
|                Description="ALttP Entrance Randomizer" | ||||
|                Directory="ApplicationProgramsFolder" /> | ||||
|     </xsl:template> | ||||
|     <xsl:template match="wix:File[@Source='SourceDir\README.hmtl']"> | ||||
|         <xsl:copy-of select="." /> | ||||
|         <wix:Shortcut Id="ReadmeShortcut" | ||||
|                  Name="ALttP Entrance Randomizer README" | ||||
|                  Advertise="yes" | ||||
|                  Description="ALttP Entrance Randomizer README" | ||||
|                  Directory="ApplicationProgramsFolder" /> | ||||
|       </xsl:template> | ||||
| 
 | ||||
| </xsl:stylesheet> | ||||
|  | @ -0,0 +1,49 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> | ||||
|     <Product Id="*" Name="ALttP Entrance Randomizer" Language="1033" Version="0.5.0" Manufacturer="Randomizer Community" UpgradeCode="0229C621-5F8A-4D59-962A-5826C58B93DD" > | ||||
|         <Package Id="*" InstallerVersion="400" Compressed="yes" InstallScope="perMachine" /> | ||||
|         <MajorUpgrade AllowDowngrades="yes"/> | ||||
|         <Media Id="1" Cabinet="contents.cab" EmbedCab="yes" CompressionLevel="high"/> | ||||
|         <Directory Id="TARGETDIR" Name="SourceDir"> | ||||
|             <Directory Id='ProgramFilesFolder' Name='PFiles'> | ||||
|                 <Directory Id='INSTALLDIR' Name='ALttP Entrance Randomizer'/> | ||||
|             </Directory> | ||||
|             <Directory Id="ProgramMenuFolder"> | ||||
|                 <Directory Id="ApplicationProgramsFolder" Name="ALttP Entrance Randomizer"/> | ||||
|             </Directory> | ||||
|         </Directory> | ||||
|         <DirectoryRef Id="ApplicationProgramsFolder"> | ||||
|             <Component Id="ApplicationShortcut" Guid="0054698A-5A56-4B36-8176-8FEC1762EF2D"> | ||||
|                 <RemoveFolder Id="CleanUpShortCut" Directory="ApplicationProgramsFolder" On="uninstall"/> | ||||
|                 <RegistryValue Root="HKCU" Key="Software\ALttPEntranceRandomizer" Name="installed" Type="integer" Value="1" KeyPath="yes"/> | ||||
|             </Component> | ||||
|         </DirectoryRef> | ||||
|         <Feature Id="Complete" | ||||
|              Title="ALttP Entrance Randomizer" | ||||
|              Description="ALttP Entrance Randomizer" | ||||
|              Level="1"> | ||||
|             <ComponentGroupRef Id="ERFiles"/> | ||||
|             <ComponentRef Id="ApplicationShortcut"/> | ||||
|         </Feature> | ||||
| 
 | ||||
|         <Icon Id="ER.ico" SourceFile="Data/ER.ico" /> | ||||
|         <Property Id="DISABLEADVTSHORTCUTS" Secure="yes">1</Property> | ||||
|         <Property Id="ARPPRODUCTICON" Value="ER.ico" /> | ||||
|         <Property Id="WIXUI_INSTALLDIR">INSTALLDIR</Property> | ||||
|         <UI> | ||||
|           <UIRef Id="WixUI_InstallDir" /> | ||||
|           <UIRef Id="WixUI_ErrorProgressText" /> | ||||
|           <!-- Skip license page --> | ||||
|           <Publish Dialog="WelcomeDlg" | ||||
|                     Control="Next" | ||||
|                     Event="NewDialog" | ||||
|                     Value="InstallDirDlg" | ||||
|                     Order="2">1</Publish> | ||||
|           <Publish Dialog="InstallDirDlg" | ||||
|                     Control="Back" | ||||
|                     Event="NewDialog" | ||||
|                     Value="WelcomeDlg" | ||||
|                     Order="2">1</Publish> | ||||
|         </UI> | ||||
|     </Product> | ||||
| </Wix> | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 38 KiB | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 123 B | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 370 B | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 882 B | 
		Loading…
	
		Reference in New Issue