Evan's Blog
EvanZhu0721 / 公开仓库

SBMS

镜像已同步

SBMS complete the calculation rules for the default logical desktop topology relationship and the physical dimensions of the displays in the Windows multi-screen collaboration system.

上游 GitHub
READ-ONLY MIRROR

README、源码与 Release 已保存到本站;源码视图固定到 commit bd87fa1e。

main/ root / ui/pages
bd87fa1e· 固定源码快照
ui/pages/screen-size.slint9.3 KB
1import { LineEdit } from "std-widgets.slint";
2import {
3 BackButton,
4 CompactComboBox,
5 PageActionButton,
6} from "../controls.slint";
7import { MdTokens } from "../theme.slint";
8
9export component ScreenSizePage inherits FocusScope {
10 in property <string> screen-size-target: "";
11 in property <string> screen-size-native-mode: "";
12 in property <string> screen-size-detected-mm: "Not reported";
13 in property <string> screen-size-detected-inches: "";
14 in-out property <string> screen-size-manual-inches: "";
15 in-out property <int> screen-size-aspect-ratio: 0;
16 in property <string> screen-size-effective-mm: "";
17 in property <string> screen-size-effective-inches: "";
18 in property <string> screen-size-source: "";
19 in property <string> screen-size-error: "";
20 in property <bool> screen-size-valid: true;
21 in property <bool> screen-size-save-blocked: false;
22
23 callback close-screen-size();
24 callback screen-size-edited();
25 callback reset-screen-size();
26 callback reread-screen-size();
27 callback save-screen-size();
28
29 key-pressed(event) => {
30 if event.text == Key.Escape {
31 root.close-screen-size();
32 return accept;
33 }
34 return reject;
35 }
36
37 Rectangle {
38 width: parent.width;
39 height: parent.height;
40 background: MdTokens.surface;
41
42 VerticalLayout {
43 padding: MdTokens.space-2;
44 spacing: MdTokens.space-1;
45
46 HorizontalLayout {
47 height: MdTokens.target;
48 spacing: MdTokens.space-1;
49 BackButton {
50 accessible-label: "Back to mapping group";
51 clicked => { root.close-screen-size(); }
52 }
53 Text {
54 text: "Screen size";
55 color: MdTokens.on-surface;
56 font-size: MdTokens.type-title-large;
57 font-weight: MdTokens.weight-medium;
58 vertical-alignment: center;
59 }
60 }
61
62 Rectangle {
63 height: 92px;
64 background: MdTokens.surface-container;
65 border-radius: MdTokens.shape-medium;
66 VerticalLayout {
67 padding: 12px;
68 spacing: 3px;
69 Text {
70 text: root.screen-size-target;
71 color: MdTokens.on-surface;
72 font-size: MdTokens.type-title-medium;
73 font-weight: MdTokens.weight-medium;
74 overflow: elide;
75 }
76 Text {
77 text: "EDID · " + root.screen-size-detected-mm;
78 color: MdTokens.on-surface-variant;
79 font-size: MdTokens.type-body-medium;
80 }
81 Text {
82 text: root.screen-size-detected-inches + " · " + root.screen-size-native-mode;
83 color: MdTokens.on-surface-variant;
84 font-size: MdTokens.type-body-small;
85 overflow: elide;
86 }
87 }
88 }
89
90 Rectangle {
91 height: 136px;
92 background: MdTokens.surface-container;
93 border-radius: MdTokens.shape-medium;
94 VerticalLayout {
95 padding: 12px;
96 spacing: MdTokens.space-1;
97 Text {
98 text: "Manual override";
99 color: MdTokens.on-surface;
100 font-size: MdTokens.type-body-medium;
101 font-weight: MdTokens.weight-medium;
102 }
103 HorizontalLayout {
104 height: MdTokens.target;
105 spacing: MdTokens.space-1;
106 LineEdit {
107 horizontal-stretch: 1;
108 height: MdTokens.target;
109 text <=> root.screen-size-manual-inches;
110 placeholder-text: "Diagonal in";
111 input-type: InputType.decimal;
112 accessible-label: "Target display diagonal in inches";
113 edited => { root.screen-size-edited(); }
114 }
115 CompactComboBox {
116 width: 112px;
117 height: MdTokens.target;
118 model: ["Native", "16:9", "16:10", "3:2", "4:3", "21:9", "32:9"];
119 current-index <=> root.screen-size-aspect-ratio;
120 control-enabled: root.screen-size-manual-inches != "";
121 field-label: "Target display physical aspect ratio";
122 selected => { root.screen-size-edited(); }
123 }
124 }
125 Text {
126 text: "Diagonal and ratio determine the effective dimensions";
127 color: MdTokens.on-surface-variant;
128 font-size: MdTokens.type-body-small;
129 overflow: elide;
130 }
131 }
132 }
133
134 Rectangle {
135 height: 72px;
136 background: root.screen-size-error == ""
137 ? MdTokens.primary-container : MdTokens.error-container;
138 border-radius: MdTokens.shape-medium;
139 VerticalLayout {
140 padding: 12px;
141 alignment: center;
142 spacing: 3px;
143 Text {
144 text: root.screen-size-error == ""
145 ? "Effective · " + root.screen-size-effective-mm
146 : "Check the value";
147 color: root.screen-size-error == ""
148 ? MdTokens.on-primary-container : MdTokens.on-error-container;
149 font-size: MdTokens.type-title-medium;
150 font-weight: MdTokens.weight-medium;
151 overflow: elide;
152 }
153 Text {
154 text: root.screen-size-error == ""
155 ? root.screen-size-effective-inches + " · " + root.screen-size-source
156 : root.screen-size-error;
157 color: root.screen-size-error == ""
158 ? MdTokens.on-primary-container : MdTokens.on-error-container;
159 font-size: MdTokens.type-body-small;
160 overflow: elide;
161 }
162 }
163 }
164
165 Text {
166 height: 32px;
167 text: "Only virtual-resolution calculations use this value.";
168 color: MdTokens.on-surface-variant;
169 font-size: MdTokens.type-body-small;
170 wrap: word-wrap;
171 }
172
173 Rectangle { vertical-stretch: 1; }
174
175 HorizontalLayout {
176 height: MdTokens.target;
177 spacing: MdTokens.space-1;
178 PageActionButton {
179 text: "Reset";
180 enabled: !root.screen-size-save-blocked;
181 accessible-label: "Use detected EDID size";
182 clicked => { root.reset-screen-size(); }
183 }
184 PageActionButton {
185 text: "Re-read";
186 accessible-label: "Read display EDID again";
187 clicked => { root.reread-screen-size(); }
188 }
189 Rectangle { horizontal-stretch: 1; }
190 PageActionButton {
191 text: "Save";
192 enabled: root.screen-size-valid && !root.screen-size-save-blocked;
193 primary: true;
194 accessible-label: "Save target display physical size";
195 clicked => { root.save-screen-size(); }
196 }
197 }
198 }
199 }
200}
201