AX Agent 등록 모델 리스트 UI 정리 및 액션 안정화
Some checks failed
Release Gate / gate (push) Has been cancelled

- 내부 설정 공통 탭에서 등록 모델 상단 중복 선택 칩 UI 제거
- 등록 모델 관리 영역을 리스트 중심 구조로 정리
- 선택 편집 삭제 액션을 팝업 친화적인 클릭 row 방식으로 변경
- 오버레이 동기화 경로에서 제거된 모델 칩 렌더 호출 삭제
- README 및 DEVELOPMENT 문서에 2026-04-06 00:08 (KST) 기준 이력 반영
- dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ 경고 0 오류 0 확인
This commit is contained in:
2026-04-05 21:17:13 +09:00
parent bfa1e342c0
commit 929c1e9f05
4 changed files with 43 additions and 84 deletions

View File

@@ -1067,3 +1067,6 @@ MIT License
- 하단 컨텍스트 토큰 심볼의 파이 아크가 왼쪽에서 잘려 보이던 문제를 수정했다. 원형 아크 계산 기준을 실제 카드 크기에 맞게 조정하고, hover 라벨은 비상호작용 툴팁처럼 바꿔 카드에서 마우스를 벗어나면 더 깔끔하게 사라지도록 정리했다.
- 업데이트: 2026-04-06 00:01 (KST)
- 하단 컨텍스트 토큰 hover 라벨이 남아 있던 문제를 창 전체 마우스 이동/클릭/비활성화 기준으로 한 번 더 보강해 줄였다. 함께 전송 버튼은 크기와 아이콘 정렬을 다시 맞춰 작고 치우쳐 보이던 인상을 보정했다.
- 업데이트: 2026-04-06 00:08 (KST)
- AX Agent 내부 설정의 등록 모델 영역에서 상단 중복 선택 칩 UI를 제거하고, 하단 등록 모델 리스트만 남기도록 정리했다.
- 등록 모델 리스트의 `선택 / 편집 / 삭제` 액션은 기본 버튼 대신 팝업 친화적인 클릭 row 스타일로 바꿔 내부 설정 오버레이에서도 더 안정적으로 동작하게 맞췄다.

View File

@@ -4822,3 +4822,6 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
- 업데이트: 2026-04-06 00:01 (KST)
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서 토큰 hover popup 닫힘 경로를 추가 보강했다. 카드 hover 종료 외에도 창 전체 마우스 이동, 마우스 클릭, 창 비활성화 시 popup 닫힘을 다시 검사하도록 해 라벨이 남는 경우를 줄였다.
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 의 전송 버튼은 42 기준으로 키우고 내부 send glyph 크기와 오프셋을 다시 조정해 아이콘이 작고 아래로 치우쳐 보이던 문제를 보정했다.
- 업데이트: 2026-04-06 00:08 (KST)
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 의 내부 설정 동기화 경로에서 `BuildOverlayModelChips(...)` 호출을 제거해, XAML에서 제거한 등록 모델 상단 중복 선택 UI를 더 이상 다시 그리지 않게 정리했다.
- 같은 파일의 `BuildOverlayRegisteredModelsPanel(...)` 에서는 `선택 / 편집 / 삭제` 액션을 기본 `Button` 대신 `Border + MouseLeftButtonUp` 기반 클릭 row로 교체했다. 이로써 AX Agent 내부 설정 오버레이 안에서도 액션 클릭이 더 안정적으로 반응하고, 등록 모델 관리 UI가 리스트 중심 구조로 일관되게 유지된다.

View File

@@ -3286,18 +3286,13 @@
</Grid>
</Border>
<StackPanel x:Name="OverlayModelEditorPanel">
<TextBlock Text="등록된 모델 선택"
FontSize="11"
Foreground="{DynamicResource SecondaryText}"
Margin="0,4,0,6"/>
<TextBlock Text="사내 서비스는 등록한 모델 중에서 선택하고, 여기서 바로 추가/편집할 수 있습니다."
FontSize="11"
TextWrapping="Wrap"
Foreground="{DynamicResource SecondaryText}"
Margin="0,0,0,8"/>
<WrapPanel x:Name="OverlayModelChipPanel" Margin="0,2,0,0"/>
Margin="0,4,0,8"/>
<Grid x:Name="OverlayRegisteredModelsHeader"
Margin="0,10,0,8">
Margin="0,6,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>

View File

@@ -14548,7 +14548,6 @@ public partial class ChatWindow : Window
RefreshOverlayTokenPresetCards();
RefreshOverlayServiceFieldLabels(service);
RefreshOverlayServiceFieldVisibility(service);
BuildOverlayModelChips(service);
BuildOverlayRegisteredModelsPanel(service);
RefreshOverlayAdvancedChoiceButtons();
}
@@ -16470,71 +16469,6 @@ public partial class ChatWindow : Window
};
}
private void BuildOverlayModelChips(string service)
{
if (OverlayModelChipPanel == null)
return;
OverlayModelChipPanel.Children.Clear();
foreach (var model in GetModelCandidates(service))
{
var captured = model.Id;
var isActive = string.Equals(model.Id, _settings.Settings.Llm.Model, StringComparison.OrdinalIgnoreCase);
var border = new Border
{
Cursor = Cursors.Hand,
CornerRadius = new CornerRadius(8),
BorderThickness = new Thickness(1),
BorderBrush = isActive
? BrushFromHex("#C7D2FE")
: (TryFindResource("BorderColor") as Brush ?? Brushes.Gray),
Background = isActive
? BrushFromHex("#EEF2FF")
: Brushes.Transparent,
Padding = new Thickness(10, 7, 10, 7),
Margin = new Thickness(0, 0, 8, 8),
Child = new StackPanel
{
Children =
{
new TextBlock
{
Text = model.Label,
FontSize = 11.5,
FontWeight = isActive ? FontWeights.SemiBold : FontWeights.Normal,
Foreground = isActive
? BrushFromHex("#1D4ED8")
: (TryFindResource("PrimaryText") as Brush ?? Brushes.Black),
},
new TextBlock
{
Text = model.Id,
Margin = new Thickness(0, 2, 0, 0),
FontSize = 10,
Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray,
}
}
}
};
border.MouseEnter += (_, _) =>
{
if (!isActive)
border.Background = TryFindResource("ItemHoverBackground") as Brush ?? Brushes.LightGray;
};
border.MouseLeave += (_, _) =>
{
if (!isActive)
border.Background = Brushes.Transparent;
};
border.MouseLeftButtonUp += (_, _) =>
{
CommitOverlayModelSelection(captured);
PersistOverlaySettingsState(refreshOverlayDeferredInputs: false);
};
OverlayModelChipPanel.Children.Add(border);
}
}
private void BuildOverlayRegisteredModelsPanel(string service)
{
if (OverlayRegisteredModelsPanel == null || OverlayRegisteredModelsHeader == null || BtnOverlayAddModel == null)
@@ -16638,29 +16572,53 @@ public partial class ChatWindow : Window
VerticalAlignment = VerticalAlignment.Top,
};
Button CreateAction(string text, RoutedEventHandler onClick, Brush foreground)
Border CreateAction(string text, Action onClick, Brush foreground)
{
var button = new Button
var label = new TextBlock
{
Content = text,
Style = TryFindResource("GhostBtn") as Style,
Text = text,
FontSize = 11.5,
FontWeight = FontWeights.SemiBold,
Foreground = foreground,
VerticalAlignment = VerticalAlignment.Center,
};
var action = new Border
{
Cursor = Cursors.Hand,
CornerRadius = new CornerRadius(8),
Padding = new Thickness(8, 4, 8, 4),
Margin = new Thickness(6, 0, 0, 0),
Foreground = foreground,
Cursor = Cursors.Hand,
Background = Brushes.Transparent,
Child = label,
};
button.Click += onClick;
return button;
action.MouseEnter += (_, _) =>
{
action.Background = hoverBg;
};
action.MouseLeave += (_, _) =>
{
action.Background = Brushes.Transparent;
};
action.MouseLeftButtonUp += (_, _) => onClick();
return action;
}
actions.Children.Add(CreateAction("선택", (_, _) =>
actions.Children.Add(CreateAction("선택", () =>
{
CommitOverlayModelSelection(model.EncryptedModelName);
PersistOverlaySettingsState(refreshOverlayDeferredInputs: false);
}, accentBrush));
actions.Children.Add(CreateAction("편집", (_, _) => EditOverlayRegisteredModel(model), primaryText));
actions.Children.Add(CreateAction("삭제", (_, _) => DeleteOverlayRegisteredModel(model), BrushFromHex("#DC2626")));
actions.Children.Add(CreateAction("편집", () =>
{
EditOverlayRegisteredModel(model);
BuildOverlayRegisteredModelsPanel(service);
}, primaryText));
actions.Children.Add(CreateAction("삭제", () =>
{
DeleteOverlayRegisteredModel(model);
}, BrushFromHex("#DC2626")));
Grid.SetColumn(actions, 1);
grid.Children.Add(actions);