parent
1efc737284
commit
9fa94e38a7
@ -1,16 +1,47 @@
|
|||||||
# dde_gesture_manager
|
# DDE Gesture Manager
|
||||||
|
专为 DDE 桌面环境打造的触摸板手势管理工具
|
||||||
|
|
||||||
A new Flutter project.
|
## ProviderGenerator
|
||||||
|
利用 [source_gen](https://pub.dev/packages/source_gen) 和 [build_runner](https://pub.flutter-io.cn/packages/build_runner) 生成 [provider](https://pub.flutter-io.cn/packages/provider) 的模板代码:
|
||||||
|
1. 在 `lib/models/` 下编写模型类
|
||||||
|
```dart
|
||||||
|
import 'package:dde_gesture_manager/builder/provider_annotation.dart';
|
||||||
|
|
||||||
## Getting Started
|
@ProviderModel()
|
||||||
|
class Test {
|
||||||
|
@ProviderModelProp()
|
||||||
|
bool? tested;
|
||||||
|
|
||||||
This project is a starting point for a Flutter application.
|
@ProviderModelProp()
|
||||||
|
String? name;
|
||||||
|
}
|
||||||
|
|
||||||
A few resources to get you started if this is your first Flutter project:
|
```
|
||||||
|
|
||||||
- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
|
2. `app` 项目目录下执行 `flutter packages pub run build_runner build`
|
||||||
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
|
|
||||||
|
|
||||||
For help getting started with Flutter, view our
|
3. 将在 `lib/models/test.provider.dart` 生成如下代码:
|
||||||
[online documentation](https://flutter.dev/docs), which offers tutorials,
|
```dart
|
||||||
samples, guidance on mobile development, and a full API reference.
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:dde_gesture_manager/extensions/compare_extension.dart';
|
||||||
|
import 'test.dart';
|
||||||
|
|
||||||
|
class TestProvider extends Test with ChangeNotifier {
|
||||||
|
void setProps({
|
||||||
|
bool? tested,
|
||||||
|
String? name,
|
||||||
|
}) {
|
||||||
|
bool changed = false;
|
||||||
|
if (tested.diff(this.tested)) {
|
||||||
|
this.tested = tested;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
if (name.diff(this.name)) {
|
||||||
|
this.name = name;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
if (changed) notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
builders:
|
||||||
|
provider_builder:
|
||||||
|
import: 'lib/builder/provider_builder.dart'
|
||||||
|
builder_factories: [ 'providerBuilder' ]
|
||||||
|
build_extensions: { '.dart': [ '.provider.dart' ] }
|
||||||
|
auto_apply: root_package
|
||||||
|
build_to: source
|
||||||
|
defaults:
|
||||||
|
generate_for:
|
||||||
|
include:
|
||||||
|
- lib/models/**
|
@ -0,0 +1,9 @@
|
|||||||
|
class ProviderModel {
|
||||||
|
const ProviderModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
class ProviderModelProp {
|
||||||
|
const ProviderModelProp({this.nullable = true});
|
||||||
|
|
||||||
|
final bool nullable;
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
import 'package:dde_gesture_manager/builder/provider_generator.dart';
|
||||||
|
import 'package:source_gen/source_gen.dart';
|
||||||
|
import 'package:build/build.dart';
|
||||||
|
|
||||||
|
Builder providerBuilder(BuilderOptions options) =>
|
||||||
|
LibraryBuilder(ProviderGenerator(), generatedExtension: '.provider.dart');
|
@ -0,0 +1,48 @@
|
|||||||
|
import 'package:analyzer/dart/element/element.dart';
|
||||||
|
import 'package:build/src/builder/build_step.dart';
|
||||||
|
import 'package:dde_gesture_manager/builder/provider_annotation.dart';
|
||||||
|
import 'package:source_gen/source_gen.dart';
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
|
|
||||||
|
class AnnotationField {
|
||||||
|
String name;
|
||||||
|
String type;
|
||||||
|
|
||||||
|
AnnotationField(this.name, this.type);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ProviderGenerator extends GeneratorForAnnotation<ProviderModel> {
|
||||||
|
@override
|
||||||
|
generateForAnnotatedElement(Element element, ConstantReader annotation, BuildStep buildStep) {
|
||||||
|
var className = (element as ClassElement).source.shortName;
|
||||||
|
List<AnnotationField> fields = [];
|
||||||
|
element.fields.forEach((field) {
|
||||||
|
var annotation = field.metadata.firstWhereOrNull(
|
||||||
|
(m) => m.computeConstantValue()?.type?.getDisplayString(withNullability: true) == 'ProviderModelProp');
|
||||||
|
if (annotation != null)
|
||||||
|
fields.add(
|
||||||
|
AnnotationField(
|
||||||
|
field.displayName,
|
||||||
|
field.type.getDisplayString(
|
||||||
|
withNullability: annotation.computeConstantValue()?.getField('nullable')?.toBoolValue() ?? true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
return '''
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:dde_gesture_manager/extensions/compare_extension.dart';
|
||||||
|
import '$className';
|
||||||
|
|
||||||
|
class ${element.displayName}Provider extends ${element.displayName} with ChangeNotifier {
|
||||||
|
void setProps({
|
||||||
|
${fields.map((f) => '${f.type.endsWith('?') ? '' : 'required '}${f.type} ${f.name},').join('\n')}
|
||||||
|
}) {
|
||||||
|
bool changed = false;
|
||||||
|
${fields.map((f) => 'if (${f.name}.diff(this.${f.name})) {this.${f.name} = ${f.name}; changed = true; }').join('\n')}
|
||||||
|
if (changed) notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
''';
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
extension CompareExtension on Object? {
|
||||||
|
bool diff(other) => this != null && this != other;
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
extension SoutExtension on Object? {
|
||||||
|
void sout() {
|
||||||
|
switch (this.runtimeType) {
|
||||||
|
case String:
|
||||||
|
return print(this);
|
||||||
|
case Null:
|
||||||
|
return print(null);
|
||||||
|
default:
|
||||||
|
return print(this.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,20 +1,10 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:dde_gesture_manager/builder/provider_annotation.dart';
|
||||||
|
|
||||||
|
@ProviderModel()
|
||||||
class Settings {
|
class Settings {
|
||||||
bool? _isDarkMode;
|
@ProviderModelProp()
|
||||||
|
bool? isDarkMode;
|
||||||
|
|
||||||
bool? get isDarkMode => _isDarkMode;
|
@ProviderModelProp()
|
||||||
}
|
String? name;
|
||||||
|
|
||||||
class SettingsProvider extends Settings with ChangeNotifier {
|
|
||||||
void setProps({
|
|
||||||
bool? isDarkMode,
|
|
||||||
}) {
|
|
||||||
bool changed = false;
|
|
||||||
if (this._isDarkMode != isDarkMode) {
|
|
||||||
this._isDarkMode = isDarkMode;
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
if (changed) notifyListeners();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,2 +1,17 @@
|
|||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
class H {
|
class H {
|
||||||
|
H._();
|
||||||
|
|
||||||
|
static final _h = H._();
|
||||||
|
|
||||||
|
factory H() => _h;
|
||||||
|
|
||||||
|
late SharedPreferences _sp;
|
||||||
|
|
||||||
|
SharedPreferences get sp => _sp;
|
||||||
|
|
||||||
|
initSharedPreference() async {
|
||||||
|
_sp = await SharedPreferences.getInstance();
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1 @@
|
|||||||
|
export 'init_web.dart' if (dart.library.io) 'init_linux.dart';
|
@ -0,0 +1,34 @@
|
|||||||
|
import 'package:dde_gesture_manager/utils/helper.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gsettings/gsettings.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
import 'package:dde_gesture_manager/models/settings.provider.dart';
|
||||||
|
|
||||||
|
Future<void> initEvents(BuildContext context) async {
|
||||||
|
var isDark = MediaQuery.of(context).platformBrightness == Brightness.dark;
|
||||||
|
if (isDark) {
|
||||||
|
context.read<SettingsProvider>().setProps(isDarkMode: isDark);
|
||||||
|
} else {
|
||||||
|
var xsettings = GSettings('com.deepin.xsettings');
|
||||||
|
xsettings.get('theme-name').then((value) {
|
||||||
|
Future.delayed(
|
||||||
|
Duration(seconds: 1),
|
||||||
|
() => context.read<SettingsProvider>().setProps(isDarkMode: value.toString().contains('dark')),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
xsettings.keysChanged.listen((event) {
|
||||||
|
xsettings.get('theme-name').then((value) {
|
||||||
|
context.read<SettingsProvider>().setProps(isDarkMode: value.toString().contains('dark'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> initConfigs() async {
|
||||||
|
await H().initSharedPreference();
|
||||||
|
var windowManager = WindowManager.instance;
|
||||||
|
windowManager.setTitle('Gesture Manager For DDE');
|
||||||
|
windowManager.setMinimumSize(const Size(800, 600));
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
import 'package:dde_gesture_manager/models/settings.provider.dart';
|
||||||
|
import 'package:dde_gesture_manager/utils/helper.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
Future<void> initEvents(BuildContext context) async {
|
||||||
|
var isDark = MediaQuery.of(context).platformBrightness == Brightness.dark;
|
||||||
|
context.read<SettingsProvider>().setProps(isDarkMode: isDark);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> initConfigs() async {
|
||||||
|
await H().initSharedPreference();
|
||||||
|
}
|
Loading…
Reference in new issue