From cb38bbe3e3a552d687038830d3dd3c1630688770 Mon Sep 17 00:00:00 2001 From: ycastonguay Date: Wed, 9 Oct 2013 23:26:49 -0400 Subject: [PATCH] iOS: Removed buttons from PlayerMetadataViewController. New playlist button is now working in PlayerViewController. Added new redesigned circular player buttons to PlayerViewController (with MPfmPlayerButton) with new glyphs. Related to issue #405. --- .../MobileNavigationManagerCommandMessage.cs | 3 +- .../Navigation/MobileNavigationManager.cs | 5 +- .../Presenters/PlayerMetadataPresenter.cs | 4 +- MPfm/MPfm.MVP/Views/IPlayerMetadataView.cs | 2 +- .../Classes/Controllers/MoreViewController.cs | 4 - .../PlayerMetadataViewController.cs | 42 +- .../PlayerMetadataViewController.designer.cs | 52 +- .../Controllers/PlayerViewController.cs | 32 +- .../PlayerViewController.designer.cs | 57 +- .../Controllers/PlaylistViewController.cs | 10 +- .../Controllers/PreferencesViewController.cs | 4 - .../Controls/MPfmNavigationController.cs | 2 +- .../Classes/Controls/MPfmPlayerButton.cs | 125 ++++ .../Classes/Controls/MPfmTableViewCell.cs | 4 +- .../Navigation/iOSNavigationManager.cs | 6 + MPfm/MPfm.iOS/Images/Player/next.png | Bin 0 -> 1285 bytes MPfm/MPfm.iOS/Images/Player/next@2x.png | Bin 0 -> 1600 bytes MPfm/MPfm.iOS/Images/Player/pause.png | Bin 0 -> 1112 bytes MPfm/MPfm.iOS/Images/Player/pause@2x.png | Bin 0 -> 1202 bytes MPfm/MPfm.iOS/Images/Player/play.png | Bin 0 -> 1220 bytes MPfm/MPfm.iOS/Images/Player/play@2x.png | Bin 0 -> 1620 bytes MPfm/MPfm.iOS/Images/Player/playlist.png | Bin 0 -> 1325 bytes MPfm/MPfm.iOS/Images/Player/playlist@2x.png | Bin 0 -> 1617 bytes MPfm/MPfm.iOS/Images/Player/previous.png | Bin 0 -> 1300 bytes MPfm/MPfm.iOS/Images/Player/previous@2x.png | Bin 0 -> 1650 bytes MPfm/MPfm.iOS/Images/Player/repeat.png | Bin 0 -> 1370 bytes MPfm/MPfm.iOS/Images/Player/repeat@2x.png | Bin 0 -> 1624 bytes MPfm/MPfm.iOS/Images/Player/shuffle.png | Bin 0 -> 1509 bytes MPfm/MPfm.iOS/Images/Player/shuffle@2x.png | Bin 0 -> 2246 bytes MPfm/MPfm.iOS/MPfm.iOS.csproj | 16 + .../PlayerMetadataViewController_iPhone.xib | 573 ++---------------- 31 files changed, 305 insertions(+), 636 deletions(-) create mode 100644 MPfm/MPfm.iOS/Classes/Controls/MPfmPlayerButton.cs create mode 100755 MPfm/MPfm.iOS/Images/Player/next.png create mode 100755 MPfm/MPfm.iOS/Images/Player/next@2x.png create mode 100755 MPfm/MPfm.iOS/Images/Player/pause.png create mode 100755 MPfm/MPfm.iOS/Images/Player/pause@2x.png create mode 100755 MPfm/MPfm.iOS/Images/Player/play.png create mode 100755 MPfm/MPfm.iOS/Images/Player/play@2x.png create mode 100755 MPfm/MPfm.iOS/Images/Player/playlist.png create mode 100755 MPfm/MPfm.iOS/Images/Player/playlist@2x.png create mode 100755 MPfm/MPfm.iOS/Images/Player/previous.png create mode 100755 MPfm/MPfm.iOS/Images/Player/previous@2x.png create mode 100755 MPfm/MPfm.iOS/Images/Player/repeat.png create mode 100755 MPfm/MPfm.iOS/Images/Player/repeat@2x.png create mode 100755 MPfm/MPfm.iOS/Images/Player/shuffle.png create mode 100755 MPfm/MPfm.iOS/Images/Player/shuffle@2x.png diff --git a/MPfm/MPfm.MVP/Messages/MobileNavigationManagerCommandMessage.cs b/MPfm/MPfm.MVP/Messages/MobileNavigationManagerCommandMessage.cs index 58697798..c0149db4 100644 --- a/MPfm/MPfm.MVP/Messages/MobileNavigationManagerCommandMessage.cs +++ b/MPfm/MPfm.MVP/Messages/MobileNavigationManagerCommandMessage.cs @@ -39,6 +39,7 @@ public MobileNavigationManagerCommandMessage(object sender, MobileNavigationMana public enum MobileNavigationManagerCommandMessageType { ShowPlayerView = 0, - ShowEqualizerPresetsView = 1 + ShowEqualizerPresetsView = 1, + ShowPlaylistView = 2 } } diff --git a/MPfm/MPfm.MVP/Navigation/MobileNavigationManager.cs b/MPfm/MPfm.MVP/Navigation/MobileNavigationManager.cs index ef50c8a5..e9e304ec 100644 --- a/MPfm/MPfm.MVP/Navigation/MobileNavigationManager.cs +++ b/MPfm/MPfm.MVP/Navigation/MobileNavigationManager.cs @@ -99,6 +99,7 @@ public abstract class MobileNavigationManager private IGeneralPreferencesPresenter _generalPreferencesPresenter; private ILibraryPreferencesPresenter _libraryPreferencesPresenter; + protected IPlaylistView PlaylistView { get { return _playlistView; } } protected IEqualizerPresetsView EqualizerPresetsView { get { return _equalizerPresetsView; } } protected IPlayerView PlayerView { get { return _playerView; } } @@ -868,8 +869,8 @@ protected virtual void CreatePlaylistViewInternal(IBaseView sourceView, Action(new NamedParameterOverloads() { { "onViewReady", onViewReady } }); #if !ANDROID - PushTabView(MobileNavigationTabType.More, _playlistView); - //PushDialogView("Playlist", View, view); + //PushTabView(MobileNavigationTabType.More, _playlistView); + PushDialogView(MobileDialogPresentationType.Standard, "Playlist", sourceView, _playlistView); #endif } diff --git a/MPfm/MPfm.MVP/Presenters/PlayerMetadataPresenter.cs b/MPfm/MPfm.MVP/Presenters/PlayerMetadataPresenter.cs index 747149eb..f535ba95 100644 --- a/MPfm/MPfm.MVP/Presenters/PlayerMetadataPresenter.cs +++ b/MPfm/MPfm.MVP/Presenters/PlayerMetadataPresenter.cs @@ -53,7 +53,7 @@ public override void BindView(IPlayerMetadataView view) // Refresh initial data if player is already playing if (_playerService.IsPlaying) { - View.RefreshAudioFile(_playerService.CurrentPlaylistItem.AudioFile); + View.RefreshMetadata(_playerService.CurrentPlaylistItem.AudioFile, _playerService.CurrentPlaylist.CurrentItemIndex, _playerService.CurrentPlaylist.Items.Count); View.RefreshRepeat(_playerService.RepeatType); View.RefreshShuffle(_isShuffle); } @@ -61,7 +61,7 @@ public override void BindView(IPlayerMetadataView view) private void OnPlaylistIndexChanged(PlayerPlaylistIndexChangedMessage message) { - View.RefreshAudioFile(message.Data.AudioFileStarted); + View.RefreshMetadata(message.Data.AudioFileStarted, _playerService.CurrentPlaylist.CurrentItemIndex, _playerService.CurrentPlaylist.Items.Count); } private void OpenPlaylist() diff --git a/MPfm/MPfm.MVP/Views/IPlayerMetadataView.cs b/MPfm/MPfm.MVP/Views/IPlayerMetadataView.cs index 3589fc75..ce528006 100644 --- a/MPfm/MPfm.MVP/Views/IPlayerMetadataView.cs +++ b/MPfm/MPfm.MVP/Views/IPlayerMetadataView.cs @@ -31,7 +31,7 @@ public interface IPlayerMetadataView : IBaseView Action OnToggleShuffle { get; set; } Action OnToggleRepeat { get; set; } - void RefreshAudioFile(AudioFile audioFile); + void RefreshMetadata(AudioFile audioFile, int playlistIndex, int playlistCount); void RefreshShuffle(bool shuffle); void RefreshRepeat(RepeatType repeatType); } diff --git a/MPfm/MPfm.iOS/Classes/Controllers/MoreViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/MoreViewController.cs index 05a85de3..f7bd8ec1 100644 --- a/MPfm/MPfm.iOS/Classes/Controllers/MoreViewController.cs +++ b/MPfm/MPfm.iOS/Classes/Controllers/MoreViewController.cs @@ -118,10 +118,6 @@ public UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) cell.ImageChevron.Image = UIImage.FromBundle("Images/Tables/chevron"); cell.ImageChevron.Hidden = false; - UIView viewBackgroundSelected = new UIView(); - viewBackgroundSelected.BackgroundColor = GlobalTheme.SecondaryColor; - cell.SelectedBackgroundView = viewBackgroundSelected; - return cell; } diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.cs index 43c30208..2f5d8abc 100644 --- a/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.cs +++ b/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.cs @@ -45,32 +45,9 @@ public override void ViewDidLoad() lblTitle.Text = string.Empty; viewBackground.BackgroundColor = GlobalTheme.PlayerPanelBackgroundColor; - btnPlaylist.BackgroundColor = UIColor.Clear; - btnRepeat.BackgroundColor = UIColor.Clear; - btnShuffle.BackgroundColor = UIColor.Clear; - btnPlaylist.SetImage(UIImage.FromBundle("Images/Buttons/playlist"), UIControlState.Normal); - btnPlaylist.SetImage(UIImage.FromBundle("Images/Buttons/playlist_on"), UIControlState.Highlighted); - btnRepeat.SetImage(UIImage.FromBundle("Images/Buttons/repeat"), UIControlState.Normal); - btnShuffle.SetImage(UIImage.FromBundle("Images/Buttons/shuffle"), UIControlState.Normal); - base.ViewDidLoad(); } - partial void actionPlaylist(NSObject sender) - { - OnOpenPlaylist(); - } - - partial void actionRepeat(NSObject sender) - { - OnToggleRepeat(); - } - - partial void actionShuffle(NSObject sender) - { - OnToggleShuffle(); - } - public void ShowPanel(bool show, bool swipeUp) { if (show && !swipeUp) @@ -104,27 +81,13 @@ public void ShowPanel(bool show, bool swipeUp) public void RefreshShuffle(bool shuffle) { - InvokeOnMainThread(() => { - if(shuffle) - btnShuffle.SetImage(UIImage.FromBundle("Images/Buttons/shuffle_on"), UIControlState.Normal); - else - btnShuffle.SetImage(UIImage.FromBundle("Images/Buttons/shuffle"), UIControlState.Normal); - }); } public void RefreshRepeat(RepeatType repeatType) { - InvokeOnMainThread(() => { - if(repeatType == RepeatType.Off) - btnRepeat.SetImage(UIImage.FromBundle("Images/Buttons/repeat"), UIControlState.Normal); - else if(repeatType == RepeatType.Playlist) - btnRepeat.SetImage(UIImage.FromBundle("Images/Buttons/repeat_on"), UIControlState.Normal); - else - btnRepeat.SetImage(UIImage.FromBundle("Images/Buttons/repeat_song_on"), UIControlState.Normal); - }); } - public void RefreshAudioFile(AudioFile audioFile) + public void RefreshMetadata(AudioFile audioFile, int playlistIndex, int playlistCount) { InvokeOnMainThread(() => { if(audioFile == null) @@ -132,6 +95,7 @@ public void RefreshAudioFile(AudioFile audioFile) lblArtistName.Text = string.Empty; lblAlbumTitle.Text = string.Empty; lblTitle.Text = string.Empty; + lblSongCount.Text = string.Empty; // Update AirPlay metadata with generic info if(MPNowPlayingInfoCenter.DefaultCenter != null) @@ -145,6 +109,8 @@ public void RefreshAudioFile(AudioFile audioFile) lblArtistName.Text = audioFile.ArtistName; lblAlbumTitle.Text = audioFile.AlbumTitle; lblTitle.Text = audioFile.Title; + lblSongCount.Text = string.Format("{0}/{1}", playlistIndex+1, playlistCount); + ShowPanel(true, false); // Update AirPlay metadata with generic info diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.designer.cs b/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.designer.cs index 9d0e6b40..fee1a25e 100644 --- a/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.designer.cs +++ b/MPfm/MPfm.iOS/Classes/Controllers/PlayerMetadataViewController.designer.cs @@ -1,58 +1,44 @@ // WARNING // // This file has been generated automatically by Xamarin Studio to store outlets and -// actions made in the Xcode designer. If it is removed, they will be lost. +// actions made in the UI designer. If it is removed, they will be lost. // Manual changes to this file may not be handled correctly. // using MonoTouch.Foundation; +using System.CodeDom.Compiler; namespace MPfm.iOS { [Register ("PlayerMetadataViewController")] partial class PlayerMetadataViewController { - [Outlet] - MonoTouch.UIKit.UILabel lblArtistName { get; set; } - [Outlet] MonoTouch.UIKit.UILabel lblAlbumTitle { get; set; } [Outlet] - MonoTouch.UIKit.UILabel lblTitle { get; set; } - - [Outlet] - MonoTouch.UIKit.UIView viewBackground { get; set; } + MonoTouch.UIKit.UILabel lblArtistName { get; set; } [Outlet] - MonoTouch.UIKit.UIButton btnPlaylist { get; set; } + MonoTouch.UIKit.UILabel lblSongCount { get; set; } [Outlet] - MonoTouch.UIKit.UIButton btnShuffle { get; set; } + MonoTouch.UIKit.UILabel lblTitle { get; set; } [Outlet] - MonoTouch.UIKit.UIButton btnRepeat { get; set; } - - [Action ("actionRepeat:")] - partial void actionRepeat (MonoTouch.Foundation.NSObject sender); - - [Action ("actionShuffle:")] - partial void actionShuffle (MonoTouch.Foundation.NSObject sender); - - [Action ("actionPlaylist:")] - partial void actionPlaylist (MonoTouch.Foundation.NSObject sender); + MonoTouch.UIKit.UIView viewBackground { get; set; } void ReleaseDesignerOutlets () { - if (lblArtistName != null) { - lblArtistName.Dispose (); - lblArtistName = null; - } - if (lblAlbumTitle != null) { lblAlbumTitle.Dispose (); lblAlbumTitle = null; } + if (lblArtistName != null) { + lblArtistName.Dispose (); + lblArtistName = null; + } + if (lblTitle != null) { lblTitle.Dispose (); lblTitle = null; @@ -63,19 +49,9 @@ void ReleaseDesignerOutlets () viewBackground = null; } - if (btnPlaylist != null) { - btnPlaylist.Dispose (); - btnPlaylist = null; - } - - if (btnShuffle != null) { - btnShuffle.Dispose (); - btnShuffle = null; - } - - if (btnRepeat != null) { - btnRepeat.Dispose (); - btnRepeat = null; + if (lblSongCount != null) { + lblSongCount.Dispose (); + lblSongCount = null; } } } diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.cs index 6b48baf0..33501706 100644 --- a/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.cs +++ b/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.cs @@ -45,7 +45,7 @@ public partial class PlayerViewController : BaseViewController, IPlayerView NSTimer _timerHidePlayerMetadata; bool _isPositionChanging = false; string _currentAlbumArtKey = string.Empty; - string _currentNavigationSubtitle = string.Empty; + //string _currentNavigationSubtitle = string.Empty; PlayerMetadataViewController _playerMetadataViewController; float _lastSliderPositionValue = 0; @@ -70,15 +70,11 @@ public override void DidReceiveMemoryWarning() public override void ViewDidLoad() { - btnPrevious.BackgroundColor = GlobalTheme.BackgroundColor; - btnPlayPause.BackgroundColor = GlobalTheme.BackgroundColor; - btnNext.BackgroundColor = GlobalTheme.BackgroundColor; - btnPrevious.SetImage(UIImage.FromBundle("Images/Buttons/previous"), UIControlState.Normal); - btnPrevious.SetImage(UIImage.FromBundle("Images/Buttons/previous_on"), UIControlState.Highlighted); - btnPlayPause.SetImage(UIImage.FromBundle("Images/Buttons/pause"), UIControlState.Normal); - btnPlayPause.SetImage(UIImage.FromBundle("Images/Buttons/pause_on"), UIControlState.Highlighted); - btnNext.SetImage(UIImage.FromBundle("Images/Buttons/next"), UIControlState.Normal); - btnNext.SetImage(UIImage.FromBundle("Images/Buttons/next_on"), UIControlState.Highlighted); + btnPrevious.GlyphImageView.Image = UIImage.FromBundle("Images/Player/previous"); + btnPlayPause.GlyphImageView.Image = UIImage.FromBundle("Images/Player/pause"); + btnNext.GlyphImageView.Image = UIImage.FromBundle("Images/Player/next"); + btnShuffle.GlyphImageView.Image = UIImage.FromBundle("Images/Player/shuffle"); + btnRepeat.GlyphImageView.Image = UIImage.FromBundle("Images/Player/repeat"); viewPosition.BackgroundColor = GlobalTheme.BackgroundColor; viewMain.BackgroundColor = GlobalTheme.BackgroundColor; @@ -368,6 +364,16 @@ private void CreateHidePlayerMetadataTimer() OnPlayerNext(); } + partial void actionRepeat(NSObject sender) + { + + } + + partial void actionShuffle(NSObject sender) + { + + } + #region IPlayerView implementation public Action OnPlayerPlay { get; set; } @@ -524,12 +530,10 @@ public void RefreshPlayerStatus(PlayerStatusType status) switch (status) { case PlayerStatusType.Paused: - btnPlayPause.SetImage(UIImage.FromBundle("Images/Buttons/play"), UIControlState.Normal); - btnPlayPause.SetImage(UIImage.FromBundle("Images/Buttons/play_on"), UIControlState.Highlighted); + btnPlayPause.GlyphImageView.Image = UIImage.FromBundle("Images/Player/play"); break; case PlayerStatusType.Playing: - btnPlayPause.SetImage(UIImage.FromBundle("Images/Buttons/pause"), UIControlState.Normal); - btnPlayPause.SetImage(UIImage.FromBundle("Images/Buttons/pause_on"), UIControlState.Highlighted); + btnPlayPause.GlyphImageView.Image = UIImage.FromBundle("Images/Player/pause"); break; } }); diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.designer.cs b/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.designer.cs index ae1a3d18..3ca8836a 100644 --- a/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.designer.cs +++ b/MPfm/MPfm.iOS/Classes/Controllers/PlayerViewController.designer.cs @@ -1,10 +1,11 @@ // WARNING // // This file has been generated automatically by Xamarin Studio to store outlets and -// actions made in the Xcode designer. If it is removed, they will be lost. +// actions made in the UI designer. If it is removed, they will be lost. // Manual changes to this file may not be handled correctly. // using MonoTouch.Foundation; +using System.CodeDom.Compiler; namespace MPfm.iOS.Classes.Controllers { @@ -12,49 +13,58 @@ namespace MPfm.iOS.Classes.Controllers partial class PlayerViewController { [Outlet] - MonoTouch.UIKit.UIView viewPageControls { get; set; } + MPfm.iOS.Classes.Controls.MPfmPlayerButton btnNext { get; set; } [Outlet] - MonoTouch.UIKit.UIView viewMain { get; set; } + MPfm.iOS.Classes.Controls.MPfmPlayerButton btnPlayPause { get; set; } [Outlet] - MonoTouch.UIKit.UILabel lblSlideMessage { get; set; } + MPfm.iOS.Classes.Controls.MPfmPlayerButton btnPrevious { get; set; } [Outlet] - MonoTouch.UIKit.UILabel lblScrubbingType { get; set; } + MPfm.iOS.Classes.Controls.MPfmPlayerButton btnRepeat { get; set; } [Outlet] - MonoTouch.UIKit.UIView viewPosition { get; set; } + MPfm.iOS.Classes.Controls.MPfmPlayerButton btnShuffle { get; set; } + + [Outlet] + MonoTouch.UIKit.UIImageView imageViewAlbumArt { get; set; } + + [Outlet] + MonoTouch.UIKit.UILabel lblLength { get; set; } [Outlet] MonoTouch.UIKit.UILabel lblPosition { get; set; } [Outlet] - MonoTouch.UIKit.UIImageView imageViewAlbumArt { get; set; } + MonoTouch.UIKit.UILabel lblScrubbingType { get; set; } [Outlet] - MPfm.iOS.Classes.Controls.MPfmSlider sliderPosition { get; set; } + MonoTouch.UIKit.UILabel lblSlideMessage { get; set; } [Outlet] - MonoTouch.UIKit.UILabel lblLength { get; set; } + MonoTouch.UIKit.UIPageControl pageControl { get; set; } [Outlet] - MonoTouch.UIKit.UIButton btnPrevious { get; set; } + MonoTouch.UIKit.UIScrollView scrollView { get; set; } [Outlet] - MonoTouch.UIKit.UIButton btnPlayPause { get; set; } + MPfm.iOS.Classes.Controls.MPfmWaveFormScrollView scrollViewWaveForm { get; set; } [Outlet] - MonoTouch.UIKit.UIButton btnNext { get; set; } + MPfm.iOS.Classes.Controls.MPfmSlider sliderPosition { get; set; } [Outlet] - MonoTouch.UIKit.UIScrollView scrollView { get; set; } + MonoTouch.UIKit.UIView viewMain { get; set; } [Outlet] - MonoTouch.UIKit.UIPageControl pageControl { get; set; } + MonoTouch.UIKit.UIView viewPageControls { get; set; } [Outlet] - MPfm.iOS.Classes.Controls.MPfmWaveFormScrollView scrollViewWaveForm { get; set; } + MonoTouch.UIKit.UIView viewPosition { get; set; } + + [Action ("actionNext:")] + partial void actionNext (MonoTouch.Foundation.NSObject sender); [Action ("actionPause:")] partial void actionPause (MonoTouch.Foundation.NSObject sender); @@ -62,8 +72,11 @@ partial class PlayerViewController [Action ("actionPrevious:")] partial void actionPrevious (MonoTouch.Foundation.NSObject sender); - [Action ("actionNext:")] - partial void actionNext (MonoTouch.Foundation.NSObject sender); + [Action ("actionRepeat:")] + partial void actionRepeat (MonoTouch.Foundation.NSObject sender); + + [Action ("actionShuffle:")] + partial void actionShuffle (MonoTouch.Foundation.NSObject sender); void ReleaseDesignerOutlets () { @@ -141,6 +154,16 @@ void ReleaseDesignerOutlets () scrollViewWaveForm.Dispose (); scrollViewWaveForm = null; } + + if (btnRepeat != null) { + btnRepeat.Dispose (); + btnRepeat = null; + } + + if (btnShuffle != null) { + btnShuffle.Dispose (); + btnShuffle = null; + } } } } diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PlaylistViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/PlaylistViewController.cs index 2652e329..4db8c033 100644 --- a/MPfm/MPfm.iOS/Classes/Controllers/PlaylistViewController.cs +++ b/MPfm/MPfm.iOS/Classes/Controllers/PlaylistViewController.cs @@ -58,7 +58,7 @@ public override void ViewDidLoad() NavigationController.DismissViewController(true, null); }; var btnDoneView = new UIView(new RectangleF(0, 0, 70, 44)); - var rect = new RectangleF(btnDoneView.Bounds.X + 5, btnDoneView.Bounds.Y, btnDoneView.Bounds.Width, btnDoneView.Bounds.Height); + var rect = new RectangleF(btnDoneView.Bounds.X + 16, btnDoneView.Bounds.Y, btnDoneView.Bounds.Width, btnDoneView.Bounds.Height); btnDoneView.Bounds = rect; btnDoneView.AddSubview(btnDone); _btnDone = new UIBarButtonItem(btnDoneView); @@ -72,7 +72,7 @@ public override void ViewDidLoad() _btnFlatEdit.Frame = new RectangleF(0, 0, 60, 44); _btnFlatEdit.OnButtonClick += HandleEditTouchUpInside; var btnEditView = new UIView(new RectangleF(UIScreen.MainScreen.Bounds.Width - 60, 0, 60, 44)); - var rect2 = new RectangleF(btnEditView.Bounds.X - 5, btnEditView.Bounds.Y, btnEditView.Bounds.Width, btnEditView.Bounds.Height); + var rect2 = new RectangleF(btnEditView.Bounds.X - 16, btnEditView.Bounds.Y, btnEditView.Bounds.Width, btnEditView.Bounds.Height); btnEditView.Bounds = rect2; btnEditView.AddSubview(_btnFlatEdit); _btnEdit = new UIBarButtonItem(btnEditView); @@ -164,6 +164,12 @@ public void MoveRowAtIndexPath(UITableView tableView, NSIndexPath fromIndexPath, Console.WriteLine("PlaylistViewController - Move playlist item from {0} to {1}", fromIndexPath.Row, toIndexPath.Row); } + [Export ("tableView:heightForRowAtIndexPath:")] + public float HeightForRow(UITableView tableView, NSIndexPath indexPath) + { + return 52; + } + private void HandleEditTouchUpInside() { _isEditingTableView = !_isEditingTableView; diff --git a/MPfm/MPfm.iOS/Classes/Controllers/PreferencesViewController.cs b/MPfm/MPfm.iOS/Classes/Controllers/PreferencesViewController.cs index 62d2d450..42021c65 100644 --- a/MPfm/MPfm.iOS/Classes/Controllers/PreferencesViewController.cs +++ b/MPfm/MPfm.iOS/Classes/Controllers/PreferencesViewController.cs @@ -88,10 +88,6 @@ public UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) cell.ImageChevron.Image = UIImage.FromBundle("Images/Tables/chevron"); cell.ImageChevron.Hidden = false; - UIView viewBackgroundSelected = new UIView(); - viewBackgroundSelected.BackgroundColor = GlobalTheme.SecondaryColor; - cell.SelectedBackgroundView = viewBackgroundSelected; - return cell; } diff --git a/MPfm/MPfm.iOS/Classes/Controls/MPfmNavigationController.cs b/MPfm/MPfm.iOS/Classes/Controls/MPfmNavigationController.cs index a07c88ac..de56ea8a 100644 --- a/MPfm/MPfm.iOS/Classes/Controls/MPfmNavigationController.cs +++ b/MPfm/MPfm.iOS/Classes/Controls/MPfmNavigationController.cs @@ -137,7 +137,7 @@ public MPfmNavigationController(MobileNavigationTabType tabType) : base(typeof(M _btnPlaylist.ImageChevron.Frame = new RectangleF((80 - 8) / 2, 6, 8, 5); _btnPlaylist.ImageChevron.BackgroundColor = UIColor.Clear; _btnPlaylist.OnButtonClick += () => { - //_messengerHub.PublishAsync(new MobileNavigationManagerCommandMessage(this, MobileNavigationManagerCommandMessageType.ShowEqualizerPresetsView)); + _messengerHub.PublishAsync(new MobileNavigationManagerCommandMessage(this, MobileNavigationManagerCommandMessageType.ShowPlaylistView)); }; _btnEffects = new MPfmFlatButton(); diff --git a/MPfm/MPfm.iOS/Classes/Controls/MPfmPlayerButton.cs b/MPfm/MPfm.iOS/Classes/Controls/MPfmPlayerButton.cs new file mode 100644 index 00000000..640198ca --- /dev/null +++ b/MPfm/MPfm.iOS/Classes/Controls/MPfmPlayerButton.cs @@ -0,0 +1,125 @@ +// 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.CoreGraphics; +using MonoTouch.Foundation; +using MonoTouch.UIKit; +using MPfm.iOS.Classes.Objects; +using MPfm.iOS.Helpers; + +namespace MPfm.iOS.Classes.Controls +{ + [Register("MPfmPlayerButton")] + public class MPfmPlayerButton : UIButton + { + public UIImageView GlyphImageView { get; private set; } + + public delegate void ButtonClick(); + public event ButtonClick OnButtonClick; + + public MPfmPlayerButton() + : base() + { + Initialize(); + } + + public MPfmPlayerButton(IntPtr handle) + : base(handle) + { + Initialize(); + } + + private void Initialize() + { + BackgroundColor = GlobalTheme.BackgroundColor; + //Layer.CornerRadius = 8; + TintColor = UIColor.White; + + GlyphImageView = new UIImageView(); + GlyphImageView.BackgroundColor = UIColor.Clear; + GlyphImageView.Layer.AnchorPoint = new PointF(0.5f, 0.5f); + //GlyphImageView.Frame = new RectangleF(0, 0, 50, 50); + GlyphImageView.Frame = new RectangleF((Frame.Width - 50) / 2, (Frame.Height - 50) / 2, 50, 50); + GlyphImageView.Alpha = 0.7f; + + TitleLabel.Alpha = 0; + TitleLabel.Hidden = true; + TitleLabel.Text = string.Empty; + + AddSubview(GlyphImageView); + } + + public override void LayoutSubviews() + { + base.LayoutSubviews(); + + //GlyphImageView.Frame = new RectangleF((Frame.Width - 50) / 2, (Frame.Height - 50) / 2, 50, 50); + } + + public override void TouchesBegan(NSSet touches, UIEvent evt) + { + AnimatePress(true); + base.TouchesBegan(touches, evt); + } + + public override void TouchesEnded(NSSet touches, UIEvent evt) + { + AnimatePress(false); + + if (OnButtonClick != null) + OnButtonClick(); + + base.TouchesEnded(touches, evt); + } + + public override void TouchesCancelled(NSSet touches, UIEvent evt) + { + AnimatePress(false); + base.TouchesCancelled(touches, evt); + } + + private void AnimatePress(bool on) + { + if (!on) + { + UIView.Animate(0.1, () => { + BackgroundColor = GlobalTheme.BackgroundColor; + GlyphImageView.Transform = CGAffineTransform.MakeScale(1, 1); + GlyphImageView.Alpha = 0.7f; + }); + } + else + { + UIView.Animate(0.1, () => { + BackgroundColor = GlobalTheme.BackgroundColor; + GlyphImageView.Transform = CGAffineTransform.MakeScale(0.8f, 0.8f); + GlyphImageView.Alpha = 1f; + }); + } + } + + public override void Draw(RectangleF rect) + { + var context = UIGraphics.GetCurrentContext(); + var rectCircle = new RectangleF(2, 2, Bounds.Width - 4, Bounds.Height - 4); + CoreGraphicsHelper.FillRect(context, Bounds, GlobalTheme.BackgroundColor.CGColor); + CoreGraphicsHelper.DrawEllipsis(context, rectCircle, new CGColor(0.6f, 0.6f, 0.6f, 0.6f), 1f); + } + } +} diff --git a/MPfm/MPfm.iOS/Classes/Controls/MPfmTableViewCell.cs b/MPfm/MPfm.iOS/Classes/Controls/MPfmTableViewCell.cs index b1915bc6..52b1b442 100644 --- a/MPfm/MPfm.iOS/Classes/Controls/MPfmTableViewCell.cs +++ b/MPfm/MPfm.iOS/Classes/Controls/MPfmTableViewCell.cs @@ -128,11 +128,13 @@ public void Initialize() DetailTextLabel.TextColor = UIColor.Gray; DetailTextLabel.HighlightedTextColor = UIColor.White; DetailTextLabel.Font = UIFont.FromName("HelveticaNeue", 12); - ImageView.BackgroundColor = UIColor.White; + ImageView.BackgroundColor = UIColor.Clear; // Make sure the text label is over all other subviews DetailTextLabel.RemoveFromSuperview(); + ImageView.RemoveFromSuperview(); AddSubview(DetailTextLabel); + AddSubview(ImageView); IndexTextLabel = new UILabel(); IndexTextLabel.BackgroundColor = UIColor.Clear; diff --git a/MPfm/MPfm.iOS/Classes/Navigation/iOSNavigationManager.cs b/MPfm/MPfm.iOS/Classes/Navigation/iOSNavigationManager.cs index ecd7595b..e09e1204 100644 --- a/MPfm/MPfm.iOS/Classes/Navigation/iOSNavigationManager.cs +++ b/MPfm/MPfm.iOS/Classes/Navigation/iOSNavigationManager.cs @@ -54,6 +54,12 @@ public iOSNavigationManager(ITinyMessengerHub messageHub) else PushDialogView(MobileDialogPresentationType.Standard, "Equalizer Presets", null, EqualizerPresetsView); break; + case MobileNavigationManagerCommandMessageType.ShowPlaylistView: + if(PlaylistView == null) + CreatePlaylistView(null); + else + PushDialogView(MobileDialogPresentationType.Standard, "Playlist", null, PlaylistView); + break; } }); } diff --git a/MPfm/MPfm.iOS/Images/Player/next.png b/MPfm/MPfm.iOS/Images/Player/next.png new file mode 100755 index 0000000000000000000000000000000000000000..733f777a07fd26fe6891056f3b2c55fb5aac2b6e GIT binary patch literal 1285 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8zp{uc_k)?^7qot{tiHoDF zg{31*uSMv>2~2MaLa!xGy`Y4UTL84#CABECEH%ZgC_h&L>|v`++-@<$X&zK> z3U0TUqWps9V)fko`Hd}+SA1`q~g|_ znftw%9R=Ep6x0x-_yx zZ0fl;Z!MmEGsPn9!E3Q;@6*!Ccld77(H2!awX~_Fb4CXYc`&+0EjSsoo9)|{t~brz z8_q;Tvx+B#FFqk1!D`MkQ!s*sc|z9PiM$0zC;VjOPSDU*zWIi?;H=JOtCKm|wp-0+ z&irV^tT|KScz$!rw4xJBq+Fd&>s-|knly7`mD;zn?~H?)?;D=Z5mN4&UO4k-S7_Sg zSzEU`$e($lu~~Ml^JA_V$?Mi$eo?$2@JVxCncttL;)3{y{OA*20^%bOk_SEneI zC3AKK&Gw#pjXU^I{f=!*T3pa>E1JwGL?c;;oC_^p2}Q{c@}3pL^D ktEPg&hA`AAR?o!4aQk}b>3mg#`JjTy)78&qol`;+0E!&JzW@LL literal 0 HcmV?d00001 diff --git a/MPfm/MPfm.iOS/Images/Player/next@2x.png b/MPfm/MPfm.iOS/Images/Player/next@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..38bef7e08886569aff149692c94b89955e9ad402 GIT binary patch literal 1600 zcmaJ>eM}Q)96mlWk&Oru#o};h6`jWRuDzDh(hjjLw#Xqu6S_E&Ywz0L;OUz_nznZ z{oeO|a$EEBmd3><#{vKlr`Kr;xQK_Im^Zk${rBAlF7Q~bku78_tP67xKo-uJ2vAR9 zR-%Bw@U`W=gc1OvK+<4jjcBgI%uqrsgb}(aJI4k9Wv1JXnM(;4G!a&kR`Kth>f(bW zuHqL-Q5dzW2^*>NIEX?|p26%XHOp~+=6j&ht>6SGg2g~LRYp4%ZWVu2SHb0>X^0Pw zLfBFj|7BA~G#^wm4g!=4VSyP=gTXYBP=rWiGT96`$+$Uq%aUg{~tBv!^|C=WlpG+U7>am7|S>e3{w`~#e5sXGEN&~2i1jAu!y8_#^oGE zqo_hpJ6Vi26MBt`&+&yMi7O-$i8fs;PDeyixk#i%(zUQmE{CP*Vs$p0Ez1gXHH^7} zB4{?u#b0sd6LLdFpzK^_4dEcy5O}tOp}^4vE69m^Nt;k_jEhg)i)=zJ#5Dtjj`g); z4o`9338mwvg$uhXF{Za=u=)i zpA_64d#8BMwdkIw@9!=yGCtZj+{yC52dhsU3f?_)r*hY|J)Jv+5%|NWWtD&HWU)t| zE%l&Jf>XWtjr8e({)UyYrPqh>95K6Sdz=^De4KHMQh6Ev%{TvO`MPoL$LHIcB!!Kr zJgVlgxTf>=!3Divb{tByUa0%gXX5E*BE(P0iFXz^T63V>`v5L3^kCbP!0$)A)jf^w z$l&&r4jFhAX?T#*u@wBwx~&Mjn(^fLku}5qjk&p#rG@QL{6E3S46Jrs{QAi;JQ`w_ZttheN&Df2rQ&O zY^Z2mFcMq_9NX0roMzclePhSx^MkXi`ut}tO|_R?gJ!{u6&u@|yQj?hD5>~SDbhFP z#NAI-_X3Xsx8A%yWI<+;XSY~-Rt}~Nu82A)v~_!C!u*I{%P+etAEqJvNZ;P_CJ9nS z`TGE*Y;VHpntY2}Hg_M-A2*q-DpH@R8@LiLK=SI=cV9lEpVxPJUH*(|y4$`1s>)V( zeA#`=3dLFd711jrodTbuS)?19o zjW34H(&zoE)bG*-&rId}?{~4!Zkjqv-U;lFJ-SZoIeqcGH#KCBaZ_-X7&XOf-U)x! dwLP6$0@wz`Lq9J+c{}t^*K6}MN0yXq`WOBCN^<}J literal 0 HcmV?d00001 diff --git a/MPfm/MPfm.iOS/Images/Player/pause.png b/MPfm/MPfm.iOS/Images/Player/pause.png new file mode 100755 index 0000000000000000000000000000000000000000..bc1f5e3808d61ac621d0c18e96d24cf8b1cc89fd GIT binary patch literal 1112 zcmaJ=TSyd97#_77)7}d)kuFq31qMb1VYi2Z5-jPWMlVsFS>3INwt+L}KZo!8{_8nXQ@zPk zxTuh#C{MIXijkdn*Nkc8zpVW56|ybFk$PNx5jI7Ym8UF4O+XA9VY6)L0L*90tUniNExlBBc?)hT2~~td(F@w4Z(>JJrPvBTmveQ4MD)i zdR4ZB1tpx1^REpCgKGfKaxBC0499!9py=mCmIad^O}yD!lNggKCw-Aqh;G5y5*a3$ zO!|_3AF`VnP7nlFgXg^j;dMGqtfaiAvm&D)K}WT93+u=PuAuuqf&?_e4nmsVjv)d!zF&+&jkdI zi}(e;R1$xUD2gbpfJN@0Kmn>bnr1eMPoQ+j8J>G+(KfibemOowJ zy?d^DabT$CSnJBEQ)bKt8}?Co`P$8$p34tpVfERDy%%4fygImU)q?N&9~*vdzqa~* z{KT#oedBwMe(ec9EG`;L1mB;pOOD?P4LukdyIPQ!pH*><;ogxaiBHXQ2R~dW?%1}u zTiABom|oZO{Zikkb?SM?WB<3}S?8~(ox1RI&$jN%qc)($!o6Pydfm4kjZ{lL8yoij E23DSK$N&HU literal 0 HcmV?d00001 diff --git a/MPfm/MPfm.iOS/Images/Player/pause@2x.png b/MPfm/MPfm.iOS/Images/Player/pause@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..c67074fecccf5da626008e817fc90a2ffbec7e13 GIT binary patch literal 1202 zcmaJ>TWHfz7*40Sv3Z$-f->|NUqsg2YF8Uu=i0PdFk^JpRhVLyoNaMSPE5|$c6b>+ zd3hKjq9`I>aOlJ4e9#9kW9-4pn+S6VL#Bv`q6iA2K6tXVouD<4oc}+3m;XQKC&!x_ zw=Jq%RY_6QqQrJ7Nmk8$D;AKi_4-VTEGuy=jhj(B&L}pd8Z^`fLBdcvU=k`??!Xfm zqNsU5Po;5M-XW^UU=$a_WDSe3DJoQ-wG_1rV$cRVbTdqUzBft(T?^AKewmZ4DD2d? z_t~(yuQ8?eb*Vv(uHOPeS&;}B5Gx>SbeoQt4bwBaB8lB?mIgBr+!dy0i%QE)Ac|}V z{0!$+xjGKi@eJ?V7zhMvfxz(`%Lyzmc=>?n6GV;!`G+QMw$?5trFh8|uMfnp8U5f?*Y9 zO(%a$zQhN+&;sRHj;|e9Y?jRTzah9O1_d+dhBLmDdEb1j| zk>Vxw@?5QSEnG=1ONwFLYyIPz3tMD%+^{&bBq@$PG|8;nWT?v@i2EqYvpyj;q_QtR zPK6hbSv8NQCq77Yd}z9wS$kml+1nyj)na*eT|RuJYkbYA6YowR9Hiw-*H+xPzy8FI zZ#SlwQA?{qS(&u8zoMer^UwJ4=)}#jV6A$3a_yHxQ6KulVb; bp|XWkm4D^M_p57OxPOsEtWg?@>^u4!hiiR1 literal 0 HcmV?d00001 diff --git a/MPfm/MPfm.iOS/Images/Player/play.png b/MPfm/MPfm.iOS/Images/Player/play.png new file mode 100755 index 0000000000000000000000000000000000000000..941e7881a04fe3f0cf5fb79b02aca51e693253bc GIT binary patch literal 1220 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8zp{uc@vw^XTtAUfDk%f_g zrGW)ZuSMv>2~2MaLa!@My`Y4UTL84#CABECEH%ZgC_h&L>|v`++-`BgX&zK> z3U0SJqWpsU3k`cDFXwem8XkiNX4x; zGk0e(IZCvKZ`>p}UzshphM#r!9xtCgCYnjh?Hau~npT>uo$i+_ddJE*+M)l6bDopH%4W_PjkC@x ziT})LQhm|5>3#MRmRkv|QHna>+znXc7f3l>&pL7Q<*T0AE5B(!`o?r^*Q2y5`IRY; z!ahf;NSj~0`)k#swBmH}!fG~Y(Zb?~9iJ8~+P$;nno!~GCO?k$W6BnPo*!*eX4?Ni zw&%dj@QM7A%b(11%;|cw^gztf1T&Yq0}tj&>{Jjs?fYR#RYI_m^#`tfrL_**Ppp;Z zHJ+~j-X*Cr*vH4G(lNNl#XM?8OwB5nt_S>kR=#sv=6Ymejm~#A?WvFBW08E8TPm8s Y(5q=SVb{TYSx~v+>FVdQ&MBb@0GTeM}Q)81Il_)d3A;Q?S5sAdYQquPyXzR6SdePRmE>gg7!h?ha_=?#kUsKk#F# zQ*gj!3TncK`@_X-ONt=sm@Fo<3d3nKzcmcBX>kUGP0jq6o4W$V{V{gQ-TOXIe!t)I zyzleN?as?t6TUEZA&NWei-+)dRxrg62oQ|u?18aYeQ(92V+zz4j2fe z95>+z=BWA+&*1Uq0Ty!+TV!0PK`BCv1TbPdVddC7UdBqh6+t)QEKrJ zSTHSEm~MoORvlhp$#&9sfiuU9Iya$e3|zSa$gpcT0Rm?cz)n<>jK;17r*t*kK9H7x zz!Zetqy?v&Dl+B)I*P`DbTK4CAq4~|q++Q&O{rAA1IQpLB!OfSsZ1nQYUDBv1OYP- z$W^1UGL1=}HB*a=v|t6xS~U`h&1MtZPDGphx;PN$DRSZ8HPX6Bl>3zOIpt3)b>0!Io0jmH0n62vT;VNLkU ze*aULF*~fd#Dp`{W*X%NSC$kgW!30t9APQiOi`7=TgsqPRh?1v$RhV!<@&YPn7+O;^dK>1wGoQ?6EJre&$1G+3{aDYBIEAXiVJ zn+cp`gIw$-S3M^;U))4y>`v-HT#Qy%{bxcQ490xe~4!Nnou1 z8gnqkc_*-)H7ys++8!r4uhX2V7lnfdc)XB7gB~{9Z;iKqP~Vs@ti4{w91;GY{6a8# zZf7Tuf6%mL-pOQ-%5OGJ=*z<7*;R>&sIc})*j`=fr_HTZZ&seZ`s~2N`+YBtUwe4v za$4b^?SDO*u*D7As=v8>FZ8!Fp~E3A9?TC3P2>wc0agjP;3FXP6_+5CzghtBxnL?6 z1YBVB@h!*r-W^}kJNn+b9(CApZoK?}uxYWs)RneoY|lvH;23?V4HhK))ZFTi>&?nZ zsf!%F*?;5J-X>s0#d-gO{X?nc(VqF2ebo+Kb+jjPkx%U~h!g7))(^bh-G4FOr2-=A zZ3DH6uPQkhgB=p~EJ%TckiotGq(5HW4y-r`o*ZnY@JCK%FPhw zU4SRf6N$gv_3w(^(bpvhJ7N<0;);#1_xPQLAyJ7_JFvmkaO2l|?&lLvSFMeFFgO~$ z+}AIR`1T4AS1%~6Eb+0omxaZg81q;^n_psT%I_Vy*w9t{qAtp{r7PwS@zP6W#tGQ# z6T1f@90}T%cEc<3qfUuhZVPR7GsyKX1s)(Yse~bo~P^cv*G; literal 0 HcmV?d00001 diff --git a/MPfm/MPfm.iOS/Images/Player/playlist.png b/MPfm/MPfm.iOS/Images/Player/playlist.png new file mode 100755 index 0000000000000000000000000000000000000000..3989b5c96d42a977b4b394be756db5da5547fc25 GIT binary patch literal 1325 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8zp{uc_vAMI8nWdYhnUk4? zg^LSJuSMv>2~2MaLazx|v`++-@<%X&zK> z3U0R;;nb@Sbc{YIT9Kj|CIn17ASOJ~0y*$xpPC0u>qWpsz3=9kT?`D2i#=T&Ln>~) znYrJa*-+&8>}^-N6kaHF1TSw=c%js^?%g>(zrJ<9%r){{Sq|R4d-3eSqmHb1S=iY{ zH(rxJeDhZK{R6^z8!ab)c^4S>;P6&wC%gB1_dHv1DN39zQG}b>$ORcJsbBoYuv{>w zS*oM)wP}=Kc!Ka93*ASBz55w9H!@fAJ==Wlgoy3_gUqR}e~WpImouqlzKf7sdUfG* z+XyCkzVve}iBfZ#v}(`Cs7PK_>yUZAzjDs{1+m_hY$`4WOaJ~eO*^pe=>=`Aqop6t zg)U)n%hy!CzsVV!nplR2%G73cv_v`9wy2P!_-F)_hX@qBB z6wqbG{#J{&$$ih@IG-@n=y1@HoHs{`7Ic@G-I`-u#BKIs^R|+;eCZQe3+5;(`+u>! z{6y;$2cNE_=0#V-M>8hg_r2e!dwl24c&X&`FWeMUPBAtaI6l2n#^EF0)4b3{`9#bT z@AH8h#8$XyS5662E?E47#kw*jMV_a*O3B(Te`flF1C@+F!^4q6Y)SrO_Xb9W-05NM TmPsW7paRU()z4*}Q$iB}`p40X literal 0 HcmV?d00001 diff --git a/MPfm/MPfm.iOS/Images/Player/playlist@2x.png b/MPfm/MPfm.iOS/Images/Player/playlist@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..da064d2af8ee497766bbd1ee298cf2cdc7f661b4 GIT binary patch literal 1617 zcmeAS@N?(olHy`uVBq!ia0vp^DImc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L$o& z6x?oc!Kqgt=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6NdQ}C-2L=YF#Ar-gY z%(3m^4U}j*zebvqlhsPdzBSF-M5r}@W8vaZ50R2hTbrC5Ri&nSb)-m(EV^|qjaybw z>yf_Go2ba@!?N#B&Uw4eC2ilCpU=*HR>?2!{%LuBX8yT3mgQZWbeMlEbl`AeP~>22 zQD6~h5&&{CSX&sJ1eiD+ITTnF8w7wH6zN;3tBV{h*X8sdf4ES0O8hDAr+uGR=sRuG zET5X(XPuQZMe=Fmr^HLGF`;_p3#w|u)24o&toLNevIPCdP^7HLgpY*Q2llk7=dy0?WHsQe%^?hM{s)o7oTMOsAPf~GdDb>SoYeVxY#UAZV>7A3mzC8TIoT7^>6tBzi)GIBq(+}RU(pr1^eB^AHk5MA|CM|+><>zz)ogqK^^wP(Ey$Shdbo%qK{rR9%$zw_1~ zHy6EIue&VH&7;I_shBlf6YwKN}}h9r-`$joF=hY44xE ziS>{Xt@TmX?bd!Gym(F8k?;4<^SDPkyG5Rj@OsI+$IykN#IfV(lSJXRgC})1Os_t% zEWlTZ&$wjLj`PfMR_T0-kHz-C4V;&j*UhBJC%vTq`vh~@toe@eEqC5^^!zyg;O4c{ z?rr*(M=q79{`j}&SoG7JS*j6pOB5&aE}V7JcIlfEqbE8+kB^_vyu&^7n#kw9I_a>q o0ZS-I$ptC|Nlgc)?Pua)_#3QdE%&Nq0jQAoboFyt=akR{0FA^{_y7O^ literal 0 HcmV?d00001 diff --git a/MPfm/MPfm.iOS/Images/Player/previous.png b/MPfm/MPfm.iOS/Images/Player/previous.png new file mode 100755 index 0000000000000000000000000000000000000000..961a72c2ba8192c37e57afef99571abcd8612168 GIT binary patch literal 1300 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8zp{uc_g}I4~g`0(uiG`Dk zxw#8WuSMv>2~2MaLa#Yay`Y4UTL84#CABECEH%ZgC_h&L>|v`++-@ z3U0TU;?%1Tbc{YIT9Kj|CIn17ASOJ~0y*$xpPC0u>qWpsZF<&-kAZ=)%hSa%q~g|_ z8MfZcjsk7A8$%~)%@qvtsO#Yf+s5^;QA8|?`=0=}_CdFUN^=twT{aq+DMfKA34UZ2 zyjEVwe7x|c>}KF0RPP$@J`xyV46>PnaIa`*JzQ zUE&7I`~{*Xt~!X@9J8D3yePTuHLr>7PAiL|oBK>AE^Jxb=zgT^k;U}A(^Mu+|Im4* zXs&>I&=d*Ppf@cV6OB5JCT{ZU5R_C66#3|>BL30yMinEkf%F6qEul#U@9u8k;N!fh zq9no@ef~kuj9#&yuh(p4Et5Dl(=Nlm=$aMd^doP!&uv)3*ZVwyGe%&O{{rSX^(3Qb zGv~1HJ+M=LM|L^up5p&*$7CPBKWMbjxcC9Xnr8l$zd2mhis%2nW3;jRYQQr06Pr$j zY*Y;Dmt5@=y84}S)=aJPZ(HUjMwGt2TJv<>)ij0OT>B2JJu>(1CI&yp*%M-!%{QK( xlemlb{Q3ud*Fw9Vtx#I9b+%~RS+=>z(H>Asd)?hZTR=jX zlW4$o;t%5ACa80aF>z*dh$JJliZjh-l6Eqnm zOnssXQrTo!u1QfyVA?{p&QNGJh>XmnHK5pm&;k~WLP3Wm&q^W=33E~xq36DBE)$%D zP-Y49MN%264WJAsFffq=u?>&_0tGM!<|hb+!c`y-f*~%%WB9Tvn$79n7HtDodsDo`KS$+jMMj8l{ zjWXd@(5HxI;rWz=NoV@v3KrY6td*Q96J0Q_1GRBs4&=L%AE;9OKh$EGMw65VdztTl z3X?jg4dZGs63-_LbmOvFzECzqMqns~6FMBv^H*_0E>7WOE^Y&5+C)%qvKnzaIf+)O z5T%u*P^$q`$|X#i&oP;dh(M4imCI6id^k}A!>RlfUIHu?$ao@t0xu0ph5cMPZpgP_ zR?5#czU1;})+b! z-=e+an@*dSUQF8_v(jECXj4BS>_-3~uwN;c>KwNQ4@=CiN+UlKK1}*58iJ%WN#WC6wg(! z9=ub2mY-w4w|icBTgcc?k;yfuVypPt zz{OR|5|=)zD4q@04%CQOjD~s+@6q=b0Z}S_pVO(Cz!L5~WEdL9XM@ihqsGwc(cab_ z(9@9^uJGoSH=@#egWKR)6<9h%C>5m-FGae8otGC^ELpfPQ@qa}t8h#Ax73;h%iE&U zy5d8G8_bEadR0+z7K zxBnR1A2k&1-~=l_sW`o)syim;?9M%B_QqET!ZmqbntQxx$G6)fy7=O_x)QTFfRz{Y z2WQ!ph8#zLrt#$RO82vvW4r55v)(TM=JjTEinp4-eL=*Ut{vWnXO)dl8j8QDCoiF6 zdFRFu;}4F(Bf*(eiKaDv%Q~R;+B#9W*fp##XqEv@sSTbHyY>#WbanDXs4M$jSL5Op zedcrL(IHlH&2J})JQ7I7+3x8C zz^g^O@->?bni~O4=jz52)E#5D_uMtr-cH%P%@V8V0KhfT+X^J@J=p`ti*|KBifR8n z!aKKM*Wk)K-pECrTH?*e@95Gm_Z=>TC2^;c<};M%+0Wq%L)RH6)E!~q)umfd^-b)% zry*pA(7EMT;V<00vqK;Qa**@*TR$N>N0F2D8O`!hTfC_BZE U-Ky>h_x%NwscQLGDVb$|0q&b(82|tP literal 0 HcmV?d00001 diff --git a/MPfm/MPfm.iOS/Images/Player/repeat.png b/MPfm/MPfm.iOS/Images/Player/repeat.png new file mode 100755 index 0000000000000000000000000000000000000000..10c9b601d881d820b5f7db3c704f453682c31ecd GIT binary patch literal 1370 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 BPPG64 literal 0 HcmV?d00001 diff --git a/MPfm/MPfm.iOS/Images/Player/shuffle.png b/MPfm/MPfm.iOS/Images/Player/shuffle.png new file mode 100755 index 0000000000000000000000000000000000000000..104f656e84a2e5cd7660751443683f9b4f4a6329 GIT binary patch literal 1509 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8Mv>2~2MaLa!rEy`Y4UTL84#CABECEH%ZgC_h&L>|v`++-@<)X&zK> z3U0Sp;MA)Rbc{YIT9Kj|CIn17ASOJ~0y*$xpPC0u>qWpsJNX4x; zGkrZm0!13qO$>U?TqE6DC*&%16nQzHP*KrPj7hl|RFu8erR4RY-W`{xecOCl>~9WN ziLk5v?h-C8&W#F}#5&zN_wM6PfADQi;hgID#};$A<&E!DznlH}sE(7+v4?Vd&I{B_t@Aq6?vl~{^KZbN;uj4o=NKC)@tt8` zJ^STrzN2rO6C?Pp-OtHXW7S;3`$`OMyjGx|4s_)NOX zsQW=>O2GOfGd`AIDrY};piFYNz^uzJCw5Qo=#9+&8x~~0Fznd66pv3yAwq#&ODZx{ zzbkm>tUf>M$9*OD1V^Em#$%>Q(TjEnYc8@AIJ?aMR__K{g@e}^hwk81wlyl;N{ zHlD)W2|j$+n}jkaF?~?xiTul4VB-5n=*`q9?T3F~3);-LUdTOd!TDQdldm0`-H%FO6}gC zh-v$jB$KsfN7alo3vGUC?T)-xrn~#bZ(jWeRwjqpv(J1ncj|wWp&hwyx9F+Qk$=l( z&*n7#G-FS!`y|nzU9+#>z8k>4_Sz4bn6}Q|s5k3OqWiCyTSR-XC+V&Av3tJvoeSfh zS9#6vixT{P#Ods7{I6(s@=%@3(W8%krLRE5Dlmpqvg=tT7$VAFwUzuhbP`nXdb;|# JtaD0e0sv>FKm-5) literal 0 HcmV?d00001 diff --git a/MPfm/MPfm.iOS/Images/Player/shuffle@2x.png b/MPfm/MPfm.iOS/Images/Player/shuffle@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..13d1dc3fb569c337f75f8d901a1009151776474e GIT binary patch literal 2246 zcmaJ@3piV88cr#SMlsZ_+DNNrXyhg$8J9tVw2h5KOI3|r4l;U@NJ2u3Dx0C>>Daoq z52e!!W?ibqOsNWM)uk?-7G3JH)jb5 zZlEPnCh%Lm|5I4vA1eaTOh6)x7IUG43)`zoB_ex@0k%{q_7@6IuJ0lvLMRnVB7`D@ zCyRgx;0t&{ndAeSPAAg@5-D521!xo(B*eGp^Lb=i;%9vCWhol6mNqd`C*UFY(C4qj*K0bi3J>YID~A)5V)tc>7S{umM4;8)gycDXhAbEU?Rec3f1VT({_pWC-QnA{Eiu? zBRtCMTziXX=f~=~P1d5_`CH&)F-glaI?G9?KC_-G9l%(o>yRq_+-{TF75SR#Z+bXN z6k$UDiN@lY_##qIf@acRLbu9yZSS`h@N;Gzrs;3EO!zx*EgPTmpzfvM*U5IrYTb6- z)ocx$vN_HQOKvC{Y5O?MN>Or%I>2TaR}CM$X%u|O*sEBn#v140Jf@W^|9EN_YAn|c z-r@6dxB8wl-a67Q!q8 zShPpZNE|VHm}T3OGRm5~Wa80XUruap9NST##k0cFY*uf!$*Ds`yJSgfZbhhmo_c~B z5%1g?klcOQQE^7swa`WH=vi#hcRjI(JeT=u_;K@GC-}dR$=})Wih`O>7QUW1<@(mu zH2+HFr8BP2Z{!(IIz8c~GW2r3%zL%Rbc$5`b;X!@)AQ7o$6G0_>EGX1I(nuU-bA)! z5nLyIo*(Y`W=EwJD#}~YrPy{tSqt;5IBO7F`#HBW|DS*Ff5y?3KMF6ko8B_gCPR$} z(Ypu@)w3miBgvtFvZ{S7&3W+UjT=1=FVqum#al2mmgu^Qka*pY2UWw?mtqqmhD>T# z;@hb6A<8Q4Q0e*EbL|%3`({h_)qG03plhaKQ0;P5m$qMx*J$Qp@Jn%`AJyl0R+)~I zqpubrm)s`_wVd+xyp{Vn>%8W!Q$q{S?7kfwVI1XGXFbXg4Qr6=SM4o^MzrM)v_9Fz z%oU3!N4k0>zV%3R;XO!9nDFv&#FXz3fzhx18(cFe0-;PRTCv{#qHdm z+rWI40g`}a@r#goj6CSIc4OLttgFr9M5Em!ruPxWs_)cSyJAka z`Cb@MAFQ`HU1(c&&%vemNgccdwCi2k4t9j179Y6GmIq;~@;c{=YnI*`Es>h9Mp&7S zUz3^E8jZ!-E*M<=p7cDW+bW@Mi(YcjyyeoTxpUv>rj!QBXGZm6`}M%N(}wVON3>pi z+h3fLIhMNrG}D|97T@EU{Cw3nPB^DNSb1Py+)oE915);h>N7_~@s6c`J`{8esi$E^l9WIbvvlZdPd4Bjrx4%CK&bvHQ#ia1?;EDtnk{Y9Cs uU^t}wNA&*p#ROec=M=pg(UHGu5(=x(Fv`ADU~)|LXF;R-QYt(`&;A?E{E|!n literal 0 HcmV?d00001 diff --git a/MPfm/MPfm.iOS/MPfm.iOS.csproj b/MPfm/MPfm.iOS/MPfm.iOS.csproj index 09ade239..66b86041 100644 --- a/MPfm/MPfm.iOS/MPfm.iOS.csproj +++ b/MPfm/MPfm.iOS/MPfm.iOS.csproj @@ -269,6 +269,7 @@ MPfmCollectionViewCell.cs + @@ -349,6 +350,7 @@ + @@ -484,6 +486,20 @@ + + + + + + + + + + + + + + diff --git a/MPfm/MPfm.iOS/XIB/iPhone/PlayerMetadataViewController_iPhone.xib b/MPfm/MPfm.iOS/XIB/iPhone/PlayerMetadataViewController_iPhone.xib index 5ec9d4a3..5f6ba9ba 100644 --- a/MPfm/MPfm.iOS/XIB/iPhone/PlayerMetadataViewController_iPhone.xib +++ b/MPfm/MPfm.iOS/XIB/iPhone/PlayerMetadataViewController_iPhone.xib @@ -1,511 +1,62 @@ - - - - 1552 - 12D78 - 3084 - 1187.37 - 626.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 2083 - - - IBProxyObject - IBUIButton - IBUILabel - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 266 - - - - 268 - {{0, 56}, {320, 27}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - [Title] - - 1 - MSAxIDEAA - - - 0 - 1 - - HelveticaNeue-Light - Helvetica Neue - 0 - 16 - - - HelveticaNeue-Medium - 16 - 16 - - NO - - - - 268 - {{0, 85}, {106, 41}} - - - - _NS:9 - - 3 - MC42NjY2NjY2NjY3AA - - NO - IBCocoaTouchFramework - 0 - 0 - Playlist - - 3 - MQA - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - 2 - 13 - - - Helvetica-Bold - 13 - 16 - - - - - 268 - {{106, 85}, {108, 41}} - - - - _NS:9 - - NO - IBCocoaTouchFramework - 0 - 0 - Shuffle - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - 268 - {{214, 85}, {106, 41}} - - - - _NS:9 - - NO - IBCocoaTouchFramework - 0 - 0 - Repeat - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - 268 - {{0, 3}, {320, 32}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - [ArtistName] - - - 0 - 1 - - HelveticaNeue-Medium - Helvetica Neue - 0 - 20 - - - HelveticaNeue-Medium - 20 - 16 - - NO - - - - 268 - {{0, 31}, {320, 28}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - [AlbumTitle] - - - 0 - 1 - - HelveticaNeue - Helvetica Neue - 0 - 18 - - - HelveticaNeue-Medium - 18 - 16 - - NO - - - {{0, 334}, {320, 126}} - - - - _NS:9 - - 3 - MAA - - IBCocoaTouchFramework - - - {{0, 20}, {320, 460}} - - - - - 1 - MCAwIDAgMAA - - - IBCocoaTouchFramework - - - - - - - view - - - - 3 - - - - lblTitle - - - - 9 - - - - lblArtistName - - - - 7 - - - - lblAlbumTitle - - - - 8 - - - - viewBackground - - - - 12 - - - - btnPlaylist - - - - 31 - - - - btnShuffle - - - - 32 - - - - btnRepeat - - - - 33 - - - - actionPlaylist: - - - 7 - - 36 - - - - actionShuffle: - - - 7 - - 35 - - - - actionRepeat: - - - 7 - - 34 - - - - - - 0 - - - - - - 1 - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 10 - - - - - - - - - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 22 - - - - - 23 - - - - - 24 - - - - - - - PlayerMetadataViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - 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 - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 36 - - - - - PlayerMetadataViewController - UIViewController - - id - id - id - - - - actionPlaylist: - id - - - actionRepeat: - id - - - actionShuffle: - id - - - - UIButton - UIButton - UIButton - UILabel - UILabel - UILabel - UIView - - - - btnPlaylist - UIButton - - - btnRepeat - UIButton - - - btnShuffle - UIButton - - - lblAlbumTitle - UILabel - - - lblArtistName - UILabel - - - lblTitle - UILabel - - - viewBackground - UIView - - - - IBProjectSource - ./Classes/PlayerMetadataViewController.h - - - - - 0 - IBCocoaTouchFramework - YES - 3 - 2083 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file