Skip to content

Commit

Permalink
Merge pull request #94 from abc873693/feature/course-overwrite
Browse files Browse the repository at this point in the history
feat: add course invisible
  • Loading branch information
abc873693 authored Sep 2, 2022
2 parents 1ce03c8 + 6ac115f commit f0bc23c
Showing 1 changed file with 104 additions and 6 deletions.
110 changes: 104 additions & 6 deletions lib/scaffold/course_scaffold.dart
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ enum _ContentStyle { list, table }

const _courseHeight = 55.0;

const _kCourseInvisibleKey = '${ApConstants.packageName}.course_invisible_';

class CourseConfig extends InheritedWidget {
final bool? showSectionTime;
final bool? showInstructors;
Expand Down Expand Up @@ -138,6 +140,8 @@ class CourseScaffoldState extends State<CourseScaffold> {
MediaQuery.of(context).size.shortestSide >= 680 ||
MediaQuery.of(context).orientation == Orientation.landscape;

List<String> invisibleCourseCodes = <String>[];

@override
void initState() {
showSectionTime = widget.showSectionTime ??
Expand All @@ -148,9 +152,16 @@ class CourseScaffoldState extends State<CourseScaffold> {
Preferences.getBool(ApConstants.showClassroomLocation, true);
showSearchButton = widget.showSearchButton ??
Preferences.getBool(ApConstants.showCourseSearchButton, true);
fetchInvisibleCourseCodes();
super.initState();
}

@override
void didUpdateWidget(covariant CourseScaffold oldWidget) {
fetchInvisibleCourseCodes();
super.didUpdateWidget(oldWidget);
}

@override
void dispose() {
super.dispose();
Expand Down Expand Up @@ -282,6 +293,15 @@ class CourseScaffoldState extends State<CourseScaffold> {
child: CourseList(
courses: widget.courseData.courses ?? [],
timeCodes: widget.courseData.timeCodes,
invisibleCourseCodes: invisibleCourseCodes,
onVisibilityChanged: (
Course course,
bool visibility,
) =>
saveInvisibleCourseCodes(
course: course,
visibility: visibility,
),
),
),
),
Expand Down Expand Up @@ -394,6 +414,15 @@ class CourseScaffoldState extends State<CourseScaffold> {
return CourseList(
courses: widget.courseData.courses ?? [],
timeCodes: widget.courseData.timeCodes,
invisibleCourseCodes: invisibleCourseCodes,
onVisibilityChanged: (
Course course,
bool visibility,
) =>
saveInvisibleCourseCodes(
course: course,
visibility: visibility,
),
);
}
}
Expand Down Expand Up @@ -482,6 +511,7 @@ class CourseScaffoldState extends State<CourseScaffold> {
}
for (var i = 0; i < widget.courseData.courses!.length; i++) {
final course = widget.courseData.courses![i];
if (invisibleCourseCodes.contains(course.code)) continue;
for (var j = 0; j < (course.times?.length ?? 0); j++) {
final time = course.times![j];
final timeCodeIndex = time.index!;
Expand Down Expand Up @@ -590,6 +620,11 @@ class CourseScaffoldState extends State<CourseScaffold> {
weekday: weekday,
courseNotifySaveKey: widget.courseNotifySaveKey,
timeCode: timeCode,
invisibleCourseCodes: invisibleCourseCodes,
onVisibilityChanged: (bool visibility) => saveInvisibleCourseCodes(
course: course,
visibility: visibility,
),
);
},
);
Expand Down Expand Up @@ -625,6 +660,30 @@ class CourseScaffoldState extends State<CourseScaffold> {
}
widget.onSearchButtonClick?.call();
}

void saveInvisibleCourseCodes({
required Course course,
required bool visibility,
}) {
if (visibility) {
invisibleCourseCodes.remove(course.code);
} else {
invisibleCourseCodes.add(course.code!);
}
Preferences.setStringList(
'$_kCourseInvisibleKey${widget.courseNotifySaveKey}',
invisibleCourseCodes,
);
setState(() {});
}

void fetchInvisibleCourseCodes() {
invisibleCourseCodes = Preferences.getStringList(
'$_kCourseInvisibleKey${widget.courseNotifySaveKey}',
[],
);
setState(() {});
}
}

class CourseContent extends StatefulWidget {
Expand All @@ -638,6 +697,8 @@ class CourseContent extends StatefulWidget {
final String courseNotifySaveKey;
final bool enableAddToCalendar;
final String? androidResourceIcon;
final List<String> invisibleCourseCodes;
final ValueChanged<bool>? onVisibilityChanged;

const CourseContent({
Key? key,
Expand All @@ -651,6 +712,8 @@ class CourseContent extends StatefulWidget {
this.courseNotifySaveKey = ApConstants.semesterLatest,
this.enableAddToCalendar = true,
this.androidResourceIcon,
this.invisibleCourseCodes = const <String>[],
this.onVisibilityChanged,
}) : super(key: key);

@override
Expand All @@ -671,6 +734,8 @@ class _CourseContentState extends State<CourseContent> {
? CourseNotifyState.cancel
: CourseNotifyState.schedule;
}
final bool visibility =
!widget.invisibleCourseCodes.contains(widget.course.code);
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16.0,
Expand Down Expand Up @@ -717,6 +782,18 @@ class _CourseContentState extends State<CourseContent> {
?.logEvent('course_export_to_calendar');
},
),
IconButton(
icon: Icon(
visibility
? Icons.visibility_outlined
: Icons.visibility_off_outlined,
),
onPressed: () {
setState(() {
widget.onVisibilityChanged?.call(!visibility);
});
},
),
if (widget.enableNotifyControl &&
widget.notifyData != null &&
NotificationUtils.isSupport)
Expand Down Expand Up @@ -882,11 +959,15 @@ class TimeCodeBorder extends StatelessWidget {

class CourseList extends StatelessWidget {
final List<Course> courses;
final List<String> invisibleCourseCodes;
final void Function(Course, bool)? onVisibilityChanged;
final List<TimeCode>? timeCodes;

const CourseList({
Key? key,
required this.courses,
this.invisibleCourseCodes = const <String>[],
this.onVisibilityChanged,
this.timeCodes,
}) : super(key: key);

Expand All @@ -896,6 +977,7 @@ class CourseList extends StatelessWidget {
return ListView.builder(
itemBuilder: (_, index) {
final course = courses[index];
final bool visibility = !invisibleCourseCodes.contains(course.code);
return Card(
elevation: 4.0,
margin: const EdgeInsets.all(8.0),
Expand All @@ -907,12 +989,28 @@ class CourseList extends StatelessWidget {
vertical: 8.0,
horizontal: 24.0,
),
title: Text(
courses[index].title!,
style: const TextStyle(
height: 1.3,
fontSize: 20.0,
),
title: Row(
children: <Widget>[
Expanded(
child: Text(
courses[index].title!,
style: const TextStyle(
height: 1.3,
fontSize: 20.0,
),
),
),
const SizedBox(width: 8.0),
IconButton(
icon: Icon(
visibility
? Icons.visibility_outlined
: Icons.visibility_off_outlined,
),
onPressed: () =>
onVisibilityChanged?.call(course, !visibility),
),
],
),
subtitle: Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
Expand Down

0 comments on commit f0bc23c

Please sign in to comment.