live-preview: console scale control (#9199)
Some checks are pending
autofix.ci / format_fix (push) Waiting to run
autofix.ci / lint_typecheck (push) Waiting to run
CI / python_test (windows-2022) (push) Blocked by required conditions
CI / files-changed (push) Waiting to run
CI / build_and_test (--exclude bevy-example, ubuntu-22.04, 1.85) (push) Blocked by required conditions
CI / cpp_cmake (ubuntu-22.04, stable) (push) Blocked by required conditions
CI / build_and_test (--exclude ffmpeg --exclude gstreamer-player, --exclude bevy-example, windows-2022, 1.85) (push) Blocked by required conditions
CI / build_and_test (--exclude ffmpeg --exclude gstreamer-player, macos-14, stable) (push) Blocked by required conditions
CI / build_and_test (--exclude ffmpeg --exclude gstreamer-player, windows-2022, beta) (push) Blocked by required conditions
CI / build_and_test (--exclude ffmpeg --exclude gstreamer-player, windows-2022, stable) (push) Blocked by required conditions
CI / build_and_test (ubuntu-22.04, nightly-2025-08-15) (push) Blocked by required conditions
CI / node_test (macos-14) (push) Blocked by required conditions
CI / node_test (ubuntu-22.04) (push) Blocked by required conditions
CI / node_test (windows-2022) (push) Blocked by required conditions
CI / python_test (macos-14) (push) Blocked by required conditions
CI / python_test (ubuntu-22.04) (push) Blocked by required conditions
CI / cpp_test_driver (macos-13) (push) Blocked by required conditions
CI / cpp_test_driver (ubuntu-22.04) (push) Blocked by required conditions
CI / cpp_test_driver (windows-2022) (push) Blocked by required conditions
CI / cpp_cmake (macos-14, 1.85) (push) Blocked by required conditions
CI / cpp_cmake (windows-2022, nightly) (push) Blocked by required conditions
CI / cpp_package_test (push) Blocked by required conditions
CI / vsce_build_test (push) Blocked by required conditions
CI / mcu (pico-st7789, thumbv6m-none-eabi) (push) Blocked by required conditions
CI / mcu (pico2-st7789, thumbv8m.main-none-eabihf) (push) Blocked by required conditions
CI / wasm (push) Blocked by required conditions
CI / wasm_demo (push) Blocked by required conditions
CI / tree-sitter (push) Blocked by required conditions
CI / updater_test (0.3.0) (push) Blocked by required conditions
CI / esp-idf-quick (push) Blocked by required conditions
CI / android (push) Blocked by required conditions
CI / miri (push) Blocked by required conditions
CI / mcu (stm32h735g, thumbv7em-none-eabihf) (push) Blocked by required conditions
CI / mcu-embassy (push) Blocked by required conditions
CI / ffi_32bit_build (push) Blocked by required conditions
CI / docs (push) Blocked by required conditions
CI / fmt_test (push) Blocked by required conditions
CI / test-figma-inspector (push) Blocked by required conditions

This commit is contained in:
szecket 2025-08-20 13:55:42 +02:00 committed by GitHub
parent 666cee9468
commit d34931d510
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 118 additions and 26 deletions

View file

@ -6,22 +6,101 @@ import { Api, LogMessage, LogMessageLevel } from "../api.slint";
import { RecentColorPicker } from "widgets/floating-brush-sections/palettes.slint"; import { RecentColorPicker } from "widgets/floating-brush-sections/palettes.slint";
import { SimpleColumn } from "layout-helpers.slint"; import { SimpleColumn } from "layout-helpers.slint";
import { ConsoleStyles, EditorSizeSettings, Icons, } from "styling.slint"; import { ConsoleStyles, EditorSizeSettings, Icons, } from "styling.slint";
import { WindowManager } from "../windowglobal.slint"; import {WindowGlobal } from "../windowglobal.slint";
export component ConsolePanel inherits SimpleColumn { export component ConsolePanel inherits SimpleColumn {
property <bool> panel-expanded: false; property <bool> panel-expanded: false;
property <bool> dragging-up: false; // Track if currently dragging upward
property <length> panel-height: ConsoleStyles.log-height;
property <length> drag-start-height; // Track height at start of drag
property <length> previous-height: 300px; // Track previous panel height for restoration
property <bool> animate-panel: false; // Control animation state
property <bool> drag-started: false;
animate panel-height {
duration: animate-panel ? 200ms : 0ms;
easing: ease-out-quad;
}
changed panel-height => {
if !dragging-up && panel-height <= (-ConsoleStyles.header-height) {
panel-expanded = false;
}
}
Rectangle { Rectangle {
height: ConsoleStyles.header-height; height: ConsoleStyles.header-height;
background: ConsoleStyles.header-background; background: ConsoleStyles.header-background;
main-resize-handle := TouchArea {
y: 0;
height: 4px;
mouse-cursor: ns-resize;
moved => {
if !panel-expanded && self.mouse-y < self.pressed-y {
panel-expanded = true;
dragging-up = true;
drag-started = true;
panel-height = Math.max(30px, -(self.mouse-y - self.pressed-y));
} else if panel-expanded {
// Only update direction if we're actively moving
if !drag-started {
drag-started = true;
dragging-up = self.mouse-y < self.pressed-y;
}
// Resizing panel during drag
let max-height = WindowGlobal.window-height - 200px;
let new-height = panel-height - (self.mouse-y - self.pressed-y);
panel-height = Math.max((-ConsoleStyles.header-height), Math.min(max-height, new-height));
}
}
pointer-event(event) => {
if event.kind == PointerEventKind.down {
drag-started = false;
animate-panel = false; // Disable animation during drag
}
if event.kind == PointerEventKind.up {
animate-panel = true;
}
// Make close decision on release
if event.kind == PointerEventKind.up && panel-expanded {
if !dragging-up && panel-height <= 5px {
// Store current height before closing (if it's a reasonable size)
if panel-height > 50px {
previous-height = panel-height;
}
panel-height = (-ConsoleStyles.header-height);
}
if dragging-up && panel-height <= 30px {
panel-height = previous-height; // Restore previous height
}
// Also update previous-height when panel is at a good size
if panel-height > 50px {
previous-height = panel-height;
}
// Reset drag tracking
dragging-up = false;
drag-started = false;
}
}
}
Rectangle { Rectangle {
y: 0; y: 0;
width: 100%; width: 100%;
height: 2px;
background: ConsoleStyles.divider-line;
opacity: main-resize-handle.has-hover ? 1.0 : 0.3;
}
Rectangle {
y: parent.height - self.height;
width: 100%;
height: 1px; height: 1px;
background: ConsoleStyles.divider-line; background: ConsoleStyles.divider-line;
opacity: 50%; opacity: 50%;
} }
Rectangle { Rectangle {
y: parent.height - self.height; y: parent.height - self.height;
width: 100%; width: 100%;
@ -52,27 +131,16 @@ export component ConsolePanel inherits SimpleColumn {
lm-ta := TouchArea { lm-ta := TouchArea {
mouse-cursor: MouseCursor.pointer; mouse-cursor: MouseCursor.pointer;
clicked => { clicked => {
panel-expanded = true; if panel-expanded {
animate-panel = true;
panel-height = (-ConsoleStyles.header-height);
} else {
panel-height = previous-height;
panel-expanded = true;
animate-panel = true;
}
} }
} }
Rectangle {
x: 0;
y: parent.height - self.height;
width: min(last-message.preferred-width, last-message.width) - 4px;
height: 1px;
background: ConsoleStyles.slint-blue;
opacity: lm-ta.has-hover ? 0.8 : 0;
}
}
Rectangle {
x: 0;
y: parent.height - self.height;
width: label.width + label.x * 2;
height: 2px;
background: ConsoleStyles.slint-blue;
visible: panel-expanded;
} }
HorizontalLayout { HorizontalLayout {
@ -128,7 +196,14 @@ export component ConsolePanel inherits SimpleColumn {
chevron-ta := TouchArea { chevron-ta := TouchArea {
mouse-cursor: MouseCursor.pointer; mouse-cursor: MouseCursor.pointer;
clicked => { clicked => {
panel-expanded = !panel-expanded; if panel-expanded {
animate-panel = true;
panel-height = (-ConsoleStyles.header-height);
} else {
panel-height = previous-height;
panel-expanded = true;
animate-panel = true;
}
} }
} }
@ -144,10 +219,12 @@ export component ConsolePanel inherits SimpleColumn {
} }
} }
} }
if panel-expanded: Rectangle { if panel-expanded: Rectangle {
width: 100%; width: 100%;
height: ConsoleStyles.header-height; height: ConsoleStyles.header-height;
background: ConsoleStyles.toolbar-background; background: ConsoleStyles.toolbar-background;
Rectangle { Rectangle {
x: 0; x: 0;
width: 36px; width: 36px;
@ -163,6 +240,7 @@ export component ConsolePanel inherits SimpleColumn {
} }
} }
} }
Rectangle { Rectangle {
x: parent.width - self.width; x: parent.width - self.width;
width: 1px; width: 1px;
@ -181,12 +259,15 @@ export component ConsolePanel inherits SimpleColumn {
color: ConsoleStyles.text-color; color: ConsoleStyles.text-color;
vertical-alignment: center; vertical-alignment: center;
} }
Rectangle { Rectangle {
width: 6px; width: 6px;
} }
Switch { Switch {
checked <=> Api.auto-clear-console; checked <=> Api.auto-clear-console;
} }
Rectangle { Rectangle {
width: 10px; width: 10px;
} }
@ -201,12 +282,14 @@ export component ConsolePanel inherits SimpleColumn {
} }
if panel-expanded: Rectangle { if panel-expanded: Rectangle {
height: ConsoleStyles.log-height; preferred-height: Math.min(panel-height, (WindowGlobal.window-height - 200px));
min-height: (-ConsoleStyles.header-height);
background: ConsoleStyles.log-background; background: ConsoleStyles.log-background;
// Scroll to end workaround while this feature is missing from ScrollView // Scroll to end workaround while this feature is missing from ScrollView
property <int> timer-clicked: 0; property <int> timer-clicked: 0;
function scroll-to-bottom(){ function scroll-to-bottom() {
lv.viewport-y = -100000px; lv.viewport-y = -100000px;
timer-clicked = 0; timer-clicked = 0;
scroll-timer.running = true; scroll-timer.running = true;
@ -246,6 +329,7 @@ export component ConsolePanel inherits SimpleColumn {
wrap: message.wrap; wrap: message.wrap;
visible: false; visible: false;
} }
message := TextInput { message := TextInput {
x: 10px; x: 10px;
width: parent.width - 80px; width: parent.width - 80px;

View file

@ -132,7 +132,7 @@ export component PreviewUi inherits Window {
WindowGlobal.window-height = self.height; WindowGlobal.window-height = self.height;
} }
VerticalLayout { ap := VerticalLayout {
if !Api.show-preview-ui: no-ui-drawing-rect := Rectangle { if !Api.show-preview-ui: no-ui-drawing-rect := Rectangle {
VerticalLayout { VerticalLayout {
ComponentContainer { ComponentContainer {
@ -142,6 +142,7 @@ export component PreviewUi inherits Window {
} }
if Api.show-preview-ui: Rectangle { if Api.show-preview-ui: Rectangle {
VerticalLayout { VerticalLayout {
padding-bottom: 0px;
header-view := HeaderView { header-view := HeaderView {
show-left-sidebar <=> root.show-left-sidebar; show-left-sidebar <=> root.show-left-sidebar;
show-right-sidebar <=> root.show-right-sidebar; show-right-sidebar <=> root.show-right-sidebar;
@ -233,9 +234,16 @@ export component PreviewUi inherits Window {
} }
} }
ConsolePanel { } Rectangle {
height: cp.height;
}
StatusLine { } // StatusLine { }
}
cp := ConsolePanel {
y: parent.height - self.height - 1px;
width: parent.width;
} }
} }
} }