blob: 91e0fb05f3b06258a132d8d0c526f20cb70520f2 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:conductor_core/proto.dart' as pb;
import 'package:flutter/material.dart';
import 'conductor_status.dart';
import 'substeps.dart';
/// Displays the progression and each step of the release from the conductor.
///
// TODO(Yugue): Add documentation to explain
// each step of the release, https://github.com/flutter/flutter/issues/90981.
class MainProgression extends StatefulWidget {
const MainProgression({
Key? key,
this.releaseState,
required this.stateFilePath,
}) : super(key: key);
final pb.ConductorState? releaseState;
final String stateFilePath;
@override
MainProgressionState createState() => MainProgressionState();
static const List<String> _stepTitles = <String>[
'Initialize a New Flutter Release',
'Flutter Engine Cherrypicks',
'Flutter Framework Cherrypicks',
'Publish the Release',
'Release is Successfully published'
];
}
class MainProgressionState extends State<MainProgression> {
int _completedStep = 0;
/// Move forward the stepper to the next step of the release.
void nextStep() {
if (_completedStep < MainProgression._stepTitles.length - 1) {
setState(() {
_completedStep += 1;
});
}
}
/// Change each step's state according to [_completedStep].
StepState handleStepState(int index) {
if (_completedStep > index) {
return StepState.complete;
} else if (_completedStep == index) {
return StepState.indexed;
} else {
return StepState.disabled;
}
}
final ScrollController _scrollController = ScrollController();
@override
Widget build(BuildContext context) {
return Expanded(
child: Scrollbar(
isAlwaysShown: true,
controller: _scrollController,
child: ListView(
controller: _scrollController,
padding: const EdgeInsets.symmetric(vertical: 12.0),
physics: const ClampingScrollPhysics(),
children: <Widget>[
ConductorStatus(
releaseState: widget.releaseState,
stateFilePath: widget.stateFilePath,
),
const SizedBox(height: 20.0),
Stepper(
controlsBuilder: (BuildContext context, ControlsDetails details) => Row(),
physics: const ScrollPhysics(),
currentStep: _completedStep,
onStepContinue: nextStep,
steps: <Step>[
Step(
title: Text(MainProgression._stepTitles[0]),
content: Column(
children: <Widget>[
ConductorSubsteps(nextStep: nextStep),
],
),
isActive: true,
state: handleStepState(0),
),
Step(
title: Text(MainProgression._stepTitles[1]),
content: Column(
children: <Widget>[
ConductorSubsteps(nextStep: nextStep),
],
),
isActive: true,
state: handleStepState(1),
),
Step(
title: Text(MainProgression._stepTitles[2]),
content: Column(
children: <Widget>[
ConductorSubsteps(nextStep: nextStep),
],
),
isActive: true,
state: handleStepState(2),
),
Step(
title: Text(MainProgression._stepTitles[3]),
content: Column(
children: <Widget>[
ConductorSubsteps(nextStep: nextStep),
],
),
isActive: true,
state: handleStepState(3),
),
Step(
title: Text(MainProgression._stepTitles[4]),
content: Column(),
isActive: true,
state: handleStepState(4),
),
],
),
],
),
),
);
}
}