KikkaAction.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import os
  2. import json
  3. import elevate
  4. import subprocess
  5. from PySide6.QtCore import Qt, QFileInfo
  6. import Kikka
  7. from Kikka.KikkaConst import *
  8. from Kikka.Utils.Singleton import singleton
  9. from Kikka.KikkaMemory import Storageable, KikkaMemory
  10. class Action:
  11. def __init__(self, data):
  12. self.name = data[0]
  13. self.type = data[1]
  14. self.path = data[2]
  15. self.icon = data[3]
  16. self.param = data[4]
  17. self.work_dir = data[5]
  18. self.run_as_admin = data[6]
  19. self.open_as_private = data[7]
  20. self.color = data[8]
  21. self.shortcut = data[9]
  22. self.remark = data[10]
  23. def toList(self):
  24. return [
  25. self.name,
  26. self.type,
  27. self.path,
  28. self.icon,
  29. self.param,
  30. self.work_dir,
  31. self.run_as_admin,
  32. self.open_as_private,
  33. self.color,
  34. self.shortcut,
  35. self.remark
  36. ]
  37. class SubCategory(Storageable):
  38. def __init__(self, name, type):
  39. self.name = name
  40. self.type = type
  41. self.actions = []
  42. def __str__(self):
  43. return "SubCategory(%s) %s" % (self.name, self.type)
  44. def toDict(self):
  45. return {
  46. 'name': self.name,
  47. 'type': self.type,
  48. 'actions': [a.toList() for a in self.actions]
  49. }
  50. class MainCategory(Storageable):
  51. def __init__(self, name):
  52. self.name = name
  53. self.sub_categories = {}
  54. def __getitem__(self, item):
  55. return self.sub_categories[item]
  56. def __str__(self):
  57. return "MainCategory(%s)" % self.name
  58. def toDict(self):
  59. return {
  60. 'name': self.name,
  61. 'sub_categories': [s.toDict() for _, s in self.sub_categories.items()]
  62. }
  63. @singleton
  64. class KikkaAction():
  65. def __init__(self):
  66. self._data = None
  67. @property
  68. def data(self):
  69. return self._data
  70. def load(self):
  71. data = {}
  72. action_data = Kikka.memory.getAction()
  73. for col, main_category_data in enumerate(action_data.values()):
  74. main_name = main_category_data['name']
  75. main_category = MainCategory(main_name)
  76. data[col] = main_category
  77. for row, sub_category_data in enumerate(main_category_data['sub_categories']):
  78. sub_name = sub_category_data['name']
  79. sub_category = SubCategory(sub_name, sub_category_data['type'])
  80. main_category.sub_categories[row] = sub_category
  81. actions = sub_category_data['actions']
  82. for action_data in actions:
  83. action = Action(action_data)
  84. sub_category.actions.append(action)
  85. self._data = data
  86. return data
  87. def save(self):
  88. Kikka.memory.updateAction(self._data)
  89. @staticmethod
  90. def createAction(name='',
  91. type='',
  92. path='',
  93. icon='',
  94. param='',
  95. work_dir='',
  96. run_as_admin=False,
  97. open_as_private=False,
  98. color='',
  99. shortcut='',
  100. remark=''):
  101. data = [name, type, path, icon, param, work_dir, run_as_admin, open_as_private, color, shortcut, remark]
  102. action = Action(data)
  103. return action
  104. def addAction(self, action, column, row):
  105. self._data[column].sub_categories[row].actions.append(action)
  106. self.save()
  107. # region Action Operation
  108. def actionOperation(self, operation, param):
  109. if operation == EActionOperation.RunAction:
  110. self._runAction(param['action'])
  111. elif operation == EActionOperation.NewAction:
  112. self._newAction(param['filepath'], param['column'], param['row'])
  113. def _runAction(self, action, run_as_admin=False, run_for_new_console=False):
  114. run_as_admin = run_as_admin or action.run_as_admin
  115. if run_as_admin:
  116. elevate.elevate()
  117. cmd = action.path + " " + action.param
  118. work_dir = action.work_dir
  119. try:
  120. proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=work_dir, shell=True)
  121. if proc.returncode != 0:
  122. print(proc.stderr)
  123. except Exception as e:
  124. print(e)
  125. pass
  126. def _newAction(self, filepath, column, row):
  127. file_info = QFileInfo(filepath)
  128. ext = file_info.suffix().lower()
  129. if ext in ["exe", "bat", "cmd", "ps1", "sh"]:
  130. # executable
  131. action = self.createAction(
  132. type="executable",
  133. name=file_info.baseName(),
  134. path=file_info.filePath(),
  135. work_dir=file_info.path(),
  136. )
  137. KikkaAction().addAction(action, column, row)
  138. pass
  139. # endregion