diff options
author | Hans Oesterholt <hans@oesterholt.net> | 2013-01-18 19:46:24 +0100 |
---|---|---|
committer | Hans Oesterholt <hans@oesterholt.net> | 2013-01-18 19:46:24 +0100 |
commit | 8596e37ebaf22959575258b184da3f6ef49541e6 (patch) | |
tree | 0eafa6873e3d9ca456f7d09297cd91edd665040d | |
parent | 5da2ce3f06f547055f8d01317b4be5be197c7278 (diff) |
CueSheets: First steps for playlists in the cuesheet extension. This is rather difficult :-(
26 files changed, 1100 insertions, 207 deletions
diff --git a/src/CueSheets/Banshee.CueSheets/CueSheet/CueSheet.cs b/src/CueSheets/Banshee.CueSheets/CueSheet/CueSheet.cs index 0d44e15..aef3ce5 100644 --- a/src/CueSheets/Banshee.CueSheets/CueSheet/CueSheet.cs +++ b/src/CueSheets/Banshee.CueSheets/CueSheet/CueSheet.cs @@ -133,10 +133,29 @@ namespace Banshee.CueSheets } } - public int searchIndex(double offset) { + public int searchIndex(string _current_entry_id,double _offset) { int k,N; - for(k=0,N=nEntries ();k<N && offset>_tracks[k].offset ();k++); - return k-1; + if (_current_entry_id==null) { + for(k=0,N=nEntries ();k<N && _offset>_tracks[k].offset ();k++); + return k-1; + } else { + for(k=0,N=nEntries ();k<N && _current_entry_id!=entry (k).id ();k++); + if (k==N) { + return N-1; + } else { + CueSheetEntry e=entry (k); + //Hyena.Log.Information ("offset="+e.offset()+", endoffset="+e.end_offset()+" offset="+_offset); + if (_offset<e.offset ()) { + return k-1; + } else if (e.end_offset ()<=0.0) { // end track, we don't know + return k; + } else if (_offset>=e.end_offset ()) { + return k+1; + } else { + return k; + } + } + } } public void resetArt() { @@ -231,13 +250,17 @@ namespace Banshee.CueSheets _tracks=null; } + public void AddEntry(CueSheetEntry e) { + append (e); + } + public CueSheetEntry AddTrack(string e_title,string e_perf,double e_offset) { int nr=0; if (_tracks!=null) { nr=_tracks.Length; } string aaid=getArtId (); - CueSheetEntry e=new CueSheetEntry(_music_file_name,aaid,nr,-1,e_title,e_perf,_title,e_offset); + CueSheetEntry e=new CueSheetEntry(this,_music_file_name,aaid,nr,-1,e_title,e_perf,_title,e_offset); append (e); int i,N; for(i=0,N=nEntries ();i<N;i++) { @@ -397,7 +420,7 @@ namespace Banshee.CueSheets if (eq(line,"track")) { if (e_offset>=0) { nr+=1; - CueSheetEntry e=new CueSheetEntry(_music_file_name,aaid,nr,-1,e_title,e_perf,_title,e_offset); + CueSheetEntry e=new CueSheetEntry(this,_music_file_name,aaid,nr,-1,e_title,e_perf,_title,e_offset); e.setComposer (e_composer); e.setPiece (e_piece); append (e); @@ -437,7 +460,7 @@ namespace Banshee.CueSheets //Console.WriteLine ("Last entry adding"); if (e_offset>=0) { nr+=1; - CueSheetEntry e=new CueSheetEntry(_music_file_name,aaid,nr,-1,e_title,e_perf,_title,e_offset); + CueSheetEntry e=new CueSheetEntry(this,_music_file_name,aaid,nr,-1,e_title,e_perf,_title,e_offset); e.setComposer (e_composer); e.setPiece (e_piece); append (e); diff --git a/src/CueSheets/Banshee.CueSheets/CueSheet/CueSheetCollection.cs b/src/CueSheets/Banshee.CueSheets/CueSheet/CueSheetCollection.cs new file mode 100644 index 0000000..93dd3a3 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/CueSheet/CueSheetCollection.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; + +namespace Banshee.CueSheets +{ + public class CueSheetCollection : List<CueSheet> + { + public CueSheetCollection () : base() { + } + + public CueSheetEntry FindEntry(string cuesheet_id,string entry_id) { + int i,N; + //Hyena.Log.Information ("Finding "+cuesheet_id); + for(i=0,N=base.Count;i<N && base[i].id ()!=cuesheet_id;i++); + //Hyena.Log.Information ("i="+i+", N="+N); + if (i==N) { + return null; + } else { + CueSheet s=base[i]; + int k,M; + for(k=0,M=s.nEntries ();k<M && s.entry (k).id ()!=entry_id;k++); + if (k==M) { + return null; + } else { + return s.entry (k); + } + } + } + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/CueSheet/CueSheetEntry.cs b/src/CueSheets/Banshee.CueSheets/CueSheet/CueSheetEntry.cs index 92fc533..62cbeba 100644 --- a/src/CueSheets/Banshee.CueSheets/CueSheet/CueSheetEntry.cs +++ b/src/CueSheets/Banshee.CueSheets/CueSheet/CueSheetEntry.cs @@ -37,14 +37,24 @@ namespace Banshee.CueSheets { public class CueSheetEntry : TrackInfo { - string _performer; - string _composer=""; - string _piece=""; - string _file; - TimeSpan _length; - string _art=""; - double _offset; - string _title; + private string _performer; + private string _composer=""; + private string _piece=""; + private string _file; + private TimeSpan _length; + private string _art=""; + private double _offset; + private double _e_offset=-1.0; + private string _title; + private CueSheet _parent; + + public string EntryName { + get { return _title; } + } + + public CueSheet getCueSheet() { + return _parent; + } public override string ArtworkId { get { return _art; } @@ -58,6 +68,10 @@ namespace Banshee.CueSheets return _file; } + public string id() { + return "title="+_title+";offset="+offset()+";length="+length (); + } + public string title() { return _title; } @@ -70,15 +84,15 @@ namespace Banshee.CueSheets return _offset; } + public double end_offset() { + return _e_offset; + } + public void setNrOfTracks(int n) { this.TrackCount=n; } - public void setComposer(string c) { - _composer=c; - } - public void setPiece(string p) { _piece=p; } @@ -87,10 +101,35 @@ namespace Banshee.CueSheets return _piece; } + public string Piece { + get { return _piece; } + set { _piece=value; } + } + + public override string Composer { + get { return _composer; } + set { _composer=value; } + } + + public void setComposer(string c) { + _composer=c; + } + public string getComposer() { return _composer; } + public string Length { + get { + double l=length (); + int t=(int) (l*100.0); + int m=t/(60*100); + int secs=(t/100)%60; + string ln=String.Format ("{0:00}:{0:00}",m,secs); + return ln; + } + } + public override TimeSpan Duration { get { return _length; @@ -107,6 +146,7 @@ namespace Banshee.CueSheets public void setLength(double l) { //_length=l; + _e_offset=_offset+l; System.Int64 ticks_100nanosecs=(System.Int64) (l*10000000); // 10 miljoen _length=new TimeSpan(ticks_100nanosecs); } @@ -115,13 +155,15 @@ namespace Banshee.CueSheets return "nr: "+this.TrackNumber+", title: "+this.title ()+", file: "+this.file (); } - public CueSheetEntry (string file,String artId,int nr,int cnt,string title,string performer,string album,double offset) : base() { + public CueSheetEntry (CueSheet s,string file,String artId,int nr,int cnt,string title,string performer,string album,double offset) : base() { _file=file; _title=title; _performer=performer; _offset=offset; _length=new TimeSpan(0); + _parent=s; + _art=artId; base.AlbumArtist=performer; base.TrackTitle=title; diff --git a/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs b/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs index 6b173e7..f82dd9c 100644 --- a/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs +++ b/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs @@ -74,7 +74,7 @@ namespace Banshee.CueSheets private Gtk.SeparatorMenuItem _sep; private Gtk.CheckButton _track_search; - private List<CueSheet> _sheets=new List<CueSheet>(); + private CueSheetCollection _sheets=new CueSheetCollection(); private CueSheet _sheet=null; private CueSheetsPrefs _preferences; private Actions _actions; @@ -181,7 +181,11 @@ namespace Banshee.CueSheets return _sheet; } - public List<CueSheet> getSheets() { + public void setSheet(CueSheet s) { + _sheet=s; + } + + public CueSheetCollection getSheets() { return _sheets; } @@ -262,6 +266,7 @@ namespace Banshee.CueSheets private CS_ArtistModel _artistModel=null; private CS_GenreModel _genreModel=null; private CS_ComposerModel _composerModel=null; + private CS_PlayListsModel _playlistsModel=null; public CS_AlbumModel getAlbumModel() { if (_model==null) { @@ -271,6 +276,19 @@ namespace Banshee.CueSheets return _model; } + public CS_PlayListsModel getPlayListsModel() { + if (_playlistsModel==null) { + Hyena.Log.Information ("Playlist model init"); + CS_PlayListCollection col=new CS_PlayListCollection(this._track_info_db,this.getSheets ()); + _playlistsModel=new CS_PlayListsModel(col); + } + return _playlistsModel; + } + + public CS_PlayListCollection getPlayListCollection() { + return _playlistsModel.Collection; + } + public TrackListModel getTrackModel() { return this.TrackModel; } @@ -299,16 +317,21 @@ namespace Banshee.CueSheets return _composerModel; } - public void setPositions(int hb,int hb1,int vp) { + public void setPositions(int hbpls,int hb,int hb1,int vp) { + Banshee.Configuration.ConfigurationClient.Set<int>("cuesheets_hbpls",hbpls); Banshee.Configuration.ConfigurationClient.Set<int>("cuesheets_hb",hb); Banshee.Configuration.ConfigurationClient.Set<int>("cuesheets_hb1",hb1); Banshee.Configuration.ConfigurationClient.Set<int>("cuesheets_vp",vp); } - public void getPositions(out int hb,out int hb1, out int vp) { + public void getPositions(out int hbpls,out int hb,out int hb1, out int vp) { + hbpls=Banshee.Configuration.ConfigurationClient.Get<int>("cuesheets_hbpls",500); hb=Banshee.Configuration.ConfigurationClient.Get<int>("cuesheets_hb",100); hb1=Banshee.Configuration.ConfigurationClient.Get<int>("cuesheets_hb1",200); vp=Banshee.Configuration.ConfigurationClient.Get<int>("cuesheets_vp",200); + if (hb1>=hbpls) { hb1=hbpls-100;} + if (hb>=hb1) { hb=hb1-100; } + if (hb<=0) { hb=100;hb1=200;hbpls=500; } } public bool getGridLayout(string id) { @@ -321,13 +344,17 @@ namespace Banshee.CueSheets _track_info_db.Set ("grid-"+id,g); } - public void setColumnWidth(string type,string albumid,int w) { - _track_info_db.Set ("col-"+type+"-"+albumid,w); + public void setColumnWidth(string type,string albumid,double w) { + string key="col-"+type+"-"+albumid; + _track_info_db.Set (key,w); + //Hyena.Log.Information ("set width("+key+")="+w); } - public int getColumnWidth(string type,string albumid) { - int w=150; - _track_info_db.Get ("col-"+type+"-"+albumid,out w,150); + public double getColumnWidth(string type,string albumid) { + double w=1.0; + string key="col-"+type+"-"+albumid; + _track_info_db.Get (key,out w,1.0); + //Hyena.Log.Information ("get width("+key+")="+w); return w; } diff --git a/src/CueSheets/Banshee.CueSheets/Data/GenreInfo.cs b/src/CueSheets/Banshee.CueSheets/Data/CS_GenreInfo.cs index 3e914c0..a3b566e 100644 --- a/src/CueSheets/Banshee.CueSheets/Data/GenreInfo.cs +++ b/src/CueSheets/Banshee.CueSheets/Data/CS_GenreInfo.cs @@ -30,23 +30,23 @@ using System.Collections; namespace Banshee.CueSheets { - public class GenreInfo + public class CS_GenreInfo { private string _genre; - public class Comparer : IComparer<GenreInfo> { + public class Comparer : IComparer<CS_GenreInfo> { private CaseInsensitiveComparer cmp=new CaseInsensitiveComparer(); - public int Compare( GenreInfo g1,GenreInfo g2 ) { + public int Compare( CS_GenreInfo g1,CS_GenreInfo g2 ) { return cmp.Compare (g1._genre,g2._genre); } } - public GenreInfo () + public CS_GenreInfo () { _genre=""; } - public GenreInfo(string s) { + public CS_GenreInfo(string s) { _genre=s; } diff --git a/src/CueSheets/Banshee.CueSheets/Data/CS_TrackInfoDb.cs b/src/CueSheets/Banshee.CueSheets/Data/CS_TrackInfoDb.cs index f070664..cba7abf 100644 --- a/src/CueSheets/Banshee.CueSheets/Data/CS_TrackInfoDb.cs +++ b/src/CueSheets/Banshee.CueSheets/Data/CS_TrackInfoDb.cs @@ -1,6 +1,7 @@ using System; using Banshee.Database; using Hyena.Data.Sqlite; +using System.Collections.Generic; namespace Banshee.CueSheets { @@ -12,7 +13,7 @@ namespace Banshee.CueSheets private readonly HyenaSqliteCommand _sql_get; private readonly HyenaSqliteCommand _sql_insert; private readonly HyenaSqliteCommand _sql_update; - + private readonly HyenaSqliteCommand _sql_key_begin; public CS_TrackInfoDb (BansheeDbConnection con) { _con=con; @@ -20,6 +21,7 @@ namespace Banshee.CueSheets _sql_get=new HyenaSqliteCommand("SELECT type,value FROM cuesheet_info WHERE key=?"); _sql_insert=new HyenaSqliteCommand("INSERT INTO cuesheet_info VALUES(?,?,?)"); _sql_update=new HyenaSqliteCommand("UPDATE cuesheet_info SET type=?, value=? WHERE key=?"); + _sql_key_begin=new HyenaSqliteCommand("SELECT key FROM cuesheet_info WHERE key LIKE ?"); try { if (!_con.TableExists ("cuesheet_info")) { _con.Query ("CREATE TABLE cuesheet_info(key varchar,type varchar,value varchar)"); @@ -81,6 +83,24 @@ namespace Banshee.CueSheets val=_default; } } + + public void Set(string key,double val) { + iSet (key,"double",val.ToString ()); + } + + public void Get(string key,out double val,double _default) { + string t,v; + if (iGet (key,out t,out v)) { + if (t=="double") { + val=Convert.ToDouble (v); + } else { + val=_default; + } + } else { + val=_default; + } + } + public void Set(string key,bool val) { iSet (key,"bool",val.ToString ()); @@ -98,6 +118,34 @@ namespace Banshee.CueSheets val=_default; } } + + public void Set(string key,string val) { + iSet (key,"string",val); + } + + public void Get(string key,out string val,string _default) { + string t,v; + if (iGet (key,out t,out v)) { + if (t=="string") { + val=v; + } else { + val=_default; + } + } else { + val=_default; + } + } + + public List<string> getKeysStartingWith(string start) { + List<string> lst=new List<string>(); + IDataReader rdr=_con.Query(_sql_key_begin,start+"%"); + while (rdr.Read ()) { + string key=rdr.Get<string>("key"); + Hyena.Log.Information ("key="+key); + lst.Add (key); + } + return lst; + } } } diff --git a/src/CueSheets/Banshee.CueSheets/Gui/CS_Column.cs b/src/CueSheets/Banshee.CueSheets/Gui/CS_Column.cs new file mode 100644 index 0000000..5212c45 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Gui/CS_Column.cs @@ -0,0 +1,27 @@ +using System; +using Hyena.Data.Gui; + +namespace Banshee.CueSheets +{ + public class CS_Column : Column + { + private string _id; + + public CS_Column (string id,string t,ColumnCell c,double w) : base(t,c,w) + { + _id=id; + } + + public string id() { + return _id; + } + + protected override void OnWidthChanged () + { + Hyena.Log.Information ("OnWidthChanged: id="+id()+", width="+Width); + base.OnWidthChanged (); + } + + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/Gui/CS_GenreListView.cs b/src/CueSheets/Banshee.CueSheets/Gui/CS_GenreListView.cs index 700b3d9..18c748a 100644 --- a/src/CueSheets/Banshee.CueSheets/Gui/CS_GenreListView.cs +++ b/src/CueSheets/Banshee.CueSheets/Gui/CS_GenreListView.cs @@ -30,7 +30,7 @@ using Hyena.Data.Gui; namespace Banshee.CueSheets { - public class CS_GenreListView : TrackFilterListView<GenreInfo> + public class CS_GenreListView : TrackFilterListView<CS_GenreInfo> { protected CS_GenreListView (IntPtr ptr) : base () {} diff --git a/src/CueSheets/Banshee.CueSheets/Gui/MusicToDevice.cs b/src/CueSheets/Banshee.CueSheets/Gui/CS_MusicToDevice.cs index 4583ce2..792ce69 100644 --- a/src/CueSheets/Banshee.CueSheets/Gui/MusicToDevice.cs +++ b/src/CueSheets/Banshee.CueSheets/Gui/CS_MusicToDevice.cs @@ -2,12 +2,12 @@ using System; namespace Banshee.CueSheets { - public class MusicToDevice : Gtk.Dialog + public class CS_MusicToDevice : Gtk.Dialog { private CueSheet _sheet; private Mp3Split _splt; - public MusicToDevice (CueSheet s) { + public CS_MusicToDevice (CueSheet s) { _sheet=s; } diff --git a/src/CueSheets/Banshee.CueSheets/Gui/CS_PlayListAdmin.cs b/src/CueSheets/Banshee.CueSheets/Gui/CS_PlayListAdmin.cs new file mode 100644 index 0000000..ef53970 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Gui/CS_PlayListAdmin.cs @@ -0,0 +1,111 @@ +using System; +using Banshee.Collection.Gui; +using Gtk; + +namespace Banshee.CueSheets +{ + public class CS_PlayListAdmin : Gtk.VBox + { + private CS_PlayListsModel _model; + private CS_PlayListCollection _col; + private Gtk.ScrolledWindow plsscroll,plscroll; + private CS_PlayListModel _pls_model; + private CS_PlayListView _pls_view; + private CS_PlayList _pls; + private Gtk.Entry _pls_name; + + public CS_PlayListAdmin (CS_PlayListsView plsview,CS_PlayListsModel mdl,CS_PlayListCollection cl) + { + _col=cl; + _model=mdl; + Gtk.HBox hb=new Gtk.HBox(); + + Gtk.Button _add=new Gtk.Button(Gtk.Stock.Add); + _add.Clicked+=delegate (object sender,EventArgs args) { + OnAddPls(); + }; + + Gtk.Button _remove=new Gtk.Button(Gtk.Stock.Remove); + _remove.Clicked+=delegate (object sender,EventArgs args) { + OnRemovePls(); + }; + + hb.PackStart (_add); + hb.PackStart (_remove); + + plsscroll=new Gtk.ScrolledWindow(); + plsscroll.Add (plsview); + + _pls=null; + _pls_name=new Gtk.Entry(); + _pls_model=new CS_PlayListModel(); + _pls_view=new CS_PlayListView(); + _pls_view.SetModel (_pls_model); + plscroll=new Gtk.ScrolledWindow(); + plscroll.Add (_pls_view); + + _pls_view.DragEnd+=delegate(object sender,DragEndArgs args) { + Console.WriteLine (args); + }; + Gtk.VBox plsvbox=new Gtk.VBox(); + plsvbox.PackStart (_pls_name,false,false,2); + plsvbox.PackEnd (plscroll); + + Gtk.VPaned vpn=new Gtk.VPaned(); + vpn.Add1 (plsscroll); + vpn.Add2 (plsvbox); + + base.PackStart (hb,false,false,2); + base.PackEnd (vpn); + + base.ShowAll (); + + mdl.SetListener (delegate(CS_PlayList pls) { + _pls=pls; + _pls_model.SetPlayList (_pls); + _pls_name.Text=_pls.PlsName; + }); + } + + public void OnAddPls() { + Hyena.Log.Information ("add playlist"); + Gtk.Dialog dlg=new Gtk.Dialog(); + dlg.Title="Add Playlist"; + Gtk.Entry pls=new Gtk.Entry(); + pls.WidthChars=40; + Gtk.Label lbl=new Gtk.Label("Playlist name:"); + Gtk.HBox hb=new Gtk.HBox(); + hb.PackStart (lbl,false,false,1); + hb.PackEnd (pls); + dlg.VBox.PackStart (hb); + dlg.AddButton (Gtk.Stock.Cancel,0); + dlg.AddButton (Gtk.Stock.Ok,1); + dlg.VBox.ShowAll (); + string plsname=""; + while (plsname=="") { + int response=dlg.Run (); + if (response==0) { + dlg.Hide (); + dlg.Destroy (); + return; + } else { + plsname=pls.Text.Trim (); + } + } + dlg.Hide (); + dlg.Destroy (); + _pls=_col.NewPlayList(plsname); + _model.Reload (); + _pls_model.SetPlayList (_pls); + } + + public void OnRemovePls() { + Hyena.Log.Information("remove playlist"); + } + + public void OnTrackAdd() { + + } + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/Gui/CS_PlayListView.cs b/src/CueSheets/Banshee.CueSheets/Gui/CS_PlayListView.cs new file mode 100644 index 0000000..12df085 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Gui/CS_PlayListView.cs @@ -0,0 +1,44 @@ +using System; +using Banshee.Collection.Gui; +using Hyena.Data.Gui; +using System.Collections.Generic; + +namespace Banshee.CueSheets +{ + public class CS_PlayListView : TrackFilterListView<CueSheetEntry> + { + protected CS_PlayListView (IntPtr ptr) : base () {} + + public CS_PlayListView () : base () + { + column_controller.Add (new Column ("Entry", new ColumnCellText ("EntryName", true), 1.0)); + ColumnController = column_controller; + base.ForceDragDestSet=true; + } + + protected override bool OnPopupMenu() { + return false; + } + + protected override bool OnDragDrop(Gdk.DragContext drg,int x,int y,uint time) { + Gtk.Widget w=Gtk.Drag.GetSourceWidget (drg); + if (w is CS_TrackListView) { + CS_TrackListView v=(CS_TrackListView) w; + CS_PlayListModel model=(CS_PlayListModel) this.Model; + CS_PlayList pls=model.PlayList; + if (pls!=null) { + List<CueSheetEntry> l=v.DragData; + foreach (CueSheetEntry e in l) { + pls.Add (e); + } + model.Reload (); + pls.Save (); + } + } + return false; + } + + + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/Gui/CS_PlayListsView.cs b/src/CueSheets/Banshee.CueSheets/Gui/CS_PlayListsView.cs new file mode 100644 index 0000000..59cddd4 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Gui/CS_PlayListsView.cs @@ -0,0 +1,45 @@ +using System; +using Banshee.Collection.Gui; +using Hyena.Data.Gui; +using Hyena.Collections; + +namespace Banshee.CueSheets +{ + public class CS_PlayListsView : TrackFilterListView<CS_PlayList> + { + protected CS_PlayListsView (IntPtr ptr) : base () {} + + private CueSheetsView _view; + + + public CS_PlayListsView (CueSheetsView view) : base () + { + _view=view; + column_controller.Add (new Column ("Playlist", new ColumnCellText ("PlsName", true), 1.0)); + ColumnController = column_controller; + } + + protected override bool OnPopupMenu() { + Gtk.Menu mnu=new Gtk.Menu(); + + Gtk.ImageMenuItem play=new Gtk.ImageMenuItem(Gtk.Stock.MediaPlay,null); + play.Activated+=delegate(object sender,EventArgs a) { + _view.PlayPlayList((CS_PlayList) this.Model[Selection.FirstIndex]); + }; + + //Gtk.ImageMenuItem edit=new Gtk.ImageMenuItem(Gtk.Stock.Edit,null); + //edit.Activated+=delegate(object sender,EventArgs a) { + // _view.EditPlayList(((CS_PlayList) this.Model[Selection.FirstIndex]).getSheet ()); + //}; + + mnu.Append (play); + mnu.Append (new Gtk.SeparatorMenuItem()); + //mnu.Append (edit); + mnu.ShowAll (); + mnu.Popup(); + + return false; + } + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/Gui/CS_TrackListView.cs b/src/CueSheets/Banshee.CueSheets/Gui/CS_TrackListView.cs new file mode 100644 index 0000000..adb88f4 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Gui/CS_TrackListView.cs @@ -0,0 +1,83 @@ +using System; +using Banshee.Collection.Gui; +using Hyena.Data.Gui; +using Banshee.Collection; +using System.Collections.Generic; + +namespace Banshee.CueSheets +{ + public class CS_TrackListView : TrackFilterListView<CueSheetEntry> + { + protected CS_TrackListView (IntPtr ptr) : base () {} + + private CueSheetsView _view; + private CS_Column _nr; + private CS_Column _track; + private CS_Column _piece; + private CS_Column _artist; + private CS_Column _composer; + private CS_Column _length; + + public CS_TrackListView (CueSheetsView view) : base () + { + _view=view; + Hyena.Log.Information ("view="+_view); + + _nr=new CS_Column ("tracknr","Nr", new ColumnCellText ("TrackNumber", true),1.0); + column_controller.Add (_nr); + + _track=new CS_Column ("track","Track", new ColumnCellText ("TrackTitle", true),1.0); + column_controller.Add (_track); + + _piece=new CS_Column ("piece","Piece", new ColumnCellText ("Piece", true),1.0); + column_controller.Add (_piece); + + _artist=new CS_Column ("artist","Artist", new ColumnCellText ("ArtistName", true),1.0); + column_controller.Add (_artist); + + _composer=new CS_Column ("composer","Composer", new ColumnCellText ("Composer", true),1.0); + column_controller.Add (_composer); + + _length=new CS_Column ("length","Length", new ColumnCellText ("Length", true),1.0); + column_controller.Add (_length); + + ColumnController = column_controller; + base.HeaderVisible=true; + + } + + protected override bool OnPopupMenu() { + return false; + } + + private List<CueSheetEntry> _dragentry=new List<CueSheetEntry>(); + public List<CueSheetEntry> DragData { + get { return _dragentry; } + set { _dragentry=value; } + } + + protected override void OnDragDataGet (Gdk.DragContext context, Gtk.SelectionData selection_data, uint info, uint time_) + { + Console.WriteLine ("getting data?"); + //TrackListModel model=_view.GetSource().TrackModel; + CS_TrackListModel model=(CS_TrackListModel) this.Model; + System.Text.StringBuilder sb = new System.Text.StringBuilder (); + List<CueSheetEntry> l=new List<CueSheetEntry>(); + + foreach (TrackInfo track in model.SelectedItems) { + CueSheetEntry e=(CueSheetEntry) track; + l.Add (e); + Console.WriteLine ("id="+e.id()); + //string id=e.id (); + //sb.Append (id); + //sb.Append ("#@#"); + } + byte [] data = System.Text.Encoding.UTF8.GetBytes (sb.ToString ()); + selection_data.Set (context.Targets[0], 8, data, data.Length); + Console.WriteLine(sb.ToString ()); + //context.Data.Add ("tracks",sb.ToString ()); + DragData=l; + } + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/Gui/CueSheetsView.cs b/src/CueSheets/Banshee.CueSheets/Gui/CueSheetsView.cs index 799dbcb..6970d2d 100644 --- a/src/CueSheets/Banshee.CueSheets/Gui/CueSheetsView.cs +++ b/src/CueSheets/Banshee.CueSheets/Gui/CueSheetsView.cs @@ -30,22 +30,24 @@ namespace Banshee.CueSheets { public class CueSheetsView : ISourceContents { - private Gtk.ListStore store; + private CS_TrackListModel store; private Gtk.VBox box; private Gtk.ScrolledWindow ascroll,tscroll,aascroll,gscroll,ccscroll; private int index=-1; private CueSheetsSource MySource=null; private CS_AlbumListView aview; - private Gtk.TreeView view; + private CS_TrackListView view; private CS_ArtistListView aaview; private CS_ComposerListView ccview; private CS_GenreListView gview; + private CS_PlayListsView plsview; + private CS_PlayListAdmin plsadmin; private Gtk.HPaned hb; private Gtk.HPaned hb1; + private Gtk.HPaned hbpls; private Gtk.VPaned vp; private Gtk.Toolbar bar; private Gtk.Label filling; - private Gtk.TreeViewColumn c_track,c_piece,c_artist,c_composer; private uint _position=0; private bool _set_position=false; @@ -154,6 +156,8 @@ namespace Banshee.CueSheets Hyena.Log.Information(MySource.getGenreModel ().Count.ToString ()); Hyena.Log.Information("Reload tracks"); MySource.getTrackModel ().Reload (); + Hyena.Log.Information("Reload play lists"); + MySource.getPlayListsModel().Reload(); Hyena.Log.Information("Reloaded all"); } catch(System.Exception e) { Hyena.Log.Information (e.ToString()); @@ -171,6 +175,9 @@ namespace Banshee.CueSheets } } + private string _song_file=null; + private string _song_id=null; + public void seekSong(int i) { Hyena.Log.Information("SeekSong called "+i); try { @@ -181,6 +188,12 @@ namespace Banshee.CueSheets } } CueSheetEntry e=sheet.entry (i); + _song_id=e.id (); + if (_song_file!=e.file ()) { + ServiceManager.PlayerEngine.Open (e); + ServiceManager.PlayerEngine.Play (); + _song_file=e.file (); + } double offset=e.offset (); ServiceManager.PlayerEngine.SetCurrentTrack(e); _position=(uint) (offset*1000.0); @@ -213,63 +226,58 @@ namespace Banshee.CueSheets } // Every N ms - private int timeout=100; - private int mscount=0; - private int chgcount=3000/100; // every 3 seconds + private int timeout=100; + private int mscount=0; + private int chgcount=3000/100; // every 3 seconds + //private CueSheetEntry _playing=null; public bool PositionDisplay() { - CueSheet sheet=MySource.getSheet (); if (ServiceManager.PlaybackController.Source==MySource) { - if (sheet!=null) { - mscount+=1; - if (mscount>chgcount) { mscount=0; } - - // Position if necessary - if (_set_position) { - _set_position=false; - _positioning=true; - ServiceManager.PlayerEngine.Position=_position; - } + CueSheet sheet=MySource.getSheet (); + if (sheet!=null) { + mscount+=1; + if (mscount>chgcount) { mscount=0; } - // Do nothing while seeking - uint pos=ServiceManager.PlayerEngine.Position; - double p=((double) pos)/1000.0; - if (_positioning && pos<=_position) { - //Hyena.Log.Information ("seek="+_position+", pos="+pos); - // do nothing - } else { - _positioning=false; - // Track number - int i=sheet.searchIndex(p); - if (i!=index && i>=0) { - // Handle repeat track - if (ServiceManager.PlaybackController.RepeatMode==PlaybackRepeatMode.RepeatSingle) { - seekSong (index); - } - // Every 2 seconds - if (mscount==0) { - index=i; - CueSheetEntry e=sheet.entry(index); - ServiceManager.PlayerEngine.SetCurrentTrack (e); - } + // Position if necessary + if (_set_position) { + _set_position=false; + _positioning=true; + ServiceManager.PlayerEngine.Position=_position; } - - if (mscount==0 && index>=0) { - int [] idx=new int[1]; - idx[0]=index; - Gtk.TreePath path=new Gtk.TreePath(idx); - //Hyena.Log.Information ("Setting cursor: "+index+", path="); - Gtk.TreeViewColumn c=new Gtk.TreeViewColumn(); - Gtk.TreePath pp; - view.GetCursor (out pp,out c); - if (pp==null || (pp.Indices[0]!=index && pp.Indices[0]>=0)) { - view.SetCursor (path,null,false); + // Do nothing while seeking + uint pos=ServiceManager.PlayerEngine.Position; + double p=((double) pos)/1000.0; + if (_positioning && pos<=_position) { + //Hyena.Log.Information ("seek="+_position+", pos="+pos); + // do nothing + } else { + _positioning=false; + // Track number + int i=sheet.searchIndex(_song_id,p); + if (i!=index && i>=0) { + // Handle repeat track + if (ServiceManager.PlaybackController.RepeatMode==PlaybackRepeatMode.RepeatSingle) { + seekSong (index); + } + // Every 2 seconds + if (mscount==0) { + Hyena.Log.Information("Found index i="+i+", songid="+_song_id); + index=i; + CueSheetEntry e=sheet.entry(index); + ServiceManager.PlayerEngine.SetCurrentTrack (e); + } + } + + if (mscount==0 && index>=0) { + Hyena.Log.Information ("mscount="+mscount+", index="+index); + view.ScrollTo(index); + view.Selection.QuietUnselect (view.Selection.FirstIndex); + view.Selection.Select(index); } } + } - - } } return true; } @@ -298,31 +306,30 @@ namespace Banshee.CueSheets return true; } + private int _set_column_sizes=0; + public void setColumnSizes(CueSheet s) { - c_track.FixedWidth=MySource.getColumnWidth("track",s.id ()); - c_piece.FixedWidth=MySource.getColumnWidth("piece",s.id ()); - c_artist.FixedWidth=MySource.getColumnWidth("artist",s.id ()); - c_composer.FixedWidth=MySource.getColumnWidth("composer",s.id ()); + int N=view.ColumnController.Count; + int i; + for(i=0;i<N;i++) { + _set_column_sizes+=1; + CS_Column col=(CS_Column) view.ColumnController[i]; + double w=(i==0) ? 0.05 : 0.16; + if (s!=null) { + w=MySource.getColumnWidth (col.id(),s.id ()); + } + col.Width=w; + } } public void loadCueSheet(CueSheet s) { //,Gtk.ListStore store) { - setColumnSizes (s); + MySource.setSheet(s); CueSheet sheet=MySource.getSheet (); - //type="cuesheet"; - sheet.Clear (); - sheet.load (s); - store.Clear (); - int i=0; - for(i=0;i<sheet.nEntries ();i++) { - CueSheetEntry e=sheet.entry (i); - double l=e.length (); - int t=(int) (l*100.0); - int m=t/(60*100); - int secs=(t/100)%60; - string ln=String.Format ("{0:00}:{0:00}",m,secs); - store.AppendValues (i+1,e.title (),e.getPiece (),e.performer (),e.getComposer(),ln); - } + store.SetSheet(sheet); + store.Reload (); reLoad (); + Hyena.Log.Information ("Setting column sizes for "+s.id ()); + setColumnSizes (s); } public void loadCueSheet(int i) { @@ -338,9 +345,16 @@ namespace Banshee.CueSheets } public void MusicFileToDevice(CueSheet s) { - MusicToDevice mtd=new MusicToDevice(s); + CS_MusicToDevice mtd=new CS_MusicToDevice(s); mtd.Do (); } + + public void PlayPlayList (CS_PlayList pls) + { + Hyena.Log.Information ("Playing playlist "+pls.PlsName); + CueSheet s=pls.GetCueSheet (); + loadCueSheet (s); + } public void ToggleGrid(string forId) { Hyena.Log.Information ("ToggleGrid for id "+forId); @@ -356,7 +370,7 @@ namespace Banshee.CueSheets public void ToggleGrid() { ArtistInfo aa=MySource.getAlbumModel().filterArtist(); - GenreInfo gg=MySource.getAlbumModel().filterGenre(); + CS_GenreInfo gg=MySource.getAlbumModel().filterGenre(); string fa=""; bool in_tracks=false; MySource.getAlbumModel ().filterAlbumOrTracks(out fa,out in_tracks); @@ -372,7 +386,7 @@ namespace Banshee.CueSheets public void SetGrid() { ArtistInfo aa=MySource.getAlbumModel().filterArtist(); - GenreInfo gg=MySource.getAlbumModel().filterGenre(); + CS_GenreInfo gg=MySource.getAlbumModel().filterGenre(); string fa=""; bool in_tracks=false; MySource.getAlbumModel ().filterAlbumOrTracks(out fa,out in_tracks); @@ -395,83 +409,60 @@ namespace Banshee.CueSheets basedir=MySource.getCueSheetDir (); - store = new Gtk.ListStore(typeof(int),typeof(string),typeof(string),typeof(string),typeof(string),typeof(string)); - view = new Gtk.TreeView(); - - Gtk.CellRendererText cr_txt=new Gtk.CellRendererText(); - cr_txt.Scale=0.8; - cr_txt.Ellipsize=Pango.EllipsizeMode.End; + store = new CS_TrackListModel(); + view = new CS_TrackListView(this); - Gtk.CellRendererText cr_other=new Gtk.CellRendererText(); - cr_other.Scale=0.8; - - { - CueSheet s=MySource.getSheet (); - - view.AppendColumn ("Nr.", cr_other, "text", 0); - c_track=new Gtk.TreeViewColumn("Track",cr_txt,"text",1); - c_track.Sizing=Gtk.TreeViewColumnSizing.Fixed; - c_track.FixedWidth=MySource.getColumnWidth("track",s.id()); - c_track.Resizable=true; - c_track.AddNotification ("width",delegate(object o, GLib.NotifyArgs args) { - MySource.setColumnWidth ("track",s.id(),c_track.Width); - }); - view.AppendColumn (c_track); - - c_piece=new Gtk.TreeViewColumn("Piece",cr_txt,"text",2); - c_piece.FixedWidth=MySource.getColumnWidth("piece",s.id ()); - c_piece.Sizing=Gtk.TreeViewColumnSizing.Fixed; - c_piece.Resizable=true; - c_piece.AddNotification ("width",delegate(object o, GLib.NotifyArgs args) { - MySource.setColumnWidth ("piece",s.id (),c_piece.Width); - }); - view.AppendColumn (c_piece); - - c_artist=new Gtk.TreeViewColumn("Artist",cr_txt,"text",3); - c_artist.Sizing=Gtk.TreeViewColumnSizing.Fixed; - c_artist.FixedWidth=MySource.getColumnWidth("artist",s.id ()); - c_artist.AddNotification("width",delegate(object o, GLib.NotifyArgs args) { - MySource.setColumnWidth ("artist",s.id (),c_artist.Width); - }); - c_artist.Resizable=true; - view.AppendColumn (c_artist); - - c_composer=new Gtk.TreeViewColumn("Composer",cr_txt,"text",4); - c_composer.Sizing=Gtk.TreeViewColumnSizing.Fixed; - c_composer.FixedWidth=MySource.getColumnWidth("composer",s.id ()); - c_composer.AddNotification("width",delegate(object o, GLib.NotifyArgs args) { - MySource.setColumnWidth ("composer",s.id(),c_composer.Width); - }); - c_composer.Resizable=true; - view.AppendColumn (c_composer); - - view.AppendColumn ("length", cr_other, "text", 5); + { + ColumnController colc=view.ColumnController; + int i,N; + for(i=0,N=colc.Count;i<N;i++) { + CS_Column col=(CS_Column) colc[i]; + col.WidthChanged+=delegate(object sender,EventArgs args) { + Hyena.Log.Information ("set-column-sizes="+_set_column_sizes); + if (_set_column_sizes<=0) { + _set_column_sizes=0; + MySource.setColumnWidth (col.id(),MySource.getSheet ().id (),col.Width); + } else { + _set_column_sizes-=1; + } + }; + } } - - view.CursorChanged += new EventHandler(EvtCursorChanged); - view.RowActivated += new Gtk.RowActivatedHandler(EvtTrackRowActivated); - view.Model = store; + + view.SetModel(store); + this.setColumnSizes(null); Hyena.Log.Information("New albumlist"); aview=new CS_AlbumListView(this); aaview=new CS_ArtistListView(); ccview=new CS_ComposerListView(); gview=new CS_GenreListView(); + try { + plsview=new CS_PlayListsView(this); + } catch (System.Exception ex) { + Hyena.Log.Error (ex.ToString ()); + } + Hyena.Log.Information("init models"); aview.SetModel (MySource.getAlbumModel ()); aaview.SetModel (MySource.getArtistModel ()); gview.SetModel (MySource.getGenreModel ()); ccview.SetModel (MySource.getComposerModel()); + plsview.SetModel(MySource.getPlayListsModel()); + plsadmin=new CS_PlayListAdmin(plsview,MySource.getPlayListsModel(),MySource.getPlayListCollection()); + MySource.getGenreModel(); Hyena.Log.Information("model albumlist"); Hyena.Log.Information("albumlist initialized"); aview.RowActivated+=new Hyena.Data.Gui.RowActivatedHandler<AlbumInfo>(EvtRowActivated); aview.Selection.Changed += HandleAviewSelectionChanged; - gview.RowActivated+=new Hyena.Data.Gui.RowActivatedHandler<GenreInfo>(EvtGenreActivated); + gview.RowActivated+=new Hyena.Data.Gui.RowActivatedHandler<CS_GenreInfo>(EvtGenreActivated); aaview.RowActivated+=new Hyena.Data.Gui.RowActivatedHandler<ArtistInfo>(EvtArtistActivated); ccview.RowActivated+=new Hyena.Data.Gui.RowActivatedHandler<CS_ComposerInfo>(EvtComposerActivated); + plsview.RowActivated+=new Hyena.Data.Gui.RowActivatedHandler<CS_PlayList>(EvtPlayListActivated); + view.RowActivated+=new RowActivatedHandler<CueSheetEntry>(EvtTrackRowActivated); bar=new Gtk.Toolbar(); if (basedir==null) { @@ -526,17 +517,24 @@ namespace Banshee.CueSheets vp.Add (hb1); vp.Add (tscroll); + Gtk.HPaned hppls=new Gtk.HPaned(); + hppls.Add1 (vp); + hppls.Add2 (plsadmin); + hbpls=hppls; + { - int hb_p,hb1_p,vp_p; - MySource.getPositions (out hb_p,out hb1_p,out vp_p); + int hb_pls,hb_p,hb1_p,vp_p; + MySource.getPositions (out hb_pls,out hb_p,out hb1_p,out vp_p); + hppls.Position=hb_pls; hb.Position=hb_p; hb1.Position=hb1_p; vp.Position=vp_p; } + box = new Gtk.VBox(); box.PackStart (bar,false,true,0); - box.PackStart (vp); + box.PackStart (hppls); box.ShowAll(); GLib.Timeout.Add ((uint) 1000,(GLib.TimeoutHandler) GardDividers); @@ -554,12 +552,14 @@ namespace Banshee.CueSheets int hb_prev=-1; int hb1_prev=-1; int vp_prev=-1; + int hbpls_prev=-1; public bool GardDividers() { if (hb_prev==-1) { hb_prev=hb.Position; hb1_prev=hb1.Position; vp_prev=vp.Position; + hbpls_prev=hbpls.Position; } bool changed=false; if (hb_prev!=hb.Position) { @@ -574,13 +574,16 @@ namespace Banshee.CueSheets vp_prev=vp.Position; changed=true; } + if (hbpls_prev!=hbpls.Position) { + hbpls_prev=hbpls.Position; + changed=true; + } if (changed) { - MySource.setPositions(hb_prev,hb1_prev,vp_prev); + MySource.setPositions(hbpls_prev,hb_prev,hb1_prev,vp_prev); } return true; } - public void EvtCursorChanged(object sender,EventArgs a) { mscount=0; } @@ -607,8 +610,8 @@ namespace Banshee.CueSheets PlayAlbum (a); } - public void EvtGenreActivated(object sender,RowActivatedArgs<GenreInfo> args) { - GenreInfo g=args.RowValue; + public void EvtGenreActivated(object sender,RowActivatedArgs<CS_GenreInfo> args) { + CS_GenreInfo g=args.RowValue; if (MySource.getGenreModel ().isNullGenre (g)) { g=null; } MySource.getAlbumModel ().filterGenre(g); MySource.getArtistModel ().filterGenre(g); @@ -626,7 +629,6 @@ namespace Banshee.CueSheets } public void EvtComposerActivated(object sender,RowActivatedArgs<CS_ComposerInfo> args) { - //Hyena.Log.Information("I'm here! "+sender+", "+args); CS_ComposerInfo a=(CS_ComposerInfo) args.RowValue; if (MySource.getComposerModel ().isNullComposer (a)) { a=null; } MySource.getAlbumModel ().filterComposer(a); @@ -634,23 +636,23 @@ namespace Banshee.CueSheets SetGrid (); } + public void EvtPlayListActivated(object sender,RowActivatedArgs<CS_PlayList> args) { + Hyena.Log.Information("I'm here! "+sender+", "+args); + + + //CS_ComposerInfo a=(CS_ComposerInfo) args.RowValue; + //if (MySource.getComposerModel ().isNullComposer (a)) { a=null; } + //MySource.getAlbumModel ().filterComposer(a); + //MySource.getArtistModel ().filterComposer (a); + //SetGrid (); + } - public void EvtTrackRowActivated(object sender,Gtk.RowActivatedArgs args) { + public void EvtTrackRowActivated(object sender,RowActivatedArgs<CueSheetEntry> args) { Hyena.Log.Information ("Row activated, seeking"); - Gtk.TreeSelection selection = (sender as Gtk.TreeView).Selection; - Gtk.TreeModel model; - Gtk.TreeIter iter; - if (selection.GetSelected(out model, out iter)) { - if (ServiceManager.PlaybackController.Source != MySource) { - reLoad (); - } - int track=(int) model.GetValue (iter,0); - int i=track-1; - seekSong (i); - index=i; - } + seekSong (args.Row); } + public CueSheetsSource GetSource() { return MySource; } public bool SetSource (ISource source) { return true; } public void ResetSource () { } diff --git a/src/CueSheets/Banshee.CueSheets/Model/CS_AlbumModel.cs b/src/CueSheets/Banshee.CueSheets/Model/CS_AlbumModel.cs index c6c37b1..34e4db8 100644 --- a/src/CueSheets/Banshee.CueSheets/Model/CS_AlbumModel.cs +++ b/src/CueSheets/Banshee.CueSheets/Model/CS_AlbumModel.cs @@ -36,7 +36,7 @@ namespace Banshee.CueSheets { private CueSheetsSource MySource; private List<CS_AlbumInfo> _filteredList; - private GenreInfo _genre; + private CS_GenreInfo _genre; private ArtistInfo _artist; private CS_ComposerInfo _composer; private string _album_search; @@ -109,7 +109,7 @@ namespace Banshee.CueSheets base.RaiseReloaded (); } - public void filterGenre(GenreInfo g) { + public void filterGenre(CS_GenreInfo g) { if (g==null) { _genre=null; Reload (); @@ -130,7 +130,7 @@ namespace Banshee.CueSheets } } - public GenreInfo filterGenre() { + public CS_GenreInfo filterGenre() { return _genre; } diff --git a/src/CueSheets/Banshee.CueSheets/Model/CS_ArtistModel.cs b/src/CueSheets/Banshee.CueSheets/Model/CS_ArtistModel.cs index cfe459b..a22a872 100644 --- a/src/CueSheets/Banshee.CueSheets/Model/CS_ArtistModel.cs +++ b/src/CueSheets/Banshee.CueSheets/Model/CS_ArtistModel.cs @@ -36,7 +36,7 @@ namespace Banshee.CueSheets private CueSheetsSource MySource; private List<CS_ArtistInfo> _artists; private CS_ArtistInfo _nullArtist; - private GenreInfo _genre; + private CS_GenreInfo _genre; private CS_ComposerInfo _composer; public CS_ArtistModel (CueSheetsSource s) { @@ -95,7 +95,7 @@ namespace Banshee.CueSheets } } - public void filterGenre(GenreInfo g) { + public void filterGenre(CS_GenreInfo g) { _genre=g; Reload (); } diff --git a/src/CueSheets/Banshee.CueSheets/Model/CS_ComposerModel.cs b/src/CueSheets/Banshee.CueSheets/Model/CS_ComposerModel.cs index a618634..4631231 100644 --- a/src/CueSheets/Banshee.CueSheets/Model/CS_ComposerModel.cs +++ b/src/CueSheets/Banshee.CueSheets/Model/CS_ComposerModel.cs @@ -9,7 +9,7 @@ namespace Banshee.CueSheets private CueSheetsSource MySource; private List<CS_ComposerInfo> _composers; private CS_ComposerInfo _nullComposer; - private GenreInfo _genre; + private CS_GenreInfo _genre; private ArtistInfo _artist; public CS_ComposerModel (CueSheetsSource s) { @@ -68,7 +68,7 @@ namespace Banshee.CueSheets } } - public void filterGenre(GenreInfo g) { + public void filterGenre(CS_GenreInfo g) { _genre=g; Reload (); } diff --git a/src/CueSheets/Banshee.CueSheets/Model/CS_GenreModel.cs b/src/CueSheets/Banshee.CueSheets/Model/CS_GenreModel.cs index bad8784..992e4c6 100644 --- a/src/CueSheets/Banshee.CueSheets/Model/CS_GenreModel.cs +++ b/src/CueSheets/Banshee.CueSheets/Model/CS_GenreModel.cs @@ -32,16 +32,16 @@ using Banshee.Collection.Database; namespace Banshee.CueSheets { - public class CS_GenreModel : BansheeListModel<GenreInfo> + public class CS_GenreModel : BansheeListModel<CS_GenreInfo> { - private CueSheetsSource MySource; - private List<GenreInfo> _genres; - private GenreInfo _nullGenre; + private CueSheetsSource MySource; + private List<CS_GenreInfo> _genres; + private CS_GenreInfo _nullGenre; public CS_GenreModel (CueSheetsSource s) { MySource=s; - _nullGenre=new GenreInfo("<All Genres>"); - _genres=new List<GenreInfo>(); + _nullGenre=new CS_GenreInfo("<All Genres>"); + _genres=new List<CS_GenreInfo>(); Selection=new Hyena.Collections.Selection(); } @@ -63,15 +63,15 @@ namespace Banshee.CueSheets for(int i=0;i<s.Count;i++) { string gen=Loosely.prepare (s[i].genre ()); if (!added.Contains (gen)) { - _genres.Add (new GenreInfo(s[i].genre ())); + _genres.Add (new CS_GenreInfo(s[i].genre ())); added.Add (gen); } } - _genres.Sort(new GenreInfo.Comparer()); + _genres.Sort(new CS_GenreInfo.Comparer()); base.RaiseReloaded (); } - public bool isNullGenre(GenreInfo g) { + public bool isNullGenre(CS_GenreInfo g) { return g==_nullGenre; } @@ -81,7 +81,7 @@ namespace Banshee.CueSheets } } - public override GenreInfo this[int index] { + public override CS_GenreInfo this[int index] { get { return _genres[index]; } diff --git a/src/CueSheets/Banshee.CueSheets/Model/CS_PlayListModel.cs b/src/CueSheets/Banshee.CueSheets/Model/CS_PlayListModel.cs new file mode 100644 index 0000000..d277302 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Model/CS_PlayListModel.cs @@ -0,0 +1,74 @@ +// +// CS_PlayListModel.cs +// +// Authors: +// Hans Oesterholt <hans@oesterholt.net> +// +// Copyright (C) 2013 Hans Oesterholt +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +using System; +using Banshee.Collection; + +namespace Banshee.CueSheets +{ + public class CS_PlayListModel : BansheeListModel<CueSheetEntry> + { + private CS_PlayList _pls; + + public CS_PlayListModel () { + _pls=null; + Selection=new Hyena.Collections.Selection(); + } + + public override void Clear () { + // does nothing + } + + public override void Reload () { + base.RaiseReloaded (); + } + + public void SetPlayList(CS_PlayList pls) { + _pls=pls; + Reload (); + } + + public CS_PlayList PlayList { + get { return _pls; } + set { SetPlayList (value); } + } + + public override int Count { + get { + if (_pls==null) { return 0; } + else { return _pls.Count; } + } + } + + public override CueSheetEntry this[int index] { + get { + return _pls[index]; + } + } + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/Model/CS_PlayListsModel.cs b/src/CueSheets/Banshee.CueSheets/Model/CS_PlayListsModel.cs new file mode 100644 index 0000000..f31b05c --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Model/CS_PlayListsModel.cs @@ -0,0 +1,68 @@ +using System; +using Banshee.Collection; +using Hyena.Collections; + +namespace Banshee.CueSheets +{ + public class CS_PlayListsModel : BansheeListModel<CS_PlayList> + { + //private CueSheetsSource MySource; + private CS_PlayListCollection _pla; + public delegate void Listener(CS_PlayList pls); + private Listener _listener=null; + + public CS_PlayListsModel (CS_PlayListCollection pls) { + _pla=pls; + Selection=new Hyena.Collections.Selection(); + Selection.Changed+=delegate(object sender,EventArgs args) { + try { + int index=((Selection) sender).FirstIndex; + if (index>=0) { + CS_PlayList pl=(CS_PlayList) this[index]; + Hyena.Log.Information ("playlist="+pl); + OnPlayListSelect(pl); + } + } catch(System.Exception ex) { + Hyena.Log.Error (ex.ToString ()); + } + }; + } + + private void OnPlayListSelect(CS_PlayList pls) { + if (_listener!=null) { + _listener(pls); + } + } + + public void SetListener(Listener f) { + _listener=f; + } + + + public CS_PlayListCollection Collection { + get { return _pla; } + } + + public override void Clear () { + // does nothing + } + + public override void Reload () { + _pla.Reload (); + base.RaiseReloaded(); + } + + public override int Count { + get { + return _pla.Count; + } + } + + public override CS_PlayList this[int index] { + get { + return _pla[index]; + } + } + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/Model/CS_TrackListModel.cs b/src/CueSheets/Banshee.CueSheets/Model/CS_TrackListModel.cs new file mode 100644 index 0000000..e3539a4 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Model/CS_TrackListModel.cs @@ -0,0 +1,66 @@ +using System; +using Banshee.Collection; +using System.Collections.Generic; + +namespace Banshee.CueSheets +{ + public class CS_TrackListModel : BansheeListModel<CueSheetEntry> { + + private CueSheet _sheet; + private List<CueSheetEntry> store; + + public CS_TrackListModel () { + Selection=new Hyena.Collections.Selection(); + store=new List<CueSheetEntry>(); + } + + public override void Clear () { + // does nothing + } + + public void SetSheet(CueSheet s) { + _sheet=s; + } + + public override void Reload () { + store.Clear (); + int i=0; + for(i=0;i<_sheet.nEntries ();i++) { + CueSheetEntry e=_sheet.entry (i); + store.Add (e); + /*double l=e.length (); + int t=(int) (l*100.0); + int m=t/(60*100); + int secs=(t/100)%60; + string ln=String.Format ("{0:00}:{0:00}",m,secs); + store.AppendValues (i+1,e.title (),e.getPiece (),e.performer (),e.getComposer(),ln);*/ + } + base.RaiseReloaded (); + } + + public override int Count { + get { + return store.Count; + } + } + + public override CueSheetEntry this[int index] { + get { + return store[index]; + } + } + + /* + public CS_TrackListModel () : base(typeof(int), + typeof(string), + typeof(string), + typeof(string), + typeof(string), + typeof(string)) + { + + }*/ + + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/Playlists/CS_PlayList.cs b/src/CueSheets/Banshee.CueSheets/Playlists/CS_PlayList.cs new file mode 100644 index 0000000..8d18e32 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Playlists/CS_PlayList.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Collections; + +namespace Banshee.CueSheets +{ + public class CS_PlayList + { + private List<CS_PlayListEntry> _playlist; + private string _name; + private CueSheetCollection _csc; + private CS_TrackInfoDb _db; + + public class Comparer : IComparer<CS_PlayList> { + private CaseInsensitiveComparer cmp=new CaseInsensitiveComparer(); + public int Compare( CS_PlayList g1,CS_PlayList g2 ) { + return cmp.Compare (g1._name,g2._name); + } + } + + public string PlsName { + get { return _name; } + set { _name=value; } + } + + public CS_PlayList (CS_TrackInfoDb con,string name,CueSheetCollection csc) { + _playlist=new List<CS_PlayListEntry>(); + _db=con; + _name=name; + _csc=csc; + Load(); + } + + public void Add(CueSheetEntry e) { + _playlist.Add (new CS_PlayListEntry(e)); + //Insert (e,_playlist.Count); + } + + public void Insert(CueSheetEntry e,int index) { + CS_PlayListEntry ple=new CS_PlayListEntry(e); + Hyena.Log.Information ("index="+index+", e="+e); + _playlist.Insert (index,ple); + } + + public int Count { + get { return _playlist.Count; } + } + + public CueSheetEntry this[int index] { + get { + CS_PlayListEntry ple=_playlist[index]; + return ple.GetCueSheetEntry(); + } + } + + public CueSheet GetCueSheet() { + CueSheet s=new CueSheet(); + s.SetTitle (_name); + foreach (CS_PlayListEntry ple in _playlist) { + s.AddEntry(ple.GetCueSheetEntry ()); + } + return s; + } + + public void Save() { + string pls=""; + string sep=""; + Hyena.Log.Information("Playlist="+_playlist); + foreach (CS_PlayListEntry ple in _playlist) { + Hyena.Log.Information ("ple="+ple); + CueSheetEntry e=ple.GetCueSheetEntry (); + Hyena.Log.Information ("e="+e); + CueSheet s=e.getCueSheet(); + Hyena.Log.Information("sheet="+s+", entry="+e); + string id=s.id (); + string e_id=e.id (); + string entry="cuesheet="+id+"%%%entry="+e_id; + pls+=sep; + pls+=entry; + sep="#@%@#"; + } + _db.Set("playlist:"+_name,pls); + } + + public void Load() { + string pls=null; + _db.Get("playlist:"+_name,out pls,null); + if (pls==null) { + return; + } else { + string [] entries=Regex.Split (pls,"#@%@#"); + //Hyena.Log.Information ("playlist name="+pls+", entries="+entries); + foreach (string e in entries) { + Hyena.Log.Information ("entry="+e); + if (e!="") { + string []ids=Regex.Split (e,"%%%"); + string cs_id=ids[0].Substring ("cuesheet=".Length); + string cs_e=ids[1].Substring("entry=".Length); + //Hyena.Log.Information ("finding: cs-id="+cs_id+", e-id="+cs_e); + CueSheetEntry entry=_csc.FindEntry(cs_id,cs_e); + if (entry!=null) { + Hyena.Log.Information("adding entry:"+entry); + Add (entry); + } + } + } + } + } + + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/Playlists/CS_PlayListCollection.cs b/src/CueSheets/Banshee.CueSheets/Playlists/CS_PlayListCollection.cs new file mode 100644 index 0000000..56f7b39 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Playlists/CS_PlayListCollection.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace Banshee.CueSheets +{ + public class CS_PlayListCollection : List<CS_PlayList> + { + private CS_TrackInfoDb _db; + private CueSheetCollection _csc; + + public CS_PlayListCollection (CS_TrackInfoDb db,CueSheetCollection csc) { + _csc=csc; + _db=db; + } + + public void Load() { + Reload (); + } + + public void Reload() { + base.Clear (); + List<string> keys=_db.getKeysStartingWith("playlist:"); + foreach (string key in keys) { + Hyena.Log.Information ("adding key"+key); + string name=key.Substring(9); + CS_PlayList pl=new CS_PlayList(_db,name,_csc); + Add (pl); + } + base.Sort (new CS_PlayList.Comparer()); + } + + public CS_PlayList NewPlayList(string name) { + CS_PlayList pls=new CS_PlayList(_db,name,_csc); + pls.Save (); + return pls; + } + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/Playlists/CS_PlayListEntry.cs b/src/CueSheets/Banshee.CueSheets/Playlists/CS_PlayListEntry.cs new file mode 100644 index 0000000..b1d1a48 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Playlists/CS_PlayListEntry.cs @@ -0,0 +1,25 @@ +using System; + +namespace Banshee.CueSheets +{ + public class CS_PlayListEntry + { + private CueSheetEntry _e; + + public CS_PlayListEntry (CueSheetEntry e) { + _e=e; + Hyena.Log.Information ("ple: construct entry="+_e); + } + + public CueSheetEntry GetCueSheetEntry() { + Hyena.Log.Information ("ple: entry"); + Hyena.Log.Information ("ple: entry="+_e); + return _e; + } + + public override string ToString() { + return "ple: "+_e.ToString (); + } + } +} + diff --git a/src/CueSheets/CueSheets.csproj b/src/CueSheets/CueSheets.csproj index 224e0df..023c2d0 100644 --- a/src/CueSheets/CueSheets.csproj +++ b/src/CueSheets/CueSheets.csproj @@ -109,13 +109,11 @@ <Compile Include="Banshee.CueSheets\Model\CS_GenreModel.cs" /> <Compile Include="Banshee.CueSheets\Gui\CueSheetsPrefs.cs" /> <Compile Include="Banshee.CueSheets\Gui\CueSheetEditor.cs" /> - <Compile Include="Banshee.CueSheets\Data\GenreInfo.cs" /> <Compile Include="Banshee.CueSheets\Tools\Loosely.cs" /> <Compile Include="Banshee.CueSheets\Tools\Tools.cs" /> <Compile Include="Banshee.CueSheets\Data\CS_TrackInfoDb.cs" /> <Compile Include="Banshee.CueSheets\Version\CS_Info.cs" /> <Compile Include="Banshee.CueSheets\mp3splt\Mp3Split.cs" /> - <Compile Include="Banshee.CueSheets\Gui\MusicToDevice.cs" /> <Compile Include="Banshee.CueSheets\mp3splt\Mp3SplitTrack.cs" /> <Compile Include="Banshee.CueSheets\Gui\Actions.cs" /> <Compile Include="Banshee.CueSheets\Gui\CS_AlbumListView.cs" /> @@ -124,6 +122,20 @@ <Compile Include="Banshee.CueSheets\Gui\CS_ArtistListView.cs" /> <Compile Include="Banshee.CueSheets\Gui\CS_ComposerListView.cs" /> <Compile Include="Banshee.CueSheets\Gui\CS_CollectionSearchEntry.cs" /> + <Compile Include="Banshee.CueSheets\CueSheet\CueSheetCollection.cs" /> + <Compile Include="Banshee.CueSheets\Data\CS_GenreInfo.cs" /> + <Compile Include="Banshee.CueSheets\Playlists\CS_PlayList.cs" /> + <Compile Include="Banshee.CueSheets\Playlists\CS_PlayListCollection.cs" /> + <Compile Include="Banshee.CueSheets\Gui\CS_MusicToDevice.cs" /> + <Compile Include="Banshee.CueSheets\Playlists\CS_PlayListEntry.cs" /> + <Compile Include="Banshee.CueSheets\Gui\CS_PlayListAdmin.cs" /> + <Compile Include="Banshee.CueSheets\Model\CS_PlayListsModel.cs" /> + <Compile Include="Banshee.CueSheets\Gui\CS_PlayListsView.cs" /> + <Compile Include="Banshee.CueSheets\Gui\CS_PlayListView.cs" /> + <Compile Include="Banshee.CueSheets\Model\CS_PlayListModel.cs" /> + <Compile Include="Banshee.CueSheets\Model\CS_TrackListModel.cs" /> + <Compile Include="Banshee.CueSheets\Gui\CS_TrackListView.cs" /> + <Compile Include="Banshee.CueSheets\Gui\CS_Column.cs" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> @@ -150,5 +162,6 @@ <Folder Include="Banshee.CueSheets\Version\" /> <Folder Include="Banshee.CueSheets\mp3splt\" /> <Folder Include="Resources\" /> + <Folder Include="Banshee.CueSheets\Playlists\" /> </ItemGroup> </Project> diff --git a/src/CueSheets/Makefile.am b/src/CueSheets/Makefile.am index 1cb4a09..da55a36 100644 --- a/src/CueSheets/Makefile.am +++ b/src/CueSheets/Makefile.am @@ -3,29 +3,41 @@ LINK = $(BANSHEE_LIBS) SOURCES = \ Banshee.CueSheets/CueSheet/CueSheet.cs \ + Banshee.CueSheets/CueSheet/CueSheetCollection.cs \ Banshee.CueSheets/CueSheet/CueSheetEntry.cs \ Banshee.CueSheets/CueSheetsSource.cs \ Banshee.CueSheets/Data/CS_AlbumInfo.cs \ Banshee.CueSheets/Data/CS_ArtistInfo.cs \ Banshee.CueSheets/Data/CS_ComposerInfo.cs \ + Banshee.CueSheets/Data/CS_GenreInfo.cs \ Banshee.CueSheets/Data/CS_TrackInfoDb.cs \ - Banshee.CueSheets/Data/GenreInfo.cs \ Banshee.CueSheets/Gui/Actions.cs \ Banshee.CueSheets/Gui/CS_AlbumListView.cs \ Banshee.CueSheets/Gui/CS_ArtistListView.cs \ Banshee.CueSheets/Gui/CS_CollectionSearchEntry.cs \ + Banshee.CueSheets/Gui/CS_Column.cs \ Banshee.CueSheets/Gui/CS_ComposerListView.cs \ Banshee.CueSheets/Gui/CS_GenreListView.cs \ + Banshee.CueSheets/Gui/CS_MusicToDevice.cs \ + Banshee.CueSheets/Gui/CS_PlayListAdmin.cs \ + Banshee.CueSheets/Gui/CS_PlayListsView.cs \ + Banshee.CueSheets/Gui/CS_PlayListView.cs \ + Banshee.CueSheets/Gui/CS_TrackListView.cs \ Banshee.CueSheets/Gui/CueSheetEditor.cs \ Banshee.CueSheets/Gui/CueSheetsPrefs.cs \ Banshee.CueSheets/Gui/CueSheetsView.cs \ - Banshee.CueSheets/Gui/MusicToDevice.cs \ Banshee.CueSheets/Model/CS_AlbumModel.cs \ Banshee.CueSheets/Model/CS_ArtistModel.cs \ Banshee.CueSheets/Model/CS_ComposerModel.cs \ Banshee.CueSheets/Model/CS_GenreModel.cs \ + Banshee.CueSheets/Model/CS_PlayListModel.cs \ + Banshee.CueSheets/Model/CS_PlayListsModel.cs \ + Banshee.CueSheets/Model/CS_TrackListModel.cs \ Banshee.CueSheets/mp3splt/Mp3Split.cs \ Banshee.CueSheets/mp3splt/Mp3SplitTrack.cs \ + Banshee.CueSheets/Playlists/CS_PlayList.cs \ + Banshee.CueSheets/Playlists/CS_PlayListCollection.cs \ + Banshee.CueSheets/Playlists/CS_PlayListEntry.cs \ Banshee.CueSheets/Tools/Loosely.cs \ Banshee.CueSheets/Tools/Tools.cs \ Banshee.CueSheets/Version/CS_Info.cs |