diff --git a/lib/main.dart b/lib/main.dart index 1153576..53907d7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,6 +7,7 @@ import "package:provider/provider.dart"; import "package:prod/models/globalModel.dart"; void main() { + // DEAL WITH NULLS IN EDITOR LIST AND PROJECT's EDITOR LIST. SWITCH TO HIDDEN NONE EDITOR WITH "" AS ID. runApp(const MyApp()); } diff --git a/lib/models/globalModel.dart b/lib/models/globalModel.dart index 4c1f407..0440ca8 100644 --- a/lib/models/globalModel.dart +++ b/lib/models/globalModel.dart @@ -11,6 +11,7 @@ class GlobalModel extends ChangeNotifier { late List hoverShow; late List editors; late SharedPreferences prefs; + late Map id2EdtMap; bool importedData = false; bool edited = false; @@ -22,13 +23,17 @@ class GlobalModel extends ChangeNotifier { String edtData = prefs.getString(kEditorsKey)!; List data = jsonDecode(edtData); editors = []; - for (var d in data) { - editors.add(Editor.fromJson(d)); + id2EdtMap = {}; + for (var (i, d) in data.indexed) { + var localEdt = Editor.fromJson(d); + editors.add(localEdt); + id2EdtMap[localEdt.id] = i; } } else { editors = []; prefs.setString(kEditorsKey, jsonEncode(editors)); } + print(id2EdtMap); if (prefs.containsKey(kProjectsKey)) { String prjData = prefs.getString(kProjectsKey)!; @@ -60,6 +65,8 @@ class GlobalModel extends ChangeNotifier { prefs.setString(kEditorsKey, jsonEncode(arst)); } + // Project management + void addPrj(Project prj) { projects.add(prj); hoverShow.add(false); @@ -97,6 +104,7 @@ class GlobalModel extends ChangeNotifier { void updatePrj(int index, Project prj) { projects[index] = prj; + saveProjectState(); notifyListeners(); } @@ -122,6 +130,10 @@ class GlobalModel extends ChangeNotifier { return editors[index]; } + int? getFromID(String? id) { + return id2EdtMap[id]; + } + // Editing controller bool get isEdited { diff --git a/lib/models/project.dart b/lib/models/project.dart index 424448c..5b283f1 100644 --- a/lib/models/project.dart +++ b/lib/models/project.dart @@ -3,14 +3,14 @@ import "dart:io"; import "package:path/path.dart" as p; class Project { - final String name; - final String language; - final File path; - final String? e0; - final String? e1; - final String? e2; - final String? e3; - final bool isGit; + String name; + String language; + File path; + String? e0; + String? e1; + String? e2; + String? e3; + bool isGit; Project( this.name, @@ -76,6 +76,40 @@ class Project { ); } + String? getEditor(enumb) { + switch (enumb) { + case 0: + return e0; + case 1: + return e1; + case 2: + return e2; + case 3: + return e3; + default: + return null; + break; + } + } + + void setEditor(int enumb, String? edt) { + switch (enumb) { + case 0: + e0 = edt; + break; + case 1: + e1 = edt; + break; + case 2: + e2 = edt; + break; + case 3: + e3 = edt; + break; + default: + } + } + // bool validatePath(){ // return File // } diff --git a/lib/views/managePrj.dart b/lib/views/managePrj.dart index 3bc124d..34e5fa0 100644 --- a/lib/views/managePrj.dart +++ b/lib/views/managePrj.dart @@ -58,6 +58,7 @@ class ManageProject extends StatelessWidget { textAlign: .center, // onEditingComplete: () => gm.updateEdited(true), decoration: InputDecoration( + labelText: "Path", border: .none, // enabledBorder: .none, fillColor: Colors.transparent, @@ -72,6 +73,7 @@ class ManageProject extends StatelessWidget { textAlign: .center, // onEditingComplete: () => gm.updateEdited(true), decoration: InputDecoration( + labelText: "Language", border: .none, enabledBorder: .none, fillColor: Colors.transparent, @@ -83,10 +85,10 @@ class ManageProject extends StatelessWidget { Row( mainAxisAlignment: .spaceEvenly, children: [ - EditorSelector(0), - EditorSelector(1), - EditorSelector(2), - EditorSelector(3), + EditorSelector(0, id), + EditorSelector(1, id), + EditorSelector(2, id), + EditorSelector(3, id), ], ), ], diff --git a/lib/widgets/editorSelector.dart b/lib/widgets/editorSelector.dart index 9554df0..8be6be1 100644 --- a/lib/widgets/editorSelector.dart +++ b/lib/widgets/editorSelector.dart @@ -1,37 +1,47 @@ 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"; class EditorSelector extends StatelessWidget { - const EditorSelector(this.turns, {super.key}); + const EditorSelector(this.turns, this.id, {super.key}); + final int id; final int turns; @override Widget build(BuildContext context) { - return Row( - children: [ - RotatedBox( - child: Icon(Icons.rounded_corner_rounded), - quarterTurns: this.turns, - ), - YaruPopupMenuButton( - child: Text("Nullie"), - onSelected: (a) { - Provider.of(context, listen: false); - print("$a"); - }, - itemBuilder: (context) { - return Provider.of( - context, - listen: false, - ).editors.map((a) { - return PopupMenuItem(value: a, child: Text("${a.name}")); - }).toList(); - }, - ), - ], + GlobalModel gm = Provider.of(context); + Project prj = gm.nthPrj(id); + return DropdownMenu( + enableSearch: true, + enableFilter: true, + initialSelection: prj.getEditor(turns), + leadingIcon: RotatedBox( + child: Icon(Icons.rounded_corner_rounded), + 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(), ); } } diff --git a/lib/widgets/launcherButton.dart b/lib/widgets/launcherButton.dart new file mode 100644 index 0000000..a5d06da --- /dev/null +++ b/lib/widgets/launcherButton.dart @@ -0,0 +1,21 @@ +import "package:flutter/material.dart"; +import "package:prod/models/editor.dart"; +import "package:prod/models/globalModel.dart"; +import "package:provider/provider.dart"; + +class LauncherButton extends StatelessWidget { + const LauncherButton(this.eid, {super.key}); + final String? eid; + + @override + Widget build(BuildContext context) { + GlobalModel gm = Provider.of(context, listen: false); + final Editor edt = gm.nthEdt(gm.id2EdtMap[eid]!); + return eid == null + ? Container() + : Expanded( + flex: 1, + child: TextButton(child: Text("${edt.sname}"), onPressed: () {}), + ); + } +} diff --git a/lib/widgets/projectCard.dart b/lib/widgets/projectCard.dart index 33b3775..991d78a 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/widgets/launcherButton.dart"; import "package:provider/provider.dart"; import "package:yaru/yaru.dart"; import "package:process_run/shell.dart"; @@ -75,31 +76,10 @@ class ProjectCard extends StatelessWidget { Row( children: [ Column( - children: [ - Expanded( - flex: 1, - child: TextButton(child: Text("Ze"), onPressed: () {}), - ), - Expanded( - flex: 1, - child: TextButton(child: Text("Ze"), onPressed: () {}), - ), - ], + children: [LauncherButton(prj.e0), LauncherButton(prj.e1)], ), Column( - children: [ - Expanded( - child: TextButton(child: Text("Ze"), onPressed: () {}), - ), - true - ? Expanded( - child: TextButton( - child: Text("Ze"), - onPressed: () {}, - ), - ) - : Container(), - ], + children: [LauncherButton(prj.e2), LauncherButton(prj.e3)], ), ], ),