Merge pull request #686 from Kingtous/flutter_desktop
feat: add tray icon to status bar & fix: multi window injection and titlebar issue
This commit is contained in:
commit
c94d10782c
BIN
flutter/assets/logo.ico
Normal file
BIN
flutter/assets/logo.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
@ -52,12 +52,7 @@ class _ConnectionPageState extends State<ConnectionPage> {
|
|||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
getUpdateUI(),
|
getUpdateUI(),
|
||||||
Row(
|
getSearchBarUI(),
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
getSearchBarUI(),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
SizedBox(height: 12),
|
SizedBox(height: 12),
|
||||||
getPeers(),
|
getPeers(),
|
||||||
]),
|
]),
|
||||||
|
@ -64,37 +64,34 @@ class _ConnectionTabPageState extends State<ConnectionTabPage>
|
|||||||
animationDuration: Duration.zero,
|
animationDuration: Duration.zero,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
SizedBox(
|
DesktopTitleBar(
|
||||||
height: 50,
|
child: TabBar(
|
||||||
child: DesktopTitleBar(
|
isScrollable: true,
|
||||||
child: TabBar(
|
labelColor: Colors.white,
|
||||||
isScrollable: true,
|
physics: NeverScrollableScrollPhysics(),
|
||||||
labelColor: Colors.white,
|
indicatorColor: Colors.white,
|
||||||
physics: NeverScrollableScrollPhysics(),
|
tabs: connectionIds
|
||||||
indicatorColor: Colors.white,
|
.map((e) => Tab(
|
||||||
tabs: connectionIds
|
child: Row(
|
||||||
.map((e) => Tab(
|
mainAxisSize: MainAxisSize.min,
|
||||||
child: Row(
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
mainAxisSize: MainAxisSize.min,
|
children: [
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
Text(e),
|
||||||
children: [
|
SizedBox(
|
||||||
Text(e),
|
width: 4,
|
||||||
SizedBox(
|
),
|
||||||
width: 4,
|
InkWell(
|
||||||
),
|
onTap: () {
|
||||||
InkWell(
|
onRemoveId(e);
|
||||||
onTap: () {
|
},
|
||||||
onRemoveId(e);
|
child: Icon(
|
||||||
},
|
Icons.highlight_remove,
|
||||||
child: Icon(
|
size: 20,
|
||||||
Icons.highlight_remove,
|
))
|
||||||
size: 20,
|
],
|
||||||
))
|
),
|
||||||
],
|
))
|
||||||
),
|
.toList()),
|
||||||
))
|
|
||||||
.toList()),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: TabBarView(
|
child: TabBarView(
|
||||||
|
@ -1,9 +1,13 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart' hide MenuItem;
|
||||||
import 'package:flutter_hbb/common.dart';
|
import 'package:flutter_hbb/common.dart';
|
||||||
import 'package:flutter_hbb/desktop/pages/connection_page.dart';
|
import 'package:flutter_hbb/desktop/pages/connection_page.dart';
|
||||||
import 'package:flutter_hbb/desktop/widgets/titlebar_widget.dart';
|
import 'package:flutter_hbb/desktop/widgets/titlebar_widget.dart';
|
||||||
import 'package:flutter_hbb/models/model.dart';
|
import 'package:flutter_hbb/models/model.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:tray_manager/tray_manager.dart';
|
||||||
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
class DesktopHomePage extends StatefulWidget {
|
class DesktopHomePage extends StatefulWidget {
|
||||||
DesktopHomePage({Key? key}) : super(key: key);
|
DesktopHomePage({Key? key}) : super(key: key);
|
||||||
@ -14,26 +18,22 @@ class DesktopHomePage extends StatefulWidget {
|
|||||||
|
|
||||||
const borderColor = Color(0xFF2F65BA);
|
const borderColor = Color(0xFF2F65BA);
|
||||||
|
|
||||||
class _DesktopHomePageState extends State<DesktopHomePage> {
|
class _DesktopHomePageState extends State<DesktopHomePage> with TrayListener {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: Column(
|
body: Column(
|
||||||
children: [
|
children: [
|
||||||
Row(
|
DesktopTitleBar(
|
||||||
children: [
|
child: Center(
|
||||||
DesktopTitleBar(
|
child: Text(
|
||||||
child: Center(
|
"RustDesk",
|
||||||
child: Text(
|
style: TextStyle(
|
||||||
"RustDesk",
|
color: Colors.white,
|
||||||
style: TextStyle(
|
fontSize: 20,
|
||||||
color: Colors.white,
|
fontWeight: FontWeight.bold),
|
||||||
fontSize: 20,
|
),
|
||||||
fontWeight: FontWeight.bold),
|
),
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Container(
|
child: Container(
|
||||||
@ -207,4 +207,30 @@ class _DesktopHomePageState extends State<DesktopHomePage> {
|
|||||||
buildRecentSession(BuildContext context) {
|
buildRecentSession(BuildContext context) {
|
||||||
return Center(child: Text("waiting implementation"));
|
return Center(child: Text("waiting implementation"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onTrayMenuItemClick(MenuItem menuItem) {
|
||||||
|
print("click ${menuItem.key}");
|
||||||
|
switch (menuItem.key) {
|
||||||
|
case "quit":
|
||||||
|
exit(0);
|
||||||
|
case "show":
|
||||||
|
windowManager.show();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
trayManager.addListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
trayManager.removeListener(this);
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,16 +12,16 @@ class DesktopTitleBar extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Expanded(
|
return Container(
|
||||||
child: Container(
|
decoration: const BoxDecoration(
|
||||||
decoration: const BoxDecoration(
|
gradient: LinearGradient(
|
||||||
gradient: LinearGradient(
|
begin: Alignment.topCenter,
|
||||||
begin: Alignment.topCenter,
|
end: Alignment.bottomCenter,
|
||||||
end: Alignment.bottomCenter,
|
colors: [backgroundStartColor, backgroundEndColor],
|
||||||
colors: [backgroundStartColor, backgroundEndColor],
|
stops: [0.0, 1.0]),
|
||||||
stops: [0.0, 1.0]),
|
),
|
||||||
),
|
child: WindowTitleBarBox(
|
||||||
child: WindowTitleBarBox(
|
child: SizedBox(
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(
|
Expanded(
|
||||||
|
@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart';
|
import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart';
|
||||||
import 'package:flutter_hbb/desktop/screen/desktop_remote_screen.dart';
|
import 'package:flutter_hbb/desktop/screen/desktop_remote_screen.dart';
|
||||||
import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
||||||
|
import 'package:flutter_hbb/utils/tray_manager.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
@ -52,6 +53,7 @@ void runRustDeskApp(List<String> args) async {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
initTray();
|
||||||
FFI.serverModel.startService();
|
FFI.serverModel.startService();
|
||||||
runApp(App());
|
runApp(App());
|
||||||
doWhenWindowReady(() {
|
doWhenWindowReady(() {
|
||||||
|
22
flutter/lib/utils/tray_manager.dart
Normal file
22
flutter/lib/utils/tray_manager.dart
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter_hbb/models/model.dart';
|
||||||
|
import 'package:tray_manager/tray_manager.dart';
|
||||||
|
|
||||||
|
Future<void> initTray({List<MenuItem>? extra_item}) async {
|
||||||
|
List<MenuItem> items = [
|
||||||
|
MenuItem(key: "show", label: translate("show rustdesk")),
|
||||||
|
MenuItem.separator(),
|
||||||
|
MenuItem(key: "quit", label: translate("quit rustdesk")),
|
||||||
|
];
|
||||||
|
if (extra_item != null) {
|
||||||
|
items.insertAll(0, extra_item);
|
||||||
|
}
|
||||||
|
await Future.wait([
|
||||||
|
trayManager
|
||||||
|
.setIcon(Platform.isWindows ? "assets/logo.ico" : "assets/logo.png"),
|
||||||
|
trayManager.setContextMenu(Menu(items: items)),
|
||||||
|
trayManager.setToolTip("rustdesk"),
|
||||||
|
trayManager.setTitle("rustdesk")
|
||||||
|
]);
|
||||||
|
}
|
@ -222,8 +222,8 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: "4aab101f17f02312dc45311eb3009cc0ea5357c1"
|
ref: "704718b2853723b615675e048f1f385cbfb209a6"
|
||||||
resolved-ref: "4aab101f17f02312dc45311eb3009cc0ea5357c1"
|
resolved-ref: "704718b2853723b615675e048f1f385cbfb209a6"
|
||||||
url: "https://github.com/Kingtous/rustdesk_desktop_multi_window"
|
url: "https://github.com/Kingtous/rustdesk_desktop_multi_window"
|
||||||
source: git
|
source: git
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
@ -408,7 +408,7 @@ packages:
|
|||||||
name: flutter_smart_dialog
|
name: flutter_smart_dialog
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.3.2"
|
version: "4.3.2+1"
|
||||||
flutter_test:
|
flutter_test:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description: flutter
|
description: flutter
|
||||||
@ -566,6 +566,13 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.4"
|
version: "0.1.4"
|
||||||
|
menu_base:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: menu_base
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.1"
|
||||||
meta:
|
meta:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -771,6 +778,13 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.0"
|
version: "3.1.0"
|
||||||
|
screen_retriever:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: screen_retriever
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.2"
|
||||||
settings_ui:
|
settings_ui:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -848,6 +862,13 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.1"
|
version: "1.0.1"
|
||||||
|
shortid:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: shortid
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.2"
|
||||||
sky_engine:
|
sky_engine:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
@ -930,6 +951,13 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.0"
|
||||||
|
tray_manager:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: tray_manager
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.7"
|
||||||
tuple:
|
tuple:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -1076,7 +1104,7 @@ packages:
|
|||||||
name: window_manager
|
name: window_manager
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.3"
|
version: "0.2.5"
|
||||||
xdg_directories:
|
xdg_directories:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -58,13 +58,14 @@ dependencies:
|
|||||||
url: https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge
|
url: https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge
|
||||||
ref: master
|
ref: master
|
||||||
path: frb_dart
|
path: frb_dart
|
||||||
window_manager: ^0.2.3
|
window_manager: ^0.2.5
|
||||||
desktop_multi_window:
|
desktop_multi_window:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/Kingtous/rustdesk_desktop_multi_window
|
url: https://github.com/Kingtous/rustdesk_desktop_multi_window
|
||||||
ref: 4aab101f17f02312dc45311eb3009cc0ea5357c1
|
ref: 704718b2853723b615675e048f1f385cbfb209a6
|
||||||
bitsdojo_window: ^0.1.2
|
bitsdojo_window: ^0.1.2
|
||||||
freezed_annotation: ^2.0.3
|
freezed_annotation: ^2.0.3
|
||||||
|
tray_manager: 0.1.7
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_launcher_icons: ^0.9.1
|
flutter_launcher_icons: ^0.9.1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user