remove unnecesary choreographer extensions
This commit is contained in:
parent
941827bb8a
commit
c256388e8b
11 changed files with 76 additions and 94 deletions
|
|
@ -40,11 +40,10 @@ import 'package:fluffychat/pangea/bot/utils/bot_name.dart';
|
|||
import 'package:fluffychat/pangea/chat/utils/unlocked_morphs_snackbar.dart';
|
||||
import 'package:fluffychat/pangea/chat/widgets/event_too_large_dialog.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/assistance_state_enum.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choregrapher_user_settings_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreo_constants.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreo_record_model.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer_state_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer_ui_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/text_editing/edit_type_enum.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/text_editing/pangea_text_controller.dart';
|
||||
import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart';
|
||||
|
|
@ -1751,10 +1750,10 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
Future<void> onInputBarSubmitted() async {
|
||||
// send();
|
||||
if (MatrixState.pangeaController.subscriptionController.shouldShowPaywall) {
|
||||
PaywallCard.show(context, choreographer.inputTransformTargetKey);
|
||||
PaywallCard.show(context, ChoreoConstants.inputTransformTargetKey);
|
||||
return;
|
||||
}
|
||||
await onRequestWritingAssistance(autosend: true);
|
||||
await onRequestWritingAssistance(manual: false, autosend: true);
|
||||
// FocusScope.of(context).requestFocus(inputFocus);
|
||||
// Pangea#
|
||||
}
|
||||
|
|
@ -2078,7 +2077,7 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
// analytics based on when / how many messages the logged in user send. This
|
||||
// stream sends the data for newly sent messages.
|
||||
if (originalSent?.langCode.split("-").first !=
|
||||
choreographer.l2Lang?.langCodeShort) {
|
||||
MatrixState.pangeaController.languageController.userL2?.langCodeShort) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2142,8 +2141,10 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
);
|
||||
|
||||
final stt = await messageEvent.getSpeechToText(
|
||||
choreographer.l1Lang?.langCodeShort ?? LanguageKeys.unknownLanguage,
|
||||
choreographer.l2Lang?.langCodeShort ?? LanguageKeys.unknownLanguage,
|
||||
MatrixState.pangeaController.languageController.userL1?.langCodeShort ??
|
||||
LanguageKeys.unknownLanguage,
|
||||
MatrixState.pangeaController.languageController.userL2?.langCodeShort ??
|
||||
LanguageKeys.unknownLanguage,
|
||||
);
|
||||
if (stt == null || stt.transcript.sttTokens.isEmpty) return;
|
||||
final constructs = stt.constructs(roomId, eventId);
|
||||
|
|
@ -2175,8 +2176,10 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
return false;
|
||||
}
|
||||
|
||||
final l1 = choreographer.l1Lang?.langCodeShort;
|
||||
final l2 = choreographer.l2Lang?.langCodeShort;
|
||||
final l1 =
|
||||
MatrixState.pangeaController.languageController.userL1?.langCodeShort;
|
||||
final l2 =
|
||||
MatrixState.pangeaController.languageController.userL2?.langCodeShort;
|
||||
final activityLang = room.activityPlan?.req.targetLanguage.split('-').first;
|
||||
|
||||
return activityLang != null &&
|
||||
|
|
@ -2185,12 +2188,15 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
l1 != activityLang;
|
||||
}
|
||||
|
||||
Future<void> onRequestWritingAssistance({bool autosend = false}) async {
|
||||
Future<void> onRequestWritingAssistance({
|
||||
bool manual = false,
|
||||
bool autosend = false,
|
||||
}) async {
|
||||
if (shouldShowLanguageMismatchPopup) {
|
||||
return showLanguageMismatchPopup();
|
||||
}
|
||||
|
||||
await choreographer.requestWritingAssistance();
|
||||
await choreographer.requestWritingAssistance(manual: manual);
|
||||
if (choreographer.assistanceState == AssistanceStateEnum.fetched) {
|
||||
final match = choreographer.igcController.firstOpenMatch!;
|
||||
match.updatedMatch.isITStart
|
||||
|
|
@ -2227,13 +2233,13 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
);
|
||||
|
||||
WidgetsBinding.instance.addPostFrameCallback(
|
||||
(_) => onRequestWritingAssistance(autosend: true),
|
||||
(_) => onRequestWritingAssistance(manual: false, autosend: true),
|
||||
);
|
||||
},
|
||||
),
|
||||
maxHeight: 325,
|
||||
maxWidth: 325,
|
||||
transformTargetId: choreographer.inputTransformTargetKey,
|
||||
transformTargetId: ChoreoConstants.inputTransformTargetKey,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,10 +8,9 @@ import 'package:matrix/matrix.dart';
|
|||
import 'package:slugify/slugify.dart';
|
||||
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choregrapher_user_settings_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreo_constants.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer_state_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer_ui_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/text_editing/pangea_text_controller.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/overlay.dart';
|
||||
import 'package:fluffychat/pangea/learning_settings/constants/language_constants.dart';
|
||||
|
|
@ -435,13 +434,15 @@ class InputBar extends StatelessWidget {
|
|||
return L10n.of(context).buildTranslation;
|
||||
}
|
||||
|
||||
return choreographer.l1Lang != null &&
|
||||
choreographer.l2Lang != null &&
|
||||
choreographer.l1Lang!.langCode != LanguageKeys.unknownLanguage &&
|
||||
choreographer.l2Lang!.langCode != LanguageKeys.unknownLanguage
|
||||
return MatrixState.pangeaController.languageController.userL1 != null &&
|
||||
MatrixState.pangeaController.languageController.userL2 != null &&
|
||||
MatrixState.pangeaController.languageController.userL1!.langCode !=
|
||||
LanguageKeys.unknownLanguage &&
|
||||
MatrixState.pangeaController.languageController.userL2!.langCode !=
|
||||
LanguageKeys.unknownLanguage
|
||||
? L10n.of(context).writeAMessageLangCodes(
|
||||
choreographer.l1Lang!.displayName,
|
||||
choreographer.l2Lang!.displayName,
|
||||
MatrixState.pangeaController.languageController.userL1!.displayName,
|
||||
MatrixState.pangeaController.languageController.userL2!.displayName,
|
||||
)
|
||||
: L10n.of(context).writeAMessage;
|
||||
}
|
||||
|
|
@ -453,7 +454,7 @@ class InputBar extends StatelessWidget {
|
|||
final subscriptionStatus =
|
||||
MatrixState.pangeaController.subscriptionController.subscriptionStatus;
|
||||
if (subscriptionStatus == SubscriptionStatus.shouldShowPaywall) {
|
||||
PaywallCard.show(context, choreographer.inputTransformTargetKey);
|
||||
PaywallCard.show(context, ChoreoConstants.inputTransformTargetKey);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,12 +7,13 @@ import 'package:fluffychat/config/themes.dart';
|
|||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pages/chat/chat.dart';
|
||||
import 'package:fluffychat/pages/chat/input_bar.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreo_constants.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer_send_button.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer_state_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer_ui_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/igc/start_igc_button.dart';
|
||||
import 'package:fluffychat/pangea/learning_settings/models/language_model.dart';
|
||||
import 'package:fluffychat/utils/platform_infos.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
|
||||
class PangeaChatInputRow extends StatelessWidget {
|
||||
final ChatController controller;
|
||||
|
|
@ -36,7 +37,9 @@ class PangeaChatInputRow extends StatelessWidget {
|
|||
return Column(
|
||||
children: [
|
||||
CompositedTransformTarget(
|
||||
link: controller.choreographer.inputLayerLinkAndKey.link,
|
||||
link: MatrixState.pAnyState
|
||||
.layerLinkAndKey(ChoreoConstants.inputTransformTargetKey)
|
||||
.link,
|
||||
child: Container(
|
||||
decoration: const BoxDecoration(
|
||||
borderRadius: BorderRadius.all(
|
||||
|
|
@ -44,7 +47,9 @@ class PangeaChatInputRow extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
child: Row(
|
||||
key: controller.choreographer.inputLayerLinkAndKey.key,
|
||||
key: MatrixState.pAnyState
|
||||
.layerLinkAndKey(ChoreoConstants.inputTransformTargetKey)
|
||||
.key,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
|
|
|
|||
|
|
@ -1,26 +0,0 @@
|
|||
import 'package:fluffychat/pangea/choreographer/choreographer.dart';
|
||||
import 'package:fluffychat/pangea/learning_settings/models/language_model.dart';
|
||||
import 'package:fluffychat/pangea/spaces/models/space_model.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
|
||||
extension ChoregrapherUserSettingsExtension on Choreographer {
|
||||
LanguageModel? get l2Lang =>
|
||||
MatrixState.pangeaController.languageController.activeL2Model();
|
||||
String? get l2LangCode => l2Lang?.langCode;
|
||||
LanguageModel? get l1Lang =>
|
||||
MatrixState.pangeaController.languageController.activeL1Model();
|
||||
String? get l1LangCode => l1Lang?.langCode;
|
||||
|
||||
bool get igcEnabled =>
|
||||
MatrixState.pangeaController.permissionsController.isToolEnabled(
|
||||
ToolSetting.interactiveGrammar,
|
||||
);
|
||||
bool get itEnabled =>
|
||||
MatrixState.pangeaController.permissionsController.isToolEnabled(
|
||||
ToolSetting.interactiveTranslator,
|
||||
);
|
||||
bool get isAutoIGCEnabled =>
|
||||
MatrixState.pangeaController.permissionsController.isToolEnabled(
|
||||
ToolSetting.autoIGC,
|
||||
);
|
||||
}
|
||||
|
|
@ -10,4 +10,5 @@ class ChoreoConstants {
|
|||
static const red = Colors.red;
|
||||
static const int msBeforeIGCStart = 10000;
|
||||
static const int maxLength = 1000;
|
||||
static const String inputTransformTargetKey = 'input_text_field';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ import 'dart:async';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:fluffychat/pangea/choreographer/assistance_state_enum.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choregrapher_user_settings_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreo_constants.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreo_mode_enum.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreo_record_model.dart';
|
||||
|
|
@ -19,6 +18,7 @@ import 'package:fluffychat/pangea/events/models/representation_content_model.dar
|
|||
import 'package:fluffychat/pangea/events/models/tokens_event_content_model.dart';
|
||||
import 'package:fluffychat/pangea/events/repo/token_api_models.dart';
|
||||
import 'package:fluffychat/pangea/learning_settings/constants/language_constants.dart';
|
||||
import 'package:fluffychat/pangea/spaces/models/space_model.dart';
|
||||
import 'package:fluffychat/pangea/subscription/controllers/subscription_controller.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/controllers/tts_controller.dart';
|
||||
import 'package:fluffychat/widgets/future_loading_dialog.dart';
|
||||
|
|
@ -190,8 +190,8 @@ class Choreographer extends ChangeNotifier {
|
|||
textController.editType = EditTypeEnum.keyboard;
|
||||
}
|
||||
|
||||
Future<void> requestWritingAssistance() =>
|
||||
_getWritingAssistance(manual: true);
|
||||
Future<void> requestWritingAssistance({bool manual = false}) =>
|
||||
_getWritingAssistance(manual: manual);
|
||||
|
||||
Future<void> _getWritingAssistance({
|
||||
bool manual = false,
|
||||
|
|
@ -201,10 +201,13 @@ class Choreographer extends ChangeNotifier {
|
|||
MatrixState.pangeaController.subscriptionController.subscriptionStatus;
|
||||
|
||||
if (canSendStatus != SubscriptionStatus.subscribed ||
|
||||
l2Lang == null ||
|
||||
l1Lang == null ||
|
||||
(!igcEnabled && !itEnabled) ||
|
||||
(!isAutoIGCEnabled && !manual && _choreoMode != ChoreoModeEnum.it)) {
|
||||
MatrixState.pangeaController.languageController.userL2 == null ||
|
||||
MatrixState.pangeaController.languageController.userL1 == null ||
|
||||
(!ToolSetting.interactiveGrammar.enabled &&
|
||||
!ToolSetting.interactiveTranslator.enabled) ||
|
||||
(!ToolSetting.autoIGC.enabled &&
|
||||
!manual &&
|
||||
_choreoMode != ChoreoModeEnum.it)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -225,6 +228,10 @@ class Choreographer extends ChangeNotifier {
|
|||
|
||||
Future<PangeaMessageContentModel> getMessageContent(String message) async {
|
||||
TokensResponseModel? tokensResp;
|
||||
final l2LangCode =
|
||||
MatrixState.pangeaController.languageController.userL2?.langCode;
|
||||
final l1LangCode =
|
||||
MatrixState.pangeaController.languageController.userL1?.langCode;
|
||||
if (l1LangCode != null && l2LangCode != null) {
|
||||
final res = await MatrixState.pangeaController.messageData
|
||||
.getTokens(
|
||||
|
|
@ -232,8 +239,8 @@ class Choreographer extends ChangeNotifier {
|
|||
room: null,
|
||||
req: TokensRequestModel(
|
||||
fullText: message,
|
||||
senderL1: l1LangCode!,
|
||||
senderL2: l2LangCode!,
|
||||
senderL1: l1LangCode,
|
||||
senderL2: l2LangCode,
|
||||
),
|
||||
)
|
||||
.timeout(const Duration(seconds: 10));
|
||||
|
|
@ -409,8 +416,6 @@ class Choreographer extends ChangeNotifier {
|
|||
s: s,
|
||||
data: {
|
||||
"currentText": currentText,
|
||||
"l1LangCode": l1LangCode,
|
||||
"l2LangCode": l2LangCode,
|
||||
"choreoRecord": _record.toJson(),
|
||||
},
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,12 +0,0 @@
|
|||
import 'package:fluffychat/pangea/choreographer/choreographer.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/any_state_holder.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
|
||||
extension ChoregrapherUserSettingsExtension on Choreographer {
|
||||
LayerLinkAndKey get itBarLinkAndKey =>
|
||||
MatrixState.pAnyState.layerLinkAndKey(itBarTransformTargetKey);
|
||||
String get itBarTransformTargetKey => 'it_bar';
|
||||
LayerLinkAndKey get inputLayerLinkAndKey =>
|
||||
MatrixState.pAnyState.layerLinkAndKey(inputTransformTargetKey);
|
||||
String get inputTransformTargetKey => 'input_text_field';
|
||||
}
|
||||
|
|
@ -135,7 +135,8 @@ class _StartIGCButtonState extends State<StartIGCButton>
|
|||
enableFeedback: enableFeedback,
|
||||
customBorder: const CircleBorder(),
|
||||
onTap: enableFeedback
|
||||
? widget.controller.onRequestWritingAssistance
|
||||
? () =>
|
||||
widget.controller.onRequestWritingAssistance(manual: true)
|
||||
: null,
|
||||
onLongPress: enableFeedback
|
||||
? () => showDialog(
|
||||
|
|
|
|||
|
|
@ -5,10 +5,8 @@ import 'package:flutter/material.dart';
|
|||
import 'package:sentry_flutter/sentry_flutter.dart';
|
||||
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choregrapher_user_settings_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreo_constants.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer_ui_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/it/completed_it_step_model.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/it/it_feedback_card.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/it/word_data_card.dart';
|
||||
|
|
@ -104,28 +102,33 @@ class ITBarState extends State<ITBar> with SingleTickerProviderStateMixin {
|
|||
}
|
||||
|
||||
final text = currentStep.continuances[index].text;
|
||||
final l1Code =
|
||||
MatrixState.pangeaController.languageController.userL1!.langCode;
|
||||
final l2Code =
|
||||
MatrixState.pangeaController.languageController.userL2!.langCode;
|
||||
|
||||
MatrixState.pAnyState.closeOverlay("it_feedback_card");
|
||||
OverlayUtil.showPositionedCard(
|
||||
context: context,
|
||||
cardToShow: choiceFeedback == null
|
||||
? WordDataCard(
|
||||
word: text,
|
||||
wordLang: widget.choreographer.l2LangCode!,
|
||||
wordLang: l2Code,
|
||||
fullText: _sourceText.value ?? widget.choreographer.currentText,
|
||||
fullTextLang: widget.choreographer.l1LangCode!,
|
||||
fullTextLang: l2Code,
|
||||
)
|
||||
: ITFeedbackCard(
|
||||
FullTextTranslationRequestModel(
|
||||
text: text,
|
||||
tgtLang: widget.choreographer.l1LangCode!,
|
||||
userL1: widget.choreographer.l1LangCode!,
|
||||
userL2: widget.choreographer.l2LangCode!,
|
||||
tgtLang: l1Code,
|
||||
userL1: l1Code,
|
||||
userL2: l2Code,
|
||||
),
|
||||
),
|
||||
maxHeight: 300,
|
||||
maxWidth: 300,
|
||||
borderColor: borderColor,
|
||||
transformTargetId: widget.choreographer.itBarTransformTargetKey,
|
||||
transformTargetId: 'it_bar',
|
||||
isScrollable: choiceFeedback == null,
|
||||
overlayKey: "it_feedback_card",
|
||||
ignorePointer: true,
|
||||
|
|
@ -196,9 +199,7 @@ class ITBarState extends State<ITBar> with SingleTickerProviderStateMixin {
|
|||
child: child,
|
||||
),
|
||||
child: CompositedTransformTarget(
|
||||
link: MatrixState.pAnyState
|
||||
.layerLinkAndKey(widget.choreographer.itBarTransformTargetKey)
|
||||
.link,
|
||||
link: MatrixState.pAnyState.layerLinkAndKey('it_bar').link,
|
||||
child: Column(
|
||||
children: [
|
||||
if (!InstructionsEnum.clickBestOption.isToggledOff) ...[
|
||||
|
|
@ -209,9 +210,7 @@ class ITBarState extends State<ITBar> with SingleTickerProviderStateMixin {
|
|||
const SizedBox(height: 8.0),
|
||||
],
|
||||
Container(
|
||||
key: MatrixState.pAnyState
|
||||
.layerLinkAndKey(widget.choreographer.itBarTransformTargetKey)
|
||||
.key,
|
||||
key: MatrixState.pAnyState.layerLinkAndKey('it_bar').key,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.circular(24),
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ import 'dart:developer';
|
|||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:fluffychat/pangea/choreographer/choreo_constants.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/choreographer_ui_extension.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/igc/pangea_match_state_model.dart';
|
||||
import 'package:fluffychat/pangea/choreographer/igc/span_card.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/any_state_holder.dart';
|
||||
|
|
@ -232,7 +232,7 @@ class OverlayUtil {
|
|||
),
|
||||
maxHeight: 325,
|
||||
maxWidth: 325,
|
||||
transformTargetId: choreographer.inputTransformTargetKey,
|
||||
transformTargetId: ChoreoConstants.inputTransformTargetKey,
|
||||
ignorePointer: true,
|
||||
isScrollable: false,
|
||||
);
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import 'package:matrix/matrix.dart';
|
|||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
|
||||
import 'package:fluffychat/pangea/spaces/constants/space_constants.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
import '../../events/constants/pangea_event_types.dart';
|
||||
import '../../learning_settings/constants/language_constants.dart';
|
||||
import '../../learning_settings/models/language_model.dart';
|
||||
|
|
@ -234,10 +235,8 @@ enum ToolSetting {
|
|||
// translations,
|
||||
autoIGC,
|
||||
enableTTS,
|
||||
enableAutocorrect,
|
||||
}
|
||||
enableAutocorrect;
|
||||
|
||||
extension SettingCopy on ToolSetting {
|
||||
String toolName(BuildContext context) {
|
||||
switch (this) {
|
||||
case ToolSetting.interactiveTranslator:
|
||||
|
|
@ -294,4 +293,7 @@ extension SettingCopy on ToolSetting {
|
|||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool get enabled =>
|
||||
MatrixState.pangeaController.permissionsController.isToolEnabled(this);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue