mirror of
https://github.com/stonega/tsacdop
synced 2025-02-21 14:01:01 +01:00
Select before and select after.
This commit is contained in:
parent
7f66ebd7e6
commit
2e0e65f41a
@ -671,6 +671,7 @@ class DBHelper {
|
|||||||
var list = <Map>[];
|
var list = <Map>[];
|
||||||
if (hideListened) {
|
if (hideListened) {
|
||||||
if (count == -1) {
|
if (count == -1) {
|
||||||
|
if (reverse) {
|
||||||
switch (filter) {
|
switch (filter) {
|
||||||
case Filter.all:
|
case Filter.all:
|
||||||
list = await dbClient.rawQuery(
|
list = await dbClient.rawQuery(
|
||||||
@ -706,6 +707,43 @@ class DBHelper {
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
switch (filter) {
|
||||||
|
case Filter.all:
|
||||||
|
list = await dbClient.rawQuery(
|
||||||
|
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
|
||||||
|
E.milliseconds, P.imagePath, P.title as feed_title, E.duration, E.explicit,
|
||||||
|
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
|
||||||
|
LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url
|
||||||
|
WHERE P.id = ? GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
|
||||||
|
OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC""", [id]);
|
||||||
|
break;
|
||||||
|
case Filter.liked:
|
||||||
|
list = await dbClient.rawQuery(
|
||||||
|
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
|
||||||
|
E.milliseconds, P.imagePath, P.title as feed_title, E.duration, E.explicit,
|
||||||
|
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
|
||||||
|
WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds DESC""", [id]);
|
||||||
|
break;
|
||||||
|
case Filter.downloaded:
|
||||||
|
list = await dbClient.rawQuery(
|
||||||
|
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
|
||||||
|
E.milliseconds, P.imagePath, P.title as feed_title, E.duration, E.explicit,
|
||||||
|
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
|
||||||
|
WHERE P.id = ? AND E.media_id != E.enclosure_url ORDER BY E.milliseconds DESC""",
|
||||||
|
[id]);
|
||||||
|
break;
|
||||||
|
case Filter.search:
|
||||||
|
list = await dbClient.rawQuery(
|
||||||
|
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
|
||||||
|
E.milliseconds, P.imagePath, P.title as feed_title, E.duration, E.explicit,
|
||||||
|
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
|
||||||
|
WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds DESC""",
|
||||||
|
[id, '%$query%']);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (reverse) {
|
} else if (reverse) {
|
||||||
switch (filter) {
|
switch (filter) {
|
||||||
case Filter.all:
|
case Filter.all:
|
||||||
@ -798,6 +836,7 @@ class DBHelper {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (count == -1) {
|
if (count == -1) {
|
||||||
|
if (reverse) {
|
||||||
switch (filter) {
|
switch (filter) {
|
||||||
case Filter.all:
|
case Filter.all:
|
||||||
list = await dbClient.rawQuery(
|
list = await dbClient.rawQuery(
|
||||||
@ -831,6 +870,41 @@ class DBHelper {
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
switch (filter) {
|
||||||
|
case Filter.all:
|
||||||
|
list = await dbClient.rawQuery(
|
||||||
|
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
|
||||||
|
E.milliseconds, P.imagePath, P.title as feed_title, E.duration, E.explicit,
|
||||||
|
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
|
||||||
|
WHERE P.id = ? ORDER BY E.milliseconds DESC""", [id]);
|
||||||
|
break;
|
||||||
|
case Filter.liked:
|
||||||
|
list = await dbClient.rawQuery(
|
||||||
|
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
|
||||||
|
E.milliseconds, P.imagePath, P.title as feed_title, E.duration, E.explicit,
|
||||||
|
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
|
||||||
|
WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds DESC""", [id]);
|
||||||
|
break;
|
||||||
|
case Filter.downloaded:
|
||||||
|
list = await dbClient.rawQuery(
|
||||||
|
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
|
||||||
|
E.milliseconds, P.imagePath, P.title as feed_title, E.duration, E.explicit,
|
||||||
|
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
|
||||||
|
WHERE P.id = ? AND E.media_id != E.enclosure_url ORDER BY E.milliseconds DESC""",
|
||||||
|
[id]);
|
||||||
|
break;
|
||||||
|
case Filter.search:
|
||||||
|
list = await dbClient.rawQuery(
|
||||||
|
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
|
||||||
|
E.milliseconds, P.imagePath, P.title as feed_title, E.duration, E.explicit,
|
||||||
|
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
|
||||||
|
WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds DESC""",
|
||||||
|
[id, '%$query%']);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (reverse) {
|
} else if (reverse) {
|
||||||
switch (filter) {
|
switch (filter) {
|
||||||
case Filter.all:
|
case Filter.all:
|
||||||
|
@ -86,6 +86,10 @@ class _PodcastDetailState extends State<PodcastDetail> {
|
|||||||
|
|
||||||
bool _selectAll;
|
bool _selectAll;
|
||||||
|
|
||||||
|
bool _selectBefore;
|
||||||
|
|
||||||
|
bool _selectAfter;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
@ -95,6 +99,8 @@ class _PodcastDetailState extends State<PodcastDetail> {
|
|||||||
_scroll = false;
|
_scroll = false;
|
||||||
_multiSelect = false;
|
_multiSelect = false;
|
||||||
_selectAll = false;
|
_selectAll = false;
|
||||||
|
_selectAfter = false;
|
||||||
|
_selectBefore = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -696,6 +702,7 @@ class _PodcastDetailState extends State<PodcastDetail> {
|
|||||||
),
|
),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
setState(() {
|
setState(() {
|
||||||
|
_top = -1;
|
||||||
_selectedEpisodes = [];
|
_selectedEpisodes = [];
|
||||||
_multiSelect = true;
|
_multiSelect = true;
|
||||||
});
|
});
|
||||||
@ -862,11 +869,25 @@ class _PodcastDetailState extends State<PodcastDetail> {
|
|||||||
filter: _filter,
|
filter: _filter,
|
||||||
query: _query),
|
query: _query),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
|
if (snapshot.hasData) {
|
||||||
if (_selectAll) {
|
if (_selectAll) {
|
||||||
_selectedEpisodes = snapshot.data;
|
_selectedEpisodes = snapshot.data;
|
||||||
}
|
}
|
||||||
return (snapshot.hasData)
|
if (_selectBefore) {
|
||||||
? EpisodeGrid(
|
final index = snapshot.data
|
||||||
|
.indexOf(_selectedEpisodes.first);
|
||||||
|
if (index != 0) {
|
||||||
|
_selectedEpisodes = snapshot.data
|
||||||
|
.sublist(0, index + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_selectAfter) {
|
||||||
|
final index = snapshot.data
|
||||||
|
.indexOf(_selectedEpisodes.first);
|
||||||
|
_selectedEpisodes =
|
||||||
|
snapshot.data.sublist(index);
|
||||||
|
}
|
||||||
|
return EpisodeGrid(
|
||||||
episodes: snapshot.data,
|
episodes: snapshot.data,
|
||||||
showFavorite: true,
|
showFavorite: true,
|
||||||
showNumber: _filter == Filter.all &&
|
showNumber: _filter == Filter.all &&
|
||||||
@ -878,14 +899,16 @@ class _PodcastDetailState extends State<PodcastDetail> {
|
|||||||
episodeCount: _episodeCount,
|
episodeCount: _episodeCount,
|
||||||
initNum: _scroll ? 0 : 12,
|
initNum: _scroll ? 0 : 12,
|
||||||
multiSelect: _multiSelect,
|
multiSelect: _multiSelect,
|
||||||
selectedList:
|
selectedList: _selectedEpisodes ?? [],
|
||||||
_selectedEpisodes ?? [],
|
|
||||||
onSelect: (value) => setState(() {
|
onSelect: (value) => setState(() {
|
||||||
_selectAll = false;
|
_selectAll = false;
|
||||||
|
_selectBefore = false;
|
||||||
|
_selectAfter = false;
|
||||||
_selectedEpisodes = value;
|
_selectedEpisodes = value;
|
||||||
}),
|
}),
|
||||||
)
|
);
|
||||||
: SliverToBoxAdapter(
|
}
|
||||||
|
return SliverToBoxAdapter(
|
||||||
child: Center(),
|
child: Center(),
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
@ -919,7 +942,23 @@ class _PodcastDetailState extends State<PodcastDetail> {
|
|||||||
onSelectAll: (value) {
|
onSelectAll: (value) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_selectAll = value;
|
_selectAll = value;
|
||||||
|
_selectAfter = false;
|
||||||
|
_selectBefore = false;
|
||||||
|
if (!value) {
|
||||||
_selectedEpisodes = [];
|
_selectedEpisodes = [];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onSelectAfter: (value) {
|
||||||
|
setState(() {
|
||||||
|
_selectBefore = false;
|
||||||
|
_selectAfter = true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onSelectBefore: (value) {
|
||||||
|
setState(() {
|
||||||
|
_selectAfter = false;
|
||||||
|
_selectBefore = true;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onClose: (value) {
|
onClose: (value) {
|
||||||
@ -927,6 +966,8 @@ class _PodcastDetailState extends State<PodcastDetail> {
|
|||||||
if (value) {
|
if (value) {
|
||||||
_multiSelect = false;
|
_multiSelect = false;
|
||||||
_selectAll = false;
|
_selectAll = false;
|
||||||
|
_selectAfter = false;
|
||||||
|
_selectBefore = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -959,12 +1000,16 @@ class MultiSelectMenuBar extends StatefulWidget {
|
|||||||
this.selectAll,
|
this.selectAll,
|
||||||
this.onSelectAll,
|
this.onSelectAll,
|
||||||
this.onClose,
|
this.onClose,
|
||||||
|
this.onSelectAfter,
|
||||||
|
this.onSelectBefore,
|
||||||
Key key})
|
Key key})
|
||||||
: super(key: key);
|
: super(key: key);
|
||||||
final List<EpisodeBrief> selectedList;
|
final List<EpisodeBrief> selectedList;
|
||||||
final bool selectAll;
|
final bool selectAll;
|
||||||
final ValueChanged<bool> onSelectAll;
|
final ValueChanged<bool> onSelectAll;
|
||||||
final ValueChanged<bool> onClose;
|
final ValueChanged<bool> onClose;
|
||||||
|
final ValueChanged<bool> onSelectBefore;
|
||||||
|
final ValueChanged<bool> onSelectAfter;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_MultiSelectMenuBarState createState() => _MultiSelectMenuBarState();
|
_MultiSelectMenuBarState createState() => _MultiSelectMenuBarState();
|
||||||
@ -1146,16 +1191,18 @@ class _MultiSelectMenuBarState extends State<MultiSelectMenuBar> {
|
|||||||
tween: Tween<double>(begin: 0, end: 1),
|
tween: Tween<double>(begin: 0, end: 1),
|
||||||
duration: Duration(milliseconds: 500),
|
duration: Duration(milliseconds: 500),
|
||||||
builder: (context, value, child) => Container(
|
builder: (context, value, child) => Container(
|
||||||
height: 80.0 * value,
|
height: 90.0 * value,
|
||||||
decoration: BoxDecoration(color: context.primaryColor),
|
decoration: BoxDecoration(color: context.primaryColor),
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 30,
|
height: 40,
|
||||||
child: Align(
|
child: Center(
|
||||||
alignment: Alignment.centerRight,
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: EdgeInsets.symmetric(horizontal: 20.0),
|
padding: EdgeInsets.symmetric(horizontal: 20.0),
|
||||||
child: Text('${widget.selectedList.length} selected',
|
child: Text('${widget.selectedList.length} selected',
|
||||||
@ -1163,6 +1210,66 @@ class _MultiSelectMenuBarState extends State<MultiSelectMenuBar> {
|
|||||||
.copyWith(color: context.accentColor))),
|
.copyWith(color: context.accentColor))),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Spacer(),
|
||||||
|
if (widget.selectedList.length == 1)
|
||||||
|
SizedBox(
|
||||||
|
height: 25,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 5),
|
||||||
|
child: OutlinedButton(
|
||||||
|
style: OutlinedButton.styleFrom(
|
||||||
|
side: BorderSide(color: context.accentColor),
|
||||||
|
primary: context.textColor,
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.all(
|
||||||
|
Radius.circular(100)))),
|
||||||
|
onPressed: () {
|
||||||
|
widget.onSelectBefore(true);
|
||||||
|
},
|
||||||
|
child: Text('Before')),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (widget.selectedList.length == 1)
|
||||||
|
SizedBox(
|
||||||
|
height: 25,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 5),
|
||||||
|
child: OutlinedButton(
|
||||||
|
style: OutlinedButton.styleFrom(
|
||||||
|
side: BorderSide(color: context.accentColor),
|
||||||
|
primary: context.textColor,
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.all(
|
||||||
|
Radius.circular(100)))),
|
||||||
|
onPressed: () {
|
||||||
|
widget.onSelectAfter(true);
|
||||||
|
},
|
||||||
|
child: Text('After')),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 25,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 5),
|
||||||
|
child: OutlinedButton(
|
||||||
|
style: OutlinedButton.styleFrom(
|
||||||
|
side: BorderSide(color: context.accentColor),
|
||||||
|
backgroundColor:
|
||||||
|
widget.selectAll ? context.accentColor : null,
|
||||||
|
primary: widget.selectAll
|
||||||
|
? Colors.white
|
||||||
|
: context.textColor,
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius:
|
||||||
|
BorderRadius.all(Radius.circular(100)))),
|
||||||
|
onPressed: () {
|
||||||
|
widget.onSelectAll(!widget.selectAll);
|
||||||
|
},
|
||||||
|
child: Text('All')),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
_buttonOnMenu(
|
_buttonOnMenu(
|
||||||
@ -1287,12 +1394,6 @@ class _MultiSelectMenuBarState extends State<MultiSelectMenuBar> {
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
Spacer(),
|
Spacer(),
|
||||||
_buttonOnMenu(
|
|
||||||
child: Icon(Icons.select_all_rounded,
|
|
||||||
color: widget.selectAll ? context.accentColor : null),
|
|
||||||
onTap: () {
|
|
||||||
widget.onSelectAll(!widget.selectAll);
|
|
||||||
}),
|
|
||||||
_buttonOnMenu(
|
_buttonOnMenu(
|
||||||
child: Icon(Icons.close),
|
child: Icon(Icons.close),
|
||||||
onTap: () => widget.onClose(true))
|
onTap: () => widget.onClose(true))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user