mirror of
https://github.com/orbien-org/orbien.git
synced 2026-09-23 08:01:34 +00:00
349 lines
14 KiB
Plaintext
349 lines
14 KiB
Plaintext
import "../assets/fonts/NotoSansSC-Regular.subset.otf";
|
|
import "../assets/fonts/NotoSansSC-Bold.subset.otf";
|
|
import { Palette } from "std-widgets.slint";
|
|
import { Theme } from "theme.slint";
|
|
import { Sidebar, AppPage } from "sidebar.slint";
|
|
import { LaunchPage } from "pages/launch.slint";
|
|
import { TunnelPage, TunnelRow } from "pages/tunnel.slint";
|
|
import { ConfigPage } from "pages/config.slint";
|
|
import { LoggerPage, LogLine } from "pages/logger.slint";
|
|
import { AboutPage } from "pages/about_page.slint";
|
|
import { AboutDialog } from "pages/about.slint";
|
|
import { ToastHost } from "toast.slint";
|
|
import { Tr } from "i18n.slint";
|
|
import { AppMeta } from "version.slint";
|
|
import { OrbienTray } from "tray.slint";
|
|
|
|
export { AppPage, TunnelRow, LogLine, Tr, AboutDialog, AppMeta, Theme, OrbienTray }
|
|
export component AppWindow inherits Window {
|
|
title: "Orbien Desktop";
|
|
default-font-family: "Noto Sans SC";
|
|
default-font-size: 13px;
|
|
icon: @image-url("../assets/app-icons/128x128.png");
|
|
preferred-width: 960px;
|
|
preferred-height: 640px;
|
|
min-width: 800px;
|
|
min-height: 600px;
|
|
background: Theme.chrome;
|
|
MenuBar {
|
|
Menu {
|
|
title: Tr.menu-preferences;
|
|
Menu {
|
|
title: Tr.menu-language;
|
|
MenuItem {
|
|
title: (root.locale-index == 0 ? "✓ " : " ") + Tr.menu-lang-zh;
|
|
activated => {
|
|
if root.locale-index == 0 {
|
|
return;
|
|
}
|
|
root.locale-index = 0;
|
|
Tr.locale-index = 0;
|
|
root.locale-changed(0);
|
|
}
|
|
}
|
|
|
|
MenuItem {
|
|
title: (root.locale-index == 1 ? "✓ " : " ") + Tr.menu-lang-en;
|
|
activated => {
|
|
if root.locale-index == 1 {
|
|
return;
|
|
}
|
|
root.locale-index = 1;
|
|
Tr.locale-index = 1;
|
|
root.locale-changed(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
Menu {
|
|
title: Tr.menu-appearance;
|
|
MenuItem {
|
|
title: (root.theme-index == 0 ? "✓ " : " ") + Tr.menu-theme-light;
|
|
activated => {
|
|
if root.theme-index == 0 {
|
|
return;
|
|
}
|
|
root.theme-index = 0;
|
|
root.theme-changed(0);
|
|
}
|
|
}
|
|
|
|
MenuItem {
|
|
title: (root.theme-index == 1 ? "✓ " : " ") + Tr.menu-theme-dark;
|
|
activated => {
|
|
if root.theme-index == 1 {
|
|
return;
|
|
}
|
|
root.theme-index = 1;
|
|
root.theme-changed(1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Menu {
|
|
title: Tr.menu-help;
|
|
MenuItem {
|
|
title: Tr.menu-about;
|
|
activated => { root.show-about(); }
|
|
}
|
|
}
|
|
}
|
|
|
|
// navigation
|
|
in-out property <AppPage> page: AppPage.launch;
|
|
in-out property <int> locale-index: 0;
|
|
/// 0 = light (default), 1 = dark
|
|
in-out property <int> theme-index: 0;
|
|
in-out property <string> sidebar-cpu: "—";
|
|
in-out property <string> sidebar-mem: "—";
|
|
|
|
// launch
|
|
in-out property <bool> running: false;
|
|
in-out property <string> running-label: "—";
|
|
in-out property <bool> busy: false;
|
|
|
|
in-out property <[TunnelRow]> tunnels;
|
|
in-out property <bool> tunnel-editor-open: false;
|
|
in-out property <int> tunnel-editing-index: -1;
|
|
in-out property <string> tunnel-edit-name: "";
|
|
in-out property <string> tunnel-edit-local-ip: "127.0.0.1";
|
|
in-out property <string> tunnel-edit-local-port: "8080";
|
|
in-out property <string> tunnel-edit-remote-port: "9000";
|
|
in-out property <string> tunnel-edit-domains: "";
|
|
in-out property <string> tunnel-edit-locations: "";
|
|
in-out property <string> tunnel-edit-basic-auth-user: "";
|
|
in-out property <string> tunnel-edit-basic-auth-password: "";
|
|
in-out property <string> tunnel-edit-host-header-rewrite: "";
|
|
in-out property <string> tunnel-edit-bandwidth-limit: "";
|
|
in-out property <int> tunnel-edit-bandwidth-side-index: 0;
|
|
in-out property <int> tunnel-edit-proxy-protocol-index: 0;
|
|
in-out property <bool> tunnel-edit-plugin-tls-term: false;
|
|
in-out property <string> tunnel-edit-plugin-local-addr: "127.0.0.1:80";
|
|
in-out property <string> tunnel-edit-plugin-cert-file: "";
|
|
in-out property <string> tunnel-edit-plugin-key-file: "";
|
|
in-out property <string> tunnel-edit-plugin-host-rewrite: "";
|
|
in-out property <string> tunnel-edit-plugin-username: "";
|
|
in-out property <string> tunnel-edit-plugin-password: "";
|
|
in-out property <int> tunnel-edit-type-index: 0;
|
|
in-out property <bool> tunnel-show-advanced: false;
|
|
|
|
// config
|
|
in-out property <string> server-addr: "127.0.0.1";
|
|
in-out property <string> server-port: "9527";
|
|
in-out property <string> token: "";
|
|
in-out property <string> user: "";
|
|
in-out property <int> protocol-index: 0;
|
|
in-out property <string> pool-count: "1";
|
|
in-out property <string> ws-path: "";
|
|
in-out property <bool> tcp-mux: true;
|
|
in-out property <bool> tls-enable: true;
|
|
in-out property <bool> config-show-advanced: false;
|
|
in-out property <string> config-mux-keepalive: "30";
|
|
in-out property <string> config-heartbeat-interval: "";
|
|
in-out property <string> config-heartbeat-timeout: "";
|
|
in-out property <string> config-udp-packet-size: "1500";
|
|
in-out property <string> config-tls-server-name: "";
|
|
in-out property <string> config-tls-ca: "";
|
|
in-out property <string> config-tls-cert: "";
|
|
in-out property <string> config-tls-key: "";
|
|
in-out property <string> config-quic-keepalive: "10";
|
|
in-out property <string> config-quic-idle: "30";
|
|
in-out property <string> config-quic-streams: "100000";
|
|
in-out property <string> config-file-path: "";
|
|
|
|
// Global toast
|
|
in-out property <bool> toast-visible: false;
|
|
in-out property <string> toast-text: "";
|
|
/// 0 = success, 1 = error
|
|
in-out property <int> toast-kind: 0;
|
|
in-out property <int> toast-token: 0;
|
|
|
|
// logger
|
|
in-out property <string> log-query: "";
|
|
in-out property <bool> log-auto-scroll: false;
|
|
in-out property <[LogLine]> log-lines;
|
|
in-out property <int> log-scroll-gen: 0;
|
|
|
|
callback locale-changed(int);
|
|
callback theme-changed(int);
|
|
callback show-about();
|
|
callback open-url(string);
|
|
callback toggle-client();
|
|
callback open-logger();
|
|
callback page-changed(AppPage);
|
|
callback tunnel-add();
|
|
callback tunnel-save();
|
|
callback tunnel-cancel();
|
|
callback tunnel-edit(int);
|
|
callback tunnel-delete(int);
|
|
callback tunnel-copy-remote(string);
|
|
callback config-save();
|
|
callback config-reset();
|
|
callback pick-file(string);
|
|
callback logs-clear();
|
|
callback log-query-edited(string);
|
|
|
|
changed locale-index => {
|
|
Tr.locale-index = root.locale-index;
|
|
}
|
|
|
|
changed theme-index => {
|
|
Theme.mode = root.theme-index;
|
|
Palette.color-scheme = root.theme-index == 1 ? ColorScheme.dark : ColorScheme.light;
|
|
}
|
|
|
|
init => {
|
|
Theme.mode = root.theme-index;
|
|
Palette.color-scheme = root.theme-index == 1 ? ColorScheme.dark : ColorScheme.light;
|
|
}
|
|
|
|
changed page => {
|
|
root.page-changed(root.page);
|
|
}
|
|
|
|
HorizontalLayout {
|
|
spacing: 0;
|
|
|
|
Sidebar {
|
|
page <=> root.page;
|
|
cpu-usage: root.sidebar-cpu;
|
|
mem-usage: root.sidebar-mem;
|
|
}
|
|
|
|
Rectangle {
|
|
background: Theme.bg;
|
|
horizontal-stretch: 1;
|
|
vertical-stretch: 1;
|
|
min-height: Theme.page-min-height + Theme.page-pad * 2;
|
|
clip: true;
|
|
|
|
private property <length> content-x: Theme.page-pad;
|
|
private property <length> content-y: Theme.page-pad;
|
|
private property <length> content-w: self.width - Theme.page-pad * 2;
|
|
private property <length> content-h: self.height - Theme.page-pad * 2;
|
|
|
|
LaunchPage {
|
|
x: parent.content-x;
|
|
y: parent.content-y;
|
|
width: parent.content-w;
|
|
height: parent.content-h;
|
|
visible: root.page == AppPage.launch;
|
|
running <=> root.running;
|
|
running-label: root.running-label;
|
|
busy: root.busy;
|
|
toggle-clicked => { root.toggle-client(); }
|
|
view-log-clicked => { root.open-logger(); }
|
|
}
|
|
|
|
TunnelPage {
|
|
x: parent.content-x;
|
|
y: parent.content-y;
|
|
width: parent.content-w;
|
|
height: parent.content-h;
|
|
visible: root.page == AppPage.tunnel;
|
|
tunnels: root.tunnels;
|
|
editing-index: root.tunnel-editing-index;
|
|
editor-open <=> root.tunnel-editor-open;
|
|
edit-name <=> root.tunnel-edit-name;
|
|
edit-local-ip <=> root.tunnel-edit-local-ip;
|
|
edit-local-port <=> root.tunnel-edit-local-port;
|
|
edit-remote-port <=> root.tunnel-edit-remote-port;
|
|
edit-domains <=> root.tunnel-edit-domains;
|
|
edit-locations <=> root.tunnel-edit-locations;
|
|
edit-basic-auth-user <=> root.tunnel-edit-basic-auth-user;
|
|
edit-basic-auth-password <=> root.tunnel-edit-basic-auth-password;
|
|
edit-host-header-rewrite <=> root.tunnel-edit-host-header-rewrite;
|
|
edit-bandwidth-limit <=> root.tunnel-edit-bandwidth-limit;
|
|
edit-bandwidth-side-index <=> root.tunnel-edit-bandwidth-side-index;
|
|
edit-proxy-protocol-index <=> root.tunnel-edit-proxy-protocol-index;
|
|
edit-plugin-tls-term <=> root.tunnel-edit-plugin-tls-term;
|
|
edit-plugin-local-addr <=> root.tunnel-edit-plugin-local-addr;
|
|
edit-plugin-cert-file <=> root.tunnel-edit-plugin-cert-file;
|
|
edit-plugin-key-file <=> root.tunnel-edit-plugin-key-file;
|
|
edit-plugin-host-rewrite <=> root.tunnel-edit-plugin-host-rewrite;
|
|
edit-plugin-username <=> root.tunnel-edit-plugin-username;
|
|
edit-plugin-password <=> root.tunnel-edit-plugin-password;
|
|
edit-type-index <=> root.tunnel-edit-type-index;
|
|
show-advanced <=> root.tunnel-show-advanced;
|
|
add-clicked => { root.tunnel-add(); }
|
|
save-clicked => { root.tunnel-save(); }
|
|
cancel-clicked => { root.tunnel-cancel(); }
|
|
edit-row(i) => { root.tunnel-edit(i); }
|
|
delete-row(i) => { root.tunnel-delete(i); }
|
|
copy-remote(text) => { root.tunnel-copy-remote(text); }
|
|
pick-file(target) => { root.pick-file(target); }
|
|
}
|
|
|
|
ConfigPage {
|
|
x: parent.content-x;
|
|
y: parent.content-y;
|
|
width: parent.content-w;
|
|
height: parent.content-h;
|
|
visible: root.page == AppPage.config;
|
|
server-addr <=> root.server-addr;
|
|
server-port <=> root.server-port;
|
|
token <=> root.token;
|
|
user <=> root.user;
|
|
protocol-index <=> root.protocol-index;
|
|
pool-count <=> root.pool-count;
|
|
ws-path <=> root.ws-path;
|
|
tcp-mux <=> root.tcp-mux;
|
|
tls-enable <=> root.tls-enable;
|
|
show-advanced <=> root.config-show-advanced;
|
|
mux-keepalive <=> root.config-mux-keepalive;
|
|
heartbeat-interval <=> root.config-heartbeat-interval;
|
|
heartbeat-timeout <=> root.config-heartbeat-timeout;
|
|
udp-packet-size <=> root.config-udp-packet-size;
|
|
tls-server-name <=> root.config-tls-server-name;
|
|
tls-ca <=> root.config-tls-ca;
|
|
tls-cert <=> root.config-tls-cert;
|
|
tls-key <=> root.config-tls-key;
|
|
quic-keepalive <=> root.config-quic-keepalive;
|
|
quic-idle <=> root.config-quic-idle;
|
|
quic-streams <=> root.config-quic-streams;
|
|
config-file-path <=> root.config-file-path;
|
|
save-clicked => { root.config-save(); }
|
|
reset-clicked => { root.config-reset(); }
|
|
pick-file(target) => { root.pick-file(target); }
|
|
}
|
|
|
|
if root.page == AppPage.logger: LoggerPage {
|
|
x: parent.content-x;
|
|
y: parent.content-y;
|
|
width: parent.content-w;
|
|
height: parent.content-h;
|
|
query <=> root.log-query;
|
|
auto-scroll <=> root.log-auto-scroll;
|
|
lines: root.log-lines;
|
|
scroll-gen: root.log-scroll-gen;
|
|
clear-clicked => { root.logs-clear(); }
|
|
query-edited(q) => { root.log-query-edited(q); }
|
|
}
|
|
|
|
AboutPage {
|
|
x: parent.content-x;
|
|
y: parent.content-y;
|
|
width: parent.content-w;
|
|
height: parent.content-h;
|
|
visible: root.page == AppPage.about;
|
|
open-github => { root.open-url("https://github.com/orbien-org/orbien"); }
|
|
open-docs => { root.open-url("https://orbien-org.github.io/orbien/"); }
|
|
open-feedback => { root.open-url("https://github.com/orbien-org/orbien/issues"); }
|
|
open-slint-about => { root.show-about(); }
|
|
}
|
|
}
|
|
}
|
|
|
|
toast := ToastHost {
|
|
x: (root.width - self.width) / 2;
|
|
y: root.height - self.height - 28px;
|
|
width: min(420px, root.width - 48px);
|
|
visible: root.toast-visible;
|
|
visible-toast <=> root.toast-visible;
|
|
text <=> root.toast-text;
|
|
kind <=> root.toast-kind;
|
|
token <=> root.toast-token;
|
|
}
|
|
}
|