mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-10-18 18:03:08 +08:00
[feat] add DeskHub stream controls and network status
This commit is contained in:
@@ -2,6 +2,9 @@ import { GalleryStrings } from "device_strings.slint";
|
||||
import { DeviceCardActions, DeviceCardStyle } from "device_card_actions.slint";
|
||||
import { DeviceGroupDialog, DeviceGroupOption } from "device_group_dialog.slint";
|
||||
import { GalleryView, GalleryTile, GalleryRecentDevice, GalleryActionDevice } from "gallery_view.slint";
|
||||
import { GalleryNetworkDialog, GalleryNetworkDevice } from "gallery_network_dialog.slint";
|
||||
import { SettingsButton, SettingsSelect, SettingsGroup, SettingsRow, SettingsToggleRow } from "settings_controls.slint";
|
||||
import { GallerySettings } from "gallery_settings.slint";
|
||||
import { GroupFilter } from "group_filter.slint";
|
||||
import { LineEdit, ScrollView } from "std-widgets.slint";
|
||||
import { AnnouncementItem, MessagePanel, MessageStrings } from "message_panel.slint";
|
||||
@@ -303,6 +306,22 @@ export component MainWindow inherits Window {
|
||||
default-font-size: ImGuiFontStyle.base;
|
||||
|
||||
in-out property <bool> gallery-mode: false;
|
||||
in-out property <bool> gallery-simplified: false;
|
||||
changed gallery-simplified => {
|
||||
root.reset-gallery-transient();
|
||||
root.gallery-action("view-mode", "");
|
||||
focus-sink.focus();
|
||||
}
|
||||
in-out property <bool> gallery-network-open: false;
|
||||
in property <int> gallery-resolution-index: 0;
|
||||
in property <int> gallery-frame-rate-index: 0;
|
||||
in-out property <int> gallery-resolution-draft: 0;
|
||||
in-out property <int> gallery-frame-rate-draft: 0;
|
||||
in property <string> gallery-settings-error;
|
||||
in property <[GalleryNetworkDevice]> gallery-network-devices;
|
||||
changed gallery-network-open => {
|
||||
if root.gallery-network-open { root.menu-open = false; root.gallery-action("network-open", ""); }
|
||||
}
|
||||
in property <bool> gallery-fullscreen: false;
|
||||
in property <bool> gallery-transitioning: false;
|
||||
in property <bool> gallery-content-visible: true;
|
||||
@@ -330,6 +349,8 @@ export component MainWindow inherits Window {
|
||||
in property <int> gallery-count: 0;
|
||||
in property <int> gallery-connected: 0;
|
||||
in property <int> gallery-selected: 0;
|
||||
in property <bool> gallery-selected-audio-available: false;
|
||||
in property <bool> gallery-selected-audio-muted: false;
|
||||
in property <int> gallery-hidden-selected: 0;
|
||||
in property <string> gallery-notice;
|
||||
in property <[GalleryActionDevice]> gallery-selected-devices;
|
||||
@@ -366,7 +387,7 @@ export component MainWindow inherits Window {
|
||||
root.device-group-open = true;
|
||||
}
|
||||
|
||||
public function reset-gallery-transient() { gallery.reset-transient(); root.menu-open = false; }
|
||||
public function reset-gallery-transient() { gallery.reset-transient(); root.menu-open = false; root.gallery-network-open = false; }
|
||||
in property <bool> custom-titlebar: false;
|
||||
in property <bool> wayland-titlebar: false;
|
||||
in property <bool> window-active: true;
|
||||
@@ -503,6 +524,7 @@ export component MainWindow inherits Window {
|
||||
|
||||
private property <bool> menu-open: false;
|
||||
in-out property <bool> settings-open: false;
|
||||
in-out property <int> settings-tab: 0;
|
||||
private property <length> settings-scroll-y: 0px;
|
||||
in-out property <bool> self-host-settings-open: false;
|
||||
changed self-host-settings-open => {
|
||||
@@ -544,7 +566,13 @@ export component MainWindow inherits Window {
|
||||
changed permission-dialog-open => { if root.permission-dialog-open { root.gallery-action("release", ""); } }
|
||||
changed settings-open => {
|
||||
if root.settings-open {
|
||||
root.settings-tab = 0;
|
||||
root.settings-scroll-y = 0px;
|
||||
root.menu-open = false;
|
||||
root.gallery-network-open = false;
|
||||
root.gallery-resolution-draft = root.gallery-resolution-index;
|
||||
root.gallery-frame-rate-draft = root.gallery-frame-rate-index;
|
||||
root.gallery-action("settings-open", "");
|
||||
focus-sink.focus();
|
||||
}
|
||||
}
|
||||
@@ -780,6 +808,10 @@ export component MainWindow inherits Window {
|
||||
if event.text == Key.Escape { root.messages-open = false; }
|
||||
return accept;
|
||||
}
|
||||
if root.settings-open && !root.self-host-settings-open {
|
||||
if event.text == Key.Escape { root.cancel-settings(); root.settings-open = false; }
|
||||
return accept;
|
||||
}
|
||||
return reject;
|
||||
}
|
||||
}
|
||||
@@ -915,6 +947,20 @@ export component MainWindow inherits Window {
|
||||
}
|
||||
}
|
||||
}
|
||||
if root.gallery-mode: CompactButton {
|
||||
x: menu-button.x - 87px - 16px - 94px - 8px - self.width;
|
||||
y: mode-switch.y; width: 94px; height: mode-switch.height;
|
||||
primary: root.gallery-simplified;
|
||||
text: root.gallery-simplified ? GalleryStrings.tr("退出精简", "Exit compact", "Обычный вид")
|
||||
: GalleryStrings.tr("精简模式", "Compact", "Компактно");
|
||||
clicked => { root.gallery-simplified = !root.gallery-simplified; }
|
||||
}
|
||||
if root.gallery-mode: CompactButton {
|
||||
x: menu-button.x - 87px - 16px - self.width;
|
||||
y: mode-switch.y; width: 94px; height: mode-switch.height;
|
||||
text: GalleryStrings.tr("网络状态", "Network", "Сеть");
|
||||
clicked => { root.gallery-network-open = true; }
|
||||
}
|
||||
if root.gallery-mode: CompactButton {
|
||||
x: menu-button.x - self.width - 8px;
|
||||
y: mode-switch.y;
|
||||
@@ -1327,8 +1373,10 @@ export component MainWindow inherits Window {
|
||||
|
||||
}
|
||||
gallery := GalleryView {
|
||||
y: root.content-header-height; width: parent.width; height: parent.height - self.y - 24px;
|
||||
y: root.content-header-height; width: parent.width;
|
||||
height: parent.height - self.y - (root.gallery-simplified ? 0px : 24px);
|
||||
visible: root.gallery-mode;
|
||||
simplified: root.gallery-simplified;
|
||||
controlling: root.gallery-controlling;
|
||||
pointer-input(button, kind, x, y) => { root.gallery-pointer(button, kind, x, y); }
|
||||
scroll-input(dx, dy, x, y) => { root.gallery-scroll(dx, dy, x, y); }
|
||||
@@ -1338,6 +1386,8 @@ export component MainWindow inherits Window {
|
||||
columns: root.gallery-columns; rows: root.gallery-rows;
|
||||
page: root.gallery-page; pages: root.gallery-pages; count: root.gallery-count;
|
||||
connected-count: root.gallery-connected; selected-count: root.gallery-selected;
|
||||
selected-audio-available: root.gallery-selected-audio-available;
|
||||
selected-audio-muted: root.gallery-selected-audio-muted;
|
||||
hidden-selected: root.gallery-hidden-selected; notice: root.gallery-notice;
|
||||
selected-devices: root.gallery-selected-devices;
|
||||
focused: root.gallery-focused; batch <=> root.gallery-batch; adding <=> root.gallery-adding;
|
||||
@@ -1356,6 +1406,7 @@ export component MainWindow inherits Window {
|
||||
}
|
||||
// Status bar.
|
||||
Rectangle {
|
||||
visible: !root.gallery-mode || !root.gallery-simplified;
|
||||
y: parent.height - 24px;
|
||||
height: 24px;
|
||||
background: #fafbfc;
|
||||
@@ -1930,172 +1981,176 @@ export component MainWindow inherits Window {
|
||||
}
|
||||
}
|
||||
|
||||
// Settings modal.
|
||||
// Both tabs share one draft and the same save/cancel actions.
|
||||
if root.settings-open: Rectangle {
|
||||
background: transparent;
|
||||
background: #15223850;
|
||||
z: 45;
|
||||
TouchArea { clicked => { focus-sink.focus(); } }
|
||||
DialogSurface {
|
||||
x: root.compact-language ? 219px : 190px;
|
||||
y: 60px;
|
||||
width: root.compact-language ? 202px : 269px;
|
||||
height: 330px;
|
||||
border-radius: 7px;
|
||||
|
||||
Rectangle {
|
||||
x: 0px;
|
||||
y: 0px;
|
||||
width: parent.width;
|
||||
height: 21px;
|
||||
background: #d3d3d3;
|
||||
border-radius: 7px;
|
||||
z: 5;
|
||||
Rectangle { y: parent.height - 7px; height: 7px; background: #d3d3d3; }
|
||||
Text { x: 6px; text: UiStrings.settings; font-size: ImGuiFontStyle.base; font-weight: 600; color: #202124; vertical-alignment: center; }
|
||||
x: (parent.width - self.width) / 2;
|
||||
y: (parent.height - self.height) / 2;
|
||||
width: min(400px, parent.width - 40px); height: 446px;
|
||||
background: #f8fafc; border-radius: 14px; border-color: #e1e7ef;
|
||||
drop-shadow-color: #14294424; drop-shadow-blur: 24px; drop-shadow-offset-y: 8px;
|
||||
TouchArea { clicked => { focus-sink.focus(); } }
|
||||
Text {
|
||||
x: 18px; y: 18px; width: parent.width - 80px; height: 27px;
|
||||
text: UiStrings.settings; font-size: 20px; font-weight: 600; color: #22324a;
|
||||
}
|
||||
|
||||
settings-scroll := ScrollView {
|
||||
x: 0px;
|
||||
y: 21px;
|
||||
width: parent.width;
|
||||
height: 265px;
|
||||
viewport-y <=> root.settings-scroll-y;
|
||||
|
||||
settings-content := VerticalLayout {
|
||||
// Reserve space for the overlaid vertical scrollbar.
|
||||
width: settings-scroll.width;
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px;
|
||||
spacing: 0px;
|
||||
|
||||
Rectangle {
|
||||
height: 30px;
|
||||
Text { x: 8px; y: 3px; width: root.compact-language ? 94px : 162px; height: 24px; text: UiStrings.language; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
CompactComboBox { x: root.compact-language ? 106px : 174px; y: 2px; model: ["中文", "English", "Русский"]; current-index <=> root.language-index; }
|
||||
SettingsButton {
|
||||
x: parent.width - 90px; y: 18px; width: 76px; height: 28px; quiet: true;
|
||||
text: GalleryStrings.tr("关闭", "Close", "Закрыть");
|
||||
clicked => { root.cancel-settings(); root.settings-open = false; root.self-host-settings-open = false; }
|
||||
}
|
||||
Rectangle {
|
||||
x: 18px; y: 56px; width: parent.width - 36px; height: 40px;
|
||||
background: #eaf0f6; border-radius: 9px;
|
||||
Rectangle {
|
||||
x: 4px + root.settings-tab * (parent.width - 8px) / 2;
|
||||
y: 4px; width: (parent.width - 8px) / 2; height: parent.height - 8px;
|
||||
background: white; border-radius: 6px;
|
||||
drop-shadow-color: #1e3e6520; drop-shadow-blur: 3px; drop-shadow-offset-y: 1px;
|
||||
animate x { duration: 140ms; easing: ease-out; }
|
||||
}
|
||||
for label[index] in [GalleryStrings.tr("常规", "General", "Общие"), GalleryStrings.tr("桌面墙", "DeskHub", "DeskHub")]: Rectangle {
|
||||
x: 4px + index * (parent.width - 8px) / 2;
|
||||
y: 4px; width: (parent.width - 8px) / 2; height: parent.height - 8px;
|
||||
border-radius: 6px;
|
||||
background: tab-touch.has-hover && root.settings-tab != index ? #e1e8f1 : transparent;
|
||||
accessible-role: button; accessible-label: label;
|
||||
accessible-action-default => { tab-touch.clicked(); }
|
||||
Text {
|
||||
text: label; font-size: 12px; font-weight: root.settings-tab == index ? 600 : 400;
|
||||
color: root.settings-tab == index ? #2e70cf : #718096;
|
||||
horizontal-alignment: center; vertical-alignment: center;
|
||||
}
|
||||
if root.capture-method-visible: Rectangle {
|
||||
height: 30px;
|
||||
Text { x: 8px; y: 3px; width: root.compact-language ? 94px : 162px; height: 24px; text: UiStrings.capture-method; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
CompactComboBox { x: root.compact-language ? 106px : 174px; y: 2px; enabled: !root.settings-session-active; model: [UiStrings.capture-method-auto, "DXGI", "WGC", "GDI"]; current-index <=> root.capture-method-index; }
|
||||
}
|
||||
Rectangle {
|
||||
height: 30px;
|
||||
Text { x: 8px; y: 3px; width: root.compact-language ? 94px : 162px; height: 24px; text: UiStrings.codec; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
CompactComboBox { x: root.compact-language ? 106px : 174px; y: 2px; enabled: !root.settings-session-active; model: [UiStrings.codec-h264, UiStrings.codec-av1]; current-index <=> root.codec-index; }
|
||||
}
|
||||
Rectangle {
|
||||
height: 30px;
|
||||
Text { x: 8px; y: 3px; width: root.compact-language ? 145px : 212px; height: 24px; text: UiStrings.hardware-codec; color: root.hardware-codec-available ? #202124 : #8b8f95; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
ImGuiCheckBox { x: root.compact-language ? 157px : 224px; y: 3px; checked <=> root.hardware-codec-enabled; enabled: root.hardware-codec-available && !root.settings-session-active; }
|
||||
}
|
||||
Rectangle {
|
||||
height: 30px;
|
||||
Text { x: 8px; y: 3px; width: root.compact-language ? 145px : 212px; height: 24px; text: UiStrings.turn-relay; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
ImGuiCheckBox { x: root.compact-language ? 157px : 224px; y: 3px; checked <=> root.turn-enabled; enabled: !root.settings-session-active; }
|
||||
}
|
||||
Rectangle {
|
||||
height: 30px;
|
||||
Text { x: 8px; y: 3px; width: root.compact-language ? 145px : 212px; height: 24px; text: UiStrings.force-relay; color: root.turn-enabled ? #202124 : #8b8f95; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
ImGuiCheckBox { x: root.compact-language ? 157px : 224px; y: 3px; checked <=> root.force-relay-enabled; enabled: root.turn-enabled && !root.settings-session-active; }
|
||||
}
|
||||
Rectangle {
|
||||
height: 30px;
|
||||
Text { x: 8px; y: 3px; width: root.compact-language ? 145px : 212px; height: 24px; text: UiStrings.save-remote-previews; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
ImGuiCheckBox { x: root.compact-language ? 157px : 224px; y: 3px; checked <=> root.save-remote-previews; }
|
||||
}
|
||||
Rectangle {
|
||||
height: 30px;
|
||||
Text { x: 8px; y: 3px; width: root.compact-language ? 145px : 212px; height: 24px; text: UiStrings.privacy-on-connect; color: root.privacy-setting-available ? #202124 : #8b8f95; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
ImGuiCheckBox { x: root.compact-language ? 157px : 224px; y: 3px; checked <=> root.privacy-on-connect-enabled; enabled: root.privacy-setting-available; }
|
||||
}
|
||||
Rectangle {
|
||||
height: 30px;
|
||||
CompactButton { x: 8px; y: 3px; width: root.compact-language ? 70px : 206px; text: UiStrings.self-hosted; enabled: !root.settings-session-active; clicked => { root.self-host-settings-open = true; } }
|
||||
ImGuiCheckBox { x: root.compact-language ? 157px : 224px; y: 3px; checked <=> root.self-hosted-enabled; enabled: !root.settings-session-active; }
|
||||
}
|
||||
Rectangle {
|
||||
height: 30px;
|
||||
Text { x: 8px; y: 3px; width: root.compact-language ? 145px : 212px; height: 24px; text: UiStrings.autostart; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
ImGuiCheckBox { x: root.compact-language ? 157px : 224px; y: 3px; checked <=> root.autostart-enabled; enabled: !root.settings-session-active; }
|
||||
}
|
||||
Rectangle {
|
||||
height: 30px;
|
||||
Text { x: 8px; y: 3px; width: root.compact-language ? 145px : 212px; height: 24px; text: UiStrings.daemon; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
ImGuiCheckBox { x: root.compact-language ? 157px : 224px; y: 3px; checked <=> root.daemon-enabled; enabled: !root.settings-session-active; }
|
||||
}
|
||||
Rectangle {
|
||||
height: 30px;
|
||||
Text { x: 8px; y: 3px; width: root.compact-language ? 94px : 154px; height: 24px; text: UiStrings.file-save-path; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
CompactButton { x: root.compact-language ? 106px : 166px; y: 3px; width: root.compact-language ? 73px : 80px; text: root.file-save-path == "" ? UiStrings.default-desktop : root.file-save-path; enabled: !root.settings-session-active; clicked => { root.browse-save-path(); } }
|
||||
tab-touch := TouchArea {
|
||||
mouse-cursor: pointer;
|
||||
clicked => { root.settings-tab = index; focus-sink.focus(); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle { x: 7px; y: 286px; width: parent.width - 14px; height: 1px; background: ImGuiLineStyle.separator; }
|
||||
CompactButton { x: root.compact-language ? 63px : 89px; y: 297px; primary: true; text: UiStrings.ok; clicked => { if root.save-settings() { root.settings-open = false; root.self-host-settings-open = false; } } }
|
||||
CompactButton { x: root.compact-language ? 104px : 130px; y: 297px; width: root.compact-language ? 34px : 56px; text: UiStrings.cancel; clicked => { root.cancel-settings(); root.settings-open = false; root.self-host-settings-open = false; } }
|
||||
if root.settings-tab == 0: settings-scroll := ScrollView {
|
||||
x: 18px; y: 108px; width: parent.width - 28px; height: 272px;
|
||||
viewport-y <=> root.settings-scroll-y;
|
||||
VerticalLayout {
|
||||
width: settings-scroll.width - 12px;
|
||||
spacing: 14px; padding-bottom: 4px;
|
||||
SettingsGroup {
|
||||
title: GalleryStrings.tr("界面", "Interface", "Интерфейс"); rows: 1;
|
||||
SettingsRow {
|
||||
label: UiStrings.language; divider: false;
|
||||
SettingsSelect { x: parent.width - 116px; y: 4px; width: 104px; model: ["中文", "English", "Русский"]; current-index <=> root.language-index; }
|
||||
}
|
||||
}
|
||||
SettingsGroup {
|
||||
title: GalleryStrings.tr("视频", "Video", "Видео");
|
||||
rows: root.capture-method-visible ? 3 : 2;
|
||||
if root.capture-method-visible: SettingsRow {
|
||||
label: UiStrings.capture-method; enabled: !root.settings-session-active;
|
||||
SettingsSelect { x: parent.width - 116px; y: 4px; width: 104px; enabled: !root.settings-session-active; model: [UiStrings.capture-method-auto, "DXGI", "WGC", "GDI"]; current-index <=> root.capture-method-index; }
|
||||
}
|
||||
SettingsRow {
|
||||
label: UiStrings.codec; enabled: !root.settings-session-active;
|
||||
SettingsSelect { x: parent.width - 116px; y: 4px; width: 104px; enabled: !root.settings-session-active; model: [UiStrings.codec-h264, UiStrings.codec-av1]; current-index <=> root.codec-index; }
|
||||
}
|
||||
SettingsToggleRow { label: UiStrings.hardware-codec; checked <=> root.hardware-codec-enabled; enabled: root.hardware-codec-available && !root.settings-session-active; divider: false; }
|
||||
}
|
||||
SettingsGroup {
|
||||
title: GalleryStrings.tr("网络连接", "Network", "Сеть"); rows: 3;
|
||||
SettingsToggleRow { label: UiStrings.turn-relay; checked <=> root.turn-enabled; enabled: !root.settings-session-active; }
|
||||
SettingsToggleRow { label: UiStrings.force-relay; checked <=> root.force-relay-enabled; enabled: root.turn-enabled && !root.settings-session-active; }
|
||||
SettingsToggleRow {
|
||||
checked <=> root.self-hosted-enabled; enabled: !root.settings-session-active; divider: false;
|
||||
SettingsButton { x: 0px; y: 2px; width: parent.width - 60px; height: 32px; quiet: true; align-left: true; text: UiStrings.self-hosted; enabled: !root.settings-session-active; clicked => { root.self-host-settings-open = true; } }
|
||||
}
|
||||
}
|
||||
SettingsGroup {
|
||||
title: GalleryStrings.tr("隐私保护", "Privacy", "Приватность"); rows: 1;
|
||||
SettingsToggleRow { label: UiStrings.privacy-on-connect; checked <=> root.privacy-on-connect-enabled; enabled: root.privacy-setting-available; divider: false; }
|
||||
}
|
||||
SettingsGroup {
|
||||
title: GalleryStrings.tr("本地存储", "Local storage", "Локальное хранение"); rows: 2;
|
||||
SettingsToggleRow { label: UiStrings.save-remote-previews; checked <=> root.save-remote-previews; }
|
||||
SettingsRow {
|
||||
label: UiStrings.file-save-path; enabled: !root.settings-session-active; divider: false;
|
||||
SettingsButton { x: parent.width - 116px; y: 4px; width: 104px; height: 28px; text: root.file-save-path == "" ? UiStrings.default-desktop : root.file-save-path; enabled: !root.settings-session-active; clicked => { root.browse-save-path(); } }
|
||||
}
|
||||
}
|
||||
SettingsGroup {
|
||||
title: GalleryStrings.tr("启动与后台", "Startup & background", "Запуск и фоновая работа"); rows: 2;
|
||||
SettingsToggleRow { label: UiStrings.autostart; checked <=> root.autostart-enabled; enabled: !root.settings-session-active; }
|
||||
SettingsToggleRow { label: UiStrings.daemon; checked <=> root.daemon-enabled; enabled: !root.settings-session-active; divider: false; }
|
||||
}
|
||||
}
|
||||
}
|
||||
if root.settings-tab == 1: GallerySettings {
|
||||
x: 18px; y: 108px; width: parent.width - 36px; height: 272px;
|
||||
resolution-index <=> root.gallery-resolution-draft;
|
||||
frame-rate-index <=> root.gallery-frame-rate-draft;
|
||||
error: root.gallery-settings-error;
|
||||
}
|
||||
Rectangle { x: 18px; y: 382px; width: parent.width - 36px; height: 1px; background: #e6ebf2; }
|
||||
HorizontalLayout {
|
||||
x: 18px; y: 396px; width: parent.width - 36px; height: 32px; spacing: 10px;
|
||||
if root.settings-tab == 1: SettingsButton {
|
||||
width: 110px; quiet: true;
|
||||
text: GalleryStrings.tr("恢复默认", "Reset defaults", "По умолчанию");
|
||||
clicked => { root.gallery-resolution-draft = 0; root.gallery-frame-rate-draft = 0; }
|
||||
}
|
||||
Rectangle { horizontal-stretch: 1; }
|
||||
SettingsButton {
|
||||
width: 80px; text: UiStrings.cancel;
|
||||
clicked => { root.cancel-settings(); root.settings-open = false; root.self-host-settings-open = false; }
|
||||
}
|
||||
SettingsButton {
|
||||
width: 92px; primary: true;
|
||||
text: GalleryStrings.tr("保存", "Save", "Сохранить");
|
||||
clicked => { if root.save-settings() { root.settings-open = false; root.self-host-settings-open = false; } }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if root.self-host-settings-open: Rectangle {
|
||||
background: transparent;
|
||||
background: #15223835;
|
||||
z: 49;
|
||||
TouchArea { clicked => { focus-sink.focus(); } }
|
||||
DialogSurface {
|
||||
x: root.compact-language ? 190px : 140px;
|
||||
y: 105px;
|
||||
width: root.compact-language ? 260px : 360px;
|
||||
height: root.self-host-settings-error == "" ? 138px : 202px;
|
||||
border-radius: 7px;
|
||||
|
||||
Rectangle {
|
||||
x: 0px;
|
||||
y: 0px;
|
||||
width: parent.width;
|
||||
height: 21px;
|
||||
background: #d3d3d3;
|
||||
border-radius: 7px;
|
||||
z: 5;
|
||||
Rectangle { y: parent.height - 7px; height: 7px; background: #d3d3d3; }
|
||||
Text { x: 6px; text: UiStrings.self-hosted-settings; font-size: ImGuiFontStyle.base; font-weight: 600; color: #202124; vertical-alignment: center; }
|
||||
x: (parent.width - self.width) / 2;
|
||||
y: (parent.height - self.height) / 2;
|
||||
width: 360px; height: root.self-host-settings-error == "" ? 266px : 322px;
|
||||
border-radius: 12px; border-color: #e1e7ef; background: #f8fafc;
|
||||
drop-shadow-color: #14294424; drop-shadow-blur: 18px; drop-shadow-offset-y: 6px;
|
||||
TouchArea { clicked => { focus-sink.focus(); } }
|
||||
Text {
|
||||
x: 18px; y: 18px; width: parent.width - 36px; height: 24px;
|
||||
text: UiStrings.self-hosted-settings; font-size: 16px; font-weight: 600; color: #22324a;
|
||||
}
|
||||
Text { x: 8px; y: 31px; width: root.compact-language ? 88px : 165px; height: 24px; text: UiStrings.server-host; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
Text { x: 18px; y: 56px; width: parent.width - 36px; height: 20px; text: UiStrings.server-host; color: #34445a; font-size: 12px; overflow: elide; vertical-alignment: center; }
|
||||
Rectangle {
|
||||
x: root.compact-language ? 100px : 173px;
|
||||
y: 30px;
|
||||
width: root.compact-language ? 152px : 179px;
|
||||
height: 24px;
|
||||
background: white;
|
||||
border-width: 1px;
|
||||
border-color: ImGuiLineStyle.border;
|
||||
border-radius: 4px;
|
||||
LineEdit { x: 1px; y: 1.5px; width: parent.width - 2px; height: parent.height - 2px; text <=> root.server-host; input-type: InputType.text; font-size: ImGuiFontStyle.body; }
|
||||
x: 18px; y: 80px; width: parent.width - 36px; height: 30px;
|
||||
background: white; border-width: 1px; border-color: #dfe6ef; border-radius: 6px;
|
||||
LineEdit { x: 1px; y: 2px; width: parent.width - 2px; height: parent.height - 4px; text <=> root.server-host; input-type: InputType.text; font-size: 12px; }
|
||||
LineEditFocusUnderlineMask { x: 5px; y: parent.height - 3px; width: parent.width - 10px; }
|
||||
}
|
||||
Text { x: 8px; y: 61px; width: root.compact-language ? 88px : 165px; height: 24px; text: UiStrings.server-port; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; }
|
||||
Text { x: 18px; y: 120px; width: parent.width - 36px; height: 20px; text: UiStrings.server-port; color: #34445a; font-size: 12px; overflow: elide; vertical-alignment: center; }
|
||||
Rectangle {
|
||||
x: root.compact-language ? 100px : 173px;
|
||||
y: 60px;
|
||||
width: root.compact-language ? 152px : 179px;
|
||||
height: 24px;
|
||||
background: white;
|
||||
border-width: 1px;
|
||||
border-color: ImGuiLineStyle.border;
|
||||
border-radius: 4px;
|
||||
LineEdit { x: 1px; y: 1.5px; width: parent.width - 2px; height: parent.height - 2px; text <=> root.server-port; input-type: InputType.number; font-size: ImGuiFontStyle.body; }
|
||||
x: 18px; y: 144px; width: parent.width - 36px; height: 30px;
|
||||
background: white; border-width: 1px; border-color: #dfe6ef; border-radius: 6px;
|
||||
LineEdit { x: 1px; y: 2px; width: parent.width - 2px; height: parent.height - 4px; text <=> root.server-port; input-type: InputType.number; font-size: 12px; }
|
||||
LineEditFocusUnderlineMask { x: 5px; y: parent.height - 3px; width: parent.width - 10px; }
|
||||
}
|
||||
if root.self-host-settings-error != "": Text {
|
||||
x: 8px; y: 89px; width: parent.width - 16px; height: 64px;
|
||||
text: root.self-host-settings-error; color: #b3261e;
|
||||
font-size: ImGuiFontStyle.body; wrap: word-wrap;
|
||||
x: 18px; y: 186px; width: parent.width - 36px; height: 48px;
|
||||
text: root.self-host-settings-error; color: #c53e3e; font-size: 11px; wrap: word-wrap;
|
||||
}
|
||||
CompactButton { x: root.compact-language ? 93px : 135px; y: parent.height - 38px; primary: true; text: UiStrings.ok; clicked => { if root.save-self-hosted-settings() { root.self-host-settings-open = false; } } }
|
||||
CompactButton { x: root.compact-language ? 134px : 176px; y: parent.height - 38px; width: root.compact-language ? 34px : 56px; text: UiStrings.cancel; clicked => { root.cancel-self-hosted-settings(); root.self-host-settings-open = false; } }
|
||||
Rectangle { x: 18px; y: parent.height - 66px; width: parent.width - 36px; height: 1px; background: #e6ebf2; }
|
||||
SettingsButton { x: parent.width - 114px; y: parent.height - 50px; width: 92px; primary: true; text: UiStrings.ok; clicked => { if root.save-self-hosted-settings() { root.self-host-settings-open = false; } } }
|
||||
SettingsButton { x: parent.width - 204px; y: parent.height - 50px; width: 80px; text: UiStrings.cancel; clicked => { root.cancel-self-hosted-settings(); root.self-host-settings-open = false; } }
|
||||
}
|
||||
}
|
||||
|
||||
// About modal.
|
||||
if root.about-open: Rectangle {
|
||||
background: transparent;
|
||||
z: 46;
|
||||
@@ -2455,6 +2510,14 @@ export component MainWindow inherits Window {
|
||||
}
|
||||
}
|
||||
|
||||
if root.gallery-mode && root.gallery-network-open: GalleryNetworkDialog {
|
||||
x: 0px; y: root.titlebar-height;
|
||||
width: root.width; height: root.height - self.y;
|
||||
z: 100;
|
||||
devices: root.gallery-network-devices;
|
||||
close => { root.gallery-network-open = false; focus-sink.focus(); }
|
||||
}
|
||||
|
||||
// Ignore clicks against moving cards and duplicate fullscreen requests.
|
||||
if root.gallery-transitioning: TouchArea {
|
||||
x: 0px; y: root.titlebar-height;
|
||||
|
||||
Reference in New Issue
Block a user