diff --git a/MPfm/MPfm.MVP/Bootstrap/Bootstrapper.cs b/MPfm/MPfm.MVP/Bootstrap/Bootstrapper.cs index cc18fd99..62102e74 100644 --- a/MPfm/MPfm.MVP/Bootstrap/Bootstrapper.cs +++ b/MPfm/MPfm.MVP/Bootstrap/Bootstrapper.cs @@ -61,6 +61,11 @@ static Bootstrapper() container.Register().AsSingleton(); container.Register().AsSingleton(); container.Register().AsSingleton(); + container.Register().AsSingleton(); + container.Register().AsSingleton(); + container.Register().AsSingleton(); + container.Register().AsSingleton(); + container.Register().AsSingleton(); } /// diff --git a/MPfm/MPfm.MVP/MPfm.MVP.iOS.csproj b/MPfm/MPfm.MVP/MPfm.MVP.iOS.csproj index 2c14e0e0..e50155d8 100644 --- a/MPfm/MPfm.MVP/MPfm.MVP.iOS.csproj +++ b/MPfm/MPfm.MVP/MPfm.MVP.iOS.csproj @@ -268,5 +268,20 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MPfm/MPfm.MVP/Navigation/MobileNavigationManager.cs b/MPfm/MPfm.MVP/Navigation/MobileNavigationManager.cs index 8ad16d62..fdc3beb9 100644 --- a/MPfm/MPfm.MVP/Navigation/MobileNavigationManager.cs +++ b/MPfm/MPfm.MVP/Navigation/MobileNavigationManager.cs @@ -32,15 +32,28 @@ public abstract class MobileNavigationManager { private readonly object _locker = new object(); - private IMobileOptionsMenuView _optionsMenuView; - private IMobileOptionsMenuPresenter _optionsMenuPresenter; - private ISplashView _splashView; private ISplashPresenter _splashPresenter; - + private IMobileOptionsMenuView _optionsMenuView; + private IMobileOptionsMenuPresenter _optionsMenuPresenter; + private IUpdateLibraryView _updateLibraryView; + private IUpdateLibraryPresenter _updateLibraryPresenter; private IPlayerView _playerView; private IPlayerPresenter _playerPresenter; + // Player sub views + private IPlayerMetadataView _playerMetadataView; + private IPlayerMetadataPresenter _playerMetadataPresenter; + private ILoopsView _loopsView; + private ILoopsPresenter _loopsPresenter; + private IMarkersView _markersView; + private IMarkersPresenter _markersPresenter; + private ITimeShiftingView _timeShiftingView; + private ITimeShiftingPresenter _timeShiftingPresenter; + private IPitchShiftingView _pitchShiftingView; + private IPitchShiftingPresenter _pitchShiftingPresenter; + + // Preferences sub views private IAudioPreferencesView _audioPreferencesView; private IGeneralPreferencesView _generalPreferencesView; private ILibraryPreferencesView _libraryPreferencesView; @@ -48,9 +61,6 @@ public abstract class MobileNavigationManager private IGeneralPreferencesPresenter _generalPreferencesPresenter; private ILibraryPreferencesPresenter _libraryPreferencesPresenter; - private IUpdateLibraryView _updateLibraryView; - private IUpdateLibraryPresenter _updateLibraryPresenter; - private Dictionary _mobileLibraryBrowserList = new Dictionary(); public abstract void ShowSplash(ISplashView view); @@ -58,6 +68,7 @@ public abstract class MobileNavigationManager public abstract void AddTab(MobileNavigationTabType type, string title, IBaseView view); public abstract void PushTabView(MobileNavigationTabType type, IBaseView view); public abstract void PushDialogView(IBaseView view); + public abstract void PushPlayerSubview(IPlayerView playerView, IBaseView view); public virtual void Start() { @@ -234,6 +245,20 @@ public virtual IPlayerView CreatePlayerView(Action onViewBindedToPres { _playerPresenter = Bootstrapper.GetContainer().Resolve(); _playerPresenter.BindView((IPlayerView)view); + + // Add scroll view items + var playerMetadata = CreatePlayerMetadataView(); + var loops = CreateLoopsView(); + var markers = CreateMarkersView(); + var timeShifting = CreateTimeShiftingView(); + var pitchShifting = CreatePitchShiftingView(); + + PushPlayerSubview(_playerView, playerMetadata); + PushPlayerSubview(_playerView, loops); + PushPlayerSubview(_playerView, markers); + PushPlayerSubview(_playerView, timeShifting); + PushPlayerSubview(_playerView, pitchShifting); + if (onViewBindedToPresenter != null) onViewBindedToPresenter(view); }; @@ -247,6 +272,101 @@ public virtual IPlayerView CreatePlayerView(Action onViewBindedToPres }; return _playerView; } + + public virtual IPlayerMetadataView CreatePlayerMetadataView() + { + // The view invokes the OnViewReady action when the view is ready. This means the presenter can be created and bound to the view. + Action onViewReady = (view) => + { + _playerMetadataPresenter = Bootstrapper.GetContainer().Resolve(); + _playerMetadataPresenter.BindView((IPlayerMetadataView)view); + }; + + // Create view and manage view destruction + _playerMetadataView = Bootstrapper.GetContainer().Resolve(new NamedParameterOverloads() { { "onViewReady", onViewReady } }); + _playerMetadataView.OnViewDestroy = (view) => + { + _playerMetadataView = null; + _playerMetadataPresenter = null; + }; + return _playerMetadataView; + } + + public virtual ILoopsView CreateLoopsView() + { + // The view invokes the OnViewReady action when the view is ready. This means the presenter can be created and bound to the view. + Action onViewReady = (view) => + { + _loopsPresenter = Bootstrapper.GetContainer().Resolve(); + _loopsPresenter.BindView((ILoopsView)view); + }; + + // Create view and manage view destruction + _loopsView = Bootstrapper.GetContainer().Resolve(new NamedParameterOverloads() { { "onViewReady", onViewReady } }); + _loopsView.OnViewDestroy = (view) => + { + _loopsView = null; + _loopsPresenter = null; + }; + return _loopsView; + } + + public virtual IMarkersView CreateMarkersView() + { + // The view invokes the OnViewReady action when the view is ready. This means the presenter can be created and bound to the view. + Action onViewReady = (view) => + { + _markersPresenter = Bootstrapper.GetContainer().Resolve(); + _markersPresenter.BindView((IMarkersView)view); + }; + + // Create view and manage view destruction + _markersView = Bootstrapper.GetContainer().Resolve(new NamedParameterOverloads() { { "onViewReady", onViewReady } }); + _markersView.OnViewDestroy = (view) => + { + _markersView = null; + _markersPresenter = null; + }; + return _markersView; + } + + public virtual ITimeShiftingView CreateTimeShiftingView() + { + // The view invokes the OnViewReady action when the view is ready. This means the presenter can be created and bound to the view. + Action onViewReady = (view) => + { + _timeShiftingPresenter = Bootstrapper.GetContainer().Resolve(); + _timeShiftingPresenter.BindView((ITimeShiftingView)view); + }; + + // Create view and manage view destruction + _timeShiftingView = Bootstrapper.GetContainer().Resolve(new NamedParameterOverloads() { { "onViewReady", onViewReady } }); + _timeShiftingView.OnViewDestroy = (view) => + { + _timeShiftingView = null; + _timeShiftingPresenter = null; + }; + return _timeShiftingView; + } + + public virtual IPitchShiftingView CreatePitchShiftingView() + { + // The view invokes the OnViewReady action when the view is ready. This means the presenter can be created and bound to the view. + Action onViewReady = (view) => + { + _pitchShiftingPresenter = Bootstrapper.GetContainer().Resolve(); + _pitchShiftingPresenter.BindView((IPitchShiftingView)view); + }; + + // Create view and manage view destruction + _pitchShiftingView = Bootstrapper.GetContainer().Resolve(new NamedParameterOverloads() { { "onViewReady", onViewReady } }); + _pitchShiftingView.OnViewDestroy = (view) => + { + _pitchShiftingView = null; + _pitchShiftingPresenter = null; + }; + return _pitchShiftingView; + } } public enum MobileNavigationTabType diff --git a/MPfm/MPfm.MVP/Presenters/Interfaces/ILoopsPresenter.cs b/MPfm/MPfm.MVP/Presenters/Interfaces/ILoopsPresenter.cs new file mode 100644 index 00000000..3efeba73 --- /dev/null +++ b/MPfm/MPfm.MVP/Presenters/Interfaces/ILoopsPresenter.cs @@ -0,0 +1,29 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using MPfm.MVP.Models; +using MPfm.MVP.Views; + +namespace MPfm.MVP.Presenters.Interfaces +{ + /// + /// Loops presenter interface. + /// + public interface ILoopsPresenter : IBasePresenter + { + } +} diff --git a/MPfm/MPfm.MVP/Presenters/Interfaces/IMarkersPresenter.cs b/MPfm/MPfm.MVP/Presenters/Interfaces/IMarkersPresenter.cs new file mode 100644 index 00000000..0f867d36 --- /dev/null +++ b/MPfm/MPfm.MVP/Presenters/Interfaces/IMarkersPresenter.cs @@ -0,0 +1,29 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using MPfm.MVP.Models; +using MPfm.MVP.Views; + +namespace MPfm.MVP.Presenters.Interfaces +{ + /// + /// Markers presenter interface. + /// + public interface IMarkersPresenter : IBasePresenter + { + } +} diff --git a/MPfm/MPfm.MVP/Presenters/Interfaces/IPitchShiftingPresenter.cs b/MPfm/MPfm.MVP/Presenters/Interfaces/IPitchShiftingPresenter.cs new file mode 100644 index 00000000..ef4f862b --- /dev/null +++ b/MPfm/MPfm.MVP/Presenters/Interfaces/IPitchShiftingPresenter.cs @@ -0,0 +1,29 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using MPfm.MVP.Models; +using MPfm.MVP.Views; + +namespace MPfm.MVP.Presenters.Interfaces +{ + /// + /// Pitch shifting presenter interface. + /// + public interface IPitchShiftingPresenter : IBasePresenter + { + } +} diff --git a/MPfm/MPfm.MVP/Presenters/Interfaces/IPlayerMetadataPresenter.cs b/MPfm/MPfm.MVP/Presenters/Interfaces/IPlayerMetadataPresenter.cs new file mode 100644 index 00000000..a77540b2 --- /dev/null +++ b/MPfm/MPfm.MVP/Presenters/Interfaces/IPlayerMetadataPresenter.cs @@ -0,0 +1,29 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using MPfm.MVP.Models; +using MPfm.MVP.Views; + +namespace MPfm.MVP.Presenters.Interfaces +{ + /// + /// Player metadata presenter interface. + /// + public interface IPlayerMetadataPresenter : IBasePresenter + { + } +} diff --git a/MPfm/MPfm.MVP/Presenters/Interfaces/ITimeShiftingPresenter.cs b/MPfm/MPfm.MVP/Presenters/Interfaces/ITimeShiftingPresenter.cs new file mode 100644 index 00000000..122547f9 --- /dev/null +++ b/MPfm/MPfm.MVP/Presenters/Interfaces/ITimeShiftingPresenter.cs @@ -0,0 +1,29 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using MPfm.MVP.Models; +using MPfm.MVP.Views; + +namespace MPfm.MVP.Presenters.Interfaces +{ + /// + /// Time shifting presenter interface. + /// + public interface ITimeShiftingPresenter : IBasePresenter + { + } +} diff --git a/MPfm/MPfm.MVP/Presenters/LoopsPresenter.cs b/MPfm/MPfm.MVP/Presenters/LoopsPresenter.cs new file mode 100644 index 00000000..267b33fb --- /dev/null +++ b/MPfm/MPfm.MVP/Presenters/LoopsPresenter.cs @@ -0,0 +1,41 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using MPfm.MVP.Navigation; +using MPfm.MVP.Presenters.Interfaces; +using MPfm.MVP.Views; + +namespace MPfm.MVP.Presenters +{ + /// + /// Loops view presenter. + /// + public class LoopsPresenter : BasePresenter, ILoopsPresenter + { + public LoopsPresenter() + { + } + + public override void BindView(ILoopsView view) + { + // Subscribe to view actions + + base.BindView(view); + } + } +} + diff --git a/MPfm/MPfm.MVP/Presenters/MarkersPresenter.cs b/MPfm/MPfm.MVP/Presenters/MarkersPresenter.cs new file mode 100644 index 00000000..95032518 --- /dev/null +++ b/MPfm/MPfm.MVP/Presenters/MarkersPresenter.cs @@ -0,0 +1,41 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using MPfm.MVP.Navigation; +using MPfm.MVP.Presenters.Interfaces; +using MPfm.MVP.Views; + +namespace MPfm.MVP.Presenters +{ + /// + /// Markers view presenter. + /// + public class MarkersPresenter : BasePresenter, IMarkersPresenter + { + public MarkersPresenter() + { + } + + public override void BindView(IMarkersView view) + { + // Subscribe to view actions + + base.BindView(view); + } + } +} + diff --git a/MPfm/MPfm.MVP/Presenters/PitchShiftingPresenter.cs b/MPfm/MPfm.MVP/Presenters/PitchShiftingPresenter.cs new file mode 100644 index 00000000..3478da14 --- /dev/null +++ b/MPfm/MPfm.MVP/Presenters/PitchShiftingPresenter.cs @@ -0,0 +1,41 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using MPfm.MVP.Navigation; +using MPfm.MVP.Presenters.Interfaces; +using MPfm.MVP.Views; + +namespace MPfm.MVP.Presenters +{ + /// + /// Pitch shifting view presenter. + /// + public class PitchShiftingPresenter : BasePresenter, IPitchShiftingPresenter + { + public PitchShiftingPresenter() + { + } + + public override void BindView(IPitchShiftingView view) + { + // Subscribe to view actions + + base.BindView(view); + } + } +} + diff --git a/MPfm/MPfm.MVP/Presenters/PlayerMetadataPresenter.cs b/MPfm/MPfm.MVP/Presenters/PlayerMetadataPresenter.cs new file mode 100644 index 00000000..7ddde4bd --- /dev/null +++ b/MPfm/MPfm.MVP/Presenters/PlayerMetadataPresenter.cs @@ -0,0 +1,41 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using MPfm.MVP.Navigation; +using MPfm.MVP.Presenters.Interfaces; +using MPfm.MVP.Views; + +namespace MPfm.MVP.Presenters +{ + /// + /// Player metadata view presenter. + /// + public class PlayerMetadataPresenter : BasePresenter, IPlayerMetadataPresenter + { + public PlayerMetadataPresenter() + { + } + + public override void BindView(IPlayerMetadataView view) + { + // Subscribe to view actions + + base.BindView(view); + } + } +} + diff --git a/MPfm/MPfm.MVP/Presenters/TimeShiftingPresenter.cs b/MPfm/MPfm.MVP/Presenters/TimeShiftingPresenter.cs new file mode 100644 index 00000000..7f252843 --- /dev/null +++ b/MPfm/MPfm.MVP/Presenters/TimeShiftingPresenter.cs @@ -0,0 +1,41 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using MPfm.MVP.Navigation; +using MPfm.MVP.Presenters.Interfaces; +using MPfm.MVP.Views; + +namespace MPfm.MVP.Presenters +{ + /// + /// Time shifting view presenter. + /// + public class TimeShiftingPresenter : BasePresenter, ITimeShiftingPresenter + { + public TimeShiftingPresenter() + { + } + + public override void BindView(ITimeShiftingView view) + { + // Subscribe to view actions + + base.BindView(view); + } + } +} + diff --git a/MPfm/MPfm.MVP/Views/ILoopsView.cs b/MPfm/MPfm.MVP/Views/ILoopsView.cs new file mode 100644 index 00000000..81e414ed --- /dev/null +++ b/MPfm/MPfm.MVP/Views/ILoopsView.cs @@ -0,0 +1,28 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using System.Collections.Generic; + +namespace MPfm.MVP.Views +{ + /// + /// Loops view interface. + /// + public interface ILoopsView : IBaseView + { + } +} diff --git a/MPfm/MPfm.MVP/Views/IMarkersView.cs b/MPfm/MPfm.MVP/Views/IMarkersView.cs new file mode 100644 index 00000000..e7390c6c --- /dev/null +++ b/MPfm/MPfm.MVP/Views/IMarkersView.cs @@ -0,0 +1,28 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using System.Collections.Generic; + +namespace MPfm.MVP.Views +{ + /// + /// Markers view interface. + /// + public interface IMarkersView : IBaseView + { + } +} diff --git a/MPfm/MPfm.MVP/Views/IPitchShiftingView.cs b/MPfm/MPfm.MVP/Views/IPitchShiftingView.cs new file mode 100644 index 00000000..ae30a08a --- /dev/null +++ b/MPfm/MPfm.MVP/Views/IPitchShiftingView.cs @@ -0,0 +1,28 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using System.Collections.Generic; + +namespace MPfm.MVP.Views +{ + /// + /// Pitch shifting view interface. + /// + public interface IPitchShiftingView : IBaseView + { + } +} diff --git a/MPfm/MPfm.MVP/Views/IPlayerMetadataView.cs b/MPfm/MPfm.MVP/Views/IPlayerMetadataView.cs new file mode 100644 index 00000000..2ce965ed --- /dev/null +++ b/MPfm/MPfm.MVP/Views/IPlayerMetadataView.cs @@ -0,0 +1,28 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using System.Collections.Generic; + +namespace MPfm.MVP.Views +{ + /// + /// Player metadata view interface. + /// + public interface IPlayerMetadataView : IBaseView + { + } +} diff --git a/MPfm/MPfm.MVP/Views/ITimeShiftingView.cs b/MPfm/MPfm.MVP/Views/ITimeShiftingView.cs new file mode 100644 index 00000000..f681a36e --- /dev/null +++ b/MPfm/MPfm.MVP/Views/ITimeShiftingView.cs @@ -0,0 +1,28 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using System.Collections.Generic; + +namespace MPfm.MVP.Views +{ + /// + /// Time shifting view interface. + /// + public interface ITimeShiftingView : IBaseView + { + } +} diff --git a/MPfm/MPfm.iOS/Classes/Controllers/EffectsViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/EffectsViewController.cs new file mode 100644 index 00000000..91326c44 --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/EffectsViewController.cs @@ -0,0 +1,46 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using System; +using System.Drawing; +using MonoTouch.Foundation; +using MonoTouch.UIKit; +using MPfm.iOS.Classes.Controllers.Base; +using MPfm.MVP.Views; + +namespace MPfm.iOS +{ + public partial class EffectsViewController : BaseViewController, IEffectsView + { + public EffectsViewController(Action onViewReady) + : base (onViewReady, UserInterfaceIdiomIsPhone ? "EffectsViewController_iPhone" : "EffectsViewController_iPad", null) + { + } + + #region IEffectsView implementation + + public void UpdateFader(int index, float value) + { + } + + public void UpdatePresetList(System.Collections.Generic.IEnumerable presets) + { + } + + #endregion + } +} diff --git a/MPfm/MPfm.iOS/Classes/Controllers/EffectsViewController.designer.cs b/MPfm/MPfm.iOS/Classes/Controllers/EffectsViewController.designer.cs new file mode 100644 index 00000000..9371dfbe --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/EffectsViewController.designer.cs @@ -0,0 +1,18 @@ +// +// This file has been generated automatically by MonoDevelop to store outlets and +// actions made in the Xcode designer. If it is removed, they will be lost. +// Manual changes to this file may not be handled correctly. +// +using MonoTouch.Foundation; + +namespace MPfm.iOS +{ + [Register ("EffectsViewController")] + partial class EffectsViewController + { + void ReleaseDesignerOutlets() + { + } + } +} + diff --git a/MPfm/MPfm.iOS/Classes/Controllers/LoopsViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/LoopsViewController.cs new file mode 100644 index 00000000..b1ecfcff --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/LoopsViewController.cs @@ -0,0 +1,41 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using System; +using System.Drawing; +using MonoTouch.Foundation; +using MonoTouch.UIKit; +using MPfm.iOS.Classes.Controllers.Base; +using MPfm.MVP.Views; + +namespace MPfm.iOS +{ + public partial class LoopsViewController : BaseViewController, ILoopsView + { + public LoopsViewController(Action onViewReady) + : base (onViewReady, UserInterfaceIdiomIsPhone ? "LoopsViewController_iPhone" : "LoopsViewController_iPad", null) + { + } + + public override void ViewDidLoad() + { + base.ViewDidLoad(); + + this.View.BackgroundColor = UIColor.Green; + } + } +} diff --git a/MPfm/MPfm.iOS/Classes/Controllers/LoopsViewController.designer.cs b/MPfm/MPfm.iOS/Classes/Controllers/LoopsViewController.designer.cs new file mode 100644 index 00000000..c13350b6 --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/LoopsViewController.designer.cs @@ -0,0 +1,18 @@ +// +// This file has been generated automatically by MonoDevelop to store outlets and +// actions made in the Xcode designer. If it is removed, they will be lost. +// Manual changes to this file may not be handled correctly. +// +using MonoTouch.Foundation; + +namespace MPfm.iOS +{ + [Register ("LoopsViewController")] + partial class LoopsViewController + { + void ReleaseDesignerOutlets() + { + } + } +} + diff --git a/MPfm/MPfm.iOS/Classes/Controllers/MarkersViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/MarkersViewController.cs new file mode 100644 index 00000000..3f974532 --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/MarkersViewController.cs @@ -0,0 +1,41 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using System; +using System.Drawing; +using MonoTouch.Foundation; +using MonoTouch.UIKit; +using MPfm.iOS.Classes.Controllers.Base; +using MPfm.MVP.Views; + +namespace MPfm.iOS +{ + public partial class MarkersViewController : BaseViewController, IMarkersView + { + public MarkersViewController(Action onViewReady) + : base (onViewReady, UserInterfaceIdiomIsPhone ? "MarkersViewController_iPhone" : "MarkersViewController_iPad", null) + { + } + + public override void ViewDidLoad() + { + base.ViewDidLoad(); + + this.View.BackgroundColor = UIColor.Blue; + } + } +} diff --git a/MPfm/MPfm.iOS/Classes/Controllers/MarkersViewController.designer.cs b/MPfm/MPfm.iOS/Classes/Controllers/MarkersViewController.designer.cs new file mode 100644 index 00000000..eedae49b --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/MarkersViewController.designer.cs @@ -0,0 +1,18 @@ +// +// This file has been generated automatically by MonoDevelop to store outlets and +// actions made in the Xcode designer. If it is removed, they will be lost. +// Manual changes to this file may not be handled correctly. +// +using MonoTouch.Foundation; + +namespace MPfm.iOS +{ + [Register ("MarkersViewController")] + partial class MarkersViewController + { + void ReleaseDesignerOutlets() + { + } + } +} + diff --git a/MPfm/MPfm.iOS/Classes/Controllers/MoreViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/MoreViewController.cs index 9abd53cd..17a8cd62 100644 --- a/MPfm/MPfm.iOS/Classes/Controllers/MoreViewController.cs +++ b/MPfm/MPfm.iOS/Classes/Controllers/MoreViewController.cs @@ -18,11 +18,11 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Linq; +using MPfm.MVP.Views; using MonoTouch.Foundation; using MonoTouch.UIKit; -using MPfm.MVP.Views; using MPfm.iOS.Classes.Controllers.Base; -using System.Linq; namespace MPfm.iOS { diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PitchShiftingViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/PitchShiftingViewController.cs new file mode 100644 index 00000000..5b2196d5 --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/PitchShiftingViewController.cs @@ -0,0 +1,42 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using System; +using System.Drawing; +using MonoTouch.Foundation; +using MonoTouch.UIKit; +using MPfm.iOS.Classes.Controllers.Base; +using MPfm.MVP.Views; + +namespace MPfm.iOS +{ + public partial class PitchShiftingViewController : BaseViewController, IPitchShiftingView + { + public PitchShiftingViewController(Action onViewReady) + : base (onViewReady, UserInterfaceIdiomIsPhone ? "PitchShiftingViewController_iPhone" : "PitchShiftingViewController_iPad", null) + { + } + + public override void ViewDidLoad() + { + base.ViewDidLoad(); + + this.View.BackgroundColor = UIColor.Brown; + } + + } +} diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PitchShiftingViewController.designer.cs b/MPfm/MPfm.iOS/Classes/Controllers/PitchShiftingViewController.designer.cs new file mode 100644 index 00000000..2eaef496 --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/PitchShiftingViewController.designer.cs @@ -0,0 +1,18 @@ +// +// This file has been generated automatically by MonoDevelop to store outlets and +// actions made in the Xcode designer. If it is removed, they will be lost. +// Manual changes to this file may not be handled correctly. +// +using MonoTouch.Foundation; + +namespace MPfm.iOS +{ + [Register ("PitchShiftingViewController")] + partial class PitchShiftingViewController + { + void ReleaseDesignerOutlets() + { + } + } +} + diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.cs new file mode 100644 index 00000000..f7af26db --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.cs @@ -0,0 +1,42 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using System; +using System.Drawing; +using MonoTouch.Foundation; +using MonoTouch.UIKit; +using MPfm.iOS.Classes.Controllers.Base; +using MPfm.MVP.Views; + +namespace MPfm.iOS +{ + public partial class PlayerMetadataViewController : BaseViewController, IPlayerMetadataView + { + public PlayerMetadataViewController(Action onViewReady) + : base (onViewReady, UserInterfaceIdiomIsPhone ? "PlayerMetadataViewController_iPhone" : "PlayerMetadataViewController_iPad", null) + { + } + + public override void ViewDidLoad() + { + base.ViewDidLoad(); + + this.View.BackgroundColor = UIColor.Orange; + } + + } +} diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.designer.cs b/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.designer.cs new file mode 100644 index 00000000..992abbc4 --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.designer.cs @@ -0,0 +1,18 @@ +// +// This file has been generated automatically by MonoDevelop to store outlets and +// actions made in the Xcode designer. If it is removed, they will be lost. +// Manual changes to this file may not be handled correctly. +// +using MonoTouch.Foundation; + +namespace MPfm.iOS +{ + [Register ("PlayerMetadataViewController")] + partial class PlayerMetadataViewController + { + void ReleaseDesignerOutlets() + { + } + } +} + diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.cs index cb650458..268768ce 100644 --- a/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.cs +++ b/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.cs @@ -18,20 +18,20 @@ using System; using System.Collections.Generic; using System.Drawing; -using MonoTouch.Foundation; -using MonoTouch.UIKit; -using MPfm.Player; using System.IO; +using System.Linq; using System.Timers; using MPfm.Core; -using System.Linq; -using MonoTouch.CoreGraphics; +using MPfm.MVP.Models; +using MPfm.MVP.Views; +using MPfm.Player; using MPfm.Sound.AudioFiles; using MPfm.Sound.Bass.Net; +using MonoTouch.CoreGraphics; +using MonoTouch.Foundation; +using MonoTouch.UIKit; using MPfm.iOS.Classes.Controllers.Base; using MPfm.iOS.Classes.Controls; -using MPfm.MVP.Views; -using MPfm.MVP.Models; namespace MPfm.iOS.Classes.Controllers { @@ -59,6 +59,13 @@ public override void ViewDidLoad() // Reduce the song position slider size sliderPosition.Transform = CGAffineTransform.MakeScale(0.7f, 0.7f); sliderPosition.Frame = new RectangleF(70, sliderPosition.Frame.Y, 180, sliderPosition.Frame.Height); + + // Setup scroll view and page control + scrollView.WeakDelegate = this; + scrollView.PagingEnabled = true; + scrollView.ShowsHorizontalScrollIndicator = false; + scrollView.ShowsVerticalScrollIndicator = false; + pageControl.CurrentPage = 0; } public override void ViewWillAppear(bool animated) @@ -69,27 +76,40 @@ public override void ViewWillAppear(bool animated) navCtrl.SetTitle("Now Playing"); } - partial void actionPause(NSObject sender) + public void AddScrollView(UIViewController viewController) { - OnPlayerPause(); + viewController.View.Frame = new RectangleF(scrollView.Subviews.Length * scrollView.Frame.Width, 0, scrollView.Frame.Width, scrollView.Frame.Height); + scrollView.AddSubview(viewController.View); + pageControl.Pages = scrollView.Subviews.Length; + scrollView.ContentSize = new SizeF(scrollView.Subviews.Length * scrollView.Frame.Width, scrollView.Frame.Height); } - partial void actionPrevious(NSObject sender) + [Export("scrollViewDidScroll:")] + public void ScrollViewDidScroll(UIScrollView scrollview) { - OnPlayerPrevious(); + float pageWidth = scrollView.Frame.Size.Width; + int page = (int)Math.Floor((scrollView.ContentOffset.X - pageWidth / 2) / pageWidth) + 1; + pageControl.CurrentPage = page; } - partial void actionNext(NSObject sender) + [Export("scrollViewDidEndDecelerating:")] + public void ScrollViewDidEndDecelerating(UIScrollView scrollView) { - OnPlayerNext(); } - partial void actionMarkers(NSObject sender) + partial void actionPause(NSObject sender) { + OnPlayerPause(); } - partial void actionLoops(NSObject sender) + partial void actionPrevious(NSObject sender) { + OnPlayerPrevious(); + } + + partial void actionNext(NSObject sender) + { + OnPlayerNext(); } #region IPlayerView implementation diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.designer.cs b/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.designer.cs index 776e6cd2..7ebb42c7 100644 --- a/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.designer.cs +++ b/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.designer.cs @@ -42,10 +42,10 @@ partial class PlayerViewController MonoTouch.UIKit.UIButton btnNext { get; set; } [Outlet] - MonoTouch.UIKit.UIButton btnLoops { get; set; } + MonoTouch.UIKit.UIScrollView scrollView { get; set; } [Outlet] - MonoTouch.UIKit.UIButton btnMarkers { get; set; } + MonoTouch.UIKit.UIPageControl pageControl { get; set; } [Action ("actionPause:")] partial void actionPause (MonoTouch.Foundation.NSObject sender); @@ -55,12 +55,6 @@ partial class PlayerViewController [Action ("actionNext:")] partial void actionNext (MonoTouch.Foundation.NSObject sender); - - [Action ("actionLoops:")] - partial void actionLoops (MonoTouch.Foundation.NSObject sender); - - [Action ("actionMarkers:")] - partial void actionMarkers (MonoTouch.Foundation.NSObject sender); void ReleaseDesignerOutlets () { @@ -114,14 +108,14 @@ void ReleaseDesignerOutlets () btnNext = null; } - if (btnLoops != null) { - btnLoops.Dispose (); - btnLoops = null; + if (scrollView != null) { + scrollView.Dispose (); + scrollView = null; } - if (btnMarkers != null) { - btnMarkers.Dispose (); - btnMarkers = null; + if (pageControl != null) { + pageControl.Dispose (); + pageControl = null; } } } diff --git a/MPfm/MPfm.iOS/Classes/Controllers/TimeShiftingViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/TimeShiftingViewController.cs new file mode 100644 index 00000000..4c10d07a --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/TimeShiftingViewController.cs @@ -0,0 +1,42 @@ +// Copyright © 2011-2013 Yanick Castonguay +// +// This file is part of MPfm. +// +// MPfm is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// MPfm is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with MPfm. If not, see . + +using System; +using System.Drawing; +using MonoTouch.Foundation; +using MonoTouch.UIKit; +using MPfm.iOS.Classes.Controllers.Base; +using MPfm.MVP.Views; + +namespace MPfm.iOS +{ + public partial class TimeShiftingViewController : BaseViewController, ITimeShiftingView + { + public TimeShiftingViewController(Action onViewReady) + : base (onViewReady, UserInterfaceIdiomIsPhone ? "TimeShiftingViewController_iPhone" : "TimeShiftingViewController_iPad", null) + { + } + + public override void ViewDidLoad() + { + base.ViewDidLoad(); + + this.View.BackgroundColor = UIColor.Magenta; + } + + } +} diff --git a/MPfm/MPfm.iOS/Classes/Controllers/TimeShiftingViewController.designer.cs b/MPfm/MPfm.iOS/Classes/Controllers/TimeShiftingViewController.designer.cs new file mode 100644 index 00000000..57f98fbb --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controllers/TimeShiftingViewController.designer.cs @@ -0,0 +1,18 @@ +// +// This file has been generated automatically by MonoDevelop to store outlets and +// actions made in the Xcode designer. If it is removed, they will be lost. +// Manual changes to this file may not be handled correctly. +// +using MonoTouch.Foundation; + +namespace MPfm.iOS +{ + [Register ("TimeShiftingViewController")] + partial class TimeShiftingViewController + { + void ReleaseDesignerOutlets() + { + } + } +} + diff --git a/MPfm/MPfm.iOS/Classes/Delegates/AppDelegate.cs b/MPfm/MPfm.iOS/Classes/Delegates/AppDelegate.cs index adccbe63..aebf4028 100644 --- a/MPfm/MPfm.iOS/Classes/Delegates/AppDelegate.cs +++ b/MPfm/MPfm.iOS/Classes/Delegates/AppDelegate.cs @@ -61,6 +61,11 @@ public override bool FinishedLaunching(UIApplication app, NSDictionary options) //container.Register().AsMultiInstance(); //container.Register().AsMultiInstance(); //container.Register().AsMultiInstance(); + container.Register().AsMultiInstance(); + container.Register().AsMultiInstance(); + container.Register().AsMultiInstance(); + container.Register().AsMultiInstance(); + container.Register().AsMultiInstance(); // Create window _window = new UIWindow(UIScreen.MainScreen.Bounds); diff --git a/MPfm/MPfm.iOS/Classes/Navigation/iOSNavigationManager.cs b/MPfm/MPfm.iOS/Classes/Navigation/iOSNavigationManager.cs index 2c256a2e..56f58a02 100644 --- a/MPfm/MPfm.iOS/Classes/Navigation/iOSNavigationManager.cs +++ b/MPfm/MPfm.iOS/Classes/Navigation/iOSNavigationManager.cs @@ -51,5 +51,11 @@ public override void PushDialogView(IBaseView view) { AppDelegate.PushDialogView((UIViewController)view); } + + public override void PushPlayerSubview(IPlayerView playerView, IBaseView view) + { + var playerViewController = (PlayerViewController)playerView; + playerViewController.AddScrollView((UIViewController)view); + } } } diff --git a/MPfm/MPfm.iOS/MPfm.iOS.csproj b/MPfm/MPfm.iOS/MPfm.iOS.csproj index 29ebf19e..efe4eab1 100644 --- a/MPfm/MPfm.iOS/MPfm.iOS.csproj +++ b/MPfm/MPfm.iOS/MPfm.iOS.csproj @@ -27,6 +27,7 @@ ARMv7 -v -v -v -gcc_flags "-L${ProjectDir}/Lib/ -framework Accelerate -ObjC -lstdc++ -lbass -lbassmix -lbass_fx -lbass_ape -lbass_mpc -lbassflac -lbasswv -all_load" + none @@ -143,6 +144,30 @@ UpdateLibraryViewController.cs + + + LoopsViewController.cs + + + + MarkersViewController.cs + + + + EffectsViewController.cs + + + + TimeShiftingViewController.cs + + + + PitchShiftingViewController.cs + + + + PlayerMetadataViewController.cs + @@ -155,6 +180,18 @@ + + + + + + + + + + + + @@ -186,6 +223,7 @@ + diff --git a/MPfm/MPfm.iOS/Resources/Default-568h@2x.png b/MPfm/MPfm.iOS/Resources/Default-568h@2x.png new file mode 100644 index 00000000..87a821b8 Binary files /dev/null and b/MPfm/MPfm.iOS/Resources/Default-568h@2x.png differ diff --git a/MPfm/MPfm.iOS/XIB/iPad/EffectsViewController_iPad.xib b/MPfm/MPfm.iOS/XIB/iPad/EffectsViewController_iPad.xib new file mode 100644 index 00000000..1862106c --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPad/EffectsViewController_iPad.xib @@ -0,0 +1,121 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + {{0, 20}, {768, 1004}} + + + + 3 + MQA + + 2 + + + NO + + 2 + + IBIPadFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + EffectsViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + EffectsViewController + UITableViewController + + IBProjectSource + EffectsViewController.h + + + + + 0 + IBIPadFramework + YES + 3 + 916 + + diff --git a/MPfm/MPfm.iOS/XIB/iPad/LoopsViewController_iPad.xib b/MPfm/MPfm.iOS/XIB/iPad/LoopsViewController_iPad.xib new file mode 100644 index 00000000..3d76cf8a --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPad/LoopsViewController_iPad.xib @@ -0,0 +1,121 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + {{0, 20}, {768, 1004}} + + + + 3 + MQA + + 2 + + + NO + + 2 + + IBIPadFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + LoopsViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + LoopsViewController + UITableViewController + + IBProjectSource + LoopsViewController.h + + + + + 0 + IBIPadFramework + YES + 3 + 916 + + diff --git a/MPfm/MPfm.iOS/XIB/iPad/MarkersViewController_iPad.xib b/MPfm/MPfm.iOS/XIB/iPad/MarkersViewController_iPad.xib new file mode 100644 index 00000000..8765cbd4 --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPad/MarkersViewController_iPad.xib @@ -0,0 +1,121 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + {{0, 20}, {768, 1004}} + + + + 3 + MQA + + 2 + + + NO + + 2 + + IBIPadFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + MarkersViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + MarkersViewController + UITableViewController + + IBProjectSource + MarkersViewController.h + + + + + 0 + IBIPadFramework + YES + 3 + 916 + + diff --git a/MPfm/MPfm.iOS/XIB/iPad/PitchShiftingViewController_iPad.xib b/MPfm/MPfm.iOS/XIB/iPad/PitchShiftingViewController_iPad.xib new file mode 100644 index 00000000..ea741c17 --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPad/PitchShiftingViewController_iPad.xib @@ -0,0 +1,121 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + {{0, 20}, {768, 1004}} + + + + 3 + MQA + + 2 + + + NO + + 2 + + IBIPadFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + PitchShiftingViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + PitchShiftingViewController + UITableViewController + + IBProjectSource + PitchShiftingViewController.h + + + + + 0 + IBIPadFramework + YES + 3 + 916 + + diff --git a/MPfm/MPfm.iOS/XIB/iPad/PlayerMetadataViewController_iPad.xib b/MPfm/MPfm.iOS/XIB/iPad/PlayerMetadataViewController_iPad.xib new file mode 100644 index 00000000..f6cecbfa --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPad/PlayerMetadataViewController_iPad.xib @@ -0,0 +1,121 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + {{0, 20}, {768, 1004}} + + + + 3 + MQA + + 2 + + + NO + + 2 + + IBIPadFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + PlayerMetadataViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + PlayerMetadataViewController + UITableViewController + + IBProjectSource + PlayerMetadataViewController.h + + + + + 0 + IBIPadFramework + YES + 3 + 916 + + diff --git a/MPfm/MPfm.iOS/XIB/iPad/TimeShiftingViewController_iPad.xib b/MPfm/MPfm.iOS/XIB/iPad/TimeShiftingViewController_iPad.xib new file mode 100644 index 00000000..e8882c48 --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPad/TimeShiftingViewController_iPad.xib @@ -0,0 +1,121 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + {{0, 20}, {768, 1004}} + + + + 3 + MQA + + 2 + + + NO + + 2 + + IBIPadFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + TimeShiftingViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + TimeShiftingViewController + UITableViewController + + IBProjectSource + TimeShiftingViewController.h + + + + + 0 + IBIPadFramework + YES + 3 + 916 + + diff --git a/MPfm/MPfm.iOS/XIB/iPhone/EffectsViewController_iPhone.xib b/MPfm/MPfm.iOS/XIB/iPhone/EffectsViewController_iPhone.xib new file mode 100644 index 00000000..dfe70668 --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPhone/EffectsViewController_iPhone.xib @@ -0,0 +1,118 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + {{0, 20}, {320, 460}} + + + + 3 + MQA + + 2 + + + + IBCocoaTouchFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + 1 + + + + + -1 + + + File's Owner + + + -2 + + + + + + + EffectsViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + EffectsViewController + UIViewController + + IBProjectSource + EffectsViewController.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + 916 + + diff --git a/MPfm/MPfm.iOS/XIB/iPhone/LoopsViewController_iPhone.xib b/MPfm/MPfm.iOS/XIB/iPhone/LoopsViewController_iPhone.xib new file mode 100644 index 00000000..1abb6f17 --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPhone/LoopsViewController_iPhone.xib @@ -0,0 +1,118 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + {{0, 20}, {320, 460}} + + + + 3 + MQA + + 2 + + + + IBCocoaTouchFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + 1 + + + + + -1 + + + File's Owner + + + -2 + + + + + + + LoopsViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + LoopsViewController + UIViewController + + IBProjectSource + LoopsViewController.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + 916 + + diff --git a/MPfm/MPfm.iOS/XIB/iPhone/MarkersViewController_iPhone.xib b/MPfm/MPfm.iOS/XIB/iPhone/MarkersViewController_iPhone.xib new file mode 100644 index 00000000..a1e2741e --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPhone/MarkersViewController_iPhone.xib @@ -0,0 +1,118 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + {{0, 20}, {320, 460}} + + + + 3 + MQA + + 2 + + + + IBCocoaTouchFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + 1 + + + + + -1 + + + File's Owner + + + -2 + + + + + + + MarkersViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + MarkersViewController + UIViewController + + IBProjectSource + MarkersViewController.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + 916 + + diff --git a/MPfm/MPfm.iOS/XIB/iPhone/PitchShiftingViewController_iPhone.xib b/MPfm/MPfm.iOS/XIB/iPhone/PitchShiftingViewController_iPhone.xib new file mode 100644 index 00000000..e62648d7 --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPhone/PitchShiftingViewController_iPhone.xib @@ -0,0 +1,118 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + {{0, 20}, {320, 460}} + + + + 3 + MQA + + 2 + + + + IBCocoaTouchFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + 1 + + + + + -1 + + + File's Owner + + + -2 + + + + + + + PitchShiftingViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + PitchShiftingViewController + UIViewController + + IBProjectSource + PitchShiftingViewController.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + 916 + + diff --git a/MPfm/MPfm.iOS/XIB/iPhone/PlayerMetadataViewController_iPhone.xib b/MPfm/MPfm.iOS/XIB/iPhone/PlayerMetadataViewController_iPhone.xib new file mode 100644 index 00000000..dd66246b --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPhone/PlayerMetadataViewController_iPhone.xib @@ -0,0 +1,118 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + {{0, 20}, {320, 460}} + + + + 3 + MQA + + 2 + + + + IBCocoaTouchFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + 1 + + + + + -1 + + + File's Owner + + + -2 + + + + + + + PlayerMetadataViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + PlayerMetadataViewController + UIViewController + + IBProjectSource + PlayerMetadataViewController.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + 916 + + diff --git a/MPfm/MPfm.iOS/XIB/iPhone/PlayerViewController_iPhone.xib b/MPfm/MPfm.iOS/XIB/iPhone/PlayerViewController_iPhone.xib index e96db746..da95e205 100644 --- a/MPfm/MPfm.iOS/XIB/iPhone/PlayerViewController_iPhone.xib +++ b/MPfm/MPfm.iOS/XIB/iPhone/PlayerViewController_iPhone.xib @@ -15,6 +15,8 @@ IBUIButton IBUIImageView IBUILabel + IBUIPageControl + IBUIScrollView IBUISlider IBUIView @@ -107,7 +109,7 @@ {{243, 5}, {66, 21}} - + _NS:9 NO YES @@ -126,7 +128,7 @@ - 292 + 268 {{118, 328}, {83, 29}} @@ -166,7 +168,7 @@ - 292 + 268 {{10, 328}, {83, 29}} @@ -188,13 +190,13 @@ - + - 292 - {{10, 38}, {120, 29}} + 268 + {{226, 328}, {83, 29}} - + _NS:9 NO @@ -202,7 +204,7 @@ 0 0 1 - Loops + Next 1 @@ -212,79 +214,60 @@ - + 292 - {{189, 38}, {120, 29}} + {{73, 2}, {172, 23}} - + _NS:9 - NO IBCocoaTouchFramework 0 0 - 1 - Markers - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - + 0.5 - + - 292 - {{226, 328}, {83, 29}} + 274 + + {{0, 27}, {320, 259}} - + _NS:9 - - NO + YES + YES IBCocoaTouchFramework - 0 - 0 - 1 - Next - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - + YES - + - 292 - {{73, 2}, {172, 23}} + 1292 + + {{141, 284}, {38, 36}} - + _NS:9 NO IBCocoaTouchFramework 0 0 - 0.5 + 3 - 292 + 268 292 - {{0, 57}, {320, 27}} + {{175, 5}, {52, 27}} - + _NS:9 NO YES @@ -310,7 +293,7 @@ 292 - {{0, 3}, {320, 32}} + {{0, 3}, {91, 32}} @@ -332,7 +315,7 @@ 292 - {{0, 32}, {320, 28}} + {{86, 5}, {91, 28}} @@ -352,7 +335,7 @@ NO - {{0, 228}, {320, 92}} + {{0, 364}, {320, 35}} @@ -377,6 +360,23 @@ NO + + IBUIScreenMetrics + + YES + + + + + + {320, 480} + {480, 320} + + + IBCocoaTouchFramework + Retina 3.5 Full Screen + 0 + IBCocoaTouchFramework @@ -448,19 +448,19 @@ - btnLoops + scrollView - + - 61 + 76 - btnMarkers + pageControl - + - 62 + 77 @@ -513,42 +513,6 @@ 31 - - - actionPrevious: - - - 7 - - 58 - - - - actionLoops: - - - 7 - - 63 - - - - actionPrevious: - - - 7 - - 60 - - - - actionMarkers: - - - 7 - - 64 - @@ -581,8 +545,8 @@ - - + + @@ -628,30 +592,26 @@ - 57 - + 74 + + - 59 - + 75 + 48 - + - - 19 - - - 23 @@ -662,6 +622,11 @@ + + 19 + + + @@ -681,15 +646,15 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 73 + 78 @@ -697,21 +662,11 @@ PlayerViewController UIViewController - id - id id id id - - actionLoops: - id - - - actionMarkers: - id - actionNext: id @@ -726,8 +681,6 @@ - UIButton - UIButton UIButton UIButton UIButton @@ -737,17 +690,11 @@ UILabel UILabel UILabel + UIPageControl + UIScrollView UISlider - - btnLoops - UIButton - - - btnMarkers - UIButton - btnNext UIButton @@ -784,6 +731,14 @@ lblTitle UILabel + + pageControl + UIPageControl + + + scrollView + UIScrollView + sliderPosition UISlider diff --git a/MPfm/MPfm.iOS/XIB/iPhone/TimeShiftingViewController_iPhone.xib b/MPfm/MPfm.iOS/XIB/iPhone/TimeShiftingViewController_iPhone.xib new file mode 100644 index 00000000..c2250b83 --- /dev/null +++ b/MPfm/MPfm.iOS/XIB/iPhone/TimeShiftingViewController_iPhone.xib @@ -0,0 +1,118 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + {{0, 20}, {320, 460}} + + + + 3 + MQA + + 2 + + + + IBCocoaTouchFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + 1 + + + + + -1 + + + File's Owner + + + -2 + + + + + + + TimeShiftingViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + TimeShiftingViewController + UIViewController + + IBProjectSource + TimeShiftingViewController.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + 916 + +