UAT_tree.py 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. # -*- coding:utf-8 -*-
  2. import os, sys, time,json
  3. from collections import OrderedDict
  4. from ssat_sdk.utils.string_util import strToList
  5. from UAT_log import error,info,debug
  6. DEBUG = True
  7. INFO = True
  8. ERROR = True
  9. class FirstLevel():
  10. ParentCol = 0
  11. ShortCutKeyCol = ParentCol + 1
  12. UIViewCol = ParentCol + 2
  13. MoveKeyCol = ParentCol + 3
  14. ToParentKeyCol = ParentCol + 4
  15. LayoutCol = ParentCol + 5
  16. OptionCol = ParentCol + 6
  17. OptionViewCol = ParentCol + 7
  18. FocusSelectCol = ParentCol + 8
  19. FocuseViewCol = ParentCol + 9
  20. EnterKeyCol = ParentCol + 10
  21. TextValueCol = ParentCol + 11
  22. InfoViewCol = ParentCol + 12
  23. OthersCol = ParentCol + 13
  24. class NLevel():
  25. ParentCol = 0
  26. UIViewCol = ParentCol + 1
  27. MoveKeyCol = ParentCol + 2
  28. ToParentKeyCol = ParentCol + 3
  29. LayoutCol = ParentCol + 4
  30. OptionCol = ParentCol + 5
  31. OptionViewCol = ParentCol + 6
  32. FocusSelectCol = ParentCol + 7
  33. FocuseViewCol = ParentCol + 8
  34. EnterKeyCol = ParentCol + 9
  35. TextValueCol = ParentCol + 10
  36. InfoViewCol = ParentCol + 11
  37. OthersCol = ParentCol + 12
  38. class DialogLevel():
  39. DialogCol = 0
  40. UIViewCol = DialogCol + 1
  41. MoveKeyCol = DialogCol + 2
  42. ToParentKeyCol = DialogCol + 3
  43. LayoutCol = DialogCol + 4
  44. OptionCol = DialogCol + 5
  45. OptionViewCol = DialogCol + 6
  46. FocusSelectCol = DialogCol + 7
  47. FocuseViewCol = DialogCol + 8
  48. EnterKeyCol = DialogCol + 9
  49. TextValueCol = DialogCol + 10
  50. InfoViewCol = DialogCol + 11
  51. OthersCol = DialogCol + 12
  52. FirstPrev = "first-prev"
  53. class UATTree():
  54. TAB_NAME = "name"
  55. TAB_SHORTCUT_KEY = "shortcut_key"
  56. TAB_UI_VIEW = "uiview"
  57. TAB_MOVE_KEY = "move_key"
  58. TAB_TOPARENT_KEY = "toparent_key"
  59. TAB_LAYOUT = "layout"
  60. TAB_OPTION = "option"
  61. TAB_LEVEL = "level"
  62. TAB_PREV_PARENT = "prev_parent"
  63. TAB_NEXT_PARENT = "next_parent"
  64. TAB_OPTION_VIEW = "optionView"
  65. TAB_FOCUS_SELECT = "focus-select"
  66. TAB_FOCUSE_VIEW = "focuseView"
  67. TAB_TEXT_VALUE = "textValue"
  68. TAB_ENTER_KEY = "enter_key"
  69. TAB_PARENT_NAME = "parentName"
  70. TAB_INFO_VIEW = "infoView"
  71. TAB_OTHERS = "others"
  72. def __init__(self):
  73. self.treeDict = OrderedDict()
  74. self.dialogDict = OrderedDict()
  75. self.cls = "UATTree"
  76. '''
  77. char为该项参数的括符符号,必须成对带入。默认为中括号[]
  78. '''
  79. #将数据从excel表格里取出来,只返回括号里面的内容
  80. def parseParam(self, key, params, char = "[]"):
  81. # 为防止key在其他地方存在相同关键字,添加一个"["做区别
  82. key1 = key + char[0]
  83. keyIndex = params.find(key1)
  84. if keyIndex == -1:
  85. return ""
  86. # key.__len__()-1 为去掉"["的处理
  87. str1 = params[keyIndex + key1.__len__()-1:params.__len__()]
  88. i1 = str1.find(char[0])
  89. if key == self.View_Bounds or key == self.View_sambounds:
  90. i2 = str1.find("]]")+1
  91. else:
  92. i2 = str1.find(char[1])
  93. if i1 == -1 or i2 == -1:
  94. return ""
  95. str2 = str1[i1 + 1: i2]
  96. return str2.strip()
  97. def findAllParam(self, key, params,seg="[]"):
  98. paramArr = []
  99. # for i in range(2):
  100. while True:
  101. keyIndex = params.find(key)
  102. if keyIndex == -1:
  103. break
  104. endIndex = params.find(seg[1])
  105. oneParam = params[keyIndex+key.__len__()+1:endIndex]
  106. params = params[endIndex+1:]
  107. paramArr.append(oneParam)
  108. return paramArr
  109. '''
  110. 返回:{key:value,key2:value2,...}
  111. '''
  112. def parseMulParam(self, keyList, params):
  113. paramDict = {}
  114. for key in keyList:
  115. # if key == 'text':
  116. # value = self.parseMulText(params)
  117. # else:
  118. value = self.parseParam(key, params)
  119. paramDict[key] = value
  120. return paramDict
  121. '''
  122. 例如:enter_key,event[]ir[]同时存在多个
  123. 返回:[[key,value],[key,value],...]
  124. '''
  125. def parseMulParam_Same(self, keyList, params):
  126. mulParam=[]
  127. for key in keyList:
  128. paramArr = self.findAllParam(key, params)
  129. for param in paramArr:
  130. keyItem = [key]
  131. keyItem.append(param)
  132. mulParam.append(keyItem)
  133. return mulParam
  134. #KeyDict数据
  135. Key_AM = "am" #android am命令
  136. Key_Event = "event" #android KeyEvent
  137. Key_IR = "ir" #红外按键
  138. Key_Input = "input" #Android input命令
  139. Max_Try = "max_try"
  140. #根据key的字符串,解析出key的字典。格式:am[]event[]ir[]组合
  141. '''
  142. 用于解析move key参数
  143. '''
  144. def parseKey(self, keyStr):
  145. keyList = [self.Key_AM, self.Key_Event, self.Key_IR, self.Key_Input, self.Max_Try]
  146. keyDict = self.parseMulParam(keyList, keyStr)
  147. keyDict[self.Key_Event] = strToList(keyDict[self.Key_Event], ",")
  148. keyDict[self.Key_IR] = strToList(keyDict[self.Key_IR], ",")
  149. return keyDict
  150. '''
  151. 不考虑按键种类,解析按键名、等待时间等参数,enter,wait=1,enterParent=hdmi_settings
  152. 返回结果:{"keyvalue":[left,right,enter],"wait":'1',"times":"1"}
  153. '''
  154. def parseKeyParam(self, keyParamStr):
  155. paramDict = {self.Key_Value:[],self.Wait_Time:'0', self.Key_Times:'1', self.Duration_Time:'1'}
  156. paramArr = strToList(keyParamStr,",")
  157. keyValue=[]
  158. for param in paramArr:
  159. if "=" not in param:
  160. keyValue.append(param.strip())
  161. else:
  162. pArr = strToList(param,"=")
  163. paramDict[pArr[0].strip().lower()] = pArr[1].strip()
  164. paramDict[self.Key_Value] = keyValue
  165. return paramDict
  166. # enterKeyDict数据
  167. Wait_Time = "wait"
  168. Duration_Time = "duration"
  169. Enter_Parent = "enterparent"
  170. Key_Value = "keyvalue"
  171. Key_Type = "keytype"
  172. Key_Param = "key_param"
  173. Key_Times = "times"
  174. # 根据key的字符串,解析出key的字典。格式:am[]event[]ir[]组合
  175. '''
  176. 返回值:[{"enterParent":"","key_param":{"keyType","event","keyvalue":[left,right,enter],"wait":1,"enterParent":"hdmi_settings"}}
  177. ,...]
  178. '''
  179. def parseEnterKey(self, keyStr, optionName):
  180. keyList = [self.Key_Event, self.Key_IR, self.Key_Input]
  181. keyArr = self.parseMulParam_Same(keyList, keyStr)
  182. retArr = []
  183. for keyItem in keyArr:
  184. nextPDict = {} #{"enterParent":"","key_param":{"keyType","event","keyvalue":[left,right,enter],"wait":1,"enterParent":"hdmi_settings"}}
  185. keyParamDict = self.parseKeyParam(keyItem[1])
  186. keyParamDict[self.Key_Type] = keyItem[0]
  187. nextPDict[self.Key_Param] = keyParamDict
  188. keyParamDict[self.Wait_Time] = float(keyParamDict[self.Wait_Time])
  189. keyParamDict[self.Duration_Time] = float(keyParamDict[self.Duration_Time])
  190. keyParamDict[self.Key_Times] = int(keyParamDict[self.Key_Times])
  191. if keyParamDict.has_key(self.Enter_Parent) is False:
  192. keyParamDict[self.Enter_Parent] = optionName
  193. nextPDict[self.Enter_Parent] = keyParamDict[self.Enter_Parent]
  194. retArr.append(nextPDict)
  195. return retArr
  196. #Android View数据
  197. View_ID = "resid" #android view resource-id
  198. View_Text = "text" #android view 文本内容。 用于焦点定位,文本组件坐标被焦点组件坐标包含
  199. View_Desc = "desc" #android view描述
  200. View_Bounds = "bounds" #android view 坐标
  201. View_Index = "index"
  202. View_Class = "class"
  203. '''
  204. 主要用于infoView数据解析
  205. '''
  206. def parseView(self, viewStr):
  207. keyList = [self.View_ID, self.View_Text, self.View_Desc, self.View_Bounds, self.View_Index, self.View_Class]
  208. paramDict = self.parseMulParam(keyList, viewStr)
  209. paramDict[self.View_Bounds] = self.strToBounds(paramDict[self.View_Bounds])
  210. return paramDict
  211. '''
  212. 将‘[801,116][1280,180]’转成数组[[801,116][1280,180]]
  213. '''
  214. def strToBounds(self, bstr):
  215. char = "[]"
  216. # print "strToBounds,bstr:", bstr,bstr.__len__()
  217. if bstr.__len__() < 10:
  218. return []
  219. keyIndex = 1
  220. # key.__len__()-1 为去掉"["的处理
  221. i1 = bstr.find(char[0])
  222. i2 = bstr.find(char[1])
  223. if i1 == -1 or i2 == -1:
  224. return []
  225. str1 = bstr[i1: i2 + 1]
  226. str2 = bstr[i2 + 1: bstr.__len__()]
  227. return [eval(str1), eval(str2)]
  228. '''
  229. 解析多文本option,更改key亦可作为其他参数
  230. '''
  231. def parseMulText(self,params, char="[]",key = 'text'):
  232. key1 = key + char[0] + char[0]
  233. keyIndex = params.find(key1)
  234. if keyIndex == -1:
  235. text = self.parseParam(key, params) # 只有一层中括号
  236. else:
  237. text = []
  238. str1 = params[keyIndex + key1.__len__() - 1:len(params)]
  239. i1 = str1.find(char[0])
  240. i2 = str1.find((char[1] + char[1]))
  241. if i1 == -1 or i2 == -1:
  242. return ""
  243. str2 = str1[i1 + 1:i2] # 只去掉外括号
  244. strList = strToList(str2, ",")
  245. # for strs in strList:
  246. # text.append(strs.strip(char[0]).strip(char[1]))
  247. return text
  248. View_sambounds = "sambounds" #采样时的样本坐标,用于和select-focus、focusView的坐标做相对比较,计算相对位置,用于确定是否被选中。
  249. # 即选中状态的坐标,option中组件选中状态下的坐标和focus-select/focusView中组件选中状态下的坐标
  250. # 分别写在optionView和focus-select/focusView中,其实就类似用sambounds做为组件
  251. '''
  252. 用于optionView的数据解析
  253. '''
  254. def parseOptionView(self, viewStr):
  255. keyList = [self.View_ID, self.View_Text, self.View_Desc, self.View_Bounds, self.View_Index, self.View_Class
  256. ,self.View_sambounds]
  257. paramDict = self.parseMulParam(keyList, viewStr)
  258. #多文本中以“,”为分隔符进行数据解析,分割为有多个独文本的元组
  259. if paramDict[self.View_Text].find(",") != -1:
  260. paramDict[self.View_Text] = strToList(paramDict[self.View_Text], ",")
  261. paramDict[self.View_Bounds] = self.strToBounds(paramDict[self.View_Bounds])
  262. paramDict[self.View_sambounds] = self.strToBounds(paramDict[self.View_sambounds])
  263. return paramDict
  264. # UI 界面数据
  265. UIView_Activity = "activity" # android activity
  266. UIVIew_Action = "action"
  267. # UIView_ID = "resid" # android view resource-id
  268. # UIView_Text = "text" # android view 文本内容
  269. # UIView_Desc = "desc" # android view描述
  270. # UIView_Bounds = "bounds" # android view 坐标
  271. UIView_Dialog_F = "dialog_forward" # 进入时可能出现的弹窗
  272. UIView_Dialog_B = "dialog_back" # 退出时可能出现的弹窗
  273. def parseUIView(self, viewStr):
  274. keyList = [self.UIView_Activity, self.UIVIew_Action, self.View_ID, self.View_Text, self.View_Desc,
  275. self.View_Bounds, self.UIView_Dialog_F, self.UIView_Dialog_B]
  276. uiView = self.parseMulParam(keyList, viewStr)
  277. return self.parseDialogParam(uiView)
  278. def parseDialogParam(self, uiView):
  279. dialog_F_List = strToList(uiView[self.UIView_Dialog_F], ",")
  280. dialog_B_List = strToList(uiView[self.UIView_Dialog_B], ",")
  281. self.addDialogList(dialog_F_List, uiView, True)
  282. self.addDialogList(dialog_B_List, uiView, False)
  283. return uiView
  284. def addDialogList(self, dialog_List, uiView, isForward):
  285. for dialog in dialog_List:
  286. dialog_A = strToList(dialog.lower(), "&")
  287. if dialog_A.__len__() == 2:
  288. dialog_Name = dialog_A[0]
  289. dialog_Choose = dialog_A[1]
  290. else:
  291. error(str(self.__class__), "parseDialogParam", "Dialog %s set error"%dialog, ERROR)
  292. return
  293. if self.dialogDict.has_key(dialog_Name):
  294. if isForward is True:
  295. dialog_Type = self.UIView_Dialog_F
  296. else:
  297. dialog_Type = self.UIView_Dialog_B
  298. uiView[dialog_Type] = {}
  299. uiView[dialog_Type][dialog_Name] = self.dialogDict[dialog_Name]
  300. uiView[dialog_Type][dialog_Name]["choose"] = self.dialogDict[dialog_Name][UATTree.TAB_OPTION][dialog_Choose]
  301. else:
  302. error(str(self.__class__), "parseDialogParam", "Dialog %s read fail"%dialog_Name, ERROR)
  303. # Android Layout数据
  304. # Layout_ID = "resid" # android view resource-id
  305. # Layout_Desc = "desc" # android view描述
  306. # Layout_Bounds = "bounds" # android view 坐标
  307. # Layout_Class = "class" #android view class类型
  308. Layout_Limit = "limit" #layout是否限制optionView焦点操作范围。0:不限制,1:限制,默认为0
  309. '''
  310. layout:各属性值,用于综合确定一个布局组件
  311. :return layout 字典:{"resid":"","desc":"","bounds":""}
  312. '''
  313. def parseLayout(self, viewStr):
  314. keyList = [self.View_ID, self.View_Desc, self.View_Bounds, self.View_Class, self.Layout_Limit]
  315. paramDict = self.parseMulParam(keyList, viewStr)
  316. if paramDict.has_key(self.Layout_Limit) and paramDict[self.Layout_Limit].__len__()>0:
  317. paramDict[self.Layout_Limit] = int(paramDict[self.Layout_Limit]) #字符'0'转数字0
  318. paramDict[self.View_Bounds] = self.strToBounds(paramDict[self.View_Bounds])
  319. return paramDict
  320. #Android FocusView数据
  321. # Focus_ID = "resid" #android view resource-id
  322. # Focus_Text = "text" #android view 文本内容
  323. # Focus_Desc = "desc" #android view描述
  324. # Focus_Bounds = "bounds" #android view 坐标
  325. # Focus_Class = "class"
  326. def parseFocus(self, viewStr):
  327. keyList = [self.View_ID, self.View_Text, self.View_Desc, self.View_Bounds, self.View_Class,
  328. self.View_sambounds]
  329. paramDict = self.parseMulParam(keyList, viewStr)
  330. paramDict[self.View_Bounds] = self.strToBounds(paramDict[self.View_Bounds])
  331. paramDict[self.View_sambounds] = self.strToBounds(paramDict[self.View_sambounds])
  332. return paramDict
  333. #Value数据
  334. # ValueView_ID = "resid" #android view resource-id
  335. # ValueView_Text = "text" #android view 文本内容
  336. # ValueView_Desc = "desc" #android view描述
  337. # ValueView_Bounds = "bounds"
  338. # ValueView_Class = "class"
  339. ValueView_Value = "value" # 输入的值范围。格式:first, second, ... 或者 0-100
  340. ValueView_Min = "minvalue" # 如果是数值范围形式的值,返回最小值
  341. ValueView_Max = "maxvalue" # 如果是数值范围形式的值,返回最小值
  342. ValueView_StepSize = "stepsize" # 如果是数值范围形式的值,每次调整数值的步长。读不到此参数时,默认为1。
  343. ValueView_Duration = "duration" # 如果是数值范围形式的值,每次调整数值的间隔时间。读不到此参数时,默认为0.2。
  344. ValueView_Sign = "sign" # 针对前缀为字母,后缀为数字形式的值,用来保存前缀
  345. def parseValueView(self, viewStr):
  346. keyList = [self.View_ID, self.View_Text, self.View_Desc, self.ValueView_Value,
  347. self.ValueView_StepSize, self.ValueView_Duration, self.View_Bounds, self.View_Class,
  348. self.View_sambounds]
  349. paramDict = self.parseMulParam(keyList, viewStr)
  350. valueStr = paramDict[self.ValueView_Value]
  351. sign = []
  352. valueListDelStr = []
  353. flagList = []
  354. flag_v = False # value前缀不为字母
  355. if valueStr != "":
  356. i = valueStr.find(",")
  357. if i != -1:
  358. valueList = strToList(valueStr, ",")
  359. isRange = False
  360. # 前缀字母,后缀数字
  361. for val in valueList:
  362. if (ord(val[0])>57 or ord(val[0])<48) and (47 < ord(val[1]) < 58):
  363. sign.append(val[0])
  364. valueDelStr = val.strip(val[0])
  365. valueListDelStr.append(valueDelStr)
  366. flagList.append(True) #value前缀为字母
  367. else:
  368. flagList.append(False)
  369. for f in flagList:
  370. flag_v = f
  371. flag_v = flag_v and f
  372. if flag_v == False:
  373. sign = []
  374. # 处理range类型(数值)
  375. try:
  376. if valueList.__len__() == 2:
  377. if flag_v == True: #//
  378. valueList = valueListDelStr
  379. paramDict[self.ValueView_Min] = -float(valueList[0])#//
  380. else:
  381. paramDict[self.ValueView_Min] = float(valueList[0])
  382. paramDict[self.ValueView_Max] = float(valueList[1])
  383. isRange = True
  384. except Exception,ValueError:
  385. info(self.cls, "parseValueView", "valueList %s not range value.", INFO)
  386. # 处理非range类型(选项)
  387. if isRange is False:
  388. for value in valueList:
  389. valueViewStr = self.parseParam(value, viewStr, "{}")
  390. if valueViewStr == "":
  391. debug(self.cls, "parseValueView", "value %s 没有任何配置信息!!!请加入该value信息,否则可能将导致设值失败!!!"%value, DEBUG)
  392. # 读出来的数值未带大括号,需加上大括号,并且json格式化
  393. valueView = eval("{%s}" % valueViewStr)
  394. paramDict[value] = valueView
  395. paramDict[self.ValueView_Sign] = sign
  396. return paramDict
  397. #focus-select数据,不仅有select或者focus类型,还有指定组件属性情况,用于处理界面多个聚焦方式出现的场景
  398. FS_Type = "type"
  399. FS_checkType = "checkType"
  400. # FS_ID = "resid" #android view resource-id
  401. # FS_Text = "text" #android view 文本内容。
  402. # FS_Desc = "desc" #android view描述
  403. # FS_Bounds = "bounds" #android view 坐标
  404. # FS_Class = "class"
  405. def parseFocusSelectType(self, fsType):
  406. keyList = [self.FS_Type,self.View_ID,self.View_Text,self.View_Desc,self.View_Bounds,
  407. self.View_sambounds,self.View_Class,self.FS_checkType]
  408. paramDict = self.parseMulParam(keyList, fsType)
  409. paramDict[self.View_sambounds] = self.strToBounds(paramDict[self.View_sambounds])
  410. return paramDict
  411. '''
  412. 扫描parent数据行时,要把建立当前parent的prevParent和nextParent关系。
  413. '''
  414. def addParent(self,level, parentName, shortkey, uiview, move_key, toparent_key, layout, others):
  415. # print "addParent, level,parentName:", level, parentName
  416. if not self.treeDict.has_key(level):
  417. self.treeDict[level] = {}
  418. parentDict = {}
  419. parentDict[UATTree.TAB_NAME] = parentName
  420. parentDict[UATTree.TAB_SHORTCUT_KEY] = self.parseKey(shortkey)
  421. parentDict[UATTree.TAB_UI_VIEW] = self.parseUIView(uiview)
  422. parentDict[UATTree.TAB_MOVE_KEY] = self.parseKey(move_key)
  423. parentDict[UATTree.TAB_TOPARENT_KEY] = self.parseKey(toparent_key)
  424. parentDict[UATTree.TAB_LAYOUT] = self.parseLayout(layout)
  425. parentDict[UATTree.TAB_OPTION] = {}
  426. parentDict[UATTree.TAB_LEVEL] = level
  427. parentDict[UATTree.TAB_PREV_PARENT] = None
  428. parentDict[UATTree.TAB_NEXT_PARENT] = {}
  429. parentDict[UATTree.TAB_OTHERS] = self.parseOthers(others)
  430. if "first" <> level:
  431. prevParent = self.getPreParentByParent(parentDict)
  432. if prevParent is not None:
  433. parentDict[UATTree.TAB_PREV_PARENT] = prevParent
  434. prevParent[UATTree.TAB_NEXT_PARENT][parentName] = parentDict
  435. self.treeDict[level][parentName] = parentDict
  436. '''
  437. 扫描option行的时候,会把option字典关联到相应的parent字典里
  438. '''
  439. def addOption(self, level, parentName, optionName, optionView, focusSelect, focusView, enterKey, textValue, infoView):
  440. # print "addOption, level,parentName,optionName:", level, parentName,optionName
  441. if self.treeDict.has_key(level) and self.treeDict[level].has_key(parentName):
  442. optionDict = {}
  443. optionDict[UATTree.TAB_NAME] = optionName
  444. optionDict[UATTree.TAB_OPTION_VIEW] = self.parseOptionView(optionView)
  445. optionDict[UATTree.TAB_FOCUS_SELECT] = self.parseFocusSelectType(focusSelect)
  446. optionDict[UATTree.TAB_FOCUSE_VIEW] = self.parseFocus(focusView)
  447. optionDict[UATTree.TAB_ENTER_KEY] = self.parseEnterKey(enterKey, optionName)
  448. optionDict[UATTree.TAB_TEXT_VALUE] = self.parseValueView(textValue)
  449. optionDict[UATTree.TAB_INFO_VIEW] = self.parseView(infoView)
  450. optionDict[UATTree.TAB_PARENT_NAME] = parentName
  451. optionDict[UATTree.TAB_LEVEL] = level
  452. self.treeDict[level][parentName][UATTree.TAB_OPTION][optionName] = optionDict
  453. def addDialog(self, parentName, shortkey, uiview, move_key, toparent_key, layout, others):
  454. # print "addDialog, parentName:", parentName
  455. parentDict = {}
  456. parentDict[UATTree.TAB_NAME] = parentName
  457. parentDict[UATTree.TAB_SHORTCUT_KEY] = self.parseKey(shortkey)
  458. parentDict[UATTree.TAB_UI_VIEW] = self.parseUIView(uiview)
  459. parentDict[UATTree.TAB_MOVE_KEY] = self.parseKey(move_key)
  460. parentDict[UATTree.TAB_TOPARENT_KEY] = self.parseKey(toparent_key)
  461. parentDict[UATTree.TAB_LAYOUT] = self.parseLayout(layout)
  462. parentDict[UATTree.TAB_OPTION] = {}
  463. parentDict[UATTree.TAB_OTHERS] = self.parseDialogOthers(others)
  464. self.dialogDict[parentName] = parentDict
  465. def addDialogOption(self, parentName, optionName, optionView, focusSelect, focusView, enterKey, textValue, infoView):
  466. # print "addDialogOption, parentName,optionName:", parentName, optionName
  467. if self.dialogDict.has_key(parentName):
  468. optionDict = {}
  469. optionDict[UATTree.TAB_NAME] = optionName
  470. optionDict[UATTree.TAB_OPTION_VIEW] = self.parseOptionView(optionView)
  471. optionDict[UATTree.TAB_FOCUS_SELECT] = self.parseFocusSelectType(focusSelect)
  472. optionDict[UATTree.TAB_FOCUSE_VIEW] = self.parseFocus(focusView)
  473. optionDict[UATTree.TAB_ENTER_KEY] = self.parseEnterKey(enterKey,optionName)
  474. optionDict[UATTree.TAB_TEXT_VALUE] = self.parseValueView(textValue)
  475. optionDict[UATTree.TAB_INFO_VIEW] = self.parseView(infoView)
  476. optionDict[UATTree.TAB_PARENT_NAME] = parentName
  477. self.dialogDict[parentName][UATTree.TAB_OPTION][optionName] = optionDict
  478. def findParentDict(self, parentName):
  479. parentName = parentName.lower()
  480. levelList = self.treeDict.keys()
  481. for index in range(levelList.__len__()-1, -1, -1):
  482. level = levelList[index]
  483. if self.treeDict[level].has_key(parentName):
  484. return self.treeDict[level][parentName]
  485. return None
  486. def getSubOptionDict(self, parentName):
  487. parentDict = self.findParentDict(parentName)
  488. if parentDict is not None:
  489. return parentDict[UATTree.TAB_OPTION]
  490. return None
  491. def findOption(self, optionName):
  492. optionName = optionName.lower()
  493. levelList = self.treeDict.keys()
  494. for index in range(levelList.__len__()-1, -1, -1):
  495. level = levelList[index]
  496. levelDict = self.treeDict[level]
  497. for parent in levelDict.keys():
  498. parentDict = levelDict[parent]
  499. for option in parentDict.keys():
  500. optionDict = parentDict[UATTree.TAB_OPTION]
  501. if optionDict.has_key(optionName):
  502. return optionDict[optionName]
  503. def getOpitonInLevel(self,targetOptionName, level):
  504. levelDict = self.treeDict[level]
  505. for parentName in levelDict.keys():
  506. parentDict = levelDict[parentName]
  507. for optionName in parentDict[UATTree.TAB_OPTION].keys():
  508. if targetOptionName == optionName:
  509. return parentDict[UATTree.TAB_OPTION][optionName]
  510. else:
  511. return None
  512. '''
  513. 检测option的enter_key中是否存在对应parentName
  514. '''
  515. def checkEnterParentEK(self, enterKey, parentName):
  516. # print "checkEnterParentEK,enterKey,parentName:",enterKey, parentName
  517. for keyItem in enterKey:
  518. if keyItem[self.Enter_Parent] == parentName:
  519. return True
  520. return False
  521. '''
  522. 检测option字典,是否下一级nextParent包含这一个parentName
  523. '''
  524. def checkOptionEnterParent(self, option, parentName):
  525. enterKey = option[self.TAB_ENTER_KEY]
  526. if option[self.TAB_NAME] == parentName:
  527. return True
  528. return self.checkEnterParentEK(enterKey, parentName)
  529. '''
  530. 根据parentName,在EnterKey所有列表中,找到匹配的enterKey字典选项
  531. 返回值:{"enterParent":"","key_param":{"keyType":"event","keyvalue":[left,right,enter],"wait":1,"enterParent":"hdmi_settings"}
  532. '''
  533. def getEKByParent(self, enterKeys, parentName):
  534. for keyItem in enterKeys:
  535. if keyItem[self.Enter_Parent] == parentName:
  536. return keyItem[self.Key_Param]
  537. return None
  538. '''
  539. 获取option的parent
  540. '''
  541. def getParentByOption(self, option):
  542. parentName = option[UATTree.TAB_PARENT_NAME]
  543. levelName = option[UATTree.TAB_LEVEL]
  544. if self.treeDict[levelName].has_key(parentName):
  545. parent = self.treeDict[levelName][parentName]
  546. return parent
  547. else:
  548. return None
  549. '''
  550. 根据Parent数据,查上一级parent。
  551. '''
  552. def getPreParentByParent(self, parent):
  553. prevLevel = self.getPrevLevel(parent[self.TAB_LEVEL])
  554. levelDict = self.treeDict[prevLevel]
  555. # print "getPreParentByParent,levelDict:",levelDict
  556. for parentName in levelDict.keys():
  557. parentDict = levelDict[parentName]
  558. # print "getPreParentByParent,parentDict:", parentDict
  559. for optionName in parentDict[UATTree.TAB_OPTION].keys():
  560. option = parentDict[UATTree.TAB_OPTION][optionName]
  561. # print "getPreParentByParent,option:", option
  562. if self.checkOptionEnterParent(option, parent[self.TAB_NAME]):
  563. return parentDict
  564. error(str(self.__class__), "getPreParentByParent",
  565. "Parent %s's prevparent not found in level %s"%(parent[self.TAB_NAME], prevLevel), ERROR)
  566. return None
  567. '''
  568. 获取当前level的前一个level名
  569. '''
  570. def getPrevLevel(self, level):
  571. self.levelList = self.treeDict.keys()
  572. index = self.levelList.index(level)
  573. if index == 0:
  574. return FirstPrev
  575. else:
  576. return self.levelList[index-1]
  577. '''
  578. 获取当前Parent的上一级parent
  579. '''
  580. def getPrevParent(self, parent):
  581. return parent[UATTree.TAB_PREV_PARENT]
  582. '''
  583. 获取当前parent下一级所有parent的字典
  584. '''
  585. def getNextParentList(self, parent):
  586. return parent[UATTree.TAB_NEXT_PARENT]
  587. def printTree(self):
  588. for level in self.treeDict.keys():
  589. print level
  590. for parent in self.treeDict[level].keys():
  591. dict1 = self.treeDict[level][parent]
  592. print level, "::parent ", dict1["name"], "name", "shortcut_key", "uiview", "move_key", "toparent_key", "layout"
  593. print level, "::parent ", dict1["name"], dict1["shortcut_key"], dict1["uiview"], dict1["move_key"], dict1["toparent_key"], dict1["layout"]
  594. for option in dict1["option"].keys():
  595. dict2 = dict1["option"][option]
  596. print level, "::option ", dict2
  597. Key_HeartBeat = "heart_beat"
  598. def parseOthers(self, othersStr):
  599. othersDict = {}
  600. othersDict[self.Key_HeartBeat] = self.parseParam(self.Key_HeartBeat, othersStr, char="{}")
  601. hb_keyDict = {}
  602. if othersDict[self.Key_HeartBeat] != "":
  603. print "Key_HeartBeat_Str:",othersDict[self.Key_HeartBeat]
  604. hb_keyDict = self.parseHeartBeatKey(othersDict[self.Key_HeartBeat])
  605. othersDict[self.Key_HeartBeat] = hb_keyDict
  606. return othersDict
  607. def parseHeartBeatKey(self, hb_keyStr):
  608. keyList = [self.Key_Event, self.Key_IR]
  609. keyDict = self.parseMulParam(keyList, hb_keyStr)
  610. keyDict[self.Key_Event] = strToList(keyDict[self.Key_Event], ",")
  611. keyDict[self.Key_IR] = strToList(keyDict[self.Key_IR], ",")
  612. return keyDict
  613. def parseDialogOthers(self, othersStr):
  614. othersDict = {}
  615. othersDict[self.Key_HeartBeat] = self.parseParam(self.Key_HeartBeat, othersStr, char="{}")
  616. hb_keyDict = {}
  617. if othersDict[self.Key_HeartBeat] != "":
  618. print "Key_HeartBeat_Str:",othersDict[self.Key_HeartBeat]
  619. hb_keyDict = self.parseHeartBeatKey(othersDict[self.Key_HeartBeat])
  620. othersDict[self.Key_HeartBeat] = hb_keyDict
  621. return othersDict
  622. if __name__ == '__main__':
  623. uatTree = UATTree()