diff --git a/lib/base/ui_model.dart b/lib/base/ui_model.dart index bb8286b..962a3d9 100644 --- a/lib/base/ui_model.dart +++ b/lib/base/ui_model.dart @@ -74,7 +74,12 @@ class BaseUIModel extends ChangeNotifier { notifyListeners(); return null; } - if (!noAlert) showToast(context!, errorOverride ?? errorMsg); + if (!noAlert) { + showToast(context!, errorOverride ?? errorMsg, + constraints: BoxConstraints( + maxWidth: MediaQuery.of(context!).size.width * .6, + ),title: "出现错误!"); + } } return null; } diff --git a/lib/common/utils/base_utils.dart b/lib/common/utils/base_utils.dart index 9fb95f0..ae3a10a 100644 --- a/lib/common/utils/base_utils.dart +++ b/lib/common/utils/base_utils.dart @@ -12,9 +12,9 @@ void dPrint(src) { } Future showToast(BuildContext context, String msg, - {BoxConstraints? constraints}) async { + {BoxConstraints? constraints, String? title}) async { return showBaseDialog(context, - title: "提示", + title: title ?? "提示", content: Text(msg), actions: [ FilledButton( diff --git a/lib/generated/grpc/party_room_server/index.pb.dart b/lib/generated/grpc/party_room_server/index.pb.dart index 4442049..a367d0c 100644 --- a/lib/generated/grpc/party_room_server/index.pb.dart +++ b/lib/generated/grpc/party_room_server/index.pb.dart @@ -14,6 +14,40 @@ import 'dart:core' as $core; import 'package:fixnum/fixnum.dart' as $fixnum; import 'package:protobuf/protobuf.dart' as $pb; +export 'index.pbenum.dart'; + +class Empty extends $pb.GeneratedMessage { + factory Empty() => create(); + Empty._() : super(); + factory Empty.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory Empty.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Empty', createEmptyInstance: create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + Empty clone() => Empty()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Empty copyWith(void Function(Empty) updates) => super.copyWith((message) => updates(message as Empty)) as Empty; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Empty create() => Empty._(); + Empty createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Empty getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Empty? _defaultInstance; +} + class PingData extends $pb.GeneratedMessage { factory PingData({ $core.String? data, @@ -92,6 +126,214 @@ class PingData extends $pb.GeneratedMessage { void clearServerVersion() => clearField(3); } +class RoomTypesData extends $pb.GeneratedMessage { + factory RoomTypesData({ + $core.Iterable? roomTypes, + }) { + final $result = create(); + if (roomTypes != null) { + $result.roomTypes.addAll(roomTypes); + } + return $result; + } + RoomTypesData._() : super(); + factory RoomTypesData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RoomTypesData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'RoomTypesData', createEmptyInstance: create) + ..pc(1, _omitFieldNames ? '' : 'roomTypes', $pb.PbFieldType.PM, protoName: 'roomTypes', subBuilder: RoomType.create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + RoomTypesData clone() => RoomTypesData()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RoomTypesData copyWith(void Function(RoomTypesData) updates) => super.copyWith((message) => updates(message as RoomTypesData)) as RoomTypesData; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static RoomTypesData create() => RoomTypesData._(); + RoomTypesData createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RoomTypesData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RoomTypesData? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get roomTypes => $_getList(0); +} + +class RoomType extends $pb.GeneratedMessage { + factory RoomType({ + $core.String? id, + $core.String? name, + $core.String? icon, + $core.String? desc, + $core.Iterable? subTypes, + }) { + final $result = create(); + if (id != null) { + $result.id = id; + } + if (name != null) { + $result.name = name; + } + if (icon != null) { + $result.icon = icon; + } + if (desc != null) { + $result.desc = desc; + } + if (subTypes != null) { + $result.subTypes.addAll(subTypes); + } + return $result; + } + RoomType._() : super(); + factory RoomType.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RoomType.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'RoomType', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'id') + ..aOS(2, _omitFieldNames ? '' : 'name') + ..aOS(3, _omitFieldNames ? '' : 'icon') + ..aOS(4, _omitFieldNames ? '' : 'desc') + ..pc(5, _omitFieldNames ? '' : 'subTypes', $pb.PbFieldType.PM, protoName: 'subTypes', subBuilder: RoomSubtype.create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + RoomType clone() => RoomType()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RoomType copyWith(void Function(RoomType) updates) => super.copyWith((message) => updates(message as RoomType)) as RoomType; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static RoomType create() => RoomType._(); + RoomType createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RoomType getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RoomType? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get name => $_getSZ(1); + @$pb.TagNumber(2) + set name($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasName() => $_has(1); + @$pb.TagNumber(2) + void clearName() => clearField(2); + + @$pb.TagNumber(3) + $core.String get icon => $_getSZ(2); + @$pb.TagNumber(3) + set icon($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasIcon() => $_has(2); + @$pb.TagNumber(3) + void clearIcon() => clearField(3); + + @$pb.TagNumber(4) + $core.String get desc => $_getSZ(3); + @$pb.TagNumber(4) + set desc($core.String v) { $_setString(3, v); } + @$pb.TagNumber(4) + $core.bool hasDesc() => $_has(3); + @$pb.TagNumber(4) + void clearDesc() => clearField(4); + + @$pb.TagNumber(5) + $core.List get subTypes => $_getList(4); +} + +class RoomSubtype extends $pb.GeneratedMessage { + factory RoomSubtype({ + $core.String? id, + $core.String? name, + }) { + final $result = create(); + if (id != null) { + $result.id = id; + } + if (name != null) { + $result.name = name; + } + return $result; + } + RoomSubtype._() : super(); + factory RoomSubtype.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RoomSubtype.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'RoomSubtype', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'id') + ..aOS(2, _omitFieldNames ? '' : 'name') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + RoomSubtype clone() => RoomSubtype()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RoomSubtype copyWith(void Function(RoomSubtype) updates) => super.copyWith((message) => updates(message as RoomSubtype)) as RoomSubtype; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static RoomSubtype create() => RoomSubtype._(); + RoomSubtype createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RoomSubtype getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RoomSubtype? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get name => $_getSZ(1); + @$pb.TagNumber(2) + set name($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasName() => $_has(1); + @$pb.TagNumber(2) + void clearName() => clearField(2); +} + const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/lib/generated/grpc/party_room_server/index.pbenum.dart b/lib/generated/grpc/party_room_server/index.pbenum.dart index ad52e35..b2147d1 100644 --- a/lib/generated/grpc/party_room_server/index.pbenum.dart +++ b/lib/generated/grpc/party_room_server/index.pbenum.dart @@ -9,3 +9,55 @@ // ignore_for_file: non_constant_identifier_names, prefer_final_fields // ignore_for_file: unnecessary_import, unnecessary_this, unused_import +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +class RoomStatus extends $pb.ProtobufEnum { + static const RoomStatus All = RoomStatus._(0, _omitEnumNames ? '' : 'All'); + static const RoomStatus Open = RoomStatus._(1, _omitEnumNames ? '' : 'Open'); + static const RoomStatus Private = RoomStatus._(2, _omitEnumNames ? '' : 'Private'); + static const RoomStatus Full = RoomStatus._(3, _omitEnumNames ? '' : 'Full'); + static const RoomStatus Closed = RoomStatus._(4, _omitEnumNames ? '' : 'Closed'); + static const RoomStatus WillOffline = RoomStatus._(5, _omitEnumNames ? '' : 'WillOffline'); + static const RoomStatus Offline = RoomStatus._(6, _omitEnumNames ? '' : 'Offline'); + + static const $core.List values = [ + All, + Open, + Private, + Full, + Closed, + WillOffline, + Offline, + ]; + + static final $core.Map<$core.int, RoomStatus> _byValue = $pb.ProtobufEnum.initByValue(values); + static RoomStatus? valueOf($core.int value) => _byValue[value]; + + const RoomStatus._($core.int v, $core.String n) : super(v, n); +} + +class RoomSortType extends $pb.ProtobufEnum { + static const RoomSortType Default = RoomSortType._(0, _omitEnumNames ? '' : 'Default'); + static const RoomSortType MostPlayerNumber = RoomSortType._(1, _omitEnumNames ? '' : 'MostPlayerNumber'); + static const RoomSortType MinimumPlayerNumber = RoomSortType._(2, _omitEnumNames ? '' : 'MinimumPlayerNumber'); + static const RoomSortType RecentlyCreated = RoomSortType._(3, _omitEnumNames ? '' : 'RecentlyCreated'); + static const RoomSortType OldestCreated = RoomSortType._(4, _omitEnumNames ? '' : 'OldestCreated'); + + static const $core.List values = [ + Default, + MostPlayerNumber, + MinimumPlayerNumber, + RecentlyCreated, + OldestCreated, + ]; + + static final $core.Map<$core.int, RoomSortType> _byValue = $pb.ProtobufEnum.initByValue(values); + static RoomSortType? valueOf($core.int value) => _byValue[value]; + + const RoomSortType._($core.int v, $core.String n) : super(v, n); +} + + +const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names'); diff --git a/lib/generated/grpc/party_room_server/index.pbgrpc.dart b/lib/generated/grpc/party_room_server/index.pbgrpc.dart index 404f23a..d86a2c8 100644 --- a/lib/generated/grpc/party_room_server/index.pbgrpc.dart +++ b/lib/generated/grpc/party_room_server/index.pbgrpc.dart @@ -25,6 +25,10 @@ class IndexServiceClient extends $grpc.Client { '/IndexService/PingServer', ($0.PingData value) => value.writeToBuffer(), ($core.List<$core.int> value) => $0.PingData.fromBuffer(value)); + static final _$getRoomTypes = $grpc.ClientMethod<$0.Empty, $0.RoomTypesData>( + '/IndexService/GetRoomTypes', + ($0.Empty value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.RoomTypesData.fromBuffer(value)); IndexServiceClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, @@ -35,6 +39,10 @@ class IndexServiceClient extends $grpc.Client { $grpc.ResponseFuture<$0.PingData> pingServer($0.PingData request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$pingServer, request, options: options); } + + $grpc.ResponseFuture<$0.RoomTypesData> getRoomTypes($0.Empty request, {$grpc.CallOptions? options}) { + return $createUnaryCall(_$getRoomTypes, request, options: options); + } } @$pb.GrpcServiceName('IndexService') @@ -49,11 +57,23 @@ abstract class IndexServiceBase extends $grpc.Service { false, ($core.List<$core.int> value) => $0.PingData.fromBuffer(value), ($0.PingData value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.Empty, $0.RoomTypesData>( + 'GetRoomTypes', + getRoomTypes_Pre, + false, + false, + ($core.List<$core.int> value) => $0.Empty.fromBuffer(value), + ($0.RoomTypesData value) => value.writeToBuffer())); } $async.Future<$0.PingData> pingServer_Pre($grpc.ServiceCall call, $async.Future<$0.PingData> request) async { return pingServer(call, await request); } + $async.Future<$0.RoomTypesData> getRoomTypes_Pre($grpc.ServiceCall call, $async.Future<$0.Empty> request) async { + return getRoomTypes(call, await request); + } + $async.Future<$0.PingData> pingServer($grpc.ServiceCall call, $0.PingData request); + $async.Future<$0.RoomTypesData> getRoomTypes($grpc.ServiceCall call, $0.Empty request); } diff --git a/lib/generated/grpc/party_room_server/index.pbjson.dart b/lib/generated/grpc/party_room_server/index.pbjson.dart index acdbc26..e257b2c 100644 --- a/lib/generated/grpc/party_room_server/index.pbjson.dart +++ b/lib/generated/grpc/party_room_server/index.pbjson.dart @@ -13,6 +13,52 @@ import 'dart:convert' as $convert; import 'dart:core' as $core; import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use roomStatusDescriptor instead') +const RoomStatus$json = { + '1': 'RoomStatus', + '2': [ + {'1': 'All', '2': 0}, + {'1': 'Open', '2': 1}, + {'1': 'Private', '2': 2}, + {'1': 'Full', '2': 3}, + {'1': 'Closed', '2': 4}, + {'1': 'WillOffline', '2': 5}, + {'1': 'Offline', '2': 6}, + ], +}; + +/// Descriptor for `RoomStatus`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List roomStatusDescriptor = $convert.base64Decode( + 'CgpSb29tU3RhdHVzEgcKA0FsbBAAEggKBE9wZW4QARILCgdQcml2YXRlEAISCAoERnVsbBADEg' + 'oKBkNsb3NlZBAEEg8KC1dpbGxPZmZsaW5lEAUSCwoHT2ZmbGluZRAG'); + +@$core.Deprecated('Use roomSortTypeDescriptor instead') +const RoomSortType$json = { + '1': 'RoomSortType', + '2': [ + {'1': 'Default', '2': 0}, + {'1': 'MostPlayerNumber', '2': 1}, + {'1': 'MinimumPlayerNumber', '2': 2}, + {'1': 'RecentlyCreated', '2': 3}, + {'1': 'OldestCreated', '2': 4}, + ], +}; + +/// Descriptor for `RoomSortType`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List roomSortTypeDescriptor = $convert.base64Decode( + 'CgxSb29tU29ydFR5cGUSCwoHRGVmYXVsdBAAEhQKEE1vc3RQbGF5ZXJOdW1iZXIQARIXChNNaW' + '5pbXVtUGxheWVyTnVtYmVyEAISEwoPUmVjZW50bHlDcmVhdGVkEAMSEQoNT2xkZXN0Q3JlYXRl' + 'ZBAE'); + +@$core.Deprecated('Use emptyDescriptor instead') +const Empty$json = { + '1': 'Empty', +}; + +/// Descriptor for `Empty`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List emptyDescriptor = $convert.base64Decode( + 'CgVFbXB0eQ=='); + @$core.Deprecated('Use pingDataDescriptor instead') const PingData$json = { '1': 'PingData', @@ -28,3 +74,47 @@ final $typed_data.Uint8List pingDataDescriptor = $convert.base64Decode( 'CghQaW5nRGF0YRISCgRkYXRhGAEgASgJUgRkYXRhEiQKDWNsaWVudFZlcnNpb24YAiABKBJSDW' 'NsaWVudFZlcnNpb24SJAoNc2VydmVyVmVyc2lvbhgDIAEoElINc2VydmVyVmVyc2lvbg=='); +@$core.Deprecated('Use roomTypesDataDescriptor instead') +const RoomTypesData$json = { + '1': 'RoomTypesData', + '2': [ + {'1': 'roomTypes', '3': 1, '4': 3, '5': 11, '6': '.RoomType', '10': 'roomTypes'}, + ], +}; + +/// Descriptor for `RoomTypesData`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List roomTypesDataDescriptor = $convert.base64Decode( + 'Cg1Sb29tVHlwZXNEYXRhEicKCXJvb21UeXBlcxgBIAMoCzIJLlJvb21UeXBlUglyb29tVHlwZX' + 'M='); + +@$core.Deprecated('Use roomTypeDescriptor instead') +const RoomType$json = { + '1': 'RoomType', + '2': [ + {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, + {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'}, + {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'}, + {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'}, + {'1': 'subTypes', '3': 5, '4': 3, '5': 11, '6': '.RoomSubtype', '10': 'subTypes'}, + ], +}; + +/// Descriptor for `RoomType`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List roomTypeDescriptor = $convert.base64Decode( + 'CghSb29tVHlwZRIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRISCgRpY29uGA' + 'MgASgJUgRpY29uEhIKBGRlc2MYBCABKAlSBGRlc2MSKAoIc3ViVHlwZXMYBSADKAsyDC5Sb29t' + 'U3VidHlwZVIIc3ViVHlwZXM='); + +@$core.Deprecated('Use roomSubtypeDescriptor instead') +const RoomSubtype$json = { + '1': 'RoomSubtype', + '2': [ + {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, + {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'}, + ], +}; + +/// Descriptor for `RoomSubtype`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List roomSubtypeDescriptor = $convert.base64Decode( + 'CgtSb29tU3VidHlwZRIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZQ=='); + diff --git a/lib/grpc/party_room_server.dart b/lib/grpc/party_room_server.dart index 37fad5a..01ce099 100644 --- a/lib/grpc/party_room_server.dart +++ b/lib/grpc/party_room_server.dart @@ -1,6 +1,5 @@ import 'package:fixnum/fixnum.dart'; import 'package:grpc/grpc.dart'; -import 'package:starcitizen_doctor/base/ui.dart'; import 'package:starcitizen_doctor/generated/grpc/party_room_server/index.pbgrpc.dart'; class PartyRoomGrpcServer { @@ -20,7 +19,11 @@ class PartyRoomGrpcServer { static Future pingServer() async { final r = await _indexService.pingServer(PingData( data: "PING", clientVersion: Int64.parseInt(clientVersion.toString()))); - dPrint(r.writeToJson()); + return r; + } + + static Future getRoomTypes() async { + final r = await _indexService.getRoomTypes(Empty()); return r; } } diff --git a/lib/ui/party_room/party_room_home_ui.dart b/lib/ui/party_room/party_room_home_ui.dart index f42c4e4..0002518 100644 --- a/lib/ui/party_room/party_room_home_ui.dart +++ b/lib/ui/party_room/party_room_home_ui.dart @@ -1,4 +1,5 @@ import 'package:starcitizen_doctor/base/ui.dart'; +import 'package:starcitizen_doctor/generated/grpc/party_room_server/index.pb.dart'; import 'party_room_home_ui_model.dart'; @@ -11,8 +12,113 @@ class PartyRoomHomeUI extends BaseUI { child: Text("${model.pingServerMessage}"), ); } - return Center( - child: Text("PartyRoom"), + if (model.roomTypes == null) return makeLoading(context); + return Column( + children: [ + makeHeader(context, model), + ], + ); + } + + Widget makeHeader(BuildContext context, PartyRoomHomeUIModel model) { + final subTypes = model.getCurRoomSubTypes(); + return Container( + padding: const EdgeInsets.only(left: 24, right: 24, top: 16, bottom: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const Text("房间类型:"), + SizedBox( + height: 36, + child: ComboBox( + value: model.selectedRoomType, + items: [ + for (final t in model.roomTypes!.entries) + ComboBoxItem( + value: t.value, + child: Text(t.value.name), + ) + ], + onChanged: model.onChangeRoomType)), + if (subTypes != null) ...[ + const SizedBox(width: 24), + const Text("子类型:"), + SizedBox( + height: 36, + child: ComboBox( + value: model.selectedRoomSubType, + items: [ + for (final t in subTypes.entries) + ComboBoxItem( + value: t.value, + child: Text(t.value.name), + ) + ], + onChanged: model.onChangeRoomSubType)), + ], + const SizedBox(width: 24), + const Text("房间状态:"), + SizedBox( + height: 36, + child: ComboBox( + value: model.selectedStatus, + items: [ + for (final t in model.roomStatus.entries) + ComboBoxItem( + value: t.key, + child: Text(t.value), + ) + ], + onChanged: model.onChangeRoomStatus)), + const SizedBox(width: 24), + const Text("排序:"), + SizedBox( + height: 36, + child: ComboBox( + value: model.selectedSortType, + items: [ + for (final t in model.roomSorts.entries) + ComboBoxItem( + value: t.key, + child: Text(t.value), + ) + ], + onChanged: model.onChangeRoomSort)), + const Spacer(), + Button( + onPressed: () {}, + child: const Padding( + padding: EdgeInsets.all(6), + child: Icon(FluentIcons.refresh), + ), + ), + const SizedBox(width: 12), + Button( + onPressed: () {}, + child: const Padding( + padding: EdgeInsets.all(3), + child: Row( + children: [ + Icon(FluentIcons.add), + SizedBox(width: 6), + Text("创建房间") + ], + ), + ), + ), + ], + ), + const SizedBox( + height: 6, + ), + Text( + model.selectedRoomType?.desc ?? "", + style: TextStyle(fontSize: 13, color: Colors.white.withOpacity(.4)), + ), + ], + ), ); } diff --git a/lib/ui/party_room/party_room_home_ui_model.dart b/lib/ui/party_room/party_room_home_ui_model.dart index c131ced..cba500e 100644 --- a/lib/ui/party_room/party_room_home_ui_model.dart +++ b/lib/ui/party_room/party_room_home_ui_model.dart @@ -1,9 +1,37 @@ import 'package:starcitizen_doctor/base/ui_model.dart'; +import 'package:starcitizen_doctor/generated/grpc/party_room_server/index.pb.dart'; import 'package:starcitizen_doctor/grpc/party_room_server.dart'; class PartyRoomHomeUIModel extends BaseUIModel { String? pingServerMessage; + Map? roomTypes; + + RoomType? selectedRoomType; + + RoomSubtype? selectedRoomSubType; + + final roomStatus = { + RoomStatus.All: "全部", + RoomStatus.Open: "开启中", + RoomStatus.Full: "已满员", + RoomStatus.Closed: "已封闭", + RoomStatus.WillOffline: "房主离线", + RoomStatus.Offline: "已离线", + }; + + RoomStatus selectedStatus = RoomStatus.All; + + final roomSorts = { + RoomSortType.Default: "默认", + RoomSortType.MostPlayerNumber: "最多玩家", + RoomSortType.MinimumPlayerNumber: "最少玩家", + RoomSortType.RecentlyCreated: "最近创建", + RoomSortType.OldestCreated: "最久创建", + }; + + RoomSortType selectedSortType = RoomSortType.Default; + @override Future loadData() async { if (pingServerMessage != "") { @@ -11,6 +39,7 @@ class PartyRoomHomeUIModel extends BaseUIModel { notifyListeners(); } await _pingServer(); + await _loadTypes(); } _pingServer() async { @@ -26,4 +55,53 @@ class PartyRoomHomeUIModel extends BaseUIModel { return; } } + + _loadTypes() async { + final r = await handleError(() => PartyRoomGrpcServer.getRoomTypes()); + if (r == null) return; + selectedRoomType = + RoomType(id: null, name: "全部", desc: "查看所有类型的房间,寻找一起玩的伙伴。"); + selectedRoomSubType = RoomSubtype(id: "all", name: "全部"); + roomTypes = {null: selectedRoomType!}; + for (var element in r.roomTypes) { + roomTypes![element.id] = element; + } + notifyListeners(); + } + + Map? getCurRoomSubTypes() { + if (selectedRoomType?.subTypes == null) return null; + Map types = {}; + for (var element in selectedRoomType!.subTypes) { + types[element.id] = element; + } + if (types.isEmpty) return null; + final allSubType = RoomSubtype(id: "all", name: "全部"); + selectedRoomSubType ??= allSubType; + return {"all": allSubType}..addAll(types); + } + + void onChangeRoomType(RoomType? value) { + selectedRoomType = value; + selectedRoomSubType = null; + notifyListeners(); + } + + void onChangeRoomStatus(RoomStatus? value) { + if (value == null) return; + selectedStatus = value; + notifyListeners(); + } + + void onChangeRoomSort(RoomSortType? value) { + if (value == null) return; + selectedSortType = value; + notifyListeners(); + } + + void onChangeRoomSubType(RoomSubtype? value) { + if (value == null) return; + selectedRoomSubType = value; + notifyListeners(); + } }