From 28c245547d9f6b4e774669b034c8919e85442f38 Mon Sep 17 00:00:00 2001 From: violet-dev Date: Sun, 15 Sep 2024 10:34:55 +0900 Subject: [PATCH 1/7] Add gitignore for .vscode directory --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..832272198 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode/** + From 29f4175fc421044874432a863d895599ef4b43b3 Mon Sep 17 00:00:00 2001 From: violet-dev Date: Sun, 15 Sep 2024 10:53:03 +0900 Subject: [PATCH 2/7] =?UTF-8?q?Suppress=20below=20error=20message=20?= =?UTF-8?q?=E2=95=90=E2=95=90=E2=95=A1=20EXCEPTION=20CAUGHT=20BY=20WIDGETS?= =?UTF-8?q?=20LIBRARY=20=E2=95=9E=E2=95=90=E2=95=90=E2=95=90=E2=95=90?= =?UTF-8?q?=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90?= =?UTF-8?q?=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90?= =?UTF-8?q?=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90?= =?UTF-8?q?=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90?= =?UTF-8?q?=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90?= =?UTF-8?q?=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90?= =?UTF-8?q?=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90?= =?UTF-8?q?led=20during=20build.=20This=20Obx=20widget=20cannot=20be=20mar?= =?UTF-8?q?ked=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=20The?= =?UTF-8?q?=20following=20assertion=20was=20thrown=20building=20LayoutBuil?= =?UTF-8?q?der:=20setState()=20or=20markNeedsBuild()=20cal=20as=20needing?= =?UTF-8?q?=20to=20build=20because=20the=20framework=20is=20already=20in?= =?UTF-8?q?=20the=20process=20of=20building=20widgets.=20A=20widget=20can?= =?UTF-8?q?=20be=20marked=20as=20needing=20to=20be=20built=20during=20the?= =?UTF-8?q?=20build=20phase=20only=20if=20one=20of=20its=20ancestors=20is?= =?UTF-8?q?=20currently=20building.=20This=20exception=20is=20allowed=20be?= =?UTF-8?q?cause=20the=20framework=20builds=20parent=20widgets=20before=20?= =?UTF-8?q?children,=20which=20means=20a=20dirty=20descendant=20will=20alw?= =?UTF-8?q?ays=20be=20built.=20Otherwise,=20the=20framework=20might=20not?= =?UTF-8?q?=20visit=20this=20widget=20during=20this=20build=20phase.=20The?= =?UTF-8?q?=20widget=20on=20which=20setState()=20or=20markNeedsBuild()=20w?= =?UTF-8?q?as=20called=20was:=20=20=20Obx=20The=20widget=20which=20was=20c?= =?UTF-8?q?urrently=20being=20built=20when=20the=20offending=20call=20was?= =?UTF-8?q?=20made=20was:=20=20=20LayoutBuilder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The relevant error-causing widget was: OrientationBuilder OrientationBuilder:file:///G:/Dev2/violet-project/violet/lib/pages/viewer/horizontal_viewer_page.dart:94:20 --- violet/lib/pages/viewer/horizontal_viewer_page.dart | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/violet/lib/pages/viewer/horizontal_viewer_page.dart b/violet/lib/pages/viewer/horizontal_viewer_page.dart index 168dcc14f..9edfa58ba 100644 --- a/violet/lib/pages/viewer/horizontal_viewer_page.dart +++ b/violet/lib/pages/viewer/horizontal_viewer_page.dart @@ -90,12 +90,13 @@ class _HorizontalViewerPageState extends State { return Obx( () => Stack( children: [ - Visibility.maintain( - child: OrientationBuilder(builder: (context, orientation) { - c.jump(c.page.value); - return const SizedBox.shrink(); - }), - ), + // TODO: 없어도 될 것 같은데 뭐지 + // Visibility.maintain( + // child: OrientationBuilder(builder: (context, orientation) { + // c.jump(c.page.value); + // return const SizedBox.shrink(); + // }), + // ), Container( decoration: const BoxDecoration( color: Colors.black, From 789ce3ff590e7b194fb7f6cf91b5e07b38745d72 Mon Sep 17 00:00:00 2001 From: violet-dev Date: Sun, 15 Sep 2024 10:54:15 +0900 Subject: [PATCH 3/7] Handle bug crop bookmark page not closes --- violet/lib/pages/viewer/image/file_image.dart | 2 +- violet/lib/pages/viewer/image/provider_image.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/violet/lib/pages/viewer/image/file_image.dart b/violet/lib/pages/viewer/image/file_image.dart index be2d88a19..0f3d073c7 100644 --- a/violet/lib/pages/viewer/image/file_image.dart +++ b/violet/lib/pages/viewer/image/file_image.dart @@ -203,7 +203,7 @@ class ImageCropBookmark extends StatelessWidget { '$articleId(${page}p): [${area.toString().split('(')[1].split(')')[0]}] Saved!', ); - if (!context.mounted) return; + // ignore: use_build_context_synchronously Navigator.pop(context); } } diff --git a/violet/lib/pages/viewer/image/provider_image.dart b/violet/lib/pages/viewer/image/provider_image.dart index 3b800b8bb..aed80b137 100644 --- a/violet/lib/pages/viewer/image/provider_image.dart +++ b/violet/lib/pages/viewer/image/provider_image.dart @@ -229,7 +229,7 @@ class ImageCropBookmark extends StatelessWidget { '$articleId(${page}p): [${area.toString().split('(')[1].split(')')[0]}] Saved!', ); - if (!context.mounted) return; + // ignore: use_build_context_synchronously Navigator.pop(context); } } From 3c26e6a35aa4e06f4cb6e08ba67ca2703e25b621 Mon Sep 17 00:00:00 2001 From: violet-dev Date: Sun, 15 Sep 2024 11:25:17 +0900 Subject: [PATCH 4/7] Make command file --- makefile | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 makefile diff --git a/makefile b/makefile new file mode 100644 index 000000000..697f79916 --- /dev/null +++ b/makefile @@ -0,0 +1,5 @@ +rebase: + git rebase -i dev + +push: + git push --set-upstream origin @ From 8c5367e1a9038672df5f9b862463da4c3afa4236 Mon Sep 17 00:00:00 2001 From: violet-dev Date: Sun, 15 Sep 2024 11:32:15 +0900 Subject: [PATCH 5/7] Symlink makefile --- violet/makefile | 1 + 1 file changed, 1 insertion(+) create mode 120000 violet/makefile diff --git a/violet/makefile b/violet/makefile new file mode 120000 index 000000000..cc63b08c8 --- /dev/null +++ b/violet/makefile @@ -0,0 +1 @@ +../makefile \ No newline at end of file From 88f112add28313cf9bf603696fb0345030df44b0 Mon Sep 17 00:00:00 2001 From: violet-dev Date: Sun, 15 Sep 2024 11:57:10 +0900 Subject: [PATCH 6/7] Suppress exclude tag selection error --- violet/lib/pages/settings/settings_page.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/violet/lib/pages/settings/settings_page.dart b/violet/lib/pages/settings/settings_page.dart index 06d5c637e..b856bc65c 100644 --- a/violet/lib/pages/settings/settings_page.dart +++ b/violet/lib/pages/settings/settings_page.dart @@ -647,14 +647,14 @@ class _SettingsPageState extends State title: Text(Translations.instance!.trans('excludetag')), trailing: const Icon(Icons.keyboard_arrow_right), onTap: () async { - final vv = await showDialog( + final vv = await showDialog<(int, String)?>( context: context, builder: (BuildContext context) => const TagSelectorDialog(what: 'exclude'), ); - if (vv.$1 == 1) { - Settings.setExcludeTags(vv.$2); + if (vv?.$1 == 1) { + Settings.setExcludeTags(vv!.$2); setState(() { _shouldReload = true; }); From 24424621af6c0915624da1072e7cc87f8e7fd5ae Mon Sep 17 00:00:00 2001 From: violet-dev Date: Sun, 15 Sep 2024 12:13:22 +0900 Subject: [PATCH 7/7] Fix parse after parentheses --- violet/lib/component/hitomi/hitomi.dart | 17 +++++++++++------ violet/test/query_test.dart | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/violet/lib/component/hitomi/hitomi.dart b/violet/lib/component/hitomi/hitomi.dart index 896bd6d8c..1e12d6107 100644 --- a/violet/lib/component/hitomi/hitomi.dart +++ b/violet/lib/component/hitomi/hitomi.dart @@ -322,6 +322,9 @@ class QueryTranslator { where += parseParentheses(token, negative); where += parseExpression(); where += nextToken(); + if (hasMoreTokens()) { + where += parseLogicalExpression(); + } } else if (token == ')') { return token; } else { @@ -329,8 +332,7 @@ class QueryTranslator { } if (hasMoreTokens() && lookAhead() != ')') { - String logicalOp = parseLogicalOperator(); - where += logicalOp + parseExpression(); + where += parseLogicalExpression(); } return where; @@ -393,18 +395,21 @@ class QueryTranslator { return negative ? "Title NOT LIKE '%$token%'" : "Title LIKE '%$token%'"; } - String parseLogicalOperator() { + String parseLogicalExpression() { String next = lookAhead(); + late String op; if (next.toLowerCase() == 'or') { nextToken(); - return ' OR '; + op = 'OR'; + } else { + op = 'AND'; } - return ' AND '; + return ' $op ${parseExpression()}'; } String nextToken() => tokens[index++]; String lookAhead() => index < tokens.length ? tokens[index] : ''; - bool hasMoreTokens() => index < tokens.length - 1; + bool hasMoreTokens() => index < tokens.length; static String findColumnByTag(String tag) { switch (tag) { diff --git a/violet/test/query_test.dart b/violet/test/query_test.dart index 9bb10826b..11ea53515 100644 --- a/violet/test/query_test.dart +++ b/violet/test/query_test.dart @@ -55,7 +55,7 @@ void main() { expect(result1, 'SELECT * FROM HitomiColumnModel WHERE Tags LIKE \'%|female:sole female|%\' AND NOT (Tags LIKE \'%|female:mother|%\' AND Tags LIKE \'%|female:milf|%\') AND ExistOnHitomi=1'); expect(result2, - 'SELECT * FROM HitomiColumnModel WHERE (Language LIKE \'%korean%\' OR Language LIKE \'%n/a%\') AND ExistOnHitomi=1'); + 'SELECT * FROM HitomiColumnModel WHERE (Language LIKE \'%korean%\' OR Language LIKE \'%n/a%\') AND (Tags LIKE \'%|female:sole female|%\') IS NOT 1 AND ExistOnHitomi=1'); }); }); }