@@ -141,81 +141,120 @@ DccObject {
141141 }
142142 }
143143
144- TextInput {
145- id: textInputItem
146- text : modelData
144+ Rectangle {
145+ id: textInputBackground
146+ property D . Palette alertBackgroundColor : DS . Style . edit . alertBackground
147147 Layout .leftMargin : 10
148148 Layout .preferredHeight : DS .Style .itemDelegate .height
149- verticalAlignment: Text .AlignVCenter
150- horizontalAlignment: Text .AlignHCenter
151- focus: false
152- wrapMode: Text .NoWrap
153- readOnly: true
154- focusPolicy: Qt .NoFocus
155- color: palette .text
156- onEditingFinished: {
157- if (! checkInputInvalid ()) {
158- text = modelData;
149+ Layout .maximumWidth : 200
150+ Layout .minimumWidth : textInputItem .contentWidth + 16
151+ radius: 4
152+ color: alert .visible ? D .ColorSelector .alertBackgroundColor : " transparent"
153+
154+ TextInput {
155+ id: textInputItem
156+ property int maxLength: 15
157+ anchors .fill : parent
158+ anchors .leftMargin : 8
159+ anchors .rightMargin : 8
160+ text: modelData
161+ verticalAlignment: Text .AlignVCenter
162+ horizontalAlignment: Text .AlignLeft
163+ focus: false
164+ wrapMode: Text .NoWrap
165+ readOnly: true
166+ focusPolicy: Qt .NoFocus
167+ color: palette .text
168+ clip: true
169+ selectByMouse: true
170+
171+ onTextEdited: {
172+ // 实时检测:过滤非法字符并限制长度
173+ var filteredText = text;
174+ // 过滤非法字符(只允许字母、数字、中文、下划线)
175+ filteredText = filteredText .replace (/ [^ A-Za-z0-9\u4e00 -\u9fa5 _] / g , " " );
176+
177+ // 检查是否超长
178+ if (filteredText .length > maxLength) {
179+ alert .show (qsTr (" No more than 15 characters" ));
180+ filteredText = filteredText .slice (0 , maxLength);
181+ }
182+
183+ if (text !== filteredText) {
184+ text = filteredText;
185+ }
186+ }
187+
188+ onEditingFinished: {
189+ if (! checkInputInvalid ()) {
190+ text = modelData;
191+ textInputItem .text = Qt .binding (function () {
192+ return modelData
193+ })
194+ return ;
195+ }
196+ focus = false ;
197+ if (modelData !== textInputItem .text ) {
198+ layout .requestRename (modelData, text);
199+ }
159200 textInputItem .text = Qt .binding (function () {
160201 return modelData
161202 })
162- return ;
163203 }
164- focus = false ;
165- if (modelData !== textInputItem . text ) {
166- layout . requestRename (modelData, text) ;
204+ onFocusChanged : {
205+ if (! focus)
206+ readOnly = true ;
167207 }
168- textInputItem .text = Qt .binding (function () {
169- return modelData
170- })
171- }
172- onFocusChanged: {
173- if (! focus)
174- readOnly = true ;
175- }
176- Keys .onEnterPressed : {
177- focus = false ;
178- }
179-
180- function checkInputInvalid () {
181- var reg = / ^ [A-Za-z0-9\u4e00 -\u9fa5 _] + $ / ;
182- var isValid = reg .test (textInputItem .text );
183- var isOverLength = textInputItem .text .length > 15 ;
184-
185- var nameList = [];
186- switch (itemRep .authType ) {
187- case CharaMangerModel .Type_Face :
188- nameList = dccData .model .facesList ;
189- break ;
190- case CharaMangerModel .Type_Finger :
191- nameList = dccData .model .thumbsList ;
192- break ;
193- case CharaMangerModel .Type_Iris :
194- nameList = dccData .model .irisList ;
195- break ;
208+ Keys .onEnterPressed : {
209+ focus = false ;
196210 }
197-
198- var isDuplicate = nameList .includes (textInputItem .text ) &&
199- textInputItem .text !== modelData;
211+ Keys .onReturnPressed : {
212+ focus = false ;
213+ }
214+
215+ function checkInputInvalid () {
216+ var reg = / ^ [A-Za-z0-9\u4e00 -\u9fa5 _] + $ / ;
217+ var isValid = text .length === 0 || reg .test (textInputItem .text );
218+ var isOverLength = textInputItem .text .length > maxLength;
219+ var isEmpty = textInputItem .text .length === 0 ;
220+
221+ var nameList = [];
222+ switch (itemRep .authType ) {
223+ case CharaMangerModel .Type_Face :
224+ nameList = dccData .model .facesList ;
225+ break ;
226+ case CharaMangerModel .Type_Finger :
227+ nameList = dccData .model .thumbsList ;
228+ break ;
229+ case CharaMangerModel .Type_Iris :
230+ nameList = dccData .model .irisList ;
231+ break ;
232+ }
233+
234+ var isDuplicate = nameList .includes (textInputItem .text ) &&
235+ textInputItem .text !== modelData;
200236
201- if (! isValid && isOverLength) {
202- alert .show (qsTr (" Use letters, numbers and underscores only, and no more than 15 characters" ));
203- } else if (! isValid) {
204- alert .show (qsTr (" Use letters, numbers and underscores only" ));
205- } else if (isOverLength) {
206- alert .show (qsTr (" No more than 15 characters" ));
207- } else if (isDuplicate) {
208- alert .show (qsTr (" This name already exists" ));
209- } else {
210- return true ;
237+ if (isEmpty) {
238+ alert .show (qsTr (" The name cannot be empty" ));
239+ } else if (! isValid && isOverLength) {
240+ alert .show (qsTr (" Use letters, numbers and underscores only, and no more than 15 characters" ));
241+ } else if (! isValid) {
242+ alert .show (qsTr (" Use letters, numbers and underscores only" ));
243+ } else if (isOverLength) {
244+ alert .show (qsTr (" No more than 15 characters" ));
245+ } else if (isDuplicate) {
246+ alert .show (qsTr (" This name already exists" ));
247+ } else {
248+ return true ;
249+ }
250+ return false ;
211251 }
212- return false ;
213252 }
214253 }
215254
216255 D .AlertToolTip {
217256 id: alert
218- target: layout
257+ target: textInputBackground
219258 timeout: 3000
220259 visible: false
221260
0 commit comments