app icons
|
After Width: | Height: | Size: 552 B |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 4.4 KiB |
|
After Width: | Height: | Size: 374 B |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 3 KiB |
|
After Width: | Height: | Size: 724 B |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 1 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 7.9 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 10 KiB |
14
android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@drawable/ic_launcher_background"/>
|
||||||
|
<foreground>
|
||||||
|
<inset
|
||||||
|
android:drawable="@drawable/ic_launcher_foreground"
|
||||||
|
android:inset="16%" />
|
||||||
|
</foreground>
|
||||||
|
<monochrome>
|
||||||
|
<inset
|
||||||
|
android:drawable="@drawable/ic_launcher_monochrome"
|
||||||
|
android:inset="16%" />
|
||||||
|
</monochrome>
|
||||||
|
</adaptive-icon>
|
||||||
|
Before Width: | Height: | Size: 544 B After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 5 KiB |
28
assets/blaster.svg
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
fill="#000000"
|
||||||
|
height="800"
|
||||||
|
width="800"
|
||||||
|
version="1.1"
|
||||||
|
id="Layer_1"
|
||||||
|
viewBox="0 0 512 512"
|
||||||
|
xml:space="preserve"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||||
|
id="defs2" />
|
||||||
|
<g
|
||||||
|
id="g2"
|
||||||
|
transform="matrix(-1,0,0,1,512,0)"
|
||||||
|
style="fill:#ffffff">
|
||||||
|
<g
|
||||||
|
id="g1"
|
||||||
|
style="fill:#ffffff">
|
||||||
|
<path
|
||||||
|
d="m 466.824,173.176 v -30.118 c 0,-12.475 -10.114,-22.588 -22.588,-22.588 -12.474,0 -22.588,10.114 -22.588,22.588 0,-12.475 -10.114,-22.588 -22.588,-22.588 -12.474,0 -22.588,10.114 -22.588,22.588 0,-12.475 -10.114,-22.588 -22.588,-22.588 -9.83,0 -18.17,6.292 -21.275,15.059 H 90.353 V 90.353 H 45.176 v 45.176 L 0,173.176 v 45.177 l 90.353,97.879 -45.177,30.121 v 75.294 h 90.353 l 43.4,-119.35 30.068,30.068 31.944,-31.944 L 196.522,256 h 136.085 c 3.105,8.767 11.445,15.059 21.275,15.059 12.475,0 22.588,-10.114 22.588,-22.588 0,12.475 10.113,22.588 22.588,22.588 12.475,0 22.588,-10.114 22.588,-22.588 0,12.475 10.113,22.588 22.588,22.588 12.475,0 22.588,-10.114 22.588,-22.588 V 218.353 H 512 V 173.176 Z M 195.765,218.353 H 90.353 v -45.177 h 105.412 z"
|
||||||
|
id="path1"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
BIN
assets/blaster_bg.png
Normal file
|
After Width: | Height: | Size: 139 B |
BIN
assets/blaster_fg.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
assets/blaster_icon.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
assets/blaster_mono.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
|
|
@ -3,8 +3,9 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_code_editor/flutter_code_editor.dart';
|
import 'package:flutter_code_editor/flutter_code_editor.dart';
|
||||||
import 'package:flutter_markdown/flutter_markdown.dart';
|
import 'package:flutter_markdown/flutter_markdown.dart';
|
||||||
import 'package:flutter_markdown_latex/flutter_markdown_latex.dart';
|
import 'package:flutter_markdown_latex/flutter_markdown_latex.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:markdown/markdown.dart' as md;
|
import 'package:markdown/markdown.dart' as md;
|
||||||
import 'package:path/path.dart' as path;
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'themes/day.dart';
|
import 'themes/day.dart';
|
||||||
import 'themes/night.dart';
|
import 'themes/night.dart';
|
||||||
import 'themes/markdown.dart';
|
import 'themes/markdown.dart';
|
||||||
|
|
@ -25,57 +26,102 @@ class NoteEditorScreen extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _NoteEditorScreenState extends State<NoteEditorScreen> {
|
class _NoteEditorScreenState extends State<NoteEditorScreen> {
|
||||||
bool isLoading = true;
|
|
||||||
bool _isPreviewMode = false; // Default: Editing mode
|
|
||||||
late CodeController _controller;
|
late CodeController _controller;
|
||||||
double _fontSize = 16.0; // Default font size
|
late String _initialContent;
|
||||||
|
bool _isPreviewMode = false;
|
||||||
|
bool _isLoading = true;
|
||||||
|
bool _autoSaveEnabled = false; // Controlled by user toggle
|
||||||
|
double _fontSize = 16.0;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
_loadPreferences();
|
||||||
_loadNoteContent();
|
_loadNoteContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _loadPreferences() async {
|
||||||
|
final prefs = await SharedPreferences.getInstance();
|
||||||
|
setState(() {
|
||||||
|
_autoSaveEnabled = prefs.getBool('auto_save_enabled') ?? false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _setAutoSaveEnabled(bool value) async {
|
||||||
|
final prefs = await SharedPreferences.getInstance();
|
||||||
|
await prefs.setBool('auto_save_enabled', value);
|
||||||
|
setState(() {
|
||||||
|
_autoSaveEnabled = value;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> _loadNoteContent() async {
|
Future<void> _loadNoteContent() async {
|
||||||
String content = "";
|
|
||||||
try {
|
try {
|
||||||
content = await widget.note.readAsString();
|
_initialContent = await widget.note.readAsString();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print("❌ Failed to read file: ${widget.note.path}");
|
print("❌ Failed to read file: ${widget.note.path}");
|
||||||
|
_initialContent = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
_controller = CodeController(
|
_controller = CodeController(
|
||||||
text: content,
|
text: _initialContent,
|
||||||
language: markdown,
|
language: markdown,
|
||||||
);
|
);
|
||||||
_controller.addListener(_saveNote);
|
_controller.addListener(_onTextChanged);
|
||||||
_controller.popupController.enabled = false;
|
_isLoading = false;
|
||||||
isLoading = false;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _onTextChanged() {
|
||||||
|
if (_autoSaveEnabled && _controller.text != _initialContent) {
|
||||||
|
_saveNote();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> _saveNote() async {
|
Future<void> _saveNote() async {
|
||||||
try {
|
try {
|
||||||
final notesDirectory = widget.notesDirectoryPath ??
|
if (_controller.text == _initialContent) return; // No change, skip saving
|
||||||
widget.note.parent.path; // ✅ Use correct directory
|
|
||||||
|
|
||||||
// Get the full path of the original file, preserving subfolder structure
|
await widget.note.writeAsString(_controller.text);
|
||||||
final relativeNotePath = path.relative(widget.note.path, from: notesDirectory);
|
_initialContent = _controller.text; // Update initial state
|
||||||
final newFilePath = path.join(notesDirectory, relativeNotePath); // ✅ Preserve subfolder
|
|
||||||
|
|
||||||
print("📝 Attempting to save note at: $newFilePath");
|
print("✅ Note saved successfully");
|
||||||
final newFile = File(newFilePath);
|
} catch (e) {
|
||||||
await newFile.writeAsString(_controller.text);
|
|
||||||
|
|
||||||
print("✅ Successfully saved note at: $newFilePath");
|
|
||||||
} catch (e, stackTrace) {
|
|
||||||
print("❌ Error saving note: ${widget.note.path}");
|
print("❌ Error saving note: ${widget.note.path}");
|
||||||
print("⚠️ Exception: $e");
|
|
||||||
print("🛠 Stack trace: $stackTrace");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<bool> _onWillPop() async {
|
||||||
|
if (_controller.text == _initialContent) return true; // No changes, exit
|
||||||
|
|
||||||
|
return await showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => AlertDialog(
|
||||||
|
title: Text("Save Changes?"),
|
||||||
|
content: Text("You have unsaved changes. Save before exiting?"),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => Navigator.of(context).pop(true), // Discard and exit
|
||||||
|
child: Text("Discard"),
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () async {
|
||||||
|
await _saveNote();
|
||||||
|
Navigator.of(context).pop(true); // Save and exit
|
||||||
|
},
|
||||||
|
child: Text("Save"),
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => Navigator.of(context).pop(false), // Stay on page
|
||||||
|
child: Text("Cancel"),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
) ??
|
||||||
|
false;
|
||||||
|
}
|
||||||
|
|
||||||
void _updateFontSize(double newSize) {
|
void _updateFontSize(double newSize) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_fontSize = newSize;
|
_fontSize = newSize;
|
||||||
|
|
@ -84,138 +130,153 @@ class _NoteEditorScreenState extends State<NoteEditorScreen> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_controller.removeListener(_saveNote);
|
_controller.removeListener(_onTextChanged);
|
||||||
_controller.dispose();
|
_controller.dispose();
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return WillPopScope(
|
||||||
appBar: AppBar(
|
onWillPop: _onWillPop,
|
||||||
title: Text(widget.note.uri.pathSegments.last.replaceAll('.md', '')),
|
child: Scaffold(
|
||||||
actions: [
|
appBar: AppBar(
|
||||||
Padding(
|
title: Text(widget.note.uri.pathSegments.last.replaceAll('.md', '')),
|
||||||
padding: EdgeInsets.symmetric(horizontal: 15),
|
leading: IconButton(
|
||||||
child: PopupMenuButton<String>(
|
icon: Icon(Icons.arrow_back),
|
||||||
icon: Icon(Icons.radio_button_checked, color: Colors.orange),
|
onPressed: () async {
|
||||||
onSelected: (String value) {
|
if (await _onWillPop()) {
|
||||||
if (value == 'Toggle Preview') {
|
Navigator.pop(context);
|
||||||
setState(() {
|
}
|
||||||
_isPreviewMode = !_isPreviewMode;
|
},
|
||||||
});
|
),
|
||||||
}
|
actions: [
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 15),
|
||||||
|
child: PopupMenuButton<String>(
|
||||||
|
icon: SvgPicture.asset(
|
||||||
|
"assets/blaster.svg",
|
||||||
|
width: 30,
|
||||||
|
color: Colors.orange,
|
||||||
|
),
|
||||||
|
onSelected: (String value) {
|
||||||
|
switch (value) {
|
||||||
|
case 'Save':
|
||||||
|
_saveNote();
|
||||||
|
break;
|
||||||
|
case 'Toggle Autosave':
|
||||||
|
_setAutoSaveEnabled(!_autoSaveEnabled);
|
||||||
|
break;
|
||||||
|
case 'Toggle Preview':
|
||||||
|
setState(() {
|
||||||
|
_isPreviewMode = !_isPreviewMode;
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
itemBuilder: (BuildContext context) => [
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
value: 'Save',
|
||||||
|
child: ListTile(
|
||||||
|
leading: Icon(Icons.save),
|
||||||
|
title: Text("Save"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
value: 'Toggle Autosave',
|
||||||
|
child: ListTile(
|
||||||
|
leading: Icon(_autoSaveEnabled
|
||||||
|
? Icons.toggle_on
|
||||||
|
: Icons.toggle_off),
|
||||||
|
title: Text(_autoSaveEnabled
|
||||||
|
? "Disable Autosave"
|
||||||
|
: "Enable Autosave"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
value: 'Toggle Preview',
|
||||||
|
child: ListTile(
|
||||||
|
leading:
|
||||||
|
Icon(_isPreviewMode ? Icons.edit : Icons.preview),
|
||||||
|
title:
|
||||||
|
Text(_isPreviewMode ? "Edit Mode" : "Preview Mode"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
body: _isLoading
|
||||||
|
? Center(child: CircularProgressIndicator())
|
||||||
|
: _isPreviewMode
|
||||||
|
? Padding(
|
||||||
|
padding: const EdgeInsets.all(16.0),
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
child: MarkdownBody(
|
||||||
|
builders: {
|
||||||
|
'latex': LatexElementBuilder(
|
||||||
|
textStyle: TextStyle(
|
||||||
|
color: widget.isDarkMode
|
||||||
|
? Colors.white
|
||||||
|
: Colors.black)),
|
||||||
},
|
},
|
||||||
itemBuilder: (BuildContext context) => [
|
extensionSet: md.ExtensionSet(
|
||||||
PopupMenuItem<String>(
|
[LatexBlockSyntax()],
|
||||||
value: 'Toggle Preview',
|
[LatexInlineSyntax()],
|
||||||
child: ListTile(
|
),
|
||||||
leading: Icon(_isPreviewMode ? Icons.edit : Icons.preview),
|
data: _controller.text,
|
||||||
title: Text(_isPreviewMode ? 'Edit Mode' : 'Preview Mode'),
|
selectable: true,
|
||||||
),
|
styleSheet: MarkdownStyleSheet(
|
||||||
),
|
p: TextStyle(
|
||||||
PopupMenuItem<String>(
|
fontSize: _fontSize,
|
||||||
enabled: false,
|
color: widget.isDarkMode
|
||||||
child: Column(
|
? Colors.white
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
: Colors.black),
|
||||||
children: [
|
h1: TextStyle(
|
||||||
Text('Font Size'),
|
fontSize: _fontSize + 8,
|
||||||
StatefulBuilder(
|
color: widget.isDarkMode
|
||||||
builder: (context, setState) {
|
? Colors.white
|
||||||
return Slider(
|
: Colors.black,
|
||||||
value: _fontSize,
|
fontWeight: FontWeight.bold),
|
||||||
min: 12.0,
|
h2: TextStyle(
|
||||||
max: 24.0,
|
fontSize: _fontSize + 6,
|
||||||
divisions: 6,
|
color: widget.isDarkMode
|
||||||
label: _fontSize.toString(),
|
? Colors.white
|
||||||
onChanged: (newSize) {
|
: Colors.black,
|
||||||
setState(() {
|
fontWeight: FontWeight.bold),
|
||||||
_fontSize = newSize;
|
h3: TextStyle(
|
||||||
});
|
fontSize: _fontSize + 4,
|
||||||
_updateFontSize(newSize);
|
color: widget.isDarkMode
|
||||||
},
|
? Colors.white
|
||||||
);
|
: Colors.black,
|
||||||
},
|
fontWeight: FontWeight.bold),
|
||||||
),
|
code: TextStyle(
|
||||||
],
|
fontSize: _fontSize,
|
||||||
),
|
backgroundColor: Colors.transparent),
|
||||||
),
|
codeblockDecoration: BoxDecoration(
|
||||||
],
|
color: Colors.transparent),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
)
|
||||||
),
|
: Padding(
|
||||||
body: isLoading
|
padding: const EdgeInsets.all(16.0),
|
||||||
? Center(
|
child: CodeTheme(
|
||||||
child:
|
data: CodeThemeData(
|
||||||
CircularProgressIndicator()) // Show loader while initializing
|
styles: widget.isDarkMode ? nightTheme : dayTheme),
|
||||||
: _isPreviewMode
|
child: SingleChildScrollView(
|
||||||
? Padding(
|
child: WrappedCodeField(
|
||||||
padding: const EdgeInsets.all(16.0),
|
wrap: true,
|
||||||
child: SingleChildScrollView(
|
controller: _controller,
|
||||||
child: MarkdownBody(
|
textStyle: TextStyle(
|
||||||
builders: {
|
fontSize: _fontSize,
|
||||||
'latex': LatexElementBuilder(
|
|
||||||
textStyle: TextStyle(
|
|
||||||
color: widget.isDarkMode
|
|
||||||
? Colors.white
|
|
||||||
: Colors.black)),
|
|
||||||
},
|
|
||||||
extensionSet: md.ExtensionSet(
|
|
||||||
[LatexBlockSyntax()],
|
|
||||||
[LatexInlineSyntax()],
|
|
||||||
),
|
|
||||||
data: _controller
|
|
||||||
.text, // ✅ Plain Markdown without syntax highlighting
|
|
||||||
selectable: true, // ✅ Allows text selection
|
|
||||||
styleSheet: MarkdownStyleSheet(
|
|
||||||
p: TextStyle(
|
|
||||||
fontSize: _fontSize,
|
|
||||||
color: widget.isDarkMode
|
|
||||||
? Colors.white
|
|
||||||
: Colors.black),
|
|
||||||
h1: TextStyle(
|
|
||||||
fontSize: _fontSize + 8,
|
|
||||||
color:
|
|
||||||
widget.isDarkMode ? Colors.white : Colors.black,
|
|
||||||
fontWeight: FontWeight.bold),
|
|
||||||
h2: TextStyle(
|
|
||||||
fontSize: _fontSize + 6,
|
|
||||||
color:
|
|
||||||
widget.isDarkMode ? Colors.white : Colors.black,
|
|
||||||
fontWeight: FontWeight.bold),
|
|
||||||
h3: TextStyle(
|
|
||||||
fontSize: _fontSize + 4,
|
|
||||||
color:
|
|
||||||
widget.isDarkMode ? Colors.white : Colors.black,
|
|
||||||
fontWeight: FontWeight.bold),
|
|
||||||
code: TextStyle(
|
|
||||||
fontSize: _fontSize,
|
|
||||||
backgroundColor: Colors
|
|
||||||
.transparent), // ✅ Disables syntax highlighting
|
|
||||||
codeblockDecoration: BoxDecoration(
|
|
||||||
color: Colors
|
|
||||||
.transparent), // ✅ Removes background color from code blocks
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: Padding(
|
|
||||||
padding: const EdgeInsets.all(16.0),
|
|
||||||
child: CodeTheme(
|
|
||||||
data: CodeThemeData(
|
|
||||||
styles: widget.isDarkMode ? nightTheme : dayTheme),
|
|
||||||
child: SingleChildScrollView(
|
|
||||||
child: WrappedCodeField(
|
|
||||||
wrap: true,
|
|
||||||
controller: _controller,
|
|
||||||
textStyle: TextStyle(
|
|
||||||
fontSize: _fontSize,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:file_picker/file_picker.dart';
|
import 'package:file_picker/file_picker.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:open_filex/open_filex.dart';
|
import 'package:open_filex/open_filex.dart';
|
||||||
import 'package:path/path.dart' as path;
|
import 'package:path/path.dart' as path;
|
||||||
|
|
@ -396,6 +397,7 @@ class _NoteListScreenState extends State<NoteListScreen> {
|
||||||
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
SnackBar(
|
SnackBar(
|
||||||
|
duration: const Duration(seconds: 3),
|
||||||
content: Text('Note moved to trash'),
|
content: Text('Note moved to trash'),
|
||||||
action: SnackBarAction(
|
action: SnackBarAction(
|
||||||
label: 'Undo',
|
label: 'Undo',
|
||||||
|
|
@ -502,6 +504,7 @@ class _NoteListScreenState extends State<NoteListScreen> {
|
||||||
autocorrect: false,
|
autocorrect: false,
|
||||||
textInputAction: TextInputAction.done,
|
textInputAction: TextInputAction.done,
|
||||||
controller: searchController,
|
controller: searchController,
|
||||||
|
cursorColor: Colors.orange,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: 'Search or enter a command...',
|
hintText: 'Search or enter a command...',
|
||||||
border: InputBorder.none,
|
border: InputBorder.none,
|
||||||
|
|
@ -521,8 +524,11 @@ class _NoteListScreenState extends State<NoteListScreen> {
|
||||||
Padding(
|
Padding(
|
||||||
padding: EdgeInsets.symmetric(horizontal: 15),
|
padding: EdgeInsets.symmetric(horizontal: 15),
|
||||||
child: PopupMenuButton<String>(
|
child: PopupMenuButton<String>(
|
||||||
icon: Icon(Icons.radio_button_checked,
|
icon: SvgPicture.asset(
|
||||||
color: Colors.orange), // Menu button (⋮)
|
"assets/blaster.svg",
|
||||||
|
width: 30,
|
||||||
|
color: Colors.orange,
|
||||||
|
),
|
||||||
onSelected: (String value) {
|
onSelected: (String value) {
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case 'Toggle Tags':
|
case 'Toggle Tags':
|
||||||
|
|
|
||||||
66
pubspec.lock
|
|
@ -1,6 +1,14 @@
|
||||||
# Generated by pub
|
# Generated by pub
|
||||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||||
packages:
|
packages:
|
||||||
|
archive:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: archive
|
||||||
|
sha256: "528579c7e4579719f04b21eeeeddfd73a18b31dabc22766893b7d1be7f49b967"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "4.0.3"
|
||||||
args:
|
args:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -49,6 +57,22 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.0"
|
version: "1.4.0"
|
||||||
|
checked_yaml:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: checked_yaml
|
||||||
|
sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.3"
|
||||||
|
cli_util:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: cli_util
|
||||||
|
sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.4.2"
|
||||||
clock:
|
clock:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -150,6 +174,14 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.0"
|
version: "0.7.0"
|
||||||
|
flutter_launcher_icons:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: flutter_launcher_icons
|
||||||
|
sha256: bfa04787c85d80ecb3f8777bde5fc10c3de809240c48fa061a2c2bf15ea5211c
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.14.3"
|
||||||
flutter_lints:
|
flutter_lints:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
|
@ -191,7 +223,7 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.24"
|
version: "2.0.24"
|
||||||
flutter_svg:
|
flutter_svg:
|
||||||
dependency: transitive
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_svg
|
name: flutter_svg
|
||||||
sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b
|
sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b
|
||||||
|
|
@ -248,6 +280,22 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.1.2"
|
version: "4.1.2"
|
||||||
|
image:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: image
|
||||||
|
sha256: "13d3349ace88f12f4a0d175eb5c12dcdd39d35c4c109a8a13dfeb6d0bd9e31c3"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "4.5.3"
|
||||||
|
json_annotation:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: json_annotation
|
||||||
|
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "4.9.0"
|
||||||
leak_tracker:
|
leak_tracker:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -480,6 +528,14 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.8"
|
version: "2.1.8"
|
||||||
|
posix:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: posix
|
||||||
|
sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.0.1"
|
||||||
provider:
|
provider:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -757,6 +813,14 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.5.0"
|
version: "6.5.0"
|
||||||
|
yaml:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: yaml
|
||||||
|
sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.1.3"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.6.0 <4.0.0"
|
dart: ">=3.6.0 <4.0.0"
|
||||||
flutter: ">=3.27.0"
|
flutter: ">=3.27.0"
|
||||||
|
|
|
||||||
78
pubspec.yaml
|
|
@ -1,38 +1,14 @@
|
||||||
name: muzzlevelocity
|
name: muzzlevelocity
|
||||||
description: "A new Flutter project."
|
description: "A new Flutter project."
|
||||||
# The following line prevents the package from being accidentally published to
|
|
||||||
# pub.dev using `flutter pub publish`. This is preferred for private packages.
|
|
||||||
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||||
|
|
||||||
# The following defines the version and build number for your application.
|
|
||||||
# A version number is three numbers separated by dots, like 1.2.43
|
|
||||||
# followed by an optional build number separated by a +.
|
|
||||||
# Both the version and the builder number may be overridden in flutter
|
|
||||||
# build by specifying --build-name and --build-number, respectively.
|
|
||||||
# In Android, build-name is used as versionName while build-number used as versionCode.
|
|
||||||
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
|
|
||||||
# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion.
|
|
||||||
# Read more about iOS versioning at
|
|
||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
|
||||||
version: 1.0.0+1
|
version: 1.0.0+1
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.6.0
|
sdk: ^3.6.0
|
||||||
|
|
||||||
# Dependencies specify other packages that your package needs in order to work.
|
|
||||||
# To automatically upgrade your package dependencies to the latest versions
|
|
||||||
# consider running `flutter pub upgrade --major-versions`. Alternatively,
|
|
||||||
# dependencies can be manually updated by changing the version numbers below to
|
|
||||||
# the latest version available on pub.dev. To see which dependencies have newer
|
|
||||||
# versions available, run `flutter pub outdated`.
|
|
||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
||||||
# The following adds the Cupertino Icons font to your application.
|
|
||||||
# Use with the CupertinoIcons class for iOS style icons.
|
|
||||||
cupertino_icons: ^1.0.8
|
cupertino_icons: ^1.0.8
|
||||||
file_picker: ^9.0.0
|
file_picker: ^9.0.0
|
||||||
flutter_highlight: ^0.7.0
|
flutter_highlight: ^0.7.0
|
||||||
|
|
@ -47,56 +23,22 @@ dependencies:
|
||||||
shared_preferences: ^2.5.2
|
shared_preferences: ^2.5.2
|
||||||
highlight: ^0.7.0
|
highlight: ^0.7.0
|
||||||
open_filex: ^4.6.0
|
open_filex: ^4.6.0
|
||||||
|
flutter_svg: ^2.0.17
|
||||||
|
flutter_launcher_icons: ^0.14.3
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
||||||
# The "flutter_lints" package below contains a set of recommended lints to
|
|
||||||
# encourage good coding practices. The lint set provided by the package is
|
|
||||||
# activated in the `analysis_options.yaml` file located at the root of your
|
|
||||||
# package. See that file for information about deactivating specific lint
|
|
||||||
# rules and activating additional ones.
|
|
||||||
flutter_lints: ^5.0.0
|
flutter_lints: ^5.0.0
|
||||||
|
|
||||||
# For information on the generic Dart part of this file, see the
|
|
||||||
# following page: https://dart.dev/tools/pub/pubspec
|
|
||||||
|
|
||||||
# The following section is specific to Flutter packages.
|
|
||||||
flutter:
|
flutter:
|
||||||
|
|
||||||
# The following line ensures that the Material Icons font is
|
|
||||||
# included with your application, so that you can use the icons in
|
|
||||||
# the material Icons class.
|
|
||||||
uses-material-design: true
|
uses-material-design: true
|
||||||
|
assets:
|
||||||
|
- assets/
|
||||||
|
|
||||||
# To add assets to your application, add an assets section, like this:
|
flutter_launcher_icons:
|
||||||
# assets:
|
android: true
|
||||||
# - images/a_dot_burr.jpeg
|
image_path: "assets/blaster_icon.png"
|
||||||
# - images/a_dot_ham.jpeg
|
adaptive_icon_background: "assets/blaster_bg.png"
|
||||||
|
adaptive_icon_foreground: "assets/blaster_fg.png"
|
||||||
# An image asset can refer to one or more resolution-specific "variants", see
|
adaptive_icon_monochrome: "assets/blaster_mono.png"
|
||||||
# https://flutter.dev/to/resolution-aware-images
|
|
||||||
|
|
||||||
# For details regarding adding assets from package dependencies, see
|
|
||||||
# https://flutter.dev/to/asset-from-package
|
|
||||||
|
|
||||||
# To add custom fonts to your application, add a fonts section here,
|
|
||||||
# in this "flutter" section. Each entry in this list should have a
|
|
||||||
# "family" key with the font family name, and a "fonts" key with a
|
|
||||||
# list giving the asset and other descriptors for the font. For
|
|
||||||
# example:
|
|
||||||
# fonts:
|
|
||||||
# - family: Schyler
|
|
||||||
# fonts:
|
|
||||||
# - asset: fonts/Schyler-Regular.ttf
|
|
||||||
# - asset: fonts/Schyler-Italic.ttf
|
|
||||||
# style: italic
|
|
||||||
# - family: Trajan Pro
|
|
||||||
# fonts:
|
|
||||||
# - asset: fonts/TrajanPro.ttf
|
|
||||||
# - asset: fonts/TrajanPro_Bold.ttf
|
|
||||||
# weight: 700
|
|
||||||
#
|
|
||||||
# For details regarding fonts from package dependencies,
|
|
||||||
# see https://flutter.dev/to/font-from-package
|
|
||||||