Skip to content

Commit

Permalink
WIP: Optimize Flutter Code
Browse files Browse the repository at this point in the history
  • Loading branch information
lylwx committed Dec 1, 2023
1 parent 9b128c1 commit eb1b0cb
Show file tree
Hide file tree
Showing 13 changed files with 354 additions and 28 deletions.
16 changes: 16 additions & 0 deletions Wox.UI.Flutter/wox/lib/api/wox_api.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'dart:core';

import 'package:wox/entity/wox_theme.dart';
import 'package:wox/utils/wox_http_util.dart';

class WoxApi {
WoxApi._privateConstructor();

static final WoxApi _instance = WoxApi._privateConstructor();

static WoxApi get instance => _instance;

Future<WoxTheme> loadTheme() async {
return await WoxHttpUtil.instance.postData<WoxTheme>("/theme", null);
}
}
4 changes: 2 additions & 2 deletions Wox.UI.Flutter/wox/lib/components/wox_result_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class WoxResultView extends StatelessWidget {
final QueryResult result;
final bool isActive;

WoxResultView({super.key, required this.result, required this.isActive});
const WoxResultView({super.key, required this.result, required this.isActive});

@override
Widget build(BuildContext context) {
Expand All @@ -16,7 +16,7 @@ class WoxResultView extends StatelessWidget {
child: Row(
children: [
WoxImageView(woxImage: result.icon),
SizedBox(width: 8),
const SizedBox(width: 8),
Expanded(
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Text(
Expand Down
23 changes: 23 additions & 0 deletions Wox.UI.Flutter/wox/lib/entity/wox_response.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
class WoxResponse {
bool? success;
String? message;
dynamic data;

WoxResponse({this.success, this.message, this.data});

WoxResponse.fromJson(Map<String, dynamic> json) {
success = json['Success'];
message = json['Message'];
data = json['Data'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['Success'] = success;
data['Message'] = message;
if (this.data != null) {
data['Data'] = this.data!.toJson();
}
return data;
}
}
192 changes: 192 additions & 0 deletions Wox.UI.Flutter/wox/lib/entity/wox_theme.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
class WoxTheme {
String? themeId;
String? themeName;
String? themeAuthor;
String? themeUrl;
String? version;
String? appBackgroundColor;
int? appPaddingLeft;
int? appPaddingTop;
int? appPaddingRight;
int? appPaddingBottom;
int? resultContainerPaddingLeft;
int? resultContainerPaddingTop;
int? resultContainerPaddingRight;
int? resultContainerPaddingBottom;
int? resultItemBorderRadius;
int? resultItemPaddingLeft;
int? resultItemPaddingTop;
int? resultItemPaddingRight;
int? resultItemPaddingBottom;
String? resultItemTitleColor;
String? resultItemSubTitleColor;
String? resultItemBorderLeft;
String? resultItemActiveBackgroundColor;
String? resultItemActiveTitleColor;
String? resultItemActiveSubTitleColor;
String? resultItemActiveBorderLeft;
String? queryBoxFontColor;
String? queryBoxBackgroundColor;
int? queryBoxBorderRadius;
String? actionContainerBackgroundColor;
String? actionContainerHeaderFontColor;
int? actionContainerPaddingLeft;
int? actionContainerPaddingTop;
int? actionContainerPaddingRight;
int? actionContainerPaddingBottom;
String? actionItemActiveBackgroundColor;
String? actionItemActiveFontColor;
String? actionItemFontColor;
String? actionQueryBoxFontColor;
String? actionQueryBoxBackgroundColor;
int? actionQueryBoxBorderRadius;
String? previewFontColor;
String? previewSplitLineColor;
String? previewPropertyTitleColor;
String? previewPropertyContentColor;

WoxTheme(
{themeId,
themeName,
themeAuthor,
themeUrl,
version,
appBackgroundColor,
appPaddingLeft,
appPaddingTop,
appPaddingRight,
appPaddingBottom,
resultContainerPaddingLeft,
resultContainerPaddingTop,
resultContainerPaddingRight,
resultContainerPaddingBottom,
resultItemBorderRadius,
resultItemPaddingLeft,
resultItemPaddingTop,
resultItemPaddingRight,
resultItemPaddingBottom,
resultItemTitleColor,
resultItemSubTitleColor,
resultItemBorderLeft,
resultItemActiveBackgroundColor,
resultItemActiveTitleColor,
resultItemActiveSubTitleColor,
resultItemActiveBorderLeft,
queryBoxFontColor,
queryBoxBackgroundColor,
queryBoxBorderRadius,
actionContainerBackgroundColor,
actionContainerHeaderFontColor,
actionContainerPaddingLeft,
actionContainerPaddingTop,
actionContainerPaddingRight,
actionContainerPaddingBottom,
actionItemActiveBackgroundColor,
actionItemActiveFontColor,
actionItemFontColor,
actionQueryBoxFontColor,
actionQueryBoxBackgroundColor,
actionQueryBoxBorderRadius,
previewFontColor,
previewSplitLineColor,
previewPropertyTitleColor,
previewPropertyContentColor});

WoxTheme.fromJson(Map<String, dynamic> json) {
themeId = json['ThemeId'];
themeName = json['ThemeName'];
themeAuthor = json['ThemeAuthor'];
themeUrl = json['ThemeUrl'];
version = json['Version'];
appBackgroundColor = json['AppBackgroundColor'];
appPaddingLeft = json['AppPaddingLeft'];
appPaddingTop = json['AppPaddingTop'];
appPaddingRight = json['AppPaddingRight'];
appPaddingBottom = json['AppPaddingBottom'];
resultContainerPaddingLeft = json['ResultContainerPaddingLeft'];
resultContainerPaddingTop = json['ResultContainerPaddingTop'];
resultContainerPaddingRight = json['ResultContainerPaddingRight'];
resultContainerPaddingBottom = json['ResultContainerPaddingBottom'];
resultItemBorderRadius = json['ResultItemBorderRadius'];
resultItemPaddingLeft = json['ResultItemPaddingLeft'];
resultItemPaddingTop = json['ResultItemPaddingTop'];
resultItemPaddingRight = json['ResultItemPaddingRight'];
resultItemPaddingBottom = json['ResultItemPaddingBottom'];
resultItemTitleColor = json['ResultItemTitleColor'];
resultItemSubTitleColor = json['ResultItemSubTitleColor'];
resultItemBorderLeft = json['ResultItemBorderLeft'];
resultItemActiveBackgroundColor = json['ResultItemActiveBackgroundColor'];
resultItemActiveTitleColor = json['ResultItemActiveTitleColor'];
resultItemActiveSubTitleColor = json['ResultItemActiveSubTitleColor'];
resultItemActiveBorderLeft = json['ResultItemActiveBorderLeft'];
queryBoxFontColor = json['QueryBoxFontColor'];
queryBoxBackgroundColor = json['QueryBoxBackgroundColor'];
queryBoxBorderRadius = json['QueryBoxBorderRadius'];
actionContainerBackgroundColor = json['ActionContainerBackgroundColor'];
actionContainerHeaderFontColor = json['ActionContainerHeaderFontColor'];
actionContainerPaddingLeft = json['ActionContainerPaddingLeft'];
actionContainerPaddingTop = json['ActionContainerPaddingTop'];
actionContainerPaddingRight = json['ActionContainerPaddingRight'];
actionContainerPaddingBottom = json['ActionContainerPaddingBottom'];
actionItemActiveBackgroundColor = json['ActionItemActiveBackgroundColor'];
actionItemActiveFontColor = json['ActionItemActiveFontColor'];
actionItemFontColor = json['ActionItemFontColor'];
actionQueryBoxFontColor = json['ActionQueryBoxFontColor'];
actionQueryBoxBackgroundColor = json['ActionQueryBoxBackgroundColor'];
actionQueryBoxBorderRadius = json['ActionQueryBoxBorderRadius'];
previewFontColor = json['PreviewFontColor'];
previewSplitLineColor = json['PreviewSplitLineColor'];
previewPropertyTitleColor = json['PreviewPropertyTitleColor'];
previewPropertyContentColor = json['PreviewPropertyContentColor'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['ThemeId'] = themeId;
data['ThemeName'] = themeName;
data['ThemeAuthor'] = themeAuthor;
data['ThemeUrl'] = themeUrl;
data['Version'] = version;
data['AppBackgroundColor'] = appBackgroundColor;
data['AppPaddingLeft'] = appPaddingLeft;
data['AppPaddingTop'] = appPaddingTop;
data['AppPaddingRight'] = appPaddingRight;
data['AppPaddingBottom'] = appPaddingBottom;
data['ResultContainerPaddingLeft'] = resultContainerPaddingLeft;
data['ResultContainerPaddingTop'] = resultContainerPaddingTop;
data['ResultContainerPaddingRight'] = resultContainerPaddingRight;
data['ResultContainerPaddingBottom'] = resultContainerPaddingBottom;
data['ResultItemBorderRadius'] = resultItemBorderRadius;
data['ResultItemPaddingLeft'] = resultItemPaddingLeft;
data['ResultItemPaddingTop'] = resultItemPaddingTop;
data['ResultItemPaddingRight'] = resultItemPaddingRight;
data['ResultItemPaddingBottom'] = resultItemPaddingBottom;
data['ResultItemTitleColor'] = resultItemTitleColor;
data['ResultItemSubTitleColor'] = resultItemSubTitleColor;
data['ResultItemBorderLeft'] = resultItemBorderLeft;
data['ResultItemActiveBackgroundColor'] = resultItemActiveBackgroundColor;
data['ResultItemActiveTitleColor'] = resultItemActiveTitleColor;
data['ResultItemActiveSubTitleColor'] = resultItemActiveSubTitleColor;
data['ResultItemActiveBorderLeft'] = resultItemActiveBorderLeft;
data['QueryBoxFontColor'] = queryBoxFontColor;
data['QueryBoxBackgroundColor'] = queryBoxBackgroundColor;
data['QueryBoxBorderRadius'] = queryBoxBorderRadius;
data['ActionContainerBackgroundColor'] = actionContainerBackgroundColor;
data['ActionContainerHeaderFontColor'] = actionContainerHeaderFontColor;
data['ActionContainerPaddingLeft'] = actionContainerPaddingLeft;
data['ActionContainerPaddingTop'] = actionContainerPaddingTop;
data['ActionContainerPaddingRight'] = actionContainerPaddingRight;
data['ActionContainerPaddingBottom'] = actionContainerPaddingBottom;
data['ActionItemActiveBackgroundColor'] = actionItemActiveBackgroundColor;
data['ActionItemActiveFontColor'] = actionItemActiveFontColor;
data['ActionItemFontColor'] = actionItemFontColor;
data['ActionQueryBoxFontColor'] = actionQueryBoxFontColor;
data['ActionQueryBoxBackgroundColor'] = actionQueryBoxBackgroundColor;
data['ActionQueryBoxBorderRadius'] = actionQueryBoxBorderRadius;
data['PreviewFontColor'] = previewFontColor;
data['PreviewSplitLineColor'] = previewSplitLineColor;
data['PreviewPropertyTitleColor'] = previewPropertyTitleColor;
data['PreviewPropertyContentColor'] = previewPropertyContentColor;
return data;
}
}
23 changes: 14 additions & 9 deletions Wox.UI.Flutter/wox/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,23 @@ import 'package:get/get.dart';
import 'package:logger/logger.dart';
import 'package:window_manager/window_manager.dart';
import 'package:wox/controller.dart';
import 'package:wox/modules/launcher/views/wox_launcher_view.dart';
import 'package:wox/modules/launcher/wox_launcher_controller.dart';
import 'package:wox/utils/wox_theme_util.dart';
import 'package:wox/view.dart';

void main() async {
WidgetsFlutterBinding.ensureInitialized();
initGetX();
initWindow();
await loadSystemConfig();
await initWindow();
await initGetX();
runApp(const MyApp());
}

void initGetX() {
Get.put(Logger(printer: SimplePrinter()));
Get.put(WoxController());
Get.put(WoxLauncherController());
Future<void> loadSystemConfig() async {
WoxThemeUtil.instance.loadTheme();
}

void initWindow() async {
Future<void> initWindow() async {
await windowManager.ensureInitialized();
await Window.initialize();

Expand Down Expand Up @@ -53,6 +52,12 @@ void initWindow() async {
});
}

Future<void> initGetX() async {
Get.put(Logger(printer: SimplePrinter()));
Get.put(WoxController());
Get.put(WoxLauncherController());
}

class MyApp extends StatelessWidget {
const MyApp({super.key});

Expand All @@ -75,7 +80,7 @@ class WoxApp extends StatefulWidget {
class _WoxAppState extends State<WoxApp> {
@override
Widget build(BuildContext context) {
return Scaffold(
return const Scaffold(
backgroundColor: Colors.transparent,
body: WoxView(),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ class WoxQueryResultView extends GetView<WoxLauncherController> {

@override
Widget build(BuildContext context) {
// TODO: implement build
throw UnimplementedError();
return Obx(() {
return Container(constraints: BoxConstraints(maxHeight: controller.getMaxHeight()));
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,9 @@ class WoxLauncherController extends GetxController with GetSingleTickerProviderS
void arrowDown() {}

void toggleActionPanel() {}

double getMaxHeight(){
return 500;
}

}
11 changes: 11 additions & 0 deletions Wox.UI.Flutter/wox/lib/utils/entity_factory.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import 'package:wox/entity/wox_theme.dart';

class EntityFactory {
static T generateOBJ<T>(Map<String, dynamic> json) {
if (T.toString() == "WoxTheme") {
return WoxTheme.fromJson(json) as T;
} else {
return json as T;
}
}
}
36 changes: 36 additions & 0 deletions Wox.UI.Flutter/wox/lib/utils/wox_http_util.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:dio/dio.dart';
import 'package:wox/entity/wox_response.dart';
import 'package:wox/utils/entity_factory.dart';

class WoxHttpUtil {
final Dio _dio = Dio();
final String _baseUrl = 'http://localhost:34987';

WoxHttpUtil._privateConstructor();

static final WoxHttpUtil _instance = WoxHttpUtil._privateConstructor();

static WoxHttpUtil get instance => _instance;

Future<T> getData<T>(String url, {Map<String, dynamic>? params}) async {
try {
final response = await _dio.get(_baseUrl + url, queryParameters: params);
WoxResponse woxResponse = WoxResponse.fromJson(response.data);
if (woxResponse.success == false) throw Exception(woxResponse.message);
return EntityFactory.generateOBJ<T>(woxResponse.data);
} catch (e) {
throw Exception('Failed to fetch data: $e');
}
}

Future<T> postData<T>(String url, dynamic data) async {
try {
final response = await _dio.post(_baseUrl + url, data: data);
WoxResponse woxResponse = WoxResponse.fromJson(response.data);
if (woxResponse.success == false) throw Exception(woxResponse.message);
return EntityFactory.generateOBJ<T>(woxResponse.data);
} catch (e) {
throw Exception('Failed to post data: $e');
}
}
}
20 changes: 20 additions & 0 deletions Wox.UI.Flutter/wox/lib/utils/wox_theme_util.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'package:wox/api/wox_api.dart';
import 'package:wox/entity/wox_theme.dart';

class WoxThemeUtil {
late WoxTheme _currentTheme;

WoxThemeUtil._privateConstructor();

static final WoxThemeUtil _instance = WoxThemeUtil._privateConstructor();

static WoxThemeUtil get instance => _instance;

Future<void> loadTheme() async {
WoxApi.instance.loadTheme().then((value) {
_currentTheme = value;
});
}

WoxTheme get currentTheme => _currentTheme;
}
Loading

0 comments on commit eb1b0cb

Please sign in to comment.