Editor almost done. #3
@@ -0,0 +1,21 @@
|
||||
export 'local_schemes_web.dart' if (dart.library.io) 'local_schemes_linux.dart';
|
||||
|
||||
import 'package:dde_gesture_manager/models/scheme.dart';
|
||||
|
||||
abstract class LocalSchemeEntry {
|
||||
Scheme scheme;
|
||||
DateTime lastModifyTime;
|
||||
String path;
|
||||
|
||||
LocalSchemeEntry({
|
||||
required this.path,
|
||||
required this.scheme,
|
||||
required this.lastModifyTime,
|
||||
});
|
||||
|
||||
save();
|
||||
}
|
||||
|
||||
abstract class LocalSchemesInterface<T extends LocalSchemeEntry> {
|
||||
Future<List<T>> get schemeEntries;
|
||||
}
|
||||
+18
-18
@@ -2,61 +2,61 @@ import 'dart:io';
|
||||
|
||||
import 'package:dde_gesture_manager/builder/provider_annotation.dart';
|
||||
import 'package:dde_gesture_manager/extensions.dart';
|
||||
import 'package:dde_gesture_manager/models/solution.dart';
|
||||
import 'package:dde_gesture_manager/models/scheme.dart';
|
||||
import 'package:path/path.dart' show join;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
import 'local_solutions.dart';
|
||||
import 'local_schemes.dart';
|
||||
|
||||
export 'local_solutions.dart';
|
||||
export 'local_schemes.dart';
|
||||
|
||||
@ProviderModel()
|
||||
class LocalSolutions implements LocalSolutionsInterface<LocalSolutionEntryLinux> {
|
||||
LocalSolutions() {
|
||||
solutionEntries.then((value) => solutions = value);
|
||||
class LocalSchemes implements LocalSchemesInterface<LocalSchemeEntryLinux> {
|
||||
LocalSchemes() {
|
||||
schemeEntries.then((value) => schemes = value);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<LocalSolutionEntryLinux>> get solutionEntries async {
|
||||
Future<List<LocalSchemeEntryLinux>> get schemeEntries async {
|
||||
var _supportDirectory = await getApplicationSupportDirectory();
|
||||
var directory = Directory(join(_supportDirectory.path, 'solutions'));
|
||||
var directory = Directory(join(_supportDirectory.path, 'schemes'));
|
||||
if (!directory.existsSync()) directory.createSync();
|
||||
directory.path.sout();
|
||||
return directory
|
||||
.list()
|
||||
.map<LocalSolutionEntryLinux?>((f) {
|
||||
LocalSolutionEntryLinux? entry;
|
||||
.map<LocalSchemeEntryLinux?>((f) {
|
||||
LocalSchemeEntryLinux? entry;
|
||||
try {
|
||||
var content = File(f.path).readAsStringSync();
|
||||
entry = LocalSolutionEntryLinux(
|
||||
path: f.path, solution: Solution.parse(content), lastModifyTime: f.statSync().modified);
|
||||
entry = LocalSchemeEntryLinux(
|
||||
path: f.path, scheme: Scheme.parse(content), lastModifyTime: f.statSync().modified);
|
||||
} catch (e) {
|
||||
e.sout();
|
||||
}
|
||||
return entry;
|
||||
})
|
||||
.where((e) => e != null)
|
||||
.cast<LocalSolutionEntryLinux>()
|
||||
.cast<LocalSchemeEntryLinux>()
|
||||
.toList();
|
||||
}
|
||||
|
||||
@ProviderModelProp()
|
||||
List<LocalSolutionEntry>? solutions;
|
||||
List<LocalSchemeEntry>? schemes;
|
||||
}
|
||||
|
||||
class LocalSolutionEntryLinux implements LocalSolutionEntry {
|
||||
class LocalSchemeEntryLinux implements LocalSchemeEntry {
|
||||
@override
|
||||
String path;
|
||||
|
||||
@override
|
||||
Solution solution;
|
||||
Scheme scheme;
|
||||
|
||||
@override
|
||||
DateTime lastModifyTime;
|
||||
|
||||
LocalSolutionEntryLinux({
|
||||
LocalSchemeEntryLinux({
|
||||
required this.path,
|
||||
required this.solution,
|
||||
required this.scheme,
|
||||
required this.lastModifyTime,
|
||||
});
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export 'local_schemes_web.provider.dart' if (dart.library.io) 'local_schemes_linux.provider.dart';
|
||||
@@ -0,0 +1,67 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:dde_gesture_manager/builder/provider_annotation.dart';
|
||||
import 'package:dde_gesture_manager/models/scheme.dart';
|
||||
import 'package:dde_gesture_manager/extensions.dart';
|
||||
import 'dart:html';
|
||||
|
||||
import 'local_schemes.dart';
|
||||
export 'local_schemes.dart';
|
||||
|
||||
@ProviderModel()
|
||||
class LocalSchemes implements LocalSchemesInterface<LocalSchemeEntryWeb> {
|
||||
LocalSchemes() {
|
||||
schemeEntries.then((value) => schemes = value);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<LocalSchemeEntryWeb>> get schemeEntries async {
|
||||
return window.localStorage.keys
|
||||
.map<LocalSchemeEntryWeb?>((key) {
|
||||
if (key.startsWith('schemes.')) {
|
||||
LocalSchemeEntryWeb? entry;
|
||||
try {
|
||||
var content = window.localStorage[key] ?? '';
|
||||
var schemeJson = json.decode(content);
|
||||
entry = LocalSchemeEntryWeb(
|
||||
path: key,
|
||||
scheme: Scheme.parse(schemeJson),
|
||||
lastModifyTime: DateTime.parse(schemeJson['modified_at']),
|
||||
);
|
||||
} catch (e) {
|
||||
e.sout();
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
})
|
||||
.where((e) => e != null)
|
||||
.cast<LocalSchemeEntryWeb>()
|
||||
.toList();
|
||||
}
|
||||
|
||||
@ProviderModelProp()
|
||||
List<LocalSchemeEntry>? schemes;
|
||||
}
|
||||
|
||||
class LocalSchemeEntryWeb implements LocalSchemeEntry {
|
||||
@override
|
||||
String path;
|
||||
|
||||
@override
|
||||
Scheme scheme;
|
||||
|
||||
@override
|
||||
DateTime lastModifyTime;
|
||||
|
||||
LocalSchemeEntryWeb({
|
||||
required this.path,
|
||||
required this.scheme,
|
||||
required this.lastModifyTime,
|
||||
});
|
||||
|
||||
@override
|
||||
save() {
|
||||
// TODO: implement save
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
export 'local_solutions_web.dart' if (dart.library.io) 'local_solutions_linux.dart';
|
||||
|
||||
import 'package:dde_gesture_manager/models/solution.dart';
|
||||
|
||||
abstract class LocalSolutionEntry {
|
||||
Solution solution;
|
||||
DateTime lastModifyTime;
|
||||
String path;
|
||||
|
||||
LocalSolutionEntry({
|
||||
required this.path,
|
||||
required this.solution,
|
||||
required this.lastModifyTime,
|
||||
});
|
||||
|
||||
save();
|
||||
}
|
||||
|
||||
abstract class LocalSolutionsInterface<T extends LocalSolutionEntry> {
|
||||
Future<List<T>> get solutionEntries;
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
export 'local_solutions_web.provider.dart' if (dart.library.io) 'local_solutions_linux.provider.dart';
|
||||
@@ -1,67 +0,0 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:dde_gesture_manager/builder/provider_annotation.dart';
|
||||
import 'package:dde_gesture_manager/models/solution.dart';
|
||||
import 'package:dde_gesture_manager/extensions.dart';
|
||||
import 'dart:html';
|
||||
|
||||
import 'local_solutions.dart';
|
||||
export 'local_solutions.dart';
|
||||
|
||||
@ProviderModel()
|
||||
class LocalSolutions implements LocalSolutionsInterface<LocalSolutionEntryWeb> {
|
||||
LocalSolutions() {
|
||||
solutionEntries.then((value) => solutions = value);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<LocalSolutionEntryWeb>> get solutionEntries async {
|
||||
return window.localStorage.keys
|
||||
.map<LocalSolutionEntryWeb?>((key) {
|
||||
if (key.startsWith('solutions.')) {
|
||||
LocalSolutionEntryWeb? entry;
|
||||
try {
|
||||
var content = window.localStorage[key] ?? '';
|
||||
var solutionJson = json.decode(content);
|
||||
entry = LocalSolutionEntryWeb(
|
||||
path: key,
|
||||
solution: Solution.parse(solutionJson),
|
||||
lastModifyTime: DateTime.parse(solutionJson['modified_at']),
|
||||
);
|
||||
} catch (e) {
|
||||
e.sout();
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
})
|
||||
.where((e) => e != null)
|
||||
.cast<LocalSolutionEntryWeb>()
|
||||
.toList();
|
||||
}
|
||||
|
||||
@ProviderModelProp()
|
||||
List<LocalSolutionEntry>? solutions;
|
||||
}
|
||||
|
||||
class LocalSolutionEntryWeb implements LocalSolutionEntry {
|
||||
@override
|
||||
String path;
|
||||
|
||||
@override
|
||||
Solution solution;
|
||||
|
||||
@override
|
||||
DateTime lastModifyTime;
|
||||
|
||||
LocalSolutionEntryWeb({
|
||||
required this.path,
|
||||
required this.solution,
|
||||
required this.lastModifyTime,
|
||||
});
|
||||
|
||||
@override
|
||||
save() {
|
||||
// TODO: implement save
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ import 'package:dde_gesture_manager/builder/provider_annotation.dart';
|
||||
import 'package:dde_gesture_manager/utils/helper.dart';
|
||||
|
||||
@ProviderModel(copyable: true)
|
||||
class Solution {
|
||||
class Scheme {
|
||||
@ProviderModelProp()
|
||||
String? name;
|
||||
|
||||
@@ -14,12 +14,12 @@ class Solution {
|
||||
@ProviderModelProp()
|
||||
List<GestureProp>? gestures;
|
||||
|
||||
Solution.parse(solution) {
|
||||
if (solution is String) solution = json.decode(solution);
|
||||
assert(solution is Map);
|
||||
name = solution['name'];
|
||||
description = solution['desc'];
|
||||
gestures = (solution['gestures'] as List? ?? []).map<GestureProp>((ele) => GestureProp.parse(ele)).toList();
|
||||
Scheme.parse(scheme) {
|
||||
if (scheme is String) scheme = json.decode(scheme);
|
||||
assert(scheme is Map);
|
||||
name = scheme['name'];
|
||||
description = scheme['desc'];
|
||||
gestures = (scheme['gestures'] as List? ?? []).map<GestureProp>((ele) => GestureProp.parse(ele)).toList();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:dde_gesture_manager/constants/constants.dart';
|
||||
import 'package:dde_gesture_manager/extensions.dart';
|
||||
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
||||
import 'package:dde_gesture_manager/models/solution.dart';
|
||||
import 'package:dde_gesture_manager/models/solution.provider.dart';
|
||||
import 'package:dde_gesture_manager/models/scheme.dart';
|
||||
import 'package:dde_gesture_manager/models/scheme.provider.dart';
|
||||
import 'package:dde_gesture_manager/utils/helper.dart';
|
||||
import 'package:dde_gesture_manager/widgets/dde_button.dart';
|
||||
import 'package:dde_gesture_manager/widgets/dde_data_table.dart';
|
||||
@@ -50,7 +50,7 @@ class GestureEditor extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var layoutProvider = context.watch<ContentLayoutProvider>();
|
||||
var solutionProvider = context.watch<SolutionProvider>();
|
||||
var schemeProvider = context.watch<SchemeProvider>();
|
||||
return Flexible(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(10),
|
||||
@@ -140,7 +140,7 @@ class GestureEditor extends StatelessWidget {
|
||||
DDataColumn(label: Text(LocaleKeys.gesture_editor_command.tr())),
|
||||
DDataColumn(label: Text(LocaleKeys.gesture_editor_remark.tr())),
|
||||
],
|
||||
rows: _buildDataRow(solutionProvider.gestures, context),
|
||||
rows: _buildDataRow(schemeProvider.gestures, context),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:dde_gesture_manager/extensions.dart';
|
||||
import 'package:dde_gesture_manager/models/local_solutions_provider.dart';
|
||||
import 'package:dde_gesture_manager/models/solution.provider.dart';
|
||||
import 'package:dde_gesture_manager/models/local_schemes_provider.dart';
|
||||
import 'package:dde_gesture_manager/models/scheme.provider.dart';
|
||||
import 'package:dde_gesture_manager/pages/content.dart';
|
||||
import 'package:dde_gesture_manager/pages/footer.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -18,7 +18,7 @@ class _HomePageState extends State<HomePage> {
|
||||
return Scaffold(
|
||||
body: MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider(create: (context) => SolutionProvider.parse('''
|
||||
ChangeNotifierProvider(create: (context) => SchemeProvider.parse('''
|
||||
{
|
||||
"name": "test",
|
||||
"desc": "some desc",
|
||||
@@ -66,7 +66,7 @@ class _HomePageState extends State<HomePage> {
|
||||
}
|
||||
''')),
|
||||
ChangeNotifierProvider(create: (context) => GesturePropProvider.empty()),
|
||||
ChangeNotifierProvider(create: (context) => LocalSolutionsProvider(),lazy: false),
|
||||
ChangeNotifierProvider(create: (context) => LocalSchemesProvider(),lazy: false),
|
||||
],
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:dde_gesture_manager/constants/constants.dart';
|
||||
import 'package:dde_gesture_manager/extensions.dart';
|
||||
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
||||
import 'package:dde_gesture_manager/models/local_solutions_provider.dart';
|
||||
import 'package:dde_gesture_manager/models/solution.provider.dart';
|
||||
import 'package:dde_gesture_manager/models/local_schemes_provider.dart';
|
||||
import 'package:dde_gesture_manager/models/scheme.provider.dart';
|
||||
import 'package:dde_gesture_manager/widgets/dde_button.dart';
|
||||
import 'package:flutter/animation.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
@@ -39,7 +39,7 @@ class _LocalManagerState extends State<LocalManager> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var isOpen = context.watch<ContentLayoutProvider>().localManagerOpened == true;
|
||||
var localSolutions = context.watch<LocalSolutionsProvider>().solutions ?? [];
|
||||
var localschemes = context.watch<LocalSchemesProvider>().schemes ?? [];
|
||||
return AnimatedContainer(
|
||||
duration: mediumDuration,
|
||||
curve: Curves.easeInOut,
|
||||
@@ -91,7 +91,7 @@ class _LocalManagerState extends State<LocalManager> {
|
||||
controller: _scrollController,
|
||||
itemBuilder: (context, index) => GestureDetector(
|
||||
onDoubleTap: () {
|
||||
context.read<SolutionProvider>().copyFrom(localSolutions[index].solution);
|
||||
context.read<SchemeProvider>().copyFrom(localschemes[index].scheme);
|
||||
setState(() {
|
||||
_selectedIndex = index;
|
||||
});
|
||||
@@ -115,7 +115,7 @@ class _LocalManagerState extends State<LocalManager> {
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(localSolutions[index].solution.name ?? ''),
|
||||
Text(localschemes[index].scheme.name ?? ''),
|
||||
Text('456'),
|
||||
],
|
||||
),
|
||||
@@ -123,7 +123,7 @@ class _LocalManagerState extends State<LocalManager> {
|
||||
),
|
||||
),
|
||||
),
|
||||
itemCount: localSolutions.length,
|
||||
itemCount: localschemes.length,
|
||||
),
|
||||
),
|
||||
Container(
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
||||
import 'package:dde_gesture_manager/models/solution.dart';
|
||||
import 'package:dde_gesture_manager/models/scheme.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:dde_gesture_manager/constants/constants.dart';
|
||||
|
||||
@@ -20,13 +20,13 @@
|
||||
"tip": "Display help documentation"
|
||||
},
|
||||
"market": {
|
||||
"title": "Solution market"
|
||||
"title": "Scheme market"
|
||||
},
|
||||
"local_manager": {
|
||||
"title": "Local solution management"
|
||||
"title": "Local scheme management"
|
||||
},
|
||||
"gesture_editor": {
|
||||
"label": "Gesture program editing",
|
||||
"label": "Gesture scheme editing",
|
||||
"gesture": "gesture",
|
||||
"direction": "direction",
|
||||
"fingers": "fingers",
|
||||
|
||||
Reference in New Issue
Block a user