Skip to content

Commit

Permalink
Implement flutter ui [WIP]
Browse files Browse the repository at this point in the history
  • Loading branch information
qianlifeng committed Nov 29, 2023
1 parent 724b6ec commit 614e862
Show file tree
Hide file tree
Showing 10 changed files with 216 additions and 119 deletions.
54 changes: 54 additions & 0 deletions Wox.UI.Flutter/wox/lib/controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import 'dart:convert';

import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
import 'package:logger/logger.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:window_manager/window_manager.dart';
import 'package:wox/entities/show_app_params.dart';
import 'package:wox/entities/websocket_msg.dart';

class WoxController extends GetxController {
final query = "".obs;
final queryTextFieldController = TextEditingController();
late final WebSocketChannel channel;

void connect() {
var channel = WebSocketChannel.connect(Uri.parse("ws://localhost:34987/ws"));
channel.stream.listen((event) {
var msg = WebsocketMsg.fromJson(jsonDecode(event));
if (msg.type == "ToggleApp") {
toggleApp(msg.data);
}
});
}

Future<void> toggleApp(ShowAppParams params) async {
Logger().i("Toggle app");
var isVisible = await windowManager.isVisible();
if (isVisible) {
hide();
} else {
show(params);
}
}

void hide() {
windowManager.hide();
}

void show(ShowAppParams params) {
windowManager.show();
windowManager.focus();
if (params.position != null) {
windowManager.setPosition(Offset(params.position!.x as double, params.position!.y as double));
}
}

void onQueryChanged(String value) {
query.value = value;
Logger().i("Query changed: $value");

windowManager.setSize(Size(800, (value.length + 1) * 100), animate: false);
}
}
29 changes: 29 additions & 0 deletions Wox.UI.Flutter/wox/lib/entities/query.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
typedef SelectionType = String;
typedef LastQueryMode = String;

const SelectionType selectionTypeText = "text";
const SelectionType selectionTypeFile = "file";

const LastQueryMode lastQueryModePreserve = "preserve";
const LastQueryMode lastQueryModeEmpty = "empty";

class Selection {
SelectionType? type;

// Only available when Type is SelectionTypeText
String? text;

// Only available when Type is SelectionTypeFile
List<String>? filePaths;
}

class ChangedQuery {
String? queryType;
String? queryText;
Selection? querySelection;
}

class QueryHistory {
ChangedQuery? query;
int? timestamp;
}
19 changes: 19 additions & 0 deletions Wox.UI.Flutter/wox/lib/entities/show_app_params.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import 'package:wox/entities/query.dart';

typedef PositionType = String;

const PositionType positionTypeMouseScreen = "MouseScreen";
const PositionType positionTypeLastLocation = "LastLocation";

class Position {
PositionType? type;
int? x;
int? y;
}

class ShowAppParams {
bool? selectAll;
Position? position;
List<QueryHistory>? queryHistories;
LastQueryMode? lastQueryMode;
}
27 changes: 27 additions & 0 deletions Wox.UI.Flutter/wox/lib/entities/websocket_msg.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
class WebsocketMsg {
String? id;
String? type;
String? method;
bool? success;
dynamic data;

WebsocketMsg({this.id, this.type, this.method, this.success, this.data});

WebsocketMsg.fromJson(Map<String, dynamic> json) {
id = json['Id'];
type = json['Type'];
method = json['Method'];
success = json['Success'];
data = json['Data'];
}

Map<String, dynamic> toJson() {
return <String, dynamic>{
'Id': id,
'Type': type,
'Method': method,
'Success': success,
'Data': data,
};
}
}
111 changes: 19 additions & 92 deletions Wox.UI.Flutter/wox/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_acrylic/flutter_acrylic.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:get/get.dart';
import 'package:window_manager/window_manager.dart';
import 'package:wox/controller.dart';
import 'package:wox/views/querybox_view.dart';

void main() async {
WidgetsFlutterBinding.ensureInitialized();
Expand All @@ -16,6 +17,10 @@ void main() async {
dark: false,
);

final woxController = WoxController();
woxController.connect();
Get.lazyPut(() => woxController);

WindowOptions windowOptions = const WindowOptions(
size: Size(800, 300),
center: true,
Expand All @@ -25,7 +30,9 @@ void main() async {
titleBarStyle: TitleBarStyle.hidden,
windowButtonVisibility: false,
);
await windowManager.setVisibleOnAllWorkspaces(true, visibleOnFullScreen: true);
if (Platform.isMacOS) {
await windowManager.setVisibleOnAllWorkspaces(true, visibleOnFullScreen: true);
}
await windowManager.setAsFrameless();
windowManager.waitUntilReadyToShow(windowOptions, () async {
await windowManager.show();
Expand All @@ -40,106 +47,26 @@ class MyApp extends StatelessWidget {

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: MyHomePage(),
return const MaterialApp(
home: WoxApp(),
);
}
}

class MyHomePage extends StatefulWidget {
MyHomePage({super.key});
class WoxApp extends StatefulWidget {
const WoxApp({super.key});

@override
State<MyHomePage> createState() => _MyHomePageState();
State<WoxApp> createState() => _WoxAppState();
}

class _MyHomePageState extends State<MyHomePage> {
final _controller = TextEditingController();
WebSocketChannel? channel;
List<dynamic> results = [];

@override
void initState() {
super.initState();
connect();
}

connect() {
final wsUrl = Uri.parse("ws://localhost:34987/ws");
channel = WebSocketChannel.connect(wsUrl);
channel?.stream.listen((message) async {
print(message);

var msg = jsonDecode(message);
switch (msg["Method"]) {
case "Query":
setState(() {
results = msg["Data"];
});
break;
case "ToggleApp":
var isVisible = await windowManager.isVisible();
if (isVisible) {
await windowManager.hide();
} else {
await windowManager.show();
await windowManager.focus();
_controller.selection = TextSelection(baseOffset: 0, extentOffset: _controller.text.length);
}
case "Result":
print("result: ${msg["Params"]["result"]}");
break;
default:
print("unknown method: ${msg["Method"]}");
}
});
}

class _WoxAppState extends State<WoxApp> {
@override
Widget build(BuildContext context) {
return Scaffold(
return const Scaffold(
body: Column(
children: <Widget>[
RawKeyboardListener(
focusNode: FocusNode(),
onKey: (event) {
if (event.logicalKey == LogicalKeyboardKey.escape) {
windowManager.hide();
}
},
child: TextField(
controller: _controller,
onChanged: (value) {
setState(() {
results = [];
});
channel?.sink.add(jsonEncode({
"Id": "dfd",
"Method": "Query",
"Params": {
"query": value,
},
}));
},
),
),
//a alfred like result list
Expanded(
child: ListView.builder(
itemCount: results.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(results[index]["Title"]),
subtitle: Text(results[index]["SubTitle"]),
);
},
),
),
QueryBoxView(),
],
),
);
Expand Down
Empty file.
26 changes: 26 additions & 0 deletions Wox.UI.Flutter/wox/lib/views/querybox_view.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:wox/controller.dart';

class QueryBoxView extends GetView<WoxController> {
const QueryBoxView({super.key});

@override
Widget build(BuildContext context) {
return RawKeyboardListener(
focusNode: FocusNode(),
onKey: (event) {
if (event.logicalKey == LogicalKeyboardKey.escape) {
controller.hide();
}
},
child: TextField(
controller: controller.queryTextFieldController,
onChanged: (value) {
controller.onQueryChanged(value);
},
),
);
}
}
2 changes: 1 addition & 1 deletion Wox.UI.Flutter/wox/macos/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,4 @@ SPEC CHECKSUMS:

PODFILE CHECKSUM: 16208599a12443d53889ba2270a4985981cfb204

COCOAPODS: 1.12.1
COCOAPODS: 1.11.3
Loading

0 comments on commit 614e862

Please sign in to comment.