您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
290 行
7.1 KiB
290 行
7.1 KiB
/*using System;
|
|
using System.Collections.Generic;
|
|
using uiwidgets;
|
|
using Unity.UIWidgets.async2;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.material;
|
|
using Unity.UIWidgets.painting;
|
|
using Unity.UIWidgets.ui;
|
|
using Unity.UIWidgets.widgets;
|
|
using UnityEngine;
|
|
using Canvas = Unity.UIWidgets.ui.Canvas;
|
|
using Rect = Unity.UIWidgets.ui.Rect;
|
|
using TextStyle = Unity.UIWidgets.painting.TextStyle;
|
|
|
|
namespace Unity.UIWidgets.DevTools
|
|
{
|
|
public class ScreenUtils
|
|
{
|
|
public static bool shouldShowScreen(Screen screen) {
|
|
if (globals.offlineMode) {
|
|
return screen.worksOffline;
|
|
}
|
|
if (screen.requiresLibrary != null) {
|
|
if (!globals.serviceManager.isServiceAvailable ||
|
|
!globals.serviceManager.isolateManager.selectedIsolateAvailable.isCompleted ||
|
|
!globals.serviceManager.libraryUriAvailableNow(screen.requiresLibrary)) {
|
|
return false;
|
|
}
|
|
}
|
|
if (screen.requiresDartVm) {
|
|
if (!globals.serviceManager.isServiceAvailable ||
|
|
!globals.serviceManager.connectedApp.isRunningOnDartVM) {
|
|
return false;
|
|
}
|
|
}
|
|
if (screen.requiresDebugBuild) {
|
|
if (!globals.serviceManager.isServiceAvailable ||
|
|
globals.serviceManager.connectedApp.isProfileBuildNow) {
|
|
return false;
|
|
}
|
|
}
|
|
if (screen.requiresVmDeveloperMode) {
|
|
if (!globals.preferences.vmDeveloperModeEnabled.value) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
public abstract class Screen {
|
|
public Screen(
|
|
string screenId,
|
|
string title = null,
|
|
IconData icon = null,
|
|
Key tabKey = null,
|
|
string requiresLibrary = null,
|
|
bool requiresDartVm = false,
|
|
bool requiresDebugBuild = false,
|
|
bool requiresVmDeveloperMode = false,
|
|
bool worksOffline = false
|
|
)
|
|
{
|
|
this.screenId = screenId;
|
|
this.title = title;
|
|
this.icon = icon;
|
|
this.tabKey = tabKey;
|
|
this.requiresLibrary = requiresLibrary;
|
|
this.requiresDartVm = requiresDartVm;
|
|
this.requiresDebugBuild = requiresDebugBuild;
|
|
this.requiresVmDeveloperMode = requiresVmDeveloperMode;
|
|
this.worksOffline = worksOffline;
|
|
}
|
|
|
|
public Screen(
|
|
string id = null,
|
|
string requiresLibrary = null,
|
|
bool requiresDartVm = false,
|
|
bool requiresDebugBuild = false,
|
|
bool requiresVmDeveloperMode = false,
|
|
bool worksOffline = false,
|
|
string title = null,
|
|
IconData icon = null,
|
|
Key tabKey = null
|
|
)
|
|
{
|
|
this.screenId = id;
|
|
this.requiresLibrary = requiresLibrary;
|
|
this.requiresDartVm = requiresDartVm;
|
|
this.requiresDebugBuild = requiresDebugBuild;
|
|
this.requiresVmDeveloperMode = requiresVmDeveloperMode;
|
|
this.worksOffline = worksOffline;
|
|
this.title = title;
|
|
this.icon = icon;
|
|
this.tabKey = tabKey;
|
|
}
|
|
|
|
public readonly string screenId;
|
|
|
|
public readonly string title;
|
|
|
|
public readonly IconData icon;
|
|
|
|
public readonly Key tabKey;
|
|
|
|
public readonly string requiresLibrary;
|
|
|
|
public readonly bool requiresDartVm;
|
|
|
|
public readonly bool requiresDebugBuild;
|
|
|
|
public readonly bool requiresVmDeveloperMode;
|
|
|
|
public readonly bool worksOffline;
|
|
|
|
// ValueListenable<bool> showIsolateSelector
|
|
// {
|
|
// get
|
|
// {
|
|
// return FixedValueListenable<bool>(false);
|
|
// }
|
|
// }
|
|
|
|
|
|
string docPageId
|
|
{
|
|
get
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
int badgeCount
|
|
{
|
|
get
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
Widget buildTab(BuildContext context) {
|
|
return new ValueListenableBuilder<int>(
|
|
valueListenable:
|
|
globals.serviceManager.errorBadgeManager.errorCountNotifier(screenId),
|
|
builder: (context2, count, _) => {
|
|
var tab = new Tab(
|
|
key: tabKey,
|
|
child: new Row(
|
|
children: new List<Widget>{
|
|
new Icon(icon, size: CommonThemeUtils.defaultIconSize),
|
|
new Padding(
|
|
padding: EdgeInsets.only(left: CommonThemeUtils.denseSpacing),
|
|
child: new Text(title)
|
|
),
|
|
}
|
|
)
|
|
);
|
|
|
|
if (count > 0) {
|
|
var painter = new TextPainter(
|
|
text: new TextSpan(
|
|
text: title
|
|
),
|
|
textDirection: TextDirection.ltr
|
|
);
|
|
var titleWidth = painter.width;
|
|
|
|
return new LayoutBuilder(
|
|
builder: (context3, constraints) =>{
|
|
return new Stack(
|
|
children: new List<Widget>{
|
|
new CustomPaint(
|
|
size: new Size(CommonThemeUtils.defaultIconSize + CommonThemeUtils.denseSpacing + titleWidth, 0),
|
|
painter: new BadgePainter(number: count)
|
|
),
|
|
tab,
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|
|
|
|
return tab;
|
|
}
|
|
);
|
|
}
|
|
|
|
public abstract Widget build(BuildContext context);
|
|
|
|
Widget buildStatus(BuildContext context, TextTheme textTheme) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// mixin OfflineScreenMixin<T extends StatefulWidget, U> on State<T> {
|
|
// bool loadingOfflineData
|
|
// {
|
|
// get
|
|
// {
|
|
// return _loadingOfflineData;
|
|
// }
|
|
// }
|
|
//
|
|
// bool _loadingOfflineData = false;
|
|
//
|
|
// bool shouldLoadOfflineData();
|
|
//
|
|
// FutureOr processOfflineData(U offlineData);
|
|
//
|
|
// Future loadOfflineData(U offlineData) {
|
|
// setState(() => {
|
|
// _loadingOfflineData = true;
|
|
// });
|
|
// processOfflineData(offlineData).then(() =>
|
|
// {
|
|
// setState(() => {
|
|
// _loadingOfflineData = false;
|
|
// });
|
|
// });
|
|
// }
|
|
// }
|
|
|
|
|
|
|
|
public class BadgePainter : CustomPainter {
|
|
public BadgePainter(int? number = null)
|
|
{
|
|
this.number = number;
|
|
}
|
|
|
|
public readonly int? number;
|
|
|
|
public void paint(Canvas canvas, Size size)
|
|
{
|
|
Paint paint = new Paint();
|
|
paint.color = CommonThemeUtils.devtoolsError;
|
|
paint.style = PaintingStyle.fill;
|
|
|
|
TextPainter countPainter = new TextPainter(
|
|
text: new TextSpan(
|
|
text: $"{number}",
|
|
style: new TextStyle(
|
|
color: Colors.white,
|
|
fontWeight: FontWeight.bold
|
|
)
|
|
),
|
|
textDirection: TextDirection.ltr
|
|
);
|
|
countPainter.layout();
|
|
|
|
var badgeWidth = Mathf.Max(
|
|
CommonThemeUtils.defaultIconSize,
|
|
countPainter.width + CommonThemeUtils.denseSpacing
|
|
);
|
|
canvas.drawOval(
|
|
Rect.fromLTWH(size.width, 0, badgeWidth, CommonThemeUtils.defaultIconSize),
|
|
paint
|
|
);
|
|
|
|
countPainter.paint(
|
|
canvas,
|
|
new Offset(size.width + (badgeWidth - countPainter.width) / 2, 0)
|
|
);
|
|
}
|
|
|
|
public bool shouldRepaint(CustomPainter oldDelegate) {
|
|
if (oldDelegate is BadgePainter) {
|
|
return number != ((BadgePainter)oldDelegate).number;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public bool? hitTest(Offset position)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public void addListener(VoidCallback listener)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public void removeListener(VoidCallback listener)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
}*/
|