saminsohag

improved gpt_markdown example app

  1 +import 'dart:io';
  2 +
  3 +import 'package:desktop_drop/desktop_drop.dart';
1 import 'package:flutter/material.dart'; 4 import 'package:flutter/material.dart';
2 import 'package:gpt_markdown/gpt_markdown.dart'; 5 import 'package:gpt_markdown/gpt_markdown.dart';
3 import 'package:flutter_math_fork/flutter_math.dart'; 6 import 'package:flutter_math_fork/flutter_math.dart';
  7 +import 'package:watcher/watcher.dart';
4 8
5 // 9 //
6 void main() { 10 void main() {
@@ -113,6 +117,35 @@ You can also use LaTeX for mathematical expressions. Here's an example: @@ -113,6 +117,35 @@ You can also use LaTeX for mathematical expressions. Here's an example:
113 Markdown and LaTeX can be powerful tools for formatting text and mathematical expressions in your Flutter app. If you have any questions or need further assistance, feel free to ask! 117 Markdown and LaTeX can be powerful tools for formatting text and mathematical expressions in your Flutter app. If you have any questions or need further assistance, feel free to ask!
114 ''', 118 ''',
115 ); 119 );
  120 + File? file;
  121 +
  122 + loadContent() async {
  123 + File? file = this.file;
  124 + if (file == null) {
  125 + return;
  126 + }
  127 + String content = await file.readAsString();
  128 + _controller.text = content;
  129 + }
  130 +
  131 + updateContent(String contents) async {
  132 + //
  133 + await file?.writeAsString(contents);
  134 + }
  135 +
  136 + load() async {
  137 + await loadContent();
  138 + String? path = file?.path;
  139 + if (path == null) {
  140 + return;
  141 + }
  142 + FileWatcher(path).events.listen((details) {
  143 + loadContent();
  144 + });
  145 + }
  146 +
  147 + bool writingMod = true;
  148 +
116 @override 149 @override
117 Widget build(BuildContext context) { 150 Widget build(BuildContext context) {
118 return Scaffold( 151 return Scaffold(
@@ -131,173 +164,196 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex @@ -131,173 +164,196 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex
131 onPressed: widget.onPressed, 164 onPressed: widget.onPressed,
132 icon: const Icon(Icons.sunny), 165 icon: const Icon(Icons.sunny),
133 ), 166 ),
  167 + IconButton(
  168 + onPressed: () => setState(() {
  169 + writingMod = !writingMod;
  170 + }),
  171 + icon: const Icon(Icons.arrow_drop_down),
  172 + ),
134 ], 173 ],
135 ), 174 ),
136 - body: Stack(  
137 - children: [  
138 - Column(  
139 - children: [  
140 - Expanded(  
141 - child: ListView(  
142 - children: [  
143 - AnimatedBuilder(  
144 - animation: _controller,  
145 - builder: (context, _) {  
146 - return Material(  
147 - // color: Theme.of(context).colorScheme.surfaceVariant,  
148 - shape: RoundedRectangleBorder(  
149 - side: BorderSide(  
150 - width: 1,  
151 - color: Theme.of(context).colorScheme.outline),  
152 - ),  
153 - child: LayoutBuilder(builder: (context, constraints) {  
154 - return Theme(  
155 - data: Theme.of(context),  
156 - // .copyWith(  
157 - // textTheme: const TextTheme(  
158 - // // For H1.  
159 - // headlineLarge: TextStyle(fontSize: 55),  
160 - // // For H2.  
161 - // headlineMedium: TextStyle(fontSize: 45),  
162 - // // For H3.  
163 - // headlineSmall: TextStyle(fontSize: 35),  
164 - // // For H4.  
165 - // titleLarge: TextStyle(fontSize: 25),  
166 - // // For H5.  
167 - // titleMedium: TextStyle(fontSize: 15),  
168 - // // For H6.  
169 - // titleSmall: TextStyle(fontSize: 10),  
170 - // ),  
171 - // ),  
172 - child: Padding(  
173 - padding: const EdgeInsets.all(8.0),  
174 - child: TexMarkdown(  
175 - _controller.text,  
176 - textDirection: _direction,  
177 - onLinkTab: (url, title) {  
178 - debugPrint(url);  
179 - debugPrint(title);  
180 - },  
181 - // maxLines: 7,  
182 - // overflow: TextOverflow.ellipsis,  
183 - textAlign: TextAlign.justify,  
184 - // textScaler: const TextScaler.linear(1.3),  
185 - textScaler: const TextScaler.linear(1),  
186 - style: const TextStyle(  
187 - // Regular text font size here.  
188 - fontSize: 15,  
189 - ),  
190 - latexWorkaround: (tex) {  
191 - List<String> stack = [];  
192 - tex = tex.splitMapJoin(  
193 - RegExp(r"\\text\{|\{|\}|\_"),  
194 - onMatch: (p) {  
195 - String input = p[0] ?? "";  
196 - if (input == r"\text{") {  
197 - stack.add(input);  
198 - }  
199 - if (stack.isNotEmpty) {  
200 - if (input == r"{") { 175 + body: DropTarget(
  176 + onDragDone: (details) {
  177 + var files = details.files;
  178 + if (files.length != 1) {
  179 + return;
  180 + }
  181 + var file = files[0];
  182 + String path = file.path;
  183 + this.file = File(path);
  184 + load();
  185 + },
  186 + child: Stack(
  187 + children: [
  188 + Column(
  189 + children: [
  190 + Expanded(
  191 + child: ListView(
  192 + children: [
  193 + AnimatedBuilder(
  194 + animation: _controller,
  195 + builder: (context, _) {
  196 + return Material(
  197 + // color: Theme.of(context).colorScheme.surfaceVariant,
  198 + shape: RoundedRectangleBorder(
  199 + side: BorderSide(
  200 + width: 1,
  201 + color: Theme.of(context).colorScheme.outline),
  202 + ),
  203 + child:
  204 + LayoutBuilder(builder: (context, constraints) {
  205 + return Theme(
  206 + data: Theme.of(context),
  207 + // .copyWith(
  208 + // textTheme: const TextTheme(
  209 + // // For H1.
  210 + // headlineLarge: TextStyle(fontSize: 55),
  211 + // // For H2.
  212 + // headlineMedium: TextStyle(fontSize: 45),
  213 + // // For H3.
  214 + // headlineSmall: TextStyle(fontSize: 35),
  215 + // // For H4.
  216 + // titleLarge: TextStyle(fontSize: 25),
  217 + // // For H5.
  218 + // titleMedium: TextStyle(fontSize: 15),
  219 + // // For H6.
  220 + // titleSmall: TextStyle(fontSize: 10),
  221 + // ),
  222 + // ),
  223 + child: Padding(
  224 + padding: const EdgeInsets.all(8.0),
  225 + child: TexMarkdown(
  226 + _controller.text,
  227 + textDirection: _direction,
  228 + onLinkTab: (url, title) {
  229 + debugPrint(url);
  230 + debugPrint(title);
  231 + },
  232 + // maxLines: 7,
  233 + // overflow: TextOverflow.ellipsis,
  234 + textAlign: TextAlign.justify,
  235 + // textScaler: const TextScaler.linear(1.3),
  236 + textScaler: const TextScaler.linear(1),
  237 + style: const TextStyle(
  238 + // Regular text font size here.
  239 + fontSize: 15,
  240 + ),
  241 + latexWorkaround: (tex) {
  242 + List<String> stack = [];
  243 + tex = tex.splitMapJoin(
  244 + RegExp(r"\\text\{|\{|\}|\_"),
  245 + onMatch: (p) {
  246 + String input = p[0] ?? "";
  247 + if (input == r"\text{") {
201 stack.add(input); 248 stack.add(input);
202 } 249 }
203 - if (input == r"}") {  
204 - stack.removeLast();  
205 - }  
206 - if (input == r"_") {  
207 - return r"\_"; 250 + if (stack.isNotEmpty) {
  251 + if (input == r"{") {
  252 + stack.add(input);
  253 + }
  254 + if (input == r"}") {
  255 + stack.removeLast();
  256 + }
  257 + if (input == r"_") {
  258 + return r"\_";
  259 + }
208 } 260 }
209 - }  
210 - return input;  
211 - },  
212 - );  
213 - return tex.replaceAllMapped(  
214 - RegExp(r"align\*"),  
215 - (match) => "aligned");  
216 - },  
217 - latexBuilder:  
218 - (contex, tex, textStyle, inline) {  
219 - if (tex.contains(r"\begin{tabular}")) {  
220 - // return table.  
221 - String tableString = "|${(RegExp(  
222 - r"^\\begin\{tabular\}\{.*?\}(.*?)\\end\{tabular\}$",  
223 - multiLine: true,  
224 - dotAll: true,  
225 - ).firstMatch(tex)?[1] ?? "").trim()}|";  
226 - tableString = tableString  
227 - .replaceAll(r"\\", "|\n|")  
228 - .replaceAll(r"\hline", "")  
229 - .replaceAll(RegExp(r"(?<!\\)&"), "|");  
230 - var tableStringList = tableString  
231 - .split("\n")  
232 - ..insert(1, "|---|");  
233 - tableString = tableStringList.join("\n");  
234 - return TexMarkdown(tableString);  
235 - }  
236 - var controller = ScrollController();  
237 - Widget child = Math.tex(  
238 - tex,  
239 - textStyle: textStyle,  
240 - );  
241 - if (!inline) {  
242 - child = Padding(  
243 - padding: const EdgeInsets.all(0.0),  
244 - child: Material(  
245 - color: Theme.of(context)  
246 - .colorScheme  
247 - .onInverseSurface,  
248 - child: Padding(  
249 - padding: const EdgeInsets.all(8.0),  
250 - child: Scrollbar(  
251 - controller: controller,  
252 - child: SingleChildScrollView( 261 + return input;
  262 + },
  263 + );
  264 + return tex.replaceAllMapped(
  265 + RegExp(r"align\*"),
  266 + (match) => "aligned");
  267 + },
  268 + latexBuilder:
  269 + (contex, tex, textStyle, inline) {
  270 + if (tex.contains(r"\begin{tabular}")) {
  271 + // return table.
  272 + String tableString = "|${(RegExp(
  273 + r"^\\begin\{tabular\}\{.*?\}(.*?)\\end\{tabular\}$",
  274 + multiLine: true,
  275 + dotAll: true,
  276 + ).firstMatch(tex)?[1] ?? "").trim()}|";
  277 + tableString = tableString
  278 + .replaceAll(r"\\", "|\n|")
  279 + .replaceAll(r"\hline", "")
  280 + .replaceAll(
  281 + RegExp(r"(?<!\\)&"), "|");
  282 + var tableStringList = tableString
  283 + .split("\n")
  284 + ..insert(1, "|---|");
  285 + tableString =
  286 + tableStringList.join("\n");
  287 + return TexMarkdown(tableString);
  288 + }
  289 + var controller = ScrollController();
  290 + Widget child = Math.tex(
  291 + tex,
  292 + textStyle: textStyle,
  293 + );
  294 + if (!inline) {
  295 + child = Padding(
  296 + padding: const EdgeInsets.all(0.0),
  297 + child: Material(
  298 + color: Theme.of(context)
  299 + .colorScheme
  300 + .onInverseSurface,
  301 + child: Padding(
  302 + padding:
  303 + const EdgeInsets.all(8.0),
  304 + child: Scrollbar(
253 controller: controller, 305 controller: controller,
254 - scrollDirection:  
255 - Axis.horizontal,  
256 - child: Math.tex(  
257 - tex,  
258 - textStyle: textStyle, 306 + child: SingleChildScrollView(
  307 + controller: controller,
  308 + scrollDirection:
  309 + Axis.horizontal,
  310 + child: Math.tex(
  311 + tex,
  312 + textStyle: textStyle,
  313 + ),
259 ), 314 ),
260 ), 315 ),
261 ), 316 ),
262 ), 317 ),
263 - ), 318 + );
  319 + }
  320 + child = InkWell(
  321 + onTap: () {
  322 + debugPrint("Hello world");
  323 + },
  324 + child: child,
264 ); 325 );
265 - }  
266 - child = InkWell(  
267 - onTap: () {  
268 - debugPrint("Hello world");  
269 - },  
270 - child: child,  
271 - );  
272 - return child;  
273 - }, 326 + return child;
  327 + },
  328 + ),
274 ), 329 ),
275 - ),  
276 - // child: const Text("Hello"),  
277 - );  
278 - }),  
279 - );  
280 - },  
281 - ),  
282 - ],  
283 - ),  
284 - ),  
285 - ConstrainedBox(  
286 - constraints: const BoxConstraints(maxHeight: 200),  
287 - child: Padding(  
288 - padding: const EdgeInsets.all(8.0),  
289 - child: TextField(  
290 - decoration: const InputDecoration(  
291 - border: OutlineInputBorder(),  
292 - label: Text("Type here:")),  
293 - maxLines: null,  
294 - controller: _controller, 330 + // child: const Text("Hello"),
  331 + );
  332 + }),
  333 + );
  334 + },
  335 + ),
  336 + ],
295 ), 337 ),
296 ), 338 ),
297 - ),  
298 - ],  
299 - ),  
300 - ], 339 + if (writingMod)
  340 + ConstrainedBox(
  341 + constraints: const BoxConstraints(maxHeight: 200),
  342 + child: Padding(
  343 + padding: const EdgeInsets.all(8.0),
  344 + child: TextField(
  345 + decoration: const InputDecoration(
  346 + border: OutlineInputBorder(),
  347 + label: Text("Type here:")),
  348 + maxLines: null,
  349 + controller: _controller,
  350 + ),
  351 + ),
  352 + ),
  353 + ],
  354 + ),
  355 + ],
  356 + ),
301 ), 357 ),
302 ); 358 );
303 } 359 }
@@ -6,10 +6,14 @@ @@ -6,10 +6,14 @@
6 6
7 #include "generated_plugin_registrant.h" 7 #include "generated_plugin_registrant.h"
8 8
  9 +#include <desktop_drop/desktop_drop_plugin.h>
9 #include <printing/printing_plugin.h> 10 #include <printing/printing_plugin.h>
10 #include <url_launcher_linux/url_launcher_plugin.h> 11 #include <url_launcher_linux/url_launcher_plugin.h>
11 12
12 void fl_register_plugins(FlPluginRegistry* registry) { 13 void fl_register_plugins(FlPluginRegistry* registry) {
  14 + g_autoptr(FlPluginRegistrar) desktop_drop_registrar =
  15 + fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin");
  16 + desktop_drop_plugin_register_with_registrar(desktop_drop_registrar);
13 g_autoptr(FlPluginRegistrar) printing_registrar = 17 g_autoptr(FlPluginRegistrar) printing_registrar =
14 fl_plugin_registry_get_registrar_for_plugin(registry, "PrintingPlugin"); 18 fl_plugin_registry_get_registrar_for_plugin(registry, "PrintingPlugin");
15 printing_plugin_register_with_registrar(printing_registrar); 19 printing_plugin_register_with_registrar(printing_registrar);
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 # 3 #
4 4
5 list(APPEND FLUTTER_PLUGIN_LIST 5 list(APPEND FLUTTER_PLUGIN_LIST
  6 + desktop_drop
6 printing 7 printing
7 url_launcher_linux 8 url_launcher_linux
8 ) 9 )
@@ -5,11 +5,13 @@ @@ -5,11 +5,13 @@
5 import FlutterMacOS 5 import FlutterMacOS
6 import Foundation 6 import Foundation
7 7
  8 +import desktop_drop
8 import path_provider_foundation 9 import path_provider_foundation
9 import printing 10 import printing
10 import url_launcher_macos 11 import url_launcher_macos
11 12
12 func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { 13 func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
  14 + DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin"))
13 PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) 15 PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
14 PrintingPlugin.register(with: registry.registrar(forPlugin: "PrintingPlugin")) 16 PrintingPlugin.register(with: registry.registrar(forPlugin: "PrintingPlugin"))
15 UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) 17 UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
1 PODS: 1 PODS:
  2 + - desktop_drop (0.0.1):
  3 + - FlutterMacOS
2 - FlutterMacOS (1.0.0) 4 - FlutterMacOS (1.0.0)
3 - path_provider_foundation (0.0.1): 5 - path_provider_foundation (0.0.1):
4 - Flutter 6 - Flutter
@@ -9,12 +11,15 @@ PODS: @@ -9,12 +11,15 @@ PODS:
9 - FlutterMacOS 11 - FlutterMacOS
10 12
11 DEPENDENCIES: 13 DEPENDENCIES:
  14 + - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`)
12 - FlutterMacOS (from `Flutter/ephemeral`) 15 - FlutterMacOS (from `Flutter/ephemeral`)
13 - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) 16 - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
14 - printing (from `Flutter/ephemeral/.symlinks/plugins/printing/macos`) 17 - printing (from `Flutter/ephemeral/.symlinks/plugins/printing/macos`)
15 - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) 18 - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
16 19
17 EXTERNAL SOURCES: 20 EXTERNAL SOURCES:
  21 + desktop_drop:
  22 + :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos
18 FlutterMacOS: 23 FlutterMacOS:
19 :path: Flutter/ephemeral 24 :path: Flutter/ephemeral
20 path_provider_foundation: 25 path_provider_foundation:
@@ -25,6 +30,7 @@ EXTERNAL SOURCES: @@ -25,6 +30,7 @@ EXTERNAL SOURCES:
25 :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos 30 :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
26 31
27 SPEC CHECKSUMS: 32 SPEC CHECKSUMS:
  33 + desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898
28 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 34 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
29 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 35 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
30 printing: 1dd6a1fce2209ec240698e2439a4adbb9b427637 36 printing: 1dd6a1fce2209ec240698e2439a4adbb9b427637
1 import Cocoa 1 import Cocoa
2 import FlutterMacOS 2 import FlutterMacOS
3 3
4 -@NSApplicationMain 4 +@main
5 class AppDelegate: FlutterAppDelegate { 5 class AppDelegate: FlutterAppDelegate {
6 override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 6 override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
7 return true 7 return true
@@ -8,5 +8,7 @@ @@ -8,5 +8,7 @@
8 <true/> 8 <true/>
9 <key>com.apple.security.network.server</key> 9 <key>com.apple.security.network.server</key>
10 <true/> 10 <true/>
  11 + <key>com.apple.security.files.user-selected.read-write</key>
  12 + <true/>
11 </dict> 13 </dict>
12 </plist> 14 </plist>
@@ -4,5 +4,7 @@ @@ -4,5 +4,7 @@
4 <dict> 4 <dict>
5 <key>com.apple.security.app-sandbox</key> 5 <key>com.apple.security.app-sandbox</key>
6 <true/> 6 <true/>
  7 + <key>com.apple.security.files.user-selected.read-write</key>
  8 + <true/>
7 </dict> 9 </dict>
8 </plist> 10 </plist>
@@ -97,6 +97,14 @@ packages: @@ -97,6 +97,14 @@ packages:
97 url: "https://pub.dev" 97 url: "https://pub.dev"
98 source: hosted 98 source: hosted
99 version: "1.0.8" 99 version: "1.0.8"
  100 + desktop_drop:
  101 + dependency: "direct main"
  102 + description:
  103 + name: desktop_drop
  104 + sha256: d55a010fe46c8e8fcff4ea4b451a9ff84a162217bdb3b2a0aa1479776205e15d
  105 + url: "https://pub.dev"
  106 + source: hosted
  107 + version: "0.4.4"
100 fake_async: 108 fake_async:
101 dependency: transitive 109 dependency: transitive
102 description: 110 description:
@@ -117,10 +125,10 @@ packages: @@ -117,10 +125,10 @@ packages:
117 dependency: "direct main" 125 dependency: "direct main"
118 description: 126 description:
119 name: file_picker 127 name: file_picker
120 - sha256: "824f5b9f389bfc4dddac3dea76cd70c51092d9dff0b2ece7ef4f53db8547d258" 128 + sha256: "825aec673606875c33cd8d3c4083f1a3c3999015a84178b317b7ef396b7384f3"
121 url: "https://pub.dev" 129 url: "https://pub.dev"
122 source: hosted 130 source: hosted
123 - version: "8.0.6" 131 + version: "8.0.7"
124 flutter: 132 flutter:
125 dependency: "direct main" 133 dependency: "direct main"
126 description: flutter 134 description: flutter
@@ -211,18 +219,18 @@ packages: @@ -211,18 +219,18 @@ packages:
211 dependency: transitive 219 dependency: transitive
212 description: 220 description:
213 name: leak_tracker 221 name: leak_tracker
214 - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" 222 + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
215 url: "https://pub.dev" 223 url: "https://pub.dev"
216 source: hosted 224 source: hosted
217 - version: "10.0.4" 225 + version: "10.0.5"
218 leak_tracker_flutter_testing: 226 leak_tracker_flutter_testing:
219 dependency: transitive 227 dependency: transitive
220 description: 228 description:
221 name: leak_tracker_flutter_testing 229 name: leak_tracker_flutter_testing
222 - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" 230 + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
223 url: "https://pub.dev" 231 url: "https://pub.dev"
224 source: hosted 232 source: hosted
225 - version: "3.0.3" 233 + version: "3.0.5"
226 leak_tracker_testing: 234 leak_tracker_testing:
227 dependency: transitive 235 dependency: transitive
228 description: 236 description:
@@ -251,18 +259,18 @@ packages: @@ -251,18 +259,18 @@ packages:
251 dependency: transitive 259 dependency: transitive
252 description: 260 description:
253 name: material_color_utilities 261 name: material_color_utilities
254 - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" 262 + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
255 url: "https://pub.dev" 263 url: "https://pub.dev"
256 source: hosted 264 source: hosted
257 - version: "0.8.0" 265 + version: "0.11.1"
258 meta: 266 meta:
259 dependency: transitive 267 dependency: transitive
260 description: 268 description:
261 name: meta 269 name: meta
262 - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" 270 + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
263 url: "https://pub.dev" 271 url: "https://pub.dev"
264 source: hosted 272 source: hosted
265 - version: "1.12.0" 273 + version: "1.15.0"
266 nested: 274 nested:
267 dependency: transitive 275 dependency: transitive
268 description: 276 description:
@@ -363,10 +371,10 @@ packages: @@ -363,10 +371,10 @@ packages:
363 dependency: transitive 371 dependency: transitive
364 description: 372 description:
365 name: permission_handler_android 373 name: permission_handler_android
366 - sha256: b29a799ca03be9f999aa6c39f7de5209482d638e6f857f6b93b0875c618b7e54 374 + sha256: eaf2a1ec4472775451e88ca6a7b86559ef2f1d1ed903942ed135e38ea0097dca
367 url: "https://pub.dev" 375 url: "https://pub.dev"
368 source: hosted 376 source: hosted
369 - version: "12.0.7" 377 + version: "12.0.8"
370 permission_handler_apple: 378 permission_handler_apple:
371 dependency: transitive 379 dependency: transitive
372 description: 380 description:
@@ -387,10 +395,10 @@ packages: @@ -387,10 +395,10 @@ packages:
387 dependency: transitive 395 dependency: transitive
388 description: 396 description:
389 name: permission_handler_platform_interface 397 name: permission_handler_platform_interface
390 - sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20" 398 + sha256: fe0ffe274d665be8e34f9c59705441a7d248edebbe5d9e3ec2665f88b79358ea
391 url: "https://pub.dev" 399 url: "https://pub.dev"
392 source: hosted 400 source: hosted
393 - version: "4.2.1" 401 + version: "4.2.2"
394 permission_handler_windows: 402 permission_handler_windows:
395 dependency: transitive 403 dependency: transitive
396 description: 404 description:
@@ -496,10 +504,10 @@ packages: @@ -496,10 +504,10 @@ packages:
496 dependency: transitive 504 dependency: transitive
497 description: 505 description:
498 name: test_api 506 name: test_api
499 - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" 507 + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
500 url: "https://pub.dev" 508 url: "https://pub.dev"
501 source: hosted 509 source: hosted
502 - version: "0.7.0" 510 + version: "0.7.2"
503 tuple: 511 tuple:
504 dependency: transitive 512 dependency: transitive
505 description: 513 description:
@@ -568,10 +576,10 @@ packages: @@ -568,10 +576,10 @@ packages:
568 dependency: transitive 576 dependency: transitive
569 description: 577 description:
570 name: url_launcher_web 578 name: url_launcher_web
571 - sha256: a36e2d7981122fa185006b216eb6b5b97ede3f9a54b7a511bc966971ab98d049 579 + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
572 url: "https://pub.dev" 580 url: "https://pub.dev"
573 source: hosted 581 source: hosted
574 - version: "2.3.2" 582 + version: "2.3.3"
575 url_launcher_windows: 583 url_launcher_windows:
576 dependency: transitive 584 dependency: transitive
577 description: 585 description:
@@ -616,10 +624,18 @@ packages: @@ -616,10 +624,18 @@ packages:
616 dependency: transitive 624 dependency: transitive
617 description: 625 description:
618 name: vm_service 626 name: vm_service
619 - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" 627 + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
  628 + url: "https://pub.dev"
  629 + source: hosted
  630 + version: "14.2.4"
  631 + watcher:
  632 + dependency: "direct main"
  633 + description:
  634 + name: watcher
  635 + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
620 url: "https://pub.dev" 636 url: "https://pub.dev"
621 source: hosted 637 source: hosted
622 - version: "14.2.1" 638 + version: "1.1.0"
623 web: 639 web:
624 dependency: transitive 640 dependency: transitive
625 description: 641 description:
@@ -21,6 +21,8 @@ dependencies: @@ -21,6 +21,8 @@ dependencies:
21 permission_handler: ^11.3.1 21 permission_handler: ^11.3.1
22 file_picker: ^8.0.6 22 file_picker: ^8.0.6
23 flutter_math_fork: ^0.7.2 23 flutter_math_fork: ^0.7.2
  24 + watcher: ^1.1.0
  25 + desktop_drop: ^0.4.4
24 26
25 dev_dependencies: 27 dev_dependencies:
26 flutter_test: 28 flutter_test:
@@ -6,11 +6,14 @@ @@ -6,11 +6,14 @@
6 6
7 #include "generated_plugin_registrant.h" 7 #include "generated_plugin_registrant.h"
8 8
  9 +#include <desktop_drop/desktop_drop_plugin.h>
9 #include <permission_handler_windows/permission_handler_windows_plugin.h> 10 #include <permission_handler_windows/permission_handler_windows_plugin.h>
10 #include <printing/printing_plugin.h> 11 #include <printing/printing_plugin.h>
11 #include <url_launcher_windows/url_launcher_windows.h> 12 #include <url_launcher_windows/url_launcher_windows.h>
12 13
13 void RegisterPlugins(flutter::PluginRegistry* registry) { 14 void RegisterPlugins(flutter::PluginRegistry* registry) {
  15 + DesktopDropPluginRegisterWithRegistrar(
  16 + registry->GetRegistrarForPlugin("DesktopDropPlugin"));
14 PermissionHandlerWindowsPluginRegisterWithRegistrar( 17 PermissionHandlerWindowsPluginRegisterWithRegistrar(
15 registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); 18 registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
16 PrintingPluginRegisterWithRegistrar( 19 PrintingPluginRegisterWithRegistrar(
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 # 3 #
4 4
5 list(APPEND FLUTTER_PLUGIN_LIST 5 list(APPEND FLUTTER_PLUGIN_LIST
  6 + desktop_drop
6 permission_handler_windows 7 permission_handler_windows
7 printing 8 printing
8 url_launcher_windows 9 url_launcher_windows