mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-07-04 06:38:27 +08:00
Add experimental history
This commit is contained in:
@ -382,6 +382,7 @@ drawer:
|
||||
folders: Folders
|
||||
fs: File System
|
||||
graph: Graph View
|
||||
history: History
|
||||
tags: Tags
|
||||
share: Share App
|
||||
rate: Rate Us
|
||||
|
@ -9,6 +9,7 @@ import 'package:gitjournal/logger/logger.dart';
|
||||
import 'package:gitjournal/repository.dart';
|
||||
import 'package:gitjournal/screens/folder_listing.dart';
|
||||
import 'package:gitjournal/screens/graph_view.dart';
|
||||
import 'package:gitjournal/screens/history_screen.dart';
|
||||
import 'package:gitjournal/screens/home_screen.dart';
|
||||
import 'package:gitjournal/screens/note_editor.dart';
|
||||
import 'package:gitjournal/screens/onboarding_screens.dart';
|
||||
@ -43,6 +44,7 @@ class AppRoute {
|
||||
SetupRemoteGit,
|
||||
Purchase,
|
||||
PurchaseThank,
|
||||
HistoryScreen.routePath,
|
||||
];
|
||||
}
|
||||
|
||||
@ -141,6 +143,8 @@ class AppRouter {
|
||||
return PurchaseScreen();
|
||||
case AppRoute.PurchaseThank:
|
||||
return PurchaseThankYouScreen();
|
||||
case HistoryScreen.routePath:
|
||||
return const HistoryScreen();
|
||||
}
|
||||
|
||||
if (route.startsWith('/newNote/')) {
|
||||
|
@ -536,6 +536,7 @@ abstract class LocaleKeys {
|
||||
static const drawer_folders = 'drawer.folders';
|
||||
static const drawer_fs = 'drawer.fs';
|
||||
static const drawer_graph = 'drawer.graph';
|
||||
static const drawer_history = 'drawer.history';
|
||||
static const drawer_tags = 'drawer.tags';
|
||||
static const drawer_share = 'drawer.share';
|
||||
static const drawer_rate = 'drawer.rate';
|
||||
|
82
lib/screens/history_screen.dart
Normal file
82
lib/screens/history_screen.dart
Normal file
@ -0,0 +1,82 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:dart_git/git.dart';
|
||||
import 'package:dart_git/plumbing/commit_iterator.dart';
|
||||
import 'package:dart_git/plumbing/objects/commit.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'package:gitjournal/repository.dart';
|
||||
import 'package:gitjournal/widgets/future_builder_with_progress.dart';
|
||||
|
||||
class HistoryScreen extends StatelessWidget {
|
||||
static const String routePath = "/history";
|
||||
|
||||
const HistoryScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(),
|
||||
body: const HistoryWidget(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class HistoryWidget extends StatefulWidget {
|
||||
const HistoryWidget({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_HistoryWidgetState createState() => _HistoryWidgetState();
|
||||
}
|
||||
|
||||
class _HistoryWidgetState extends State<HistoryWidget> {
|
||||
List<GitCommit> commits = [];
|
||||
Stream<Result<GitCommit>>? _stream;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
Future<Stream<Result<GitCommit>>> _initStream() async {
|
||||
var gjRepo = Provider.of<GitJournalRepo>(context);
|
||||
|
||||
var repo = await GitRepository.load(gjRepo.gitBaseDirectory).getOrThrow();
|
||||
return commitPreOrderIterator(
|
||||
objStorage: repo.objStorage,
|
||||
from: await repo.headCommit().getOrThrow(),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return FutureBuilderWithProgress(
|
||||
future: () async {
|
||||
_stream = await _initStream();
|
||||
|
||||
return ListView.builder(
|
||||
itemBuilder: (BuildContext context, int i) {
|
||||
return FutureBuilderWithProgress(future: _buildTile(context, i));
|
||||
},
|
||||
);
|
||||
}(),
|
||||
);
|
||||
}
|
||||
|
||||
Future<Widget> _buildTile(BuildContext context, int i) async {
|
||||
var stream = _stream!;
|
||||
|
||||
// Put in a lock!
|
||||
if (i >= commits.length) {
|
||||
for (var j = 0; j < (commits.length - i).abs() + 1; j++) {
|
||||
await for (var commit in stream) {
|
||||
commits.add(commit.getOrThrow());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var commit = commits[i];
|
||||
return Text(commit.message);
|
||||
}
|
||||
}
|
@ -48,6 +48,8 @@ class AppSettings extends ChangeNotifier {
|
||||
var experimentalGitMerge = false;
|
||||
var experimentalGitOps = false;
|
||||
|
||||
var experimentalHistory = false;
|
||||
|
||||
void load(SharedPreferences pref) {
|
||||
onBoardingCompleted = pref.getBool("onBoardingCompleted") ?? false;
|
||||
|
||||
|
@ -188,6 +188,15 @@ class _AppDrawerState extends State<AppDrawer>
|
||||
onTap: () => _navTopLevel(context, '/graph'),
|
||||
selected: currentRoute == "/graph",
|
||||
),
|
||||
if (appSettings.experimentalHistory)
|
||||
_buildDrawerTile(
|
||||
context,
|
||||
icon: Icons.history,
|
||||
isFontAwesome: true,
|
||||
title: tr(LocaleKeys.drawer_history),
|
||||
onTap: () => _navTopLevel(context, '/history'),
|
||||
selected: currentRoute == "/history",
|
||||
),
|
||||
_buildDrawerTile(
|
||||
context,
|
||||
icon: FontAwesomeIcons.tag,
|
||||
|
Reference in New Issue
Block a user