쿼리 편집기 디자인 맞춤 — 그리고 스크롤이 자동완성을 지우던 결함
■ 목업에 맞춘 것 · 툴바(포맷·주석·자동완성)를 탭 모양으로 — 밑줄이 들어오는 글자 버튼. · '전체 지우기'를 빨강에서 강조색 링크로. 되돌릴 수 있는 동작이라 위험색을 쓸 이유가 없다 (TextBox 실행취소에 남는다). · 검증 결과와 상태 줄을 한 상자로 묶고, 결과가 닫혀 있어도 상태 줄은 남게 했다. · 결과 표에 머리글 면·격자선·행 높이를 줬다. 컬럼이 52개까지 나오는 조회가 있어 가로 스크롤이 자연스럽게 보여야 한다. · 하단 버튼을 왼쪽으로 옮기고 여백·글자 크기를 키웠다. 줄 번호는 세로선으로 본문과 가른다. ■ 스크롤이 자동완성 목록을 지우던 결함 디자인 작업 중 --query-popup 이 '포커스를 잃으면 닫힌다'에서 실패했다. 파고 보니 원인은 포커스가 아니라 <b>그 앞 단계</b>였다 — 목록이 아예 안 열리고 있었다. 편집기가 스크롤되면 목록을 닫도록 해 뒀는데, 긴 문서 끝에서 타이핑하면 그 입력 자체가 스크롤을 일으킨다. 그래서 목록이 열리자마자 스크롤 이벤트가 닫아 버렸다. 실사용에서 '긴 쿼리에서만 자동완성이 안 뜬다'로 나타났을 결함이다. 이제 스크롤에는 닫지 않고 <b>새 자리에 다시 놓는다</b>(WPF Popup 은 열린 채로 Placement 를 다시 계산하지 않으므로 닫았다 다시 연다). 걸려 있던 낱말을 커서가 벗어난 경우에만 닫는다. 회귀: 테스트 230/230, 편집 스모크 실패 0, 팝업·정렬·결과표·단축키 점검 16/16, DB 왕복 1,271건 diff 0/예외 0, 종이 렌더 P062 바이트 동일. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
0e2e2fb0e6
commit
568fbdb0dd
@@ -135,9 +135,11 @@ public partial class QueryEditorWindow : Window
|
||||
ConnText.Text = "텍스트 편집";
|
||||
}
|
||||
|
||||
// 편집기가 스크롤되면 목록이 걸린 자리가 화면에서 움직인다 — 따라가지 않고 닫는다
|
||||
// 편집기가 스크롤되면 목록이 걸린 자리가 화면에서 움직인다 — 따라가게 다시 놓는다.
|
||||
// 닫아 버리면 안 된다: 긴 문서 끝에서 타이핑하면 그 입력 자체가 스크롤을 일으켜
|
||||
// 목록이 열리자마자 사라진다(진단이 이 상태를 잡았다).
|
||||
SqlBox.AddHandler(ScrollViewer.ScrollChangedEvent,
|
||||
new ScrollChangedEventHandler((_, _) => CompletionPopup.IsOpen = false));
|
||||
new ScrollChangedEventHandler((_, _) => RepositionCompletion()));
|
||||
// 창을 벗어나면 목록이 다른 창 위에 떠 있게 된다
|
||||
Deactivated += (_, _) => CompletionPopup.IsOpen = false;
|
||||
|
||||
@@ -228,6 +230,29 @@ public partial class QueryEditorWindow : Window
|
||||
|
||||
private void OnSqlLostFocus(object sender, RoutedEventArgs e) => CompletionPopup.IsOpen = false;
|
||||
|
||||
/// <summary>
|
||||
/// 스크롤로 자리가 움직였을 때 목록을 새 자리에 다시 놓는다.
|
||||
///
|
||||
/// WPF Popup 은 열려 있는 동안 Placement 를 다시 계산하지 않으므로 닫았다 다시 연다.
|
||||
/// 걸려 있던 낱말을 커서가 벗어났으면 그때는 닫는다 — 더 이상 유효한 목록이 아니다.
|
||||
/// </summary>
|
||||
private void RepositionCompletion()
|
||||
{
|
||||
if (!CompletionPopup.IsOpen)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var caret = SqlBox.CaretIndex;
|
||||
if (caret < completionStart || caret > completionEnd)
|
||||
{
|
||||
CompletionPopup.IsOpen = false;
|
||||
return;
|
||||
}
|
||||
CompletionPopup.IsOpen = false;
|
||||
PlaceCompletionPopup();
|
||||
CompletionPopup.IsOpen = true;
|
||||
}
|
||||
|
||||
private IEnumerable<SqlCompletionItem> CandidatesFor(SqlCompletionQuery query)
|
||||
{
|
||||
switch (query.Context)
|
||||
|
||||
Reference in New Issue
Block a user