diff --git a/analysis_options.yaml b/analysis_options.yaml index be07d4b..0d29021 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -26,5 +26,3 @@ linter: # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options -plugins: - riverpod_lint: ^3.1.3 diff --git a/lib/main.dart b/lib/main.dart index b5c9573..ad11545 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,7 +10,6 @@ void main() { runApp(const MyApp()); } - class MyApp extends StatelessWidget { const MyApp({super.key}); @@ -29,7 +28,6 @@ class MyApp extends StatelessWidget { routes: { "/": (context) => HomePage(), "/editors": (context) => EditorEditor(), - "/manageprj": (context) => ManageProject(), }, initialRoute: "/", ); diff --git a/lib/models/globalModel.dart b/lib/models/globalModel.dart index b01bebf..1e8c909 100644 --- a/lib/models/globalModel.dart +++ b/lib/models/globalModel.dart @@ -17,22 +17,20 @@ class GlobalModel extends ChangeNotifier { GlobalModel() { SharedPreferences.getInstance().then((a) { - print("Loaded sp"); prefs = a; - editors = [Editor("", "None", "NANII", "", "")]; - id2EdtMap = {"NANII": 0}; + editors = []; + id2EdtMap = {}; if (prefs.containsKey(kEditorsKey)) { String edtData = prefs.getString(kEditorsKey)!; List data = jsonDecode(edtData); for (var (i, d) in data.indexed) { var localEdt = Editor.fromJson(d); editors.add(localEdt); - id2EdtMap[localEdt.id] = i + 1; + id2EdtMap[localEdt.id] = i; } } else { prefs.setString(kEditorsKey, jsonEncode(editors)); } - print(id2EdtMap); final List idList = id2EdtMap.keys.toList(); projects = []; @@ -45,6 +43,7 @@ class GlobalModel extends ChangeNotifier { } else { prefs.setString(kProjectsKey, jsonEncode(projects)); } + print("Project List:"); print(projects); hoverShow = List.filled(projects.length, false, growable: true); @@ -61,7 +60,6 @@ class GlobalModel extends ChangeNotifier { void saveEditorState() { var tempEditors = editors; - tempEditors.removeWhere((a) => a.id == ""); List> arst = tempEditors .map((a) => a.toJson()) .toList(); @@ -115,8 +113,7 @@ class GlobalModel extends ChangeNotifier { void addEdt(Editor edt) { editors.add(edt); - print(editors); - id2EdtMap[edt.id] = editors.length - 1; + rebuildIndex(); saveEditorState(); notifyListeners(); } @@ -124,11 +121,19 @@ class GlobalModel extends ChangeNotifier { void delEdt(int index) { Editor removed = editors.removeAt(index); int remmedID = id2EdtMap.remove(removed.id)!; - assert(index == remmedID); + assert(index == remmedID, "Index: $index removedID: $remmedID"); + rebuildIndex(); saveEditorState(); notifyListeners(); } + void rebuildIndex() { + id2EdtMap.clear(); + for (var (i, e) in editors.indexed) { + id2EdtMap[e.id] = i; + } + } + int get lenEdt { return editors.length; } @@ -138,7 +143,7 @@ class GlobalModel extends ChangeNotifier { } int getEdtPosFromID(String id) { - return id2EdtMap[id] ?? 0; + return id2EdtMap[id] ?? -1; } // Editing controller diff --git a/lib/views/editors.dart b/lib/views/editors.dart index d048b7d..3a354ad 100644 --- a/lib/views/editors.dart +++ b/lib/views/editors.dart @@ -14,7 +14,7 @@ class EditorEditor extends StatelessWidget { return Scaffold( appBar: AppBar(title: Text("/ PROject Dashboard / Editors")), floatingActionButton: EditorFAB(), - body: gm.lenEdt - 1 > 0 + body: gm.lenEdt > 0 ? LayoutBuilder( builder: (context, constraints) { int cols = (constraints.maxWidth / 250).floor(); @@ -25,7 +25,7 @@ class EditorEditor extends StatelessWidget { mainAxisSpacing: 10, childAspectRatio: 1.5, ), - itemCount: gm.lenEdt - 1, + itemCount: gm.lenEdt, itemBuilder: (context, index) => EditorCard(index), ); }, diff --git a/lib/views/managePrj.dart b/lib/views/managePrj.dart index 34e5fa0..a7a9f77 100644 --- a/lib/views/managePrj.dart +++ b/lib/views/managePrj.dart @@ -7,11 +7,11 @@ import "package:prod/widgets/editorSelector.dart"; import "package:provider/provider.dart"; class ManageProject extends StatelessWidget { - const ManageProject({super.key}); + const ManageProject(this.id, {super.key}); + final int id; @override Widget build(BuildContext context) { - final id = ModalRoute.of(context)?.settings.arguments as int; GlobalModel gm = Provider.of(context); final Project prj = gm.nthPrj(id); TextEditingController nameController = TextEditingController(); @@ -20,136 +20,121 @@ class ManageProject extends StatelessWidget { nameController.text = prj.name; pathController.text = prj.path.path; langController.text = prj.language; - return Scaffold( - appBar: AppBar(title: Text("/ PROject Dashboard / Editing ${prj.name} ")), - body: Container( - // constraints: BoxConstraints(maxWidth: 500), - child: CustomScrollView( - slivers: [ - SliverAppBar( - // title: gm.isEdited ? Text("Unsaved Changes") : null, - pinned: false, - snap: false, - floating: false, - automaticallyImplyLeading: false, - automaticallyImplyActions: false, - backgroundColor: Colors.transparent, - shape: LinearBorder(), - ), - SliverToBoxAdapter( - child: TextField( - style: TextStyle(fontSize: 50), - controller: nameController, - textAlign: .center, - // onEditingComplete: () => gm.updateEdited(true), - decoration: InputDecoration( - border: .none, - enabledBorder: .none, - fillColor: Colors.transparent, + return SimpleDialog( + title: Row( + mainAxisAlignment: .spaceBetween, + children: [ + OutlinedButton( + child: Text("Cancel"), + onPressed: () => Navigator.pop(context), + ), + Text("Edit Project"), + FilledButton( + child: Text("Save"), + onPressed: () { + prj.name = nameController.text; + prj.path = File(pathController.text); + prj.language = langController.text; + gm.updatePrj(id, prj); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text("Updated Project Details"), + duration: Duration(milliseconds: 2000), ), - ), - ), - SliverToBoxAdapter( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: TextField( - style: TextStyle(fontSize: 30), - controller: pathController, - textAlign: .center, - // onEditingComplete: () => gm.updateEdited(true), - decoration: InputDecoration( - labelText: "Path", - border: .none, - // enabledBorder: .none, - fillColor: Colors.transparent, - ), - ), - ), - ), - SliverToBoxAdapter( - child: TextField( - style: TextStyle(fontSize: 30), - controller: langController, - textAlign: .center, - // onEditingComplete: () => gm.updateEdited(true), - decoration: InputDecoration( - labelText: "Language", - border: .none, - enabledBorder: .none, - fillColor: Colors.transparent, - ), - ), - ), - SliverList.list( - children: [ - Row( - mainAxisAlignment: .spaceEvenly, - children: [ - EditorSelector(0, id), - EditorSelector(1, id), - EditorSelector(2, id), - EditorSelector(3, id), - ], - ), - ], - ), - - SliverList.list( - children: [ - Row( - children: [ - OutlinedButton( - child: Text("Delete"), - onPressed: () { - Navigator.pop(context); - gm.delPrj(id); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text("Deleted ${prj.name}"), - duration: Duration(milliseconds: 2350), - ), - ); - }, - ), - - OutlinedButton( - child: Text("Cancel"), - onPressed: () => Navigator.pop(context), - ), - OutlinedButton( - child: Text("Save"), - onPressed: () { - gm.updatePrj( - id, - Project( - nameController.text, - langController.text, - File(pathController.text), - prj.isGit, - ), - ); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text("Updated Project Details"), - duration: Duration(milliseconds: 2500), - ), - ); - }, - // gm.updateEdited(false); - ), - ], - ), - ], - ), - // SliverList.builder( - // itemCount: 3, - // itemBuilder: (context, index) { - // return Placeholder(); - // }, - // ), - ], - ), + ); + Navigator.pop(context); + }, + // gm.updateEdited(false); + ), + ], ), + children: [ + TextField( + style: TextStyle(fontSize: 50), + controller: nameController, + textAlign: .center, + // onEditingComplete: () => gm.updateEdited(true), + decoration: InputDecoration( + border: .none, + enabledBorder: .none, + fillColor: Colors.transparent, + ), + ), + TextField( + style: TextStyle(fontSize: 30), + controller: pathController, + textAlign: .center, + // onEditingComplete: () => gm.updateEdited(true), + decoration: InputDecoration( + labelText: "Path", + border: .none, + // enabledBorder: .none, + fillColor: Colors.transparent, + ), + ), + TextField( + style: TextStyle(fontSize: 30), + controller: langController, + textAlign: .center, + // onEditingComplete: () => gm.updateEdited(true), + decoration: InputDecoration( + labelText: "Language", + border: .none, + enabledBorder: .none, + fillColor: Colors.transparent, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Card( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: .spaceEvenly, + crossAxisAlignment: .start, + children: [ + Text("Select Editors:"), + SizedBox(height: 10), + Row( + mainAxisAlignment: .spaceEvenly, + children: [ + EditorSelector(3, id), + SizedBox(width: 10), + EditorSelector(0, id), + ], + ), + SizedBox(height: 10), + Row( + mainAxisAlignment: .spaceEvenly, + children: [ + EditorSelector(2, id), + SizedBox(width: 10), + EditorSelector(1, id), + ], + ), + ], + ), + ), + ), + ), + // Row( + // children: [ + // OutlinedButton( + // child: Text("Delete"), + // onPressed: () { + // Navigator.pop(context); + // gm.delPrj(id); + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar( + // content: Text("Deleted ${prj.name}"), + // duration: Duration(milliseconds: 2350), + // ), + // ); + // }, + // ), + // ], + // ), + ], ); } } diff --git a/lib/widgets/editorCard.dart b/lib/widgets/editorCard.dart index c94e68a..bef21a3 100644 --- a/lib/widgets/editorCard.dart +++ b/lib/widgets/editorCard.dart @@ -1,13 +1,11 @@ import "package:flutter/material.dart"; import "package:prod/models/editor.dart"; import "package:prod/models/globalModel.dart"; -import "package:prod/models/project.dart"; import "package:provider/provider.dart"; import "package:yaru/yaru.dart"; -import "package:process_run/shell.dart"; class EditorCard extends StatelessWidget { - const EditorCard(id, {super.key}) : id = id + 1; + const EditorCard(this.id, {super.key}); final int id; @override diff --git a/lib/widgets/editorSelector.dart b/lib/widgets/editorSelector.dart index d2e92a5..d3b6f9c 100644 --- a/lib/widgets/editorSelector.dart +++ b/lib/widgets/editorSelector.dart @@ -3,7 +3,6 @@ import "package:prod/models/editor.dart"; import "package:prod/models/globalModel.dart"; import "package:prod/models/project.dart"; import "package:provider/provider.dart"; -import "package:yaru/yaru.dart"; class EditorSelector extends StatelessWidget { const EditorSelector(this.turns, this.id, {super.key}); @@ -23,25 +22,28 @@ class EditorSelector extends StatelessWidget { quarterTurns: turns, ), onSelected: (a) { - // print("$a"); prj.setEditor(turns, a ?? ""); gm.updatePrj(id, prj); }, - dropdownMenuEntries: Provider.of(context).editors.map((a) { - return DropdownMenuEntry( - label: a.name, - labelWidget: Column( - crossAxisAlignment: .start, - mainAxisAlignment: .center, - children: [ - Text("${a.name}", style: TextStyle(fontSize: 20)), - Text("${a.commandTemplate}", style: TextStyle(fontSize: 12)), - ], - ), - value: a.id, - ); - }).toList(), + dropdownMenuEntries: + [ + const Editor("", "None", "", "", ""), + ...Provider.of(context).editors, + ].map((a) { + return DropdownMenuEntry( + label: a.name, + labelWidget: Column( + crossAxisAlignment: .start, + mainAxisAlignment: .center, + children: [ + Text("${a.name}", style: TextStyle(fontSize: 20)), + Text("${a.commandTemplate}", style: TextStyle(fontSize: 12)), + ], + ), + value: a.id, + ); + }).toList(), ); } } diff --git a/lib/widgets/edtFAB.dart b/lib/widgets/edtFAB.dart index e1e35a8..56e24b7 100644 --- a/lib/widgets/edtFAB.dart +++ b/lib/widgets/edtFAB.dart @@ -10,15 +10,6 @@ class EditorFAB extends StatelessWidget { Widget build(BuildContext context) { return FloatingActionButton( onPressed: () { - // gm.add( - // Project.validated( - // "Kimi", - // "Rust", - // "/home/arrow/Gitted/cowin", - // [], - // true, - // ), - // ); TextEditingController nameController = TextEditingController(); TextEditingController commandController = TextEditingController(); TextEditingController commandTemplateController = diff --git a/lib/widgets/launcherButton.dart b/lib/widgets/launcherButton.dart index 1a312f8..976c42f 100644 --- a/lib/widgets/launcherButton.dart +++ b/lib/widgets/launcherButton.dart @@ -13,7 +13,11 @@ class LauncherButton extends StatelessWidget { Widget build(BuildContext context) { // print("EDITOR ID: $eid"); GlobalModel gm = Provider.of(context, listen: false); - final Editor edt = gm.nthEdt(gm.getEdtPosFromID(eid)); + final int enumb = gm.getEdtPosFromID(eid); + if (enumb == -1) { + return Container(); + } + final Editor edt = gm.nthEdt(enumb); // print("GRABBED EDITOR: ${edt.name}"); return eid == "" ? Container() diff --git a/lib/widgets/projectCard.dart b/lib/widgets/projectCard.dart index 16301a5..41a77ee 100644 --- a/lib/widgets/projectCard.dart +++ b/lib/widgets/projectCard.dart @@ -2,6 +2,7 @@ import "package:flutter/material.dart"; import "package:prod/models/editor.dart"; import "package:prod/models/globalModel.dart"; import "package:prod/models/project.dart"; +import "package:prod/views/managePrj.dart"; import "package:prod/widgets/launcherButton.dart"; import "package:provider/provider.dart"; import "package:yaru/yaru.dart"; @@ -18,8 +19,9 @@ class ProjectCard extends StatelessWidget { return InkWell( onHover: (st) => gm.setHoverShow(id, st), borderRadius: .circular(kYaruContainerRadius), - onTap: () async { - await Navigator.pushNamed(context, "/manageprj", arguments: id); + onTap: () { + // await Navigator.pushNamed(context, "/manageprj", arguments: id); + showDialog(context: context, builder: (context) => ManageProject(id)); }, child: Card( // decoration: BoxDecoration( @@ -77,14 +79,14 @@ class ProjectCard extends StatelessWidget { children: [ Column( children: [ - LauncherButton(prj.e0, prj.path.path), - LauncherButton(prj.e1, prj.path.path), + LauncherButton(prj.e3, prj.path.path), + LauncherButton(prj.e2, prj.path.path), ], ), Column( children: [ - LauncherButton(prj.e2, prj.path.path), - LauncherButton(prj.e3, prj.path.path), + LauncherButton(prj.e0, prj.path.path), + LauncherButton(prj.e1, prj.path.path), ], ), ],