feature: date selector in ranking page
This commit is contained in:
parent
ac1e7dfd02
commit
2015389cb5
@ -4,6 +4,7 @@
|
|||||||
xmlns:i="clr-namespace:Pixiview.Illust"
|
xmlns:i="clr-namespace:Pixiview.Illust"
|
||||||
xmlns:u="clr-namespace:Pixiview.UI"
|
xmlns:u="clr-namespace:Pixiview.UI"
|
||||||
xmlns:r="clr-namespace:Pixiview.Resources"
|
xmlns:r="clr-namespace:Pixiview.Resources"
|
||||||
|
xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
|
||||||
x:Class="Pixiview.Illust.RankingPage"
|
x:Class="Pixiview.Illust.RankingPage"
|
||||||
BackgroundColor="{DynamicResource WindowColor}"
|
BackgroundColor="{DynamicResource WindowColor}"
|
||||||
Title="{r:Text Ranking}">
|
Title="{r:Text Ranking}">
|
||||||
@ -33,8 +34,15 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
</Shell.TitleView>
|
</Shell.TitleView>
|
||||||
<ContentPage.ToolbarItems>
|
<ContentPage.ToolbarItems>
|
||||||
<ToolbarItem Order="Primary" Clicked="Refresh_Clicked"
|
<ToolbarItem Order="Primary"
|
||||||
IconImageSource="{DynamicResource FontIconRefresh}"/>
|
Command="{Binding ToolbarCommand}" CommandParameter="prev"
|
||||||
|
IconImageSource="{DynamicResource FontIconCaretCircleLeft}"/>
|
||||||
|
<ToolbarItem Order="Primary"
|
||||||
|
Command="{Binding ToolbarCommand}" CommandParameter="select"
|
||||||
|
IconImageSource="{DynamicResource FontIconCalendarDay}"/>
|
||||||
|
<ToolbarItem Order="Primary"
|
||||||
|
Command="{Binding ToolbarCommand}" CommandParameter="next"
|
||||||
|
IconImageSource="{DynamicResource FontIconCaretCircleRight}"/>
|
||||||
</ContentPage.ToolbarItems>
|
</ContentPage.ToolbarItems>
|
||||||
<Grid>
|
<Grid>
|
||||||
<ScrollView x:Name="scrollView" Scrolled="ScrollView_Scrolled"
|
<ScrollView x:Name="scrollView" Scrolled="ScrollView_Scrolled"
|
||||||
@ -92,5 +100,11 @@
|
|||||||
<ActivityIndicator IsRunning="True" IsVisible="True"
|
<ActivityIndicator IsRunning="True" IsVisible="True"
|
||||||
Color="{DynamicResource WindowColor}"/>
|
Color="{DynamicResource WindowColor}"/>
|
||||||
</Frame>
|
</Frame>
|
||||||
|
|
||||||
|
<DatePicker x:Name="datePicker" IsVisible="False"
|
||||||
|
ios:DatePicker.UpdateMode="WhenFinished"
|
||||||
|
Date="{Binding SelectedDate}"
|
||||||
|
MaximumDate="{Binding MaximumDate}"
|
||||||
|
DateSelected="DatePicker_DateSelected"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</i:IllustRankingDataCollectionPage>
|
</i:IllustRankingDataCollectionPage>
|
||||||
|
@ -18,6 +18,10 @@ namespace Pixiview.Illust
|
|||||||
nameof(SegmentDate), typeof(int), typeof(RankingPage), propertyChanged: OnSegmentDatePropertyChanged);
|
nameof(SegmentDate), typeof(int), typeof(RankingPage), propertyChanged: OnSegmentDatePropertyChanged);
|
||||||
public static readonly BindableProperty SegmentTypeProperty = BindableProperty.Create(
|
public static readonly BindableProperty SegmentTypeProperty = BindableProperty.Create(
|
||||||
nameof(SegmentType), typeof(int), typeof(RankingPage), propertyChanged: OnSegmentTypePropertyChanged);
|
nameof(SegmentType), typeof(int), typeof(RankingPage), propertyChanged: OnSegmentTypePropertyChanged);
|
||||||
|
public static readonly BindableProperty MaximumDateProperty = BindableProperty.Create(
|
||||||
|
nameof(MaximumDate), typeof(DateTime), typeof(RankingPage), DateTime.Now);
|
||||||
|
public static readonly BindableProperty SelectedDateProperty = BindableProperty.Create(
|
||||||
|
nameof(SelectedDate), typeof(DateTime), typeof(RankingPage), DateTime.Now);
|
||||||
|
|
||||||
private static void OnSegmentDatePropertyChanged(BindableObject obj, object old, object @new)
|
private static void OnSegmentDatePropertyChanged(BindableObject obj, object old, object @new)
|
||||||
{
|
{
|
||||||
@ -60,12 +64,28 @@ namespace Pixiview.Illust
|
|||||||
get => (int)GetValue(SegmentTypeProperty);
|
get => (int)GetValue(SegmentTypeProperty);
|
||||||
set => SetValue(SegmentTypeProperty, value);
|
set => SetValue(SegmentTypeProperty, value);
|
||||||
}
|
}
|
||||||
|
public DateTime MaximumDate
|
||||||
|
{
|
||||||
|
get => (DateTime)GetValue(MaximumDateProperty);
|
||||||
|
set => SetValue(MaximumDateProperty, value);
|
||||||
|
}
|
||||||
|
public DateTime SelectedDate
|
||||||
|
{
|
||||||
|
get => (DateTime)GetValue(SelectedDateProperty);
|
||||||
|
set => SetValue(SelectedDateProperty, value);
|
||||||
|
}
|
||||||
|
public Command<string> ToolbarCommand { get; private set; }
|
||||||
|
|
||||||
private double lastScrollY = double.MinValue;
|
private double lastScrollY = double.MinValue;
|
||||||
|
public bool previousEnabled;
|
||||||
|
public bool dateEnabled;
|
||||||
|
public bool nextEnabled;
|
||||||
|
|
||||||
private bool isFilterVisible;
|
private bool isFilterVisible;
|
||||||
private string lastQueryKey;
|
private string lastQueryKey;
|
||||||
private string queryDate;
|
private string queryDate;
|
||||||
|
private string previousDate;
|
||||||
|
private string nextDate;
|
||||||
private int currentPage;
|
private int currentPage;
|
||||||
private int nextPage;
|
private int nextPage;
|
||||||
|
|
||||||
@ -74,6 +94,7 @@ namespace Pixiview.Illust
|
|||||||
public RankingPage()
|
public RankingPage()
|
||||||
{
|
{
|
||||||
Resources.Add("cardView", GetCardViewTemplate());
|
Resources.Add("cardView", GetCardViewTemplate());
|
||||||
|
ToolbarCommand = new Command<string>(OnDateTrigger, OnCanDateTrigger);
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
gridFilter.TranslationY = -100;
|
gridFilter.TranslationY = -100;
|
||||||
panelFilter.TranslationY = -100;
|
panelFilter.TranslationY = -100;
|
||||||
@ -81,6 +102,9 @@ namespace Pixiview.Illust
|
|||||||
lastQueryKey = QueryKey;
|
lastQueryKey = QueryKey;
|
||||||
queryDate = null; // $"{now.Year}{now.Month:00}{now.Day:00}";
|
queryDate = null; // $"{now.Year}{now.Month:00}{now.Day:00}";
|
||||||
currentPage = 1;
|
currentPage = 1;
|
||||||
|
|
||||||
|
datePicker.MinimumDate = new DateTime(2007, 9, 13);
|
||||||
|
MaximumDate = DateTime.Now;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void DoIllustsLoaded(IllustCollection collection)
|
protected override void DoIllustsLoaded(IllustCollection collection)
|
||||||
@ -118,13 +142,56 @@ namespace Pixiview.Illust
|
|||||||
nextPage = next;
|
nextPage = next;
|
||||||
}
|
}
|
||||||
var date = data.date;
|
var date = data.date;
|
||||||
if (date.Length == 8)
|
DateTime now;
|
||||||
|
if (date.Length == 8 && int.TryParse(date, out _))
|
||||||
{
|
{
|
||||||
queryDate = date;
|
queryDate = date;
|
||||||
date = date.Substring(0, 4) + "-" + date.Substring(4, 2) + "-" + date.Substring(6, 2);
|
now = new DateTime(
|
||||||
|
int.Parse(date.Substring(0, 4)),
|
||||||
|
int.Parse(date.Substring(4, 2)),
|
||||||
|
int.Parse(date.Substring(6, 2)));
|
||||||
|
SelectedDate = now;
|
||||||
|
date = now.ToShortDateString();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
now = default;
|
||||||
}
|
}
|
||||||
date = ResourceHelper.GetResource(data.mode, date);
|
date = ResourceHelper.GetResource(data.mode, date);
|
||||||
MainThread.BeginInvokeOnMainThread(() => Title = date);
|
|
||||||
|
var prev = data.prev_date;
|
||||||
|
if (int.TryParse(prev, out _))
|
||||||
|
{
|
||||||
|
previousDate = prev;
|
||||||
|
previousEnabled = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
previousDate = null;
|
||||||
|
previousEnabled = false;
|
||||||
|
}
|
||||||
|
var next_ = data.next_date;
|
||||||
|
if (int.TryParse(next_, out _))
|
||||||
|
{
|
||||||
|
nextDate = next_;
|
||||||
|
nextEnabled = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nextDate = null;
|
||||||
|
nextEnabled = false;
|
||||||
|
if (now != default)
|
||||||
|
{
|
||||||
|
MaximumDate = now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dateEnabled = true;
|
||||||
|
MainThread.BeginInvokeOnMainThread(() =>
|
||||||
|
{
|
||||||
|
ToolbarCommand.ChangeCanExecute();
|
||||||
|
Title = date;
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -157,14 +224,74 @@ namespace Pixiview.Illust
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Refresh_Clicked(object sender, EventArgs e)
|
private void OnDateTrigger(string action)
|
||||||
{
|
{
|
||||||
if (IsLoading)
|
if (IsLoading)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (action == "select")
|
||||||
|
{
|
||||||
|
datePicker.Focus();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var date = action == "prev" ? previousDate : nextDate;
|
||||||
|
if (date == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (isFilterVisible)
|
||||||
|
{
|
||||||
|
ToggleFilterPanel(false);
|
||||||
|
}
|
||||||
|
// release
|
||||||
|
var collection = IllustCollection;
|
||||||
|
if (collection != null)
|
||||||
|
{
|
||||||
|
collection.Running = false;
|
||||||
|
IllustCollection = null;
|
||||||
|
}
|
||||||
|
previousEnabled = false;
|
||||||
|
dateEnabled = false;
|
||||||
|
nextEnabled = false;
|
||||||
|
queryDate = date;
|
||||||
|
currentPage = 1;
|
||||||
|
StartLoad(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool OnCanDateTrigger(string action)
|
||||||
|
{
|
||||||
|
switch (action)
|
||||||
|
{
|
||||||
|
case "prev":
|
||||||
|
return previousEnabled;
|
||||||
|
case "next":
|
||||||
|
return nextEnabled;
|
||||||
|
default:
|
||||||
|
return dateEnabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DatePicker_DateSelected(object sender, DateChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (IsLoading)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// release
|
||||||
|
var collection = IllustCollection;
|
||||||
|
if (collection != null)
|
||||||
|
{
|
||||||
|
collection.Running = false;
|
||||||
|
IllustCollection = null;
|
||||||
|
}
|
||||||
|
previousEnabled = false;
|
||||||
|
dateEnabled = false;
|
||||||
|
nextEnabled = false;
|
||||||
|
queryDate = e.NewDate.ToString("yyyyMMdd");
|
||||||
currentPage = 1;
|
currentPage = 1;
|
||||||
IllustCollection = null;
|
|
||||||
StartLoad(true);
|
StartLoad(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,10 +353,16 @@ namespace Pixiview.Illust
|
|||||||
}
|
}
|
||||||
if (lastQueryKey != query)
|
if (lastQueryKey != query)
|
||||||
{
|
{
|
||||||
|
// release
|
||||||
|
var collection = IllustCollection;
|
||||||
|
if (collection != null)
|
||||||
|
{
|
||||||
|
collection.Running = false;
|
||||||
|
IllustCollection = null;
|
||||||
|
}
|
||||||
// query changed.
|
// query changed.
|
||||||
currentPage = 1;
|
currentPage = 1;
|
||||||
lastQueryKey = query;
|
lastQueryKey = query;
|
||||||
IllustCollection = null;
|
|
||||||
refresh = true;
|
refresh = true;
|
||||||
App.DebugPrint($"query changed: {query}");
|
App.DebugPrint($"query changed: {query}");
|
||||||
}
|
}
|
||||||
|
@ -16,12 +16,12 @@
|
|||||||
<Male>受男性欢迎</Male>
|
<Male>受男性欢迎</Male>
|
||||||
<monthly>当月截至 {0}</monthly>
|
<monthly>当月截至 {0}</monthly>
|
||||||
<weekly>当周截至 {0}</weekly>
|
<weekly>当周截至 {0}</weekly>
|
||||||
<daily>当日 {0}</daily>
|
<daily>{0} 当日</daily>
|
||||||
<male>受欢迎 {0}</male>
|
<male>{0} 最受欢迎</male>
|
||||||
<monthly_r18>当月截至 {0}</monthly_r18>
|
<monthly_r18>当月截至 {0}</monthly_r18>
|
||||||
<weekly_r18>当周截至 {0}</weekly_r18>
|
<weekly_r18>当周截至 {0}</weekly_r18>
|
||||||
<daily_r18>当日 {0}</daily_r18>
|
<daily_r18>{0} 当日</daily_r18>
|
||||||
<male_r18>受欢迎 {0}</male_r18>
|
<male_r18>{0} 最受欢迎</male_r18>
|
||||||
<General>一般</General>
|
<General>一般</General>
|
||||||
<R18>R-18</R18>
|
<R18>R-18</R18>
|
||||||
<Follow>已关注</Follow>
|
<Follow>已关注</Follow>
|
||||||
|
@ -47,6 +47,9 @@ namespace Pixiview.UI
|
|||||||
public const string IconCircleCheck = "\uf058";
|
public const string IconCircleCheck = "\uf058";
|
||||||
public const string IconPlay = "\uf04b";
|
public const string IconPlay = "\uf04b";
|
||||||
public const string IconMore = "\uf142";
|
public const string IconMore = "\uf142";
|
||||||
|
public const string IconCaretCircleLeft = "\uf32e";
|
||||||
|
public const string IconCaretCircleRight = "\uf330";
|
||||||
|
public const string IconCalendarDay = "\uf783";
|
||||||
|
|
||||||
static StyleDefinition()
|
static StyleDefinition()
|
||||||
{
|
{
|
||||||
|
@ -14,6 +14,9 @@ namespace Pixiview.UI.Theme
|
|||||||
public const string FontIconFavorite = nameof(FontIconFavorite);
|
public const string FontIconFavorite = nameof(FontIconFavorite);
|
||||||
public const string FontIconShare = nameof(FontIconShare);
|
public const string FontIconShare = nameof(FontIconShare);
|
||||||
public const string FontIconMore = nameof(FontIconMore);
|
public const string FontIconMore = nameof(FontIconMore);
|
||||||
|
public const string FontIconCaretCircleLeft = nameof(FontIconCaretCircleLeft);
|
||||||
|
public const string FontIconCaretCircleRight = nameof(FontIconCaretCircleRight);
|
||||||
|
public const string FontIconCalendarDay = nameof(FontIconCalendarDay);
|
||||||
public const string IconCircleCheck = nameof(IconCircleCheck);
|
public const string IconCircleCheck = nameof(IconCircleCheck);
|
||||||
public const string IconCaretDown = nameof(IconCaretDown);
|
public const string IconCaretDown = nameof(IconCaretDown);
|
||||||
|
|
||||||
@ -57,6 +60,9 @@ namespace Pixiview.UI.Theme
|
|||||||
Add(FontIconFavorite, GetSolidIcon(StyleDefinition.IconFavorite, solidFontFamily));
|
Add(FontIconFavorite, GetSolidIcon(StyleDefinition.IconFavorite, solidFontFamily));
|
||||||
Add(FontIconShare, GetSolidIcon(StyleDefinition.IconShare, solidFontFamily));
|
Add(FontIconShare, GetSolidIcon(StyleDefinition.IconShare, solidFontFamily));
|
||||||
Add(FontIconMore, GetSolidIcon(StyleDefinition.IconMore, regularFontFamily));
|
Add(FontIconMore, GetSolidIcon(StyleDefinition.IconMore, regularFontFamily));
|
||||||
|
Add(FontIconCaretCircleLeft, GetSolidIcon(StyleDefinition.IconCaretCircleLeft, solidFontFamily));
|
||||||
|
Add(FontIconCaretCircleRight, GetSolidIcon(StyleDefinition.IconCaretCircleRight, solidFontFamily));
|
||||||
|
Add(FontIconCalendarDay, GetSolidIcon(StyleDefinition.IconCalendarDay, regularFontFamily));
|
||||||
|
|
||||||
Add(IconCircleCheck, StyleDefinition.IconCircleCheck);
|
Add(IconCircleCheck, StyleDefinition.IconCircleCheck);
|
||||||
Add(IconCaretDown, StyleDefinition.IconCaretDown);
|
Add(IconCaretDown, StyleDefinition.IconCaretDown);
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 1.6 MiB After Width: | Height: | Size: 588 KiB |
Loading…
x
Reference in New Issue
Block a user