11
This commit is contained in:
commit
e6f1776d4f
264 files changed
+54215
No files matched your search
@@ -0,0 +1,88 @@
|
||||
package tui
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"charm.land/lipgloss/v2"
|
||||
"superwork-tui/internal/cc"
|
||||
)
|
||||
|
||||
// createModalWidth returns the outer width of the new-issue modal for a given
|
||||
// terminal width.
|
||||
func createModalWidth(termWidth int) int {
|
||||
width := 84
|
||||
if termWidth > 0 && termWidth-8 < width {
|
||||
width = termWidth - 8
|
||||
}
|
||||
if width < 40 {
|
||||
width = 40
|
||||
}
|
||||
return width
|
||||
}
|
||||
|
||||
// defaultProfileIdx picks the initially-selected profile, preferring the VSCode
|
||||
// default name "offical", else the first profile, else -1 (默认/none).
|
||||
func defaultProfileIdx(profiles []cc.ClaudeProfile) int {
|
||||
for i, p := range profiles {
|
||||
if p.Name == "offical" {
|
||||
return i
|
||||
}
|
||||
}
|
||||
if len(profiles) > 0 {
|
||||
return 0
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
func profileRadios(profiles []cc.ClaudeProfile, sel int) string {
|
||||
mark := func(on bool) string {
|
||||
if on {
|
||||
return "◉"
|
||||
}
|
||||
return "○"
|
||||
}
|
||||
parts := make([]string, 0, len(profiles)+1)
|
||||
for i, p := range profiles {
|
||||
parts = append(parts, mark(i == sel)+" "+p.Name)
|
||||
}
|
||||
parts = append(parts, mark(sel < 0)+" (默认)")
|
||||
return strings.Join(parts, " ")
|
||||
}
|
||||
|
||||
// createView renders the new-issue modal (title + multi-line request textarea +
|
||||
// optional profile radios) centered over the board, matching the VSCode dialog.
|
||||
func (m Model) createView() string {
|
||||
bg := m.boardView()
|
||||
|
||||
width := createModalWidth(m.width)
|
||||
innerW := width - 2
|
||||
|
||||
hint := lipgloss.NewStyle().Faint(true)
|
||||
block := func(s string) string {
|
||||
return lipgloss.NewStyle().Width(innerW).PaddingLeft(1).Render(s)
|
||||
}
|
||||
|
||||
var parts []string
|
||||
parts = append(parts, block(lipgloss.NewStyle().Bold(true).Foreground(detailBorderColor).Render("新建工单")))
|
||||
parts = append(parts, block(""))
|
||||
parts = append(parts, block(m.createArea.View()))
|
||||
if len(m.createImages) > 0 {
|
||||
parts = append(parts, block(hint.Render(fmt.Sprintf("已粘贴 %d 张图片", len(m.createImages)))))
|
||||
}
|
||||
if len(m.profilePickerProfiles) > 0 {
|
||||
parts = append(parts, block(""))
|
||||
parts = append(parts, block(hint.Render("配置文件 (Tab 切换):")))
|
||||
parts = append(parts, block(profileRadios(m.profilePickerProfiles, m.createProfileIdx)))
|
||||
}
|
||||
parts = append(parts, block(""))
|
||||
parts = append(parts, block(hint.Render("Ctrl+S 确认 Ctrl+V 粘贴图片 Esc 取消")))
|
||||
|
||||
box := lipgloss.NewStyle().
|
||||
Border(lipgloss.RoundedBorder()).
|
||||
BorderForeground(detailBorderColor).
|
||||
Width(width).
|
||||
Render(lipgloss.JoinVertical(lipgloss.Left, parts...))
|
||||
|
||||
return placeOverlayCenter(bg, box)
|
||||
}
|
||||
Reference in new issue
Block a user