11#!/usr/bin/env python
22# -*- coding:utf-8 -*-
3- # @Filename : formater .py
3+ # @Filename : formatter .py
44# @Date : 18-1-26 下午5:48
55# @Author : DebuggerX
66from functools import partial
1313import pyperclip
1414
1515# 定义显示的json格式化字符串的缩进量为4个空格
16- indent = ' '
16+ indent = ' ' * 4
1717
1818# 临时存储
1919last_list_com_box = None
@@ -54,7 +54,14 @@ def analyse_json_obj(json_obj, level=0, res=None, json_key=None):
5454 else :
5555 res .append ('%s<%s> : <[list]>9' % (indent * level , json_key ))
5656 if len (json_obj ) > 0 :
57- analyse_json_obj (json_obj [0 ], level + 1 , res )
57+ json_obj_temp = json_obj [0 ] if json_obj [0 ] is not None else {}
58+ if len (list (filter (lambda item : type (item ) is dict or item is None , json_obj ))) == len (json_obj ):
59+ for i in range (1 , len (json_obj )):
60+ for k in json_obj [i ]:
61+ if json_obj_temp is None or (k not in json_obj_temp or json_obj_temp [k ] is None ):
62+ json_obj_temp [k ] = json_obj [i ][k ]
63+ json_obj_temp = None if json_obj_temp is {} else json_obj_temp
64+ analyse_json_obj (json_obj_temp , level + 1 , res )
5865
5966 else :
6067 # 针对基本数据类型,在插入的键值对数据后再加入类型序号标志位
@@ -110,6 +117,7 @@ def get_type_combobox(need_connect, line):
110117
111118 com_box .setCurrentIndex (obj_type )
112119 elif obj_type == 8 :
120+ com_box .addItem ('Map<String, dynamic>' )
113121 com_box .setCurrentText ('' )
114122 elif obj_type == 9 :
115123 com_box .setCurrentText ('List<>' )
@@ -131,7 +139,8 @@ def update_list(json_str):
131139 json_obj = json .loads (json_str )
132140 # 传入json对象,返回所需要的格式化协议数据数组
133141 res = analyse_json_obj (json_obj )
134-
142+ global last_list_com_box
143+ last_list_com_box = None
135144 ui .tv_fields .setRowCount (len (res ))
136145
137146 pre_type_combobox = None
@@ -206,11 +215,32 @@ def generate_bean():
206215 ui .te_json .setText (res )
207216
208217
218+ def str_to_camel_case (text ):
219+ try :
220+ arr = filter (None , text .split ('_' ))
221+ res = ''
222+ for i in arr :
223+ res = res + i [0 ].upper () + i [1 :]
224+ return res [0 ].lower () + res [1 :]
225+ except IndexError :
226+ return text
227+
228+
229+ def convert_names_to_camel_case (index ):
230+ if ui .tv_fields .horizontalHeaderItem (index ).text () == 'Name(click to camelCase)' :
231+ for i in range (ui .tv_fields .rowCount ()):
232+ name_cell = ui .tv_fields .cellWidget (i , 2 )
233+ if type (name_cell ) is QtWidgets .QTextEdit :
234+ assert isinstance (name_cell , QtWidgets .QTextEdit )
235+ name_cell .setText (str_to_camel_case (name_cell .toPlainText ()))
236+
237+
209238def init_event ():
210239 # 绑定json解析按钮事件
211240 ui .btn_format .clicked .connect (json_format )
212241 ui .btn_generate .clicked .connect (generate_bean )
213242 ui .btn_copy .clicked .connect (copy_left_text )
243+ ui .tv_fields .horizontalHeader ().sectionClicked .connect (convert_names_to_camel_case )
214244
215245
216246def copy_left_text ():
@@ -222,7 +252,7 @@ def copy_left_text():
222252# 设置表格基础样式
223253def init_table ():
224254 # 设置表头,表头文字居中
225- ui .tv_fields .setHorizontalHeaderLabels (['Fields' , 'Types' , 'Name' ])
255+ ui .tv_fields .setHorizontalHeaderLabels (['Fields' , 'Types' , 'Name(click to camelCase) ' ])
226256 ui .tv_fields .horizontalHeader ().setDefaultAlignment (QtCore .Qt .AlignHCenter )
227257 # 表头自动平分宽度
228258 ui .tv_fields .horizontalHeader ().setSectionResizeMode (QtWidgets .QHeaderView .Stretch )
@@ -253,5 +283,5 @@ def custom_ui():
253283 custom_ui ()
254284 widget .show ()
255285 code = check_version ()
256- widget .setWindowTitle (widget .windowTitle ().replace ('code' ,str (code )))
286+ widget .setWindowTitle (widget .windowTitle ().replace ('code' , str (code )))
257287 sys .exit (app .exec_ ())
0 commit comments