internal static void DownloadVolume( BookItem ThisBook, Volume Vol ) { if ( ThisBook is BookInstruction ) { Chapter[] Chs = Vol.ChapterList; int i = 0; int l = Chs.Length; ChapterLoader Loader = null; Loader = new ChapterLoader( ThisBook, C => { C.UpdateStatus(); if ( i < l ) { Loader.Load( Chs[ i++ ] ); } } ); Loader.Load( Chs[ i++ ] ); return; } Worker.ReisterBackgroundWork( () => { string id = ThisBook.Id; string CVid = Vol.vid; foreach ( Chapter c in Vol.ChapterList ) { if ( !c.IsCached ) { Logger.Log( ID, "Registering: " + c.ChapterTitle, LogType.DEBUG ); App.RuntimeTransfer.RegisterRuntimeThread( X.Call<XKey[]>( XProto.WRequest, "GetBookContent", id, c.cid ) , c.ChapterPath, Guid.NewGuid() , Uri.EscapeDataString( ThisBook.Title ) + "&" + Uri.EscapeDataString( Vol.VolumeTitle ) + "&" + Uri.EscapeDataString( c.ChapterTitle ) , c.IllustrationPath ); } } App.RuntimeTransfer.StartThreadCycle( ( a, b ) => { LoadComplete( a, b ); Worker.UIInvoke( () => { foreach ( Chapter C in Vol.ChapterList ) C.UpdateStatus(); } ); } ); App.RuntimeTransfer.ResumeThread(); } ); }
public void OpenBook( Chapter C, bool Reload = false, int Anchor = -1 ) { if ( OpenLock ) return; if ( C == null ) { Logger.Log( ID, "Oops, Chapter is null. Can't open nothing.", LogType.WARNING ); return; } if ( !Reload && C.Equals( CurrentChapter ) ) { if ( Anchor != -1 ) { ContentView.UserStartReading = false; ContentView.GotoIndex( Anchor ); } return; } ClosePane(); OpenMask(); CurrentChapter = C; OpenLock = true; // Throw this into background as it is resources intensive Task.Run( () => { if ( CurrentBook == null || C.aid != CurrentBook.Id ) { Shared.LoadMessage( "BookConstruct" ); if ( C is SChapter ) { CurrentBook = new BookInstruction( C as SChapter ); } else { CurrentBook = X.Instance<BookItem>( XProto.BookItemEx, C ); } } BookLoader BL = new BookLoader( BookLoaded ); BL.Load( CurrentBook, true ); // Fire up Episode stepper, used for stepping next episode if ( ES == null || ES.Chapter.aid != C.aid ) { Shared.LoadMessage( "EpisodeStepper" ); VolumeLoader VL = new VolumeLoader( ( BookItem b ) => { ES = new EpisodeStepper( new VolumesInfo( b ) ); SetInfoTemplate(); } ); VL.Load( CurrentBook ); } else { Worker.UIInvoke( () => SetInfoTemplate() ); } ReloadReader = () => { ContentFrame.Content = null; Shared.LoadMessage( "RedrawingContent" ); ContentView?.Dispose(); ContentView = new ReaderContent( this, Anchor ); SetLayoutAware(); ContentFrame.Content = ContentView; // Load Content at the very end ContentView.Load( false ); }; // Override reload here since // Since the selected index just won't update if ( Reload ) { ChapterLoader CL = new ChapterLoader( CurrentBook, x => { OpenLock = false; Redraw(); } ); // if book is local, use the cache CL.Load( CurrentChapter, CurrentBook.IsLocal ); } else { Worker.UIInvoke( () => { // Lock should be released before redrawing start OpenLock = false; Redraw(); } ); } } ); }