8434b699649ffe9252c46b1a15d39c09b8bdd069
[jalview.git] / utils / macos_dmg / jalview_customise_dsstore.py
1 #!/usr/bin/env python3
2 # Adapted from custom_dsstore.py by the Jalview team 2024
3 # Copyright (c) 2013-2017 The Bitcoin Core developers
4 # Distributed under the MIT software license, see the accompanying
5 # file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 from ds_store import DSStore
7 from pprint import pprint
8 import mac_alias
9 import argparse
10 import json
11
12 parser = argparse.ArgumentParser(
13   prog = "jalview_custom_dsstore.py",
14   description = "Take an existing DS_Store file and change the volume name and add path to background image"
15   )
16 parser.add_argument("-i", "--input", help="The existing styled DS_Store file", dest="input")
17 parser.add_argument("-o", "--output", help="The output DS_Store file", dest="output")
18 parser.add_argument("-v", "--volumename", help="The name of the output DS_Store volume", dest="volumename")
19 parser.add_argument("-b", "--background", help="The background image filename to use", dest="background")
20 parser.add_argument("-c", "--config", help="YAML configuration for window and icon sizes and positions", dest="config")
21 parser.add_argument("-d", "--dump", help="Display contents of the input DS_Store to stdout", action="store_true", dest="dump")
22 parser.add_argument("-q", "--quiet", help="Don't print messages to stdout", action="store_true", dest="quiet")
23 parser.add_argument("-f", "--filenames", help="List of comma-separated filenames to show information for --dump", dest="filenames", default="")
24
25 args = parser.parse_args()
26
27 def myprint(string):
28   if (not args.quiet):
29     print(string)
30
31 def mypprint(string):
32   if (not args.quiet):
33     pprint(string)
34
35 if (args.dump and not args.input):
36   exit("When --dump used, an --input must be given")
37
38 if (args.dump):
39   with DSStore.open(args.input, 'r+') as d:
40     for key in ["bwsp", "icvp","Iloc"]:
41       try:
42         myprint(f"d['.']['{key}']=")
43         mypprint(str(d['.'][key]))
44       except:
45         myprint(f"No info for d['.']['{key}']")
46
47     alias = mac_alias.Alias.from_bytes( d['.']['icvp']['backgroundImageAlias'] )
48     myprint("backgroundImageAlias=")
49     mypprint(alias)
50
51     for data in d:
52       try:
53         data = str(data)
54         mypprint(f"d['{data}']=",d[data])
55       except:
56         myprint(f"No info for d['{data}']")
57 #    for filename in args.filenames.split(","):
58 #      if (filename):
59 #        for f in d.find(filename):
60 #          myprint(f"d['{f}']=", d[f])
61 #        else:
62 #          myprint(f"# No filename '{filename}' found in DS_Store '{args.input}'")
63     exit(0)
64
65 if (args.output and not (args.input or args.config)):
66   exit("Need --input FILENAME or --config FILENAME to produce an --output")
67
68 if (not args.output):
69   exit("Provide --output FILENAME to output DS_Store")
70
71 if (not args.volumename):
72   exit("Provide a volume name with --volumename NAME")
73
74 if (not args.background):
75   exit("Provide a background image filename (just the file, no path) with --background FILENAME")
76
77 package_name_ns = args.volumename
78 configfilename = args.config
79 configfile = open(configfilename, 'r')
80
81 config = json.load(configfile)
82 inputds = DSStore.open(args.input)
83 outputds = DSStore.open(args.output, 'w+')
84
85
86 bwsp = {}
87
88 for key in "ShowStatusBar SidebarWidthTenElevenOrLater ShowToolbar ShowTabView ContainerShowSidebar WindowBounds ShowSidebar ShowPathbar".split():
89   bwsp[key] = inputds['.']['bwsp'][key]
90   myprint(f"Setting bwsp['{key}'] to '"+str(inputds['.']['bwsp'][key])+"'")
91
92 outputds['.']['bwsp'] = bwsp
93
94 icvp = {}
95
96 alias = mac_alias.Alias.from_bytes(inputds['.']['icvp']['backgroundImageAlias'])
97 alias.volume.name = args.volumename
98 alias.volume.posix_path = '/Volumes/' + args.volumename
99 alias.volume.disk_image_alias.target.filename = args.volumename + '.dmg'
100 alias.volume.disk_image_alias.target.carbon_path = 'Macintosh HD:Users:\x00Jalview:\x00' + args.volumename + ':\x00' + args.volumename + '.dmg'
101 alias.volume.disk_image_alias.target.posix_path = '/Users/Jalview/' + args.volumename + '.dmg'
102 alias.target.carbon_path = args.volumename + ':.background:\x00' + args.background
103
104 icvp['backgroundImageAlias'] = alias.to_bytes()
105
106 for key in "backgroundColorRed backgroundColorBlue backgroundColorGreen gridSpacing gridOffsetX gridOffsetY showItemInfo viewOptionsVersion arrangeBy textSize labelOnBottom backgroundType showIconPreview iconSize".split():
107   icvp[key] = inputds['.']['icvp'][key]
108   myprint(f"Setting icvp['{key}'] to '"+str(inputds['.']['icvp'][key])+"'")
109
110 outputds['.']['icvp'] = icvp
111
112 # copy filenames properties? not working, using JSON config file
113 #for filename in args.filenames.split(","):
114 #  outputds[filename]['Iloc'] = inputds[filename]['Iloc']
115
116 outputds['.']['vSrn'] = ('long', 1)
117
118 for fileinfo in config['files']:
119   outputds[fileinfo['name']]['Iloc'] = (fileinfo['xpos'], fileinfo['ypos'])
120
121 outputds.flush()
122 outputds.close()
123 inputds.close()
124