Merge pull request #6233 from fufesou/refact/displays_arrangement

Refact/displays arrangement
This commit is contained in:
RustDesk 2023-10-30 22:39:50 +08:00 committed by GitHub
commit e96ae7a650
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 97 additions and 54 deletions

View File

@ -580,6 +580,8 @@ class _MobileActionMenu extends StatelessWidget {
} }
} }
const _defaultButtonSize = Size(24.0, 18.0);
class _MonitorMenu extends StatelessWidget { class _MonitorMenu extends StatelessWidget {
final String id; final String id;
final FFI ffi; final FFI ffi;
@ -604,7 +606,7 @@ class _MonitorMenu extends StatelessWidget {
Widget buildMonitorMenu() { Widget buildMonitorMenu() {
return _IconSubmenuButton( return _IconSubmenuButton(
tooltip: 'Select Monitor', tooltip: 'Select Monitor',
icon: icon(), icon: icon(_defaultButtonSize),
ffi: ffi, ffi: ffi,
color: _ToolbarTheme.blueColor, color: _ToolbarTheme.blueColor,
hoverColor: _ToolbarTheme.hoverBlueColor, hoverColor: _ToolbarTheme.hoverBlueColor,
@ -644,26 +646,29 @@ class _MonitorMenu extends StatelessWidget {
child: Text(translate('Show displays as individual windows'))); child: Text(translate('Show displays as individual windows')));
} }
buildOneMonitorButton(i, curDisplay) => Text(
'${i + 1}',
style: TextStyle(
color: i == curDisplay
? _ToolbarTheme.blueColor
: _ToolbarTheme.inactiveColor,
fontSize: 12,
fontWeight: FontWeight.bold,
),
);
List<Widget> buildMonitorList(bool isMulti) { List<Widget> buildMonitorList(bool isMulti) {
final List<Widget> monitorList = []; final List<Widget> monitorList = [];
final pi = ffi.ffiModel.pi; final pi = ffi.ffiModel.pi;
getMonitorText(int i) {
if (i == kAllDisplayValue) {
if (pi.displays.length == 2) {
return '1|2';
} else {
return 'ALL';
}
} else {
return (i + 1).toString();
}
}
buildMonitorButton(int i) => Obx(() { buildMonitorButton(int i) => Obx(() {
RxInt display = CurrentDisplayState.find(id); RxInt display = CurrentDisplayState.find(id);
return _IconMenuButton( return _IconMenuButton(
tooltip: isMulti ? '' : '#${i + 1} monitor', tooltip: isMulti
? ''
: i == kAllDisplayValue
? 'all monitors'
: '#${i + 1} monitor',
hMargin: isMulti ? null : 6, hMargin: isMulti ? null : 6,
vMargin: isMulti ? null : 12, vMargin: isMulti ? null : 12,
topLevel: false, topLevel: false,
@ -685,18 +690,9 @@ class _MonitorMenu extends StatelessWidget {
colorFilter: colorFilter:
ColorFilter.mode(Colors.white, BlendMode.srcIn), ColorFilter.mode(Colors.white, BlendMode.srcIn),
), ),
Obx( i == kAllDisplayValue
() => Text( ? globalMonitorsWidget(_defaultButtonSize)
getMonitorText(i), : Obx(() => buildOneMonitorButton(i, display.value)),
style: TextStyle(
color: i == display.value
? _ToolbarTheme.blueColor
: _ToolbarTheme.inactiveColor,
fontSize: 12,
fontWeight: FontWeight.bold,
),
),
),
], ],
), ),
), ),
@ -713,29 +709,72 @@ class _MonitorMenu extends StatelessWidget {
return monitorList; return monitorList;
} }
icon() { globalMonitorsWidget(Size size) {
final pi = ffi.ffiModel.pi; final pi = ffi.ffiModel.pi;
return Stack( return Obx(() {
RxInt display = CurrentDisplayState.find(id);
final rect = ffi.ffiModel.globalDisplaysRect();
if (rect == null) {
return Offstage();
}
final scaleX = size.width / rect.width;
final scaleY = size.height / rect.height;
final children = <Widget>[];
for (var i = 0; i < pi.displays.length; i++) {
final d = pi.displays[i];
final fontSize = (d.width * scaleX < d.height * scaleY
? d.width * scaleX
: d.height * scaleY) *
0.75;
children.add(Positioned(
left: (d.x - rect.left) * scaleX,
top: (d.y - rect.top) * scaleY,
child: SizedBox(
width: d.width * scaleX,
height: d.height * scaleY,
child: Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.grey,
width: 1.0,
),
borderRadius: BorderRadius.circular(1.0),
),
child: Center(
child: Text(
'${i + 1}',
style: TextStyle(
color: display.value == i
? _ToolbarTheme.blueColor
: _ToolbarTheme.inactiveColor,
fontSize: fontSize,
fontWeight: FontWeight.bold,
),
)),
),
),
));
}
return Container(
width: size.width,
height: size.height,
child: Stack(
children: children,
),
);
});
}
icon(Size size) => Stack(
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
"assets/screen.svg", "assets/screen.svg",
colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),
), ),
Obx(() { globalMonitorsWidget(size),
RxInt display = CurrentDisplayState.find(id);
return Text(
'${display.value == kAllDisplayValue ? 'A' : '${display.value + 1}'}/${pi.displays.length}',
style: const TextStyle(
color: _ToolbarTheme.blueColor,
fontSize: 8,
fontWeight: FontWeight.bold,
),
);
}),
], ],
); );
}
onPressed(int i, PeerInfo pi) { onPressed(int i, PeerInfo pi) {
_menuDismissCallback(ffi); _menuDismissCallback(ffi);

View File

@ -138,8 +138,9 @@ class FfiModel with ChangeNotifier {
sessionId = parent.target!.sessionId; sessionId = parent.target!.sessionId;
} }
Rect? displaysRect() { Rect? globalDisplaysRect() => _getDisplaysRect(_pi.displays);
final displays = _pi.getCurDisplays(); Rect? displaysRect() => _getDisplaysRect(_pi.getCurDisplays());
Rect? _getDisplaysRect(List<Display> displays) {
if (displays.isEmpty) { if (displays.isEmpty) {
return null; return null;
} }
@ -666,11 +667,12 @@ class FfiModel with ChangeNotifier {
if (connType == ConnType.fileTransfer) { if (connType == ConnType.fileTransfer) {
parent.target?.fileModel.onReady(); parent.target?.fileModel.onReady();
} else if (connType == ConnType.defaultConn) { } else if (connType == ConnType.defaultConn) {
_pi.displays = []; List<Display> newDisplays = [];
List<dynamic> displays = json.decode(evt['displays']); List<dynamic> displays = json.decode(evt['displays']);
for (int i = 0; i < displays.length; ++i) { for (int i = 0; i < displays.length; ++i) {
_pi.displays.add(evtToDisplay(displays[i])); newDisplays.add(evtToDisplay(displays[i]));
} }
_pi.displays.value = newDisplays;
_pi.displaysCount.value = _pi.displays.length; _pi.displaysCount.value = _pi.displays.length;
if (_pi.currentDisplay < _pi.displays.length) { if (_pi.currentDisplay < _pi.displays.length) {
// now replaced to _updateCurDisplay // now replaced to _updateCurDisplay
@ -860,7 +862,7 @@ class FfiModel with ChangeNotifier {
for (int i = 0; i < displays.length; ++i) { for (int i = 0; i < displays.length; ++i) {
newDisplays.add(evtToDisplay(displays[i])); newDisplays.add(evtToDisplay(displays[i]));
} }
_pi.displays = newDisplays; _pi.displays.value = newDisplays;
_pi.displaysCount.value = _pi.displays.length; _pi.displaysCount.value = _pi.displays.length;
if (_pi.currentDisplay == kAllDisplayValue) { if (_pi.currentDisplay == kAllDisplayValue) {
@ -908,11 +910,11 @@ class FfiModel with ChangeNotifier {
_pi.platformAdditions.remove(kPlatformAdditionsVirtualDisplays); _pi.platformAdditions.remove(kPlatformAdditionsVirtualDisplays);
} else { } else {
try { try {
final updateJson = json.decode(updateData); final updateJson = json.decode(updateData) as Map<String, dynamic>;
for (final key in updateJson.keys) { for (final key in updateJson.keys) {
_pi.platformAdditions[key] = updateJson[key]; _pi.platformAdditions[key] = updateJson[key];
} }
if (!updateJson.contains(kPlatformAdditionsVirtualDisplays)) { if (!updateJson.containsKey(kPlatformAdditionsVirtualDisplays)) {
_pi.platformAdditions.remove(kPlatformAdditionsVirtualDisplays); _pi.platformAdditions.remove(kPlatformAdditionsVirtualDisplays);
} }
} catch (e) { } catch (e) {
@ -2321,7 +2323,7 @@ class PeerInfo with ChangeNotifier {
bool isSupportMultiUiSession = false; bool isSupportMultiUiSession = false;
int currentDisplay = 0; int currentDisplay = 0;
int primaryDisplay = kInvalidDisplayIndex; int primaryDisplay = kInvalidDisplayIndex;
List<Display> displays = []; RxList<Display> displays = <Display>[].obs;
Features features = Features(); Features features = Features();
List<Resolution> resolutions = []; List<Resolution> resolutions = [];
Map<String, dynamic> platformAdditions = {}; Map<String, dynamic> platformAdditions = {};

View File

@ -142,6 +142,8 @@ pub fn reset_all() -> ResultType<()> {
let mut manager = VIRTUAL_DISPLAY_MANAGER.lock().unwrap(); let mut manager = VIRTUAL_DISPLAY_MANAGER.lock().unwrap();
if !manager.peer_index_name.is_empty() || manager.headless_index_name.is_some() { if !manager.peer_index_name.is_empty() || manager.headless_index_name.is_some() {
manager.install_update_driver()?; manager.install_update_driver()?;
manager.peer_index_name.clear();
manager.headless_index_name = None;
} }
Ok(()) Ok(())
} }