Advertisement
Guest User

Untitled

a guest
Apr 11th, 2024
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.05 KB | None | 0 0
  1. # TODO:
  2. # required: check obsolete methods
  3. # -- generate mappings from buttons or .rewasd file - rethink whole idea
  4. # fix: config generating and saving (adjust to new Button class)
  5.  
  6.  
  7. import json,os
  8. from Classes.KeysAssignment.KeyButtonClass import *
  9.  
  10. root_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  11. dik_codes_file_path = os.path.join(root_dir,"corefiles","DIK","dik_codes_nodoubles.json")
  12.  
  13. # https://community.bistudio.com/wiki/DIK_KeyCodes
  14. # https://gist.github.com/tracend/912308
  15. class DIKClass:
  16. def __init__(self):
  17.  
  18. self.dik_codes_file_path = dik_codes_file_path
  19.  
  20. self.parse_dik_codes()
  21.  
  22.  
  23. def parse_dik_codes(self):
  24. f = open(self.dik_codes_file_path)
  25. self.dik_dict = json.load(f)
  26. f.close()
  27.  
  28. self.dik_dict_reversed = {} # id : LETTER
  29. for dik_key,dik_value in self.dik_dict.items():
  30. self.dik_dict_reversed[dik_value] = dik_key
  31.  
  32.  
  33.  
  34. class RewasdFileClass:
  35.  
  36. def __init__(self,file_path, device_obj):
  37.  
  38. self.dik_obj = DIKClass()
  39.  
  40. self.file_path = file_path
  41.  
  42. self.rewasd_file_dict = {}
  43.  
  44. self.device_obj = device_obj # to get metadata info from it set by placement application ()
  45.  
  46.  
  47. # def is_key_assigned(self,assigned_key): # these functions are to keep _keysassignments_dict_reversed protected
  48. # return (assigned_key in self._keys_assignments_dict_reversed)
  49. def get_file_path(self):
  50. return self.file_path
  51.  
  52.  
  53. def set_file_path(self,file_path: str):
  54. self.file_path = file_path
  55.  
  56.  
  57. def is_file_path_set(self):
  58. return len(self.file_path) > 0
  59.  
  60.  
  61. def get_dev_key_assignment_value(self,dev_key_name):
  62. return self._keys_assignments_dict[dev_key_name]["assignment"]
  63.  
  64.  
  65. def set_dev_key_assignment_value(self,dev_key_name,new_value):
  66. self._keys_assignments_dict[dev_key_name]["assignment"] = new_value
  67.  
  68.  
  69. def get_dev_key_assignment_description(self,dev_key_name):
  70. return self._keys_assignments_dict[dev_key_name]["description"]
  71.  
  72.  
  73. def set_dev_key_assignment_description(self,dev_key_name,new_value):
  74. self._keys_assignments_dict[dev_key_name]["description"] = new_value
  75.  
  76.  
  77. def get_assignments_dict(self):
  78. return self._keys_assignments_dict
  79.  
  80.  
  81. def get_assigned_key_assignments_list(self,assigned_key):
  82. return self._keys_assignments_dict_reversed[assigned_key]
  83.  
  84.  
  85. def parse_masks(self,masks_dict): # to create order_ids_dict and orders_ids_reversed
  86. self.order_ids_dict = {}
  87. self.order_ids_dict_reversed = {}
  88.  
  89. for i in masks_dict:
  90. self.device_id = i['set'][0]['deviceId']
  91. self.order_ids_dict[ i['set'][0]['buttonId']] = i['id'] # dev_key_dik_id = order_id
  92. self.order_ids_dict_reversed[i['id']] = i['set'][0]['buttonId'] # order_id = dev_key_dik_id
  93.  
  94.  
  95. def parse_config(self):
  96.  
  97. f = open(self.file_path)
  98. self.rewasd_file_dict = json.load(f)
  99. f.close()
  100.  
  101. self.parse_masks(self.rewasd_file_dict['masks'])
  102.  
  103. self._keys_assignments_dict = {} #
  104.  
  105. self._keys_assignments_dict_reversed = {} # ASSIGNED_KEY : { "dev_key_1", "dev_key_2"} < 1 letter may be assigned on few base keys
  106.  
  107. for i in self.rewasd_file_dict['mappings']:
  108. if 'description' in i.keys():
  109. order_id = i["condition"]['mask']["id"]
  110. dev_key_dik_id = self.order_ids_dict_reversed[order_id]
  111. dev_key_name = self.dik_obj.dik_dict_reversed[dev_key_dik_id]
  112.  
  113. assigned_key_dik_id = i["macros"][0]['keyboard']["buttonId"]
  114. assigned_key_name = self.dik_obj.dik_dict_reversed[assigned_key_dik_id]
  115.  
  116. # >>>>>>>>>>>>>>>_keys_assignments_dict <<<<<<<<<<<<<<<<<<<
  117. self._keys_assignments_dict[dev_key_name] = { # LETTER
  118. "assignment" : assigned_key_name, # LETTER
  119. "description": i["description"]
  120. }
  121.  
  122. # reverse assignment
  123.  
  124. if assigned_key_name in self._keys_assignments_dict_reversed:
  125. if dev_key_name not in self._keys_assignments_dict_reversed[assigned_key_name]:
  126. self._keys_assignments_dict_reversed[assigned_key_name].append(dev_key_name)
  127. else:
  128. self._keys_assignments_dict_reversed[assigned_key_name] = [dev_key_name]
  129.  
  130. # print(self._keys_assignments_dict_reversed)
  131.  
  132.  
  133. ################### json methods
  134. def _generate_jsonfile(self):
  135.  
  136. self.rewasd_file_dict["schemaVersion"] = self.device_obj.schemaVersion
  137. self.rewasd_file_dict["appVersion"] = self.device_obj.appVersion
  138. self.rewasd_file_dict["config"] = {
  139. "appName": os.path.basename(self.file_path),
  140. "minTimeUnit": 1
  141. }
  142. self.rewasd_file_dict["devices"] = self.device_obj.devices
  143. self.rewasd_file_dict["masks"] = self.device_obj.masks
  144. self._generate_jsonfile_mappings() # create self.mapping_list
  145. self.rewasd_file_dict['mappings'] = self._mappings_list
  146.  
  147.  
  148. def _generate_jsonfile_mappings(self):
  149. self.parse_masks(self.device_obj.masks)
  150. self._mappings_list = []
  151.  
  152. for order_id,dev_key_dik_id in self.order_ids_dict_reversed.items():
  153.  
  154. dev_key_dik_id = self.order_ids_dict_reversed[order_id]
  155. dev_key_name = self.dik_obj.dik_dict_reversed[dev_key_dik_id]
  156.  
  157. #assigned_key_name = self._keys_assignments_dict[dev_key_name]['assignment'] # connection point!
  158. assigned_key_name = self.buttons_dict[dev_key_name].get_assigned_key()
  159. assigned_key_dik_id = self.dik_obj.dik_dict[assigned_key_name]
  160.  
  161. row_dict = {
  162. 'condition': {
  163. 'hardware': {
  164. 'deviceId': 11,
  165. 'buttonId': dev_key_dik_id,
  166. 'description': 'DIK_' + dev_key_name
  167. }
  168. },
  169. 'hardware': {'unmap': True}
  170. }
  171.  
  172. self._mappings_list.append(row_dict)
  173.  
  174. row_dict = {
  175. "description": self.buttons_dict[dev_key_name].get_assigned_key_description(),
  176. "condition": {
  177. "mask": {
  178. "id": order_id,
  179. "activator": {
  180. "type": "single",
  181. "mode": "hold_until_release"
  182. }
  183. }
  184. },
  185. "macros": [
  186. {
  187. "keyboard": {
  188. "buttonId": assigned_key_dik_id,
  189. "description": "DIK_" + self.dik_obj.dik_dict_reversed[assigned_key_dik_id]
  190. }
  191. }
  192. ]
  193. }
  194.  
  195. self._mappings_list.append(row_dict)
  196.  
  197. #print(row_dict)
  198. #print(json.dumps(self.mappings_list))
  199.  
  200.  
  201. def save_config(self,buttons_dict):
  202. self.buttons_dict = buttons_dict
  203.  
  204. self._generate_jsonfile()
  205.  
  206. #size = os.path.getsize(self.file_path)
  207.  
  208. print(self.file_path)
  209. stat = os.stat(self.file_path)
  210. size = stat.st_size
  211. print(size)
  212. file_exists = os.path.getsize(self.file_path) > 0 # must be before opening file
  213.  
  214. f = open(self.file_path, "a+") # open original file
  215.  
  216. if file_exists: # if file exists and is not empty
  217. self.rewasd_file_bckp_dict = json.load(f)
  218. f_bckp = open(self.file_path + ".bak", "w") # create backup file
  219. f_bckp.write(json.dumps(self.rewasd_file_bckp_dict, indent=4)) # write original content to backup file
  220. f_bckp.close()
  221.  
  222. f.write(json.dumps(self.rewasd_file_dict, indent=4)) # write new content to backup file
  223. f.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement