Files
metabuilder/fakemui/widgets/NerdPanel.qml
JohnDoe6345789 59714ca814 Add new widgets for language selection, nerd panel, patch dialog, and prompt submission
- Introduced `LanguageSelector.qml` for selecting application languages with a user-friendly interface.
- Created `NerdPanel.qml` to display API logs, session information, and keyboard shortcuts in a dedicated panel.
- Implemented `PatchDialog.qml` for viewing and managing Git patches, including copy and save functionalities.
- Developed `SendPromptDialog.qml` for sending prompts to Codex, featuring environment selection and input validation.
- Added `TaskListItem.qml` to represent individual tasks with detailed information and PR indicators.
- Introduced `ThemeSelector.qml` for selecting application themes with visual indicators.
2025-12-30 02:35:35 +00:00

418 lines
17 KiB
QML

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Rectangle {
id: root
color: colors.background
property string sessionInfo: "{}"
property alias logText: logArea.text
property var themeColors: ({})
// Internal colors that map from passed themeColors or use defaults
readonly property var colors: ({
background: themeColors.base || themeColors.background || "#1a1a2e",
surface: themeColors.alternateBase || themeColors.surface || "#252542",
primary: themeColors.highlight || themeColors.primary || "#4dabf7",
secondary: themeColors.accent || themeColors.secondary || "#69db7c",
accent: themeColors.accent || "#ffd43b",
text: themeColors.text || themeColors.windowText || "#ffffff",
textMuted: themeColors.textSecondary || themeColors.textMuted || "#888888",
border: themeColors.mid || themeColors.border || "#3d3d5c",
success: themeColors.success || "#51cf66",
warning: themeColors.warning || "#fcc419",
error: themeColors.error || "#ff6b6b",
nerd: "#00ff41"
})
function appendLog(msg) {
logArea.text = logArea.text + msg + "\n"
// Auto-scroll to bottom
logArea.cursorPosition = logArea.length
}
function clearLogs() {
logArea.text = ""
}
ColumnLayout {
anchors.fill: parent
anchors.margins: 8
spacing: 8
// Header
RowLayout {
Layout.fillWidth: true
Label {
text: "🤓 NERD MODE"
font.bold: true
font.pixelSize: 14
color: colors.nerd
font.family: "Menlo"
}
Item { Layout.fillWidth: true }
Label {
text: "API Logs • Session Info • Debug"
opacity: 0.6
color: colors.nerd
font.pixelSize: 11
}
}
// Tab bar for different nerd views
TabBar {
id: nerdTabs
Layout.fillWidth: true
background: Rectangle {
color: Qt.darker(colors.background, 1.2)
}
TabButton {
text: "📡 API Log"
font.pixelSize: 11
background: Rectangle {
color: nerdTabs.currentIndex === 0 ? colors.surface : "transparent"
radius: 4
}
contentItem: Text {
text: parent.text
color: nerdTabs.currentIndex === 0 ? colors.nerd : colors.textMuted
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
}
TabButton {
text: "🔐 Session"
font.pixelSize: 11
background: Rectangle {
color: nerdTabs.currentIndex === 1 ? colors.surface : "transparent"
radius: 4
}
contentItem: Text {
text: parent.text
color: nerdTabs.currentIndex === 1 ? colors.nerd : colors.textMuted
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
}
TabButton {
text: "⌨️ Shortcuts"
font.pixelSize: 11
background: Rectangle {
color: nerdTabs.currentIndex === 2 ? colors.surface : "transparent"
radius: 4
}
contentItem: Text {
text: parent.text
color: nerdTabs.currentIndex === 2 ? colors.nerd : colors.textMuted
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
}
}
// Tab content
StackLayout {
Layout.fillWidth: true
Layout.fillHeight: true
currentIndex: nerdTabs.currentIndex
// API Log tab
Item {
ColumnLayout {
anchors.fill: parent
spacing: 4
// Log controls
RowLayout {
Layout.fillWidth: true
Label {
text: logArea.text.split('\n').length - 1 + " entries"
color: colors.textMuted
font.pixelSize: 10
}
Item { Layout.fillWidth: true }
Button {
text: "Clear"
flat: true
font.pixelSize: 10
onClicked: {
app.clearDebugLogs()
root.clearLogs()
}
contentItem: Text {
text: parent.text
color: colors.error
horizontalAlignment: Text.AlignHCenter
}
background: Rectangle {
color: parent.hovered ? colors.surface : "transparent"
radius: 2
}
}
Button {
text: "Copy"
flat: true
font.pixelSize: 10
onClicked: app.copyToClipboard(logArea.text)
contentItem: Text {
text: parent.text
color: colors.primary
horizontalAlignment: Text.AlignHCenter
}
background: Rectangle {
color: parent.hovered ? colors.surface : "transparent"
radius: 2
}
}
}
// Log output
ScrollView {
Layout.fillWidth: true
Layout.fillHeight: true
clip: true
TextArea {
id: logArea
readOnly: true
font.family: "Menlo"
font.pixelSize: 11
color: colors.nerd
selectionColor: colors.nerd
selectedTextColor: colors.background
wrapMode: Text.NoWrap
selectByMouse: true
background: Rectangle {
color: Qt.darker(colors.background, 1.2)
radius: 4
}
// Syntax highlighting simulation
text: ""
}
}
}
}
// Session tab
Item {
ScrollView {
anchors.fill: parent
clip: true
ColumnLayout {
width: parent.width
spacing: 12
// Session status
Rectangle {
Layout.fillWidth: true
Layout.preferredHeight: sessionCol.implicitHeight + 16
color: Qt.darker(colors.background, 1.2)
radius: 4
ColumnLayout {
id: sessionCol
anchors.fill: parent
anchors.margins: 8
spacing: 8
Label {
text: "Session Status"
font.bold: true
color: colors.nerd
font.pixelSize: 12
}
RowLayout {
spacing: 8
Rectangle {
width: 8
height: 8
radius: 4
color: {
try {
var info = JSON.parse(sessionInfo)
return info.has_session ? colors.success : colors.error
} catch(e) {
return colors.error
}
}
}
Label {
text: {
try {
var info = JSON.parse(sessionInfo)
return info.has_session ? "Connected" : "Not Connected"
} catch(e) {
return "Unknown"
}
}
color: colors.text
font.pixelSize: 11
}
}
Label {
text: {
try {
var info = JSON.parse(sessionInfo)
return "Cookie: " + (info.cookie_preview || "N/A")
} catch(e) {
return "Cookie: N/A"
}
}
color: colors.textMuted
font.pixelSize: 10
font.family: "Menlo"
}
Label {
text: {
try {
var info = JSON.parse(sessionInfo)
return "Base URL: " + (info.base_url || "N/A")
} catch(e) {
return "Base URL: N/A"
}
}
color: colors.textMuted
font.pixelSize: 10
font.family: "Menlo"
}
}
}
// Raw session JSON
Label {
text: "Raw Session Info"
font.bold: true
color: colors.nerd
font.pixelSize: 12
}
TextArea {
Layout.fillWidth: true
Layout.preferredHeight: 150
text: sessionInfo
readOnly: true
font.family: "Menlo"
font.pixelSize: 10
color: colors.primary
wrapMode: Text.Wrap
selectByMouse: true
background: Rectangle {
color: Qt.darker(colors.background, 1.2)
radius: 4
}
}
}
}
}
// Shortcuts tab
Item {
ScrollView {
anchors.fill: parent
clip: true
ColumnLayout {
width: parent.width
spacing: 8
Label {
text: "Keyboard Shortcuts"
font.bold: true
color: colors.nerd
font.pixelSize: 12
}
Repeater {
model: [
{ key: "Ctrl+N", action: "New Task" },
{ key: "Ctrl+R", action: "Refresh Tasks" },
{ key: "F5", action: "Refresh Tasks" },
{ key: "Ctrl+T", action: "Toggle Theme" },
{ key: "Ctrl+`", action: "Toggle Nerd Mode" },
{ key: "Ctrl+Enter", action: "Send Prompt (in dialog)" },
{ key: "Escape", action: "Close Dialog" },
]
delegate: RowLayout {
Layout.fillWidth: true
spacing: 16
Rectangle {
Layout.preferredWidth: 100
Layout.preferredHeight: 24
color: colors.surface
radius: 4
Label {
anchors.centerIn: parent
text: modelData.key
color: colors.accent
font.family: "Menlo"
font.pixelSize: 11
}
}
Label {
text: modelData.action
color: colors.text
font.pixelSize: 11
}
}
}
Item { Layout.preferredHeight: 16 }
Label {
text: "CLI Commands"
font.bold: true
color: colors.nerd
font.pixelSize: 12
}
TextArea {
Layout.fillWidth: true
Layout.preferredHeight: 120
readOnly: true
font.family: "Menlo"
font.pixelSize: 10
color: colors.primary
text: "codex tasks # List tasks\ncodex task <id> # Task detail\ncodex prompt \"...\" # Create task\ncodex patch <id> # Extract diff\ncodex yolo # Auto-merge all\ncodex ui # Launch this UI"
background: Rectangle {
color: Qt.darker(colors.background, 1.2)
radius: 4
}
}
}
}
}
}
}
}