feat: responsive layout.
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
|
||||||
|
const double localManagerPanelWidth = 200;
|
||||||
|
|
||||||
|
const double marketPanelWidth = 200;
|
||||||
|
|
||||||
|
const shortDuration = const Duration(milliseconds: 100);
|
||||||
|
|
||||||
|
const mediumDuration = const Duration(milliseconds: 300);
|
||||||
|
|
||||||
|
const longDuration = const Duration(milliseconds: 500);
|
||||||
|
|
||||||
|
const minWindowSize = const Size(800, 600);
|
||||||
|
|
||||||
|
enum PanelType {
|
||||||
|
local_manager,
|
||||||
|
market,
|
||||||
|
}
|
||||||
@@ -54,6 +54,7 @@ class MyApp extends StatelessWidget {
|
|||||||
localizationsDelegates: context.localizationDelegates,
|
localizationsDelegates: context.localizationDelegates,
|
||||||
supportedLocales: context.supportedLocales,
|
supportedLocales: context.supportedLocales,
|
||||||
locale: context.locale,
|
locale: context.locale,
|
||||||
|
debugShowCheckedModeBanner: false,
|
||||||
home: AnimatedCrossFade(
|
home: AnimatedCrossFade(
|
||||||
crossFadeState: isDarkMode != null ? CrossFadeState.showSecond : CrossFadeState.showFirst,
|
crossFadeState: isDarkMode != null ? CrossFadeState.showSecond : CrossFadeState.showFirst,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
|
|||||||
+30
-12
@@ -4,6 +4,7 @@ import 'package:dde_gesture_manager/pages/local_manager.dart';
|
|||||||
import 'package:dde_gesture_manager/pages/market.dart';
|
import 'package:dde_gesture_manager/pages/market.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
||||||
|
import 'package:dde_gesture_manager/utils/helper.dart';
|
||||||
|
|
||||||
class Content extends StatefulWidget {
|
class Content extends StatefulWidget {
|
||||||
const Content({Key? key}) : super(key: key);
|
const Content({Key? key}) : super(key: key);
|
||||||
@@ -13,21 +14,38 @@ class Content extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _ContentState extends State<Content> {
|
class _ContentState extends State<Content> {
|
||||||
|
double? preWindowWidth;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ChangeNotifierProvider(
|
var windowWidth = MediaQuery.of(context).size.width;
|
||||||
|
var preferredPanelsStatus = H.getPreferredPanelsStatus(windowWidth);
|
||||||
|
var widthChanged = preWindowWidth != null && preWindowWidth != windowWidth;
|
||||||
|
var widget = ChangeNotifierProvider(
|
||||||
create: (context) => ContentLayoutProvider()
|
create: (context) => ContentLayoutProvider()
|
||||||
..localManagerOpened = true
|
..localManagerOpened = preferredPanelsStatus.localManagerPanelOpened
|
||||||
..marketOpened = true,
|
..marketOpened = preferredPanelsStatus.marketPanelOpened,
|
||||||
builder: (context, child) => Row(
|
builder: (context, child) {
|
||||||
mainAxisSize: MainAxisSize.max,
|
if (widthChanged && mounted) {
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
Future.microtask(
|
||||||
children: [
|
() => context.read<ContentLayoutProvider>().setProps(
|
||||||
LocalManager(),
|
localManagerOpened: preferredPanelsStatus.localManagerPanelOpened,
|
||||||
GestureEditor(),
|
marketOpened: preferredPanelsStatus.marketPanelOpened,
|
||||||
Market(),
|
),
|
||||||
],
|
);
|
||||||
),
|
}
|
||||||
|
return Row(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
LocalManager(),
|
||||||
|
GestureEditor(),
|
||||||
|
Market(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
preWindowWidth = windowWidth;
|
||||||
|
return widget;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,56 @@
|
|||||||
|
import 'package:dde_gesture_manager/constants/constants.dart';
|
||||||
|
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
||||||
|
import 'package:dde_gesture_manager/utils/helper.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:dde_gesture_manager/extensions.dart';
|
||||||
|
|
||||||
class GestureEditor extends StatelessWidget {
|
class GestureEditor extends StatelessWidget {
|
||||||
const GestureEditor({Key? key}) : super(key: key);
|
const GestureEditor({Key? key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
var layoutProvider = context.watch<ContentLayoutProvider>();
|
||||||
color: Colors.black45,
|
return Flexible(
|
||||||
child: Column(
|
child: Container(
|
||||||
children: [],
|
color: Colors.black45,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Visibility(
|
||||||
|
visible: layoutProvider.localManagerOpened == false,
|
||||||
|
child: IconButton(
|
||||||
|
onPressed: () => H.openPanel(context, PanelType.local_manager),
|
||||||
|
icon: Icon(
|
||||||
|
CupertinoIcons.square_list,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Visibility(
|
||||||
|
visible: layoutProvider.marketOpened == false,
|
||||||
|
child: IconButton(
|
||||||
|
onPressed: () => H.openPanel(context, PanelType.market),
|
||||||
|
icon: Icon(
|
||||||
|
CupertinoIcons.cart,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text("<编辑器区域"),
|
||||||
|
Text("编辑器区域>"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:flutter/animation.dart';
|
|||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:dde_gesture_manager/extensions.dart';
|
import 'package:dde_gesture_manager/extensions.dart';
|
||||||
|
import 'package:dde_gesture_manager/constants/constants.dart';
|
||||||
|
|
||||||
class LocalManager extends StatelessWidget {
|
class LocalManager extends StatelessWidget {
|
||||||
const LocalManager({
|
const LocalManager({
|
||||||
@@ -12,18 +13,18 @@ class LocalManager extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var isOpen = context.watch<ContentLayoutProvider>().localManagerOpened == true;
|
var isOpen = context.watch<ContentLayoutProvider>().localManagerOpened == true;
|
||||||
isOpen.sout();
|
|
||||||
return AnimatedContainer(
|
return AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 300),
|
duration: mediumDuration,
|
||||||
curve: Curves.easeInOut,
|
curve: Curves.easeInOut,
|
||||||
width: isOpen ? 200 : 36,
|
width: isOpen ? localManagerPanelWidth : 0,
|
||||||
child: OverflowBox(
|
child: OverflowBox(
|
||||||
alignment: Alignment.centerRight,
|
alignment: Alignment.centerRight,
|
||||||
maxWidth: 200,
|
maxWidth: localManagerPanelWidth,
|
||||||
minWidth: 200,
|
minWidth: localManagerPanelWidth,
|
||||||
child: Material(
|
child: Material(
|
||||||
color: context.t.backgroundColor,
|
// color: context.t.backgroundColor,
|
||||||
elevation: 20,
|
color: Colors.deepPurple,
|
||||||
|
elevation: isOpen ? 20 : 0,
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
@@ -41,7 +42,7 @@ class LocalManager extends StatelessWidget {
|
|||||||
IconButton(
|
IconButton(
|
||||||
onPressed: () => context.read<ContentLayoutProvider>().setProps(localManagerOpened: !isOpen),
|
onPressed: () => context.read<ContentLayoutProvider>().setProps(localManagerOpened: !isOpen),
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
isOpen ? CupertinoIcons.chevron_left_2 : CupertinoIcons.chevron_right_2,
|
CupertinoIcons.chevron_left_2,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
|
import 'package:dde_gesture_manager/constants/constants.dart';
|
||||||
|
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:dde_gesture_manager/extensions.dart';
|
||||||
|
|
||||||
class Market extends StatelessWidget {
|
class Market extends StatelessWidget {
|
||||||
const Market({
|
const Market({
|
||||||
@@ -7,6 +11,44 @@ class Market extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container();
|
var isOpen = context.watch<ContentLayoutProvider>().marketOpened == true;
|
||||||
|
return AnimatedContainer(
|
||||||
|
duration: mediumDuration,
|
||||||
|
curve: Curves.easeInOut,
|
||||||
|
width: isOpen ? marketPanelWidth : 0,
|
||||||
|
child: OverflowBox(
|
||||||
|
alignment: Alignment.centerLeft,
|
||||||
|
maxWidth: marketPanelWidth,
|
||||||
|
minWidth: marketPanelWidth,
|
||||||
|
child: Material(
|
||||||
|
color: Colors.deepPurpleAccent,
|
||||||
|
elevation: isOpen ? 20 : 0,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
IconButton(
|
||||||
|
onPressed: () => context.read<ContentLayoutProvider>().setProps(marketOpened: !isOpen),
|
||||||
|
icon: Icon(
|
||||||
|
CupertinoIcons.chevron_right_2,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Flexible(
|
||||||
|
child: Center(
|
||||||
|
child: Text(
|
||||||
|
"配置市场",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
|
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
import 'package:dde_gesture_manager/constants/constants.dart';
|
||||||
|
import 'package:dde_gesture_manager/extensions.dart';
|
||||||
|
|
||||||
class H {
|
class H {
|
||||||
H._();
|
H._();
|
||||||
@@ -14,4 +18,48 @@ class H {
|
|||||||
initSharedPreference() async {
|
initSharedPreference() async {
|
||||||
_sp = await SharedPreferences.getInstance();
|
_sp = await SharedPreferences.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void openPanel(BuildContext context, PanelType panelType) {
|
||||||
|
var windowWidth = MediaQuery.of(context).size.width;
|
||||||
|
if (windowWidth < minWindowSize.width + localManagerPanelWidth + marketPanelWidth) {
|
||||||
|
context.read<ContentLayoutProvider>().setProps(
|
||||||
|
localManagerOpened: panelType == PanelType.local_manager,
|
||||||
|
marketOpened: panelType == PanelType.market,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
switch (panelType) {
|
||||||
|
case PanelType.local_manager:
|
||||||
|
return context.read<ContentLayoutProvider>().setProps(localManagerOpened: true);
|
||||||
|
case PanelType.market:
|
||||||
|
return context.read<ContentLayoutProvider>().setProps(marketOpened: true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static PreferredPanelsStatus getPreferredPanelsStatus(double windowWidth) {
|
||||||
|
var preferredPanelsStatus = PreferredPanelsStatus(localManagerPanelOpened: true, marketPanelOpened: true);
|
||||||
|
if (windowWidth > minWindowSize.width + localManagerPanelWidth + marketPanelWidth)
|
||||||
|
return preferredPanelsStatus;
|
||||||
|
else if (windowWidth < minWindowSize.width + localManagerPanelWidth)
|
||||||
|
return preferredPanelsStatus
|
||||||
|
..marketPanelOpened = false
|
||||||
|
..localManagerPanelOpened = false;
|
||||||
|
else
|
||||||
|
return preferredPanelsStatus..marketPanelOpened = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PreferredPanelsStatus {
|
||||||
|
bool localManagerPanelOpened;
|
||||||
|
bool marketPanelOpened;
|
||||||
|
|
||||||
|
PreferredPanelsStatus({
|
||||||
|
required this.localManagerPanelOpened,
|
||||||
|
required this.marketPanelOpened,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'PreferredPanelsStatus{localManagerPanelOpened: $localManagerPanelOpened, marketPanelOpened: $marketPanelOpened}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:dde_gesture_manager/constants/constants.dart';
|
||||||
import 'package:dde_gesture_manager/constants/sp_keys.dart';
|
import 'package:dde_gesture_manager/constants/sp_keys.dart';
|
||||||
import 'package:dde_gesture_manager/constants/supported_locales.dart';
|
import 'package:dde_gesture_manager/constants/supported_locales.dart';
|
||||||
import 'package:dde_gesture_manager/extensions.dart';
|
import 'package:dde_gesture_manager/extensions.dart';
|
||||||
@@ -40,7 +41,7 @@ Future<void> initConfigs() async {
|
|||||||
var userLanguageIndex = H().sp.getInt(SPKeys.userLanguage) ?? 0;
|
var userLanguageIndex = H().sp.getInt(SPKeys.userLanguage) ?? 0;
|
||||||
var locale = supportedLocales[userLanguageIndex];
|
var locale = supportedLocales[userLanguageIndex];
|
||||||
windowManager.setTitle(CodegenLoader.mapLocales[locale.toString()]?[LocaleKeys.app_name]);
|
windowManager.setTitle(CodegenLoader.mapLocales[locale.toString()]?[LocaleKeys.app_name]);
|
||||||
windowManager.setMinimumSize(const Size(800, 600));
|
windowManager.setMinimumSize(minWindowSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
var windowManager = WindowManager.instance;
|
var windowManager = WindowManager.instance;
|
||||||
|
|||||||
Reference in New Issue
Block a user