moved editing page to popup
All checks were successful
Build CI / AMD64 Build (push) Successful in 1m54s

This commit is contained in:
2026-03-11 01:10:25 +05:30
parent cee48b3e4b
commit ce25d26f70
10 changed files with 164 additions and 181 deletions

View File

@@ -26,5 +26,3 @@ linter:
# Additional information about this file can be found at # Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options # https://dart.dev/guides/language/analysis-options
plugins:
riverpod_lint: ^3.1.3

View File

@@ -10,7 +10,6 @@ void main() {
runApp(const MyApp()); runApp(const MyApp());
} }
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
const MyApp({super.key}); const MyApp({super.key});
@@ -29,7 +28,6 @@ class MyApp extends StatelessWidget {
routes: { routes: {
"/": (context) => HomePage(), "/": (context) => HomePage(),
"/editors": (context) => EditorEditor(), "/editors": (context) => EditorEditor(),
"/manageprj": (context) => ManageProject(),
}, },
initialRoute: "/", initialRoute: "/",
); );

View File

@@ -17,22 +17,20 @@ class GlobalModel extends ChangeNotifier {
GlobalModel() { GlobalModel() {
SharedPreferences.getInstance().then((a) { SharedPreferences.getInstance().then((a) {
print("Loaded sp");
prefs = a; prefs = a;
editors = [Editor("", "None", "NANII", "", "")]; editors = [];
id2EdtMap = {"NANII": 0}; id2EdtMap = {};
if (prefs.containsKey(kEditorsKey)) { if (prefs.containsKey(kEditorsKey)) {
String edtData = prefs.getString(kEditorsKey)!; String edtData = prefs.getString(kEditorsKey)!;
List<dynamic> data = jsonDecode(edtData); List<dynamic> data = jsonDecode(edtData);
for (var (i, d) in data.indexed) { for (var (i, d) in data.indexed) {
var localEdt = Editor.fromJson(d); var localEdt = Editor.fromJson(d);
editors.add(localEdt); editors.add(localEdt);
id2EdtMap[localEdt.id] = i + 1; id2EdtMap[localEdt.id] = i;
} }
} else { } else {
prefs.setString(kEditorsKey, jsonEncode(editors)); prefs.setString(kEditorsKey, jsonEncode(editors));
} }
print(id2EdtMap);
final List<String> idList = id2EdtMap.keys.toList(); final List<String> idList = id2EdtMap.keys.toList();
projects = []; projects = [];
@@ -45,6 +43,7 @@ class GlobalModel extends ChangeNotifier {
} else { } else {
prefs.setString(kProjectsKey, jsonEncode(projects)); prefs.setString(kProjectsKey, jsonEncode(projects));
} }
print("Project List:");
print(projects); print(projects);
hoverShow = List.filled(projects.length, false, growable: true); hoverShow = List.filled(projects.length, false, growable: true);
@@ -61,7 +60,6 @@ class GlobalModel extends ChangeNotifier {
void saveEditorState() { void saveEditorState() {
var tempEditors = editors; var tempEditors = editors;
tempEditors.removeWhere((a) => a.id == "");
List<Map<String, dynamic>> arst = tempEditors List<Map<String, dynamic>> arst = tempEditors
.map((a) => a.toJson()) .map((a) => a.toJson())
.toList(); .toList();
@@ -115,8 +113,7 @@ class GlobalModel extends ChangeNotifier {
void addEdt(Editor edt) { void addEdt(Editor edt) {
editors.add(edt); editors.add(edt);
print(editors); rebuildIndex();
id2EdtMap[edt.id] = editors.length - 1;
saveEditorState(); saveEditorState();
notifyListeners(); notifyListeners();
} }
@@ -124,11 +121,19 @@ class GlobalModel extends ChangeNotifier {
void delEdt(int index) { void delEdt(int index) {
Editor removed = editors.removeAt(index); Editor removed = editors.removeAt(index);
int remmedID = id2EdtMap.remove(removed.id)!; int remmedID = id2EdtMap.remove(removed.id)!;
assert(index == remmedID); assert(index == remmedID, "Index: $index removedID: $remmedID");
rebuildIndex();
saveEditorState(); saveEditorState();
notifyListeners(); notifyListeners();
} }
void rebuildIndex() {
id2EdtMap.clear();
for (var (i, e) in editors.indexed) {
id2EdtMap[e.id] = i;
}
}
int get lenEdt { int get lenEdt {
return editors.length; return editors.length;
} }
@@ -138,7 +143,7 @@ class GlobalModel extends ChangeNotifier {
} }
int getEdtPosFromID(String id) { int getEdtPosFromID(String id) {
return id2EdtMap[id] ?? 0; return id2EdtMap[id] ?? -1;
} }
// Editing controller // Editing controller

View File

@@ -14,7 +14,7 @@ class EditorEditor extends StatelessWidget {
return Scaffold( return Scaffold(
appBar: AppBar(title: Text("/ PROject Dashboard / Editors")), appBar: AppBar(title: Text("/ PROject Dashboard / Editors")),
floatingActionButton: EditorFAB(), floatingActionButton: EditorFAB(),
body: gm.lenEdt - 1 > 0 body: gm.lenEdt > 0
? LayoutBuilder( ? LayoutBuilder(
builder: (context, constraints) { builder: (context, constraints) {
int cols = (constraints.maxWidth / 250).floor(); int cols = (constraints.maxWidth / 250).floor();
@@ -25,7 +25,7 @@ class EditorEditor extends StatelessWidget {
mainAxisSpacing: 10, mainAxisSpacing: 10,
childAspectRatio: 1.5, childAspectRatio: 1.5,
), ),
itemCount: gm.lenEdt - 1, itemCount: gm.lenEdt,
itemBuilder: (context, index) => EditorCard(index), itemBuilder: (context, index) => EditorCard(index),
); );
}, },

View File

@@ -7,11 +7,11 @@ import "package:prod/widgets/editorSelector.dart";
import "package:provider/provider.dart"; import "package:provider/provider.dart";
class ManageProject extends StatelessWidget { class ManageProject extends StatelessWidget {
const ManageProject({super.key}); const ManageProject(this.id, {super.key});
final int id;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final id = ModalRoute.of(context)?.settings.arguments as int;
GlobalModel gm = Provider.of(context); GlobalModel gm = Provider.of(context);
final Project prj = gm.nthPrj(id); final Project prj = gm.nthPrj(id);
TextEditingController nameController = TextEditingController(); TextEditingController nameController = TextEditingController();
@@ -20,136 +20,121 @@ class ManageProject extends StatelessWidget {
nameController.text = prj.name; nameController.text = prj.name;
pathController.text = prj.path.path; pathController.text = prj.path.path;
langController.text = prj.language; langController.text = prj.language;
return Scaffold( return SimpleDialog(
appBar: AppBar(title: Text("/ PROject Dashboard / Editing ${prj.name} ")), title: Row(
body: Container( mainAxisAlignment: .spaceBetween,
// constraints: BoxConstraints(maxWidth: 500), children: [
child: CustomScrollView( OutlinedButton(
slivers: [ child: Text("Cancel"),
SliverAppBar( onPressed: () => Navigator.pop(context),
// title: gm.isEdited ? Text("Unsaved Changes") : null, ),
pinned: false, Text("Edit Project"),
snap: false, FilledButton(
floating: false, child: Text("Save"),
automaticallyImplyLeading: false, onPressed: () {
automaticallyImplyActions: false, prj.name = nameController.text;
backgroundColor: Colors.transparent, prj.path = File(pathController.text);
shape: LinearBorder(), prj.language = langController.text;
), gm.updatePrj(id, prj);
SliverToBoxAdapter( ScaffoldMessenger.of(context).showSnackBar(
child: TextField( SnackBar(
style: TextStyle(fontSize: 50), content: Text("Updated Project Details"),
controller: nameController, duration: Duration(milliseconds: 2000),
textAlign: .center,
// onEditingComplete: () => gm.updateEdited(true),
decoration: InputDecoration(
border: .none,
enabledBorder: .none,
fillColor: Colors.transparent,
), ),
), );
), Navigator.pop(context);
SliverToBoxAdapter( },
child: Padding( // gm.updateEdited(false);
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();
// },
// ),
],
),
), ),
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),
// ),
// );
// },
// ),
// ],
// ),
],
); );
} }
} }

View File

@@ -1,13 +1,11 @@
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:prod/models/editor.dart"; import "package:prod/models/editor.dart";
import "package:prod/models/globalModel.dart"; import "package:prod/models/globalModel.dart";
import "package:prod/models/project.dart";
import "package:provider/provider.dart"; import "package:provider/provider.dart";
import "package:yaru/yaru.dart"; import "package:yaru/yaru.dart";
import "package:process_run/shell.dart";
class EditorCard extends StatelessWidget { class EditorCard extends StatelessWidget {
const EditorCard(id, {super.key}) : id = id + 1; const EditorCard(this.id, {super.key});
final int id; final int id;
@override @override

View File

@@ -3,7 +3,6 @@ import "package:prod/models/editor.dart";
import "package:prod/models/globalModel.dart"; import "package:prod/models/globalModel.dart";
import "package:prod/models/project.dart"; import "package:prod/models/project.dart";
import "package:provider/provider.dart"; import "package:provider/provider.dart";
import "package:yaru/yaru.dart";
class EditorSelector extends StatelessWidget { class EditorSelector extends StatelessWidget {
const EditorSelector(this.turns, this.id, {super.key}); const EditorSelector(this.turns, this.id, {super.key});
@@ -23,25 +22,28 @@ class EditorSelector extends StatelessWidget {
quarterTurns: turns, quarterTurns: turns,
), ),
onSelected: (a) { onSelected: (a) {
// print("$a");
prj.setEditor(turns, a ?? ""); prj.setEditor(turns, a ?? "");
gm.updatePrj(id, prj); gm.updatePrj(id, prj);
}, },
dropdownMenuEntries: Provider.of<GlobalModel>(context).editors.map((a) { dropdownMenuEntries:
return DropdownMenuEntry( [
label: a.name, const Editor("", "None", "", "", ""),
labelWidget: Column( ...Provider.of<GlobalModel>(context).editors,
crossAxisAlignment: .start, ].map((a) {
mainAxisAlignment: .center, return DropdownMenuEntry(
children: [ label: a.name,
Text("${a.name}", style: TextStyle(fontSize: 20)), labelWidget: Column(
Text("${a.commandTemplate}", style: TextStyle(fontSize: 12)), crossAxisAlignment: .start,
], mainAxisAlignment: .center,
), children: [
value: a.id, Text("${a.name}", style: TextStyle(fontSize: 20)),
); Text("${a.commandTemplate}", style: TextStyle(fontSize: 12)),
}).toList(), ],
),
value: a.id,
);
}).toList(),
); );
} }
} }

View File

@@ -10,15 +10,6 @@ class EditorFAB extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return FloatingActionButton( return FloatingActionButton(
onPressed: () { onPressed: () {
// gm.add(
// Project.validated(
// "Kimi",
// "Rust",
// "/home/arrow/Gitted/cowin",
// [],
// true,
// ),
// );
TextEditingController nameController = TextEditingController(); TextEditingController nameController = TextEditingController();
TextEditingController commandController = TextEditingController(); TextEditingController commandController = TextEditingController();
TextEditingController commandTemplateController = TextEditingController commandTemplateController =

View File

@@ -13,7 +13,11 @@ class LauncherButton extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
// print("EDITOR ID: $eid"); // print("EDITOR ID: $eid");
GlobalModel gm = Provider.of<GlobalModel>(context, listen: false); GlobalModel gm = Provider.of<GlobalModel>(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}"); // print("GRABBED EDITOR: ${edt.name}");
return eid == "" return eid == ""
? Container() ? Container()

View File

@@ -2,6 +2,7 @@ import "package:flutter/material.dart";
import "package:prod/models/editor.dart"; import "package:prod/models/editor.dart";
import "package:prod/models/globalModel.dart"; import "package:prod/models/globalModel.dart";
import "package:prod/models/project.dart"; import "package:prod/models/project.dart";
import "package:prod/views/managePrj.dart";
import "package:prod/widgets/launcherButton.dart"; import "package:prod/widgets/launcherButton.dart";
import "package:provider/provider.dart"; import "package:provider/provider.dart";
import "package:yaru/yaru.dart"; import "package:yaru/yaru.dart";
@@ -18,8 +19,9 @@ class ProjectCard extends StatelessWidget {
return InkWell( return InkWell(
onHover: (st) => gm.setHoverShow(id, st), onHover: (st) => gm.setHoverShow(id, st),
borderRadius: .circular(kYaruContainerRadius), borderRadius: .circular(kYaruContainerRadius),
onTap: () async { onTap: () {
await Navigator.pushNamed(context, "/manageprj", arguments: id); // await Navigator.pushNamed(context, "/manageprj", arguments: id);
showDialog(context: context, builder: (context) => ManageProject(id));
}, },
child: Card( child: Card(
// decoration: BoxDecoration( // decoration: BoxDecoration(
@@ -77,14 +79,14 @@ class ProjectCard extends StatelessWidget {
children: [ children: [
Column( Column(
children: [ children: [
LauncherButton(prj.e0, prj.path.path), LauncherButton(prj.e3, prj.path.path),
LauncherButton(prj.e1, prj.path.path), LauncherButton(prj.e2, prj.path.path),
], ],
), ),
Column( Column(
children: [ children: [
LauncherButton(prj.e2, prj.path.path), LauncherButton(prj.e0, prj.path.path),
LauncherButton(prj.e3, prj.path.path), LauncherButton(prj.e1, prj.path.path),
], ],
), ),
], ],