Skip to content

Commit

Permalink
[1.2.0] キーストロークの追跡 (#28)
Browse files Browse the repository at this point in the history
* Registration of keystrokes from the device keyboard.
* Some fixes with rebuild ui depends on state
  • Loading branch information
Carapacik authored Jun 11, 2022
1 parent 8a17292 commit b4d9923
Show file tree
Hide file tree
Showing 18 changed files with 274 additions and 315 deletions.
30 changes: 15 additions & 15 deletions .metadata
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# This file should be version controlled.

version:
revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
revision: cd41fdd495f6944ecd3506c21e94c6567b073278
channel: stable

project_type: app
Expand All @@ -13,26 +13,26 @@ project_type: app
migration:
platforms:
- platform: root
create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- platform: android
create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- platform: ios
create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- platform: linux
create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- platform: macos
create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- platform: web
create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- platform: windows
create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278

# User provided section

Expand Down
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = '1.6.21'
ext.kotlin_version = '1.7.0'
repositories {
google()
mavenCentral()
Expand Down
39 changes: 39 additions & 0 deletions lib/bloc/main/main_cubit.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/services.dart';
import 'package:get_it/get_it.dart';
import 'package:wordly/data/models/dictionary_languages.dart';
import 'package:wordly/data/models/flushbar_types.dart';
import 'package:wordly/data/models/keyboard_keys.dart';
import 'package:wordly/data/models/letter_status.dart';
Expand All @@ -18,6 +20,43 @@ class MainCubit extends Cubit<MainState> {
MainCubit(this.dictionaryRepository) : super(MainInitial());
final DictionaryRepository dictionaryRepository;

void keyDown(final RawKeyDownEvent event, final DictionaryLanguages lang) {
if (event.isKeyPressed(LogicalKeyboardKey.enter)) {
final wordComplete = completeWord();
if (wordComplete) {
dictionaryRepository.getAllLettersInList().map(
(index, value) {
final key = KeyboardKeys.values.firstWhere(
(element) => element.fromDictionaryLang(lang) == value,
);
if (dictionaryRepository.secretWord[index] == value) {
updateKey(key, LetterStatus.correctSpot);
return MapEntry(index, value);
}
if (dictionaryRepository.secretWord.contains(value)) {
updateKey(key, LetterStatus.wrongSpot);
return MapEntry(index, value);
}
updateKey(key, LetterStatus.notInWords);
return MapEntry(index, value);
},
);
}
return;
}

if (event.isKeyPressed(LogicalKeyboardKey.delete) ||
event.isKeyPressed(LogicalKeyboardKey.backspace)) {
removeLetter();
return;
}
final key = KeyboardKeys.fromLogicalKey(event.logicalKey);
if (key != null) {
setLetter(key);
return;
}
}

void setLetter(final KeyboardKeys keyboardKey) {
if (dictionaryRepository.setLetter(keyboardKey)) {
emit(GridUpdateState());
Expand Down
254 changes: 74 additions & 180 deletions lib/data/models/keyboard_keys.dart
Original file line number Diff line number Diff line change
@@ -1,49 +1,75 @@
import 'package:collection/collection.dart';
import 'package:flutter/services.dart';
import 'package:wordly/data/models/dictionary_languages.dart';

enum KeyboardKeys {
q,
w,
e,
r,
t,
y,
u,
i,
o,
p,
a1, // х
a2, // ъ
a,
s,
d,
f,
g,
h,
j,
k,
l,
b1, // ж
b2, // э
enter,
z,
x,
c,
v,
b,
n,
m,
c1, // б
c2, // ю
delete,
}

const _defaultWidthRu = 0.067;
const _defaultWidthEn = 0.08;

extension KeyboardKeyExtension on KeyboardKeys {
enum KeyboardKeys {
q('й', 'q', LogicalKeyboardKey(1081), LogicalKeyboardKey.keyQ),
w('ц', 'w', LogicalKeyboardKey(1094), LogicalKeyboardKey.keyW),
e('у', 'e', LogicalKeyboardKey(1091), LogicalKeyboardKey.keyE),
r('к', 'r', LogicalKeyboardKey(1082), LogicalKeyboardKey.keyR),
t('е', 't', LogicalKeyboardKey(1077), LogicalKeyboardKey.keyT),
y('н', 'y', LogicalKeyboardKey(1085), LogicalKeyboardKey.keyY),
u('г', 'u', LogicalKeyboardKey(1075), LogicalKeyboardKey.keyU),
i('ш', 'i', LogicalKeyboardKey(1096), LogicalKeyboardKey.keyI),
o('щ', 'o', LogicalKeyboardKey(1097), LogicalKeyboardKey.keyO),
p('з', 'p', LogicalKeyboardKey(1079), LogicalKeyboardKey.keyP),
a1('х', null, LogicalKeyboardKey(1093), null),
a2('ъ', null, LogicalKeyboardKey(1098), null),
a('ф', 'a', LogicalKeyboardKey(1092), LogicalKeyboardKey.keyA),
s('ы', 's', LogicalKeyboardKey(1099), LogicalKeyboardKey.keyS),
d('в', 'd', LogicalKeyboardKey(1074), LogicalKeyboardKey.keyD),
f('а', 'f', LogicalKeyboardKey(1072), LogicalKeyboardKey.keyF),
g('п', 'g', LogicalKeyboardKey(1087), LogicalKeyboardKey.keyG),
h('р', 'h', LogicalKeyboardKey(1088), LogicalKeyboardKey.keyH),
j('о', 'j', LogicalKeyboardKey(1086), LogicalKeyboardKey.keyJ),
k('л', 'k', LogicalKeyboardKey(1083), LogicalKeyboardKey.keyK),
l('д', 'l', LogicalKeyboardKey(1076), LogicalKeyboardKey.keyL),
b1('ж', null, LogicalKeyboardKey(1078), null),
b2('э', null, LogicalKeyboardKey(1101), null),
z('я', 'z', LogicalKeyboardKey(1103), LogicalKeyboardKey.keyZ),
x('ч', 'x', LogicalKeyboardKey(1095), LogicalKeyboardKey.keyX),
c('с', 'c', LogicalKeyboardKey(1089), LogicalKeyboardKey.keyC),
v('м', 'v', LogicalKeyboardKey(1084), LogicalKeyboardKey.keyV),
b('и', 'b', LogicalKeyboardKey(1080), LogicalKeyboardKey.keyB),
n('т', 'n', LogicalKeyboardKey(1090), LogicalKeyboardKey.keyN),
m('ь', 'm', LogicalKeyboardKey(1100), LogicalKeyboardKey.keyM),
c1('б', null, LogicalKeyboardKey(1073), null),
c2('ю', null, LogicalKeyboardKey(1102), null),
enter('ввод', 'enter', null, null),
delete('удалить', 'delete', null, null);

const KeyboardKeys(
this.ruName,
this.enName,
this.ruKey,
this.enKey,
);

final String? ruName;
final LogicalKeyboardKey? ruKey;
final String? enName;
final LogicalKeyboardKey? enKey;

static KeyboardKeys? fromLogicalKey(final LogicalKeyboardKey logicalKey) =>
KeyboardKeys.values.firstWhereOrNull(
(element) => element._notNullKeys.contains(logicalKey),
);

String? fromDictionaryLang(DictionaryLanguages lang) {
switch (lang) {
case DictionaryLanguages.ru:
return ruName;
case DictionaryLanguages.en:
return enName;
}
}

double width({
required final DictionaryLanguages language,
required final double screenWidth,
required DictionaryLanguages language,
required double screenWidth,
}) {
final parentWidth = screenWidth > 400 ? 400 : screenWidth;
if (this == KeyboardKeys.delete) {
Expand All @@ -70,146 +96,14 @@ extension KeyboardKeyExtension on KeyboardKeys {
}
}

String? name(final DictionaryLanguages lang) {
switch (lang) {
case DictionaryLanguages.ru:
switch (this) {
case KeyboardKeys.q:
return 'й';
case KeyboardKeys.w:
return 'ц';
case KeyboardKeys.e:
return 'у';
case KeyboardKeys.r:
return 'к';
case KeyboardKeys.t:
return 'е';
case KeyboardKeys.y:
return 'н';
case KeyboardKeys.u:
return 'г';
case KeyboardKeys.i:
return 'ш';
case KeyboardKeys.o:
return 'щ';
case KeyboardKeys.p:
return 'з';
case KeyboardKeys.a1:
return 'х';
case KeyboardKeys.a2:
return 'ъ';
case KeyboardKeys.a:
return 'ф';
case KeyboardKeys.s:
return 'ы';
case KeyboardKeys.d:
return 'в';
case KeyboardKeys.f:
return 'а';
case KeyboardKeys.g:
return 'п';
case KeyboardKeys.h:
return 'р';
case KeyboardKeys.j:
return 'о';
case KeyboardKeys.k:
return 'л';
case KeyboardKeys.l:
return 'д';
case KeyboardKeys.b1:
return 'ж';
case KeyboardKeys.b2:
return 'э';
case KeyboardKeys.enter:
return 'Ввод';
case KeyboardKeys.z:
return 'я';
case KeyboardKeys.x:
return 'ч';
case KeyboardKeys.c:
return 'с';
case KeyboardKeys.v:
return 'м';
case KeyboardKeys.b:
return 'и';
case KeyboardKeys.n:
return 'т';
case KeyboardKeys.m:
return 'ь';
case KeyboardKeys.c1:
return 'б';
case KeyboardKeys.c2:
return 'ю';
case KeyboardKeys.delete:
break;
}
break;
case DictionaryLanguages.en:
switch (this) {
case KeyboardKeys.q:
return 'q';
case KeyboardKeys.w:
return 'w';
case KeyboardKeys.e:
return 'e';
case KeyboardKeys.r:
return 'r';
case KeyboardKeys.t:
return 't';
case KeyboardKeys.y:
return 'y';
case KeyboardKeys.u:
return 'u';
case KeyboardKeys.i:
return 'i';
case KeyboardKeys.o:
return 'o';
case KeyboardKeys.p:
return 'p';
case KeyboardKeys.a:
return 'a';
case KeyboardKeys.s:
return 's';
case KeyboardKeys.d:
return 'd';
case KeyboardKeys.f:
return 'f';
case KeyboardKeys.g:
return 'g';
case KeyboardKeys.h:
return 'h';
case KeyboardKeys.j:
return 'j';
case KeyboardKeys.k:
return 'k';
case KeyboardKeys.l:
return 'l';
case KeyboardKeys.enter:
return 'Enter';
case KeyboardKeys.z:
return 'z';
case KeyboardKeys.x:
return 'x';
case KeyboardKeys.c:
return 'c';
case KeyboardKeys.v:
return 'v';
case KeyboardKeys.b:
return 'b';
case KeyboardKeys.n:
return 'n';
case KeyboardKeys.m:
return 'm';
case KeyboardKeys.a1:
case KeyboardKeys.a2:
case KeyboardKeys.b1:
case KeyboardKeys.b2:
case KeyboardKeys.c1:
case KeyboardKeys.c2:
case KeyboardKeys.delete:
break;
}
List<LogicalKeyboardKey> get _notNullKeys {
final list = <LogicalKeyboardKey>[];
if (ruKey != null) {
list.add(ruKey!);
}
if (enKey != null) {
list.add(enKey!);
}
return null;
return list;
}
}
6 changes: 3 additions & 3 deletions lib/data/repositories/dictionary_repository_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -142,15 +142,15 @@ class DictionaryRepositoryImpl implements DictionaryRepository {
if (_completeGame) {
return false;
}
if (KeyboardKeys.enter.name == key.name) {
if (KeyboardKeys.enter.fromDictionaryLang == key.fromDictionaryLang) {
return false;
}
if (_gridData.length <= _currentWordIndex) {
_gridData.add('');
}
if (_gridData[_currentWordIndex].length < 5) {
_gridData[_currentWordIndex] =
_gridData[_currentWordIndex] + (key.name(_dictionaryLanguage) ?? '');
_gridData[_currentWordIndex] = _gridData[_currentWordIndex] +
(key.fromDictionaryLang(_dictionaryLanguage) ?? '');
return true;
}
return false;
Expand Down
Loading

0 comments on commit b4d9923

Please sign in to comment.