Re: [Banshee-List] iTunes-style check boxes for syncing - patch
- From: Aaron Bockover <abockover novell com>
- To: banshee-list gnome org
- Subject: Re: [Banshee-List] iTunes-style check boxes for syncing - patch
- Date: Tue, 05 Sep 2006 22:06:26 -0400
Please open a bug in bugzilla for this. At quick glance it looks pretty
nice, but I can't test it because you posted the patch inline and not
attached.
I ask for it to go in bugzilla so it can be tracked and discussed in the
proper area; wouldn't want it to get lost on the list.
Thanks,
Aaron
On Tue, 2006-09-05 at 20:15 -0400, Michael Quinn wrote:
> Heres a small patch I've worked on that adds the iTunes-style checkbox
> interface to banshee, so you can specify which songs you want synced to
> your device. I hope people find this useful!
>
> Index: data/UIManagerLayout.xml
> ===================================================================
> RCS file: /cvs/gnome/banshee/data/UIManagerLayout.xml,v
> retrieving revision 1.19
> diff -u -r1.19 UIManagerLayout.xml
> --- data/UIManagerLayout.xml 4 Sep 2006 00:22:29 -0000 1.19
> +++ data/UIManagerLayout.xml 6 Sep 2006 00:02:33 -0000
> @@ -96,6 +96,9 @@
> <menuitem name="SearchForSameGenre"
> action="SearchForSameGenreAction" />
> </menu>
> <separator />
> + <menuitem name="CheckSongs" action="CheckSongsAction" />
> + <menuitem name="UncheckSongs" action="UncheckSongsAction" />
> + <separator />
> <menuitem name="SelectAll" action="SelectAllAction" />
> <menuitem name="SelectNone" action="SelectNoneAction" />
> <separator />
> Index: src/PlayerInterface.cs
> ===================================================================
> RCS file: /cvs/gnome/banshee/src/PlayerInterface.cs,v
> retrieving revision 1.211
> diff -u -r1.211 PlayerInterface.cs
> --- src/PlayerInterface.cs 4 Sep 2006 22:58:11 -0000 1.211
> +++ src/PlayerInterface.cs 6 Sep 2006 00:02:35 -0000
> @@ -935,6 +935,8 @@
> Globals.ActionManager.SongActions.Sensitive = true;
> Globals.ActionManager["WriteCDAction"].Sensitive = !(source
> is AudioCdSource);
> Globals.ActionManager["RemoveSongsAction"].Sensitive
> = !(source is AudioCdSource);
> + Globals.ActionManager["CheckSongsAction"].Visible = (source
> is LibrarySource);
> + Globals.ActionManager["UncheckSongsAction"].Visible =
> (source is LibrarySource);
>
> Globals.ActionManager["DeleteSongsFromDriveAction"].Sensitive =
> !(source is AudioCdSource || source is DapSource);
> }
> @@ -1120,6 +1122,8 @@
> gxml["DapContainer"].Hide();
> }
>
> + playlistView.SyncColumn.Visible = source is LibrarySource;
> +
> // Make some choices for audio CDs, they can't be rated,
> nor have plays or
> // last-played info. Only show the rip button for audio CDs
> gxml["SearchLabel"].Sensitive = source.SearchEnabled;
> @@ -1556,7 +1560,7 @@
> "/SongViewPopup/AddToPlaylist") as MenuItem;
> rating_menu_item =
> Globals.ActionManager.GetWidget("/SongViewPopup/Rating") as MenuItem;
> }
> -
> +
> bool sensitive = playlistView.Selection.CountSelectedRows()
> > 0;
>
> if(sensitive && (SourceManager.ActiveSource is
> LibrarySource || SourceManager.ActiveSource is PlaylistSource)) {
> @@ -1612,6 +1616,20 @@
>
> plMenu.ShowAll();
> ratingMenu.ShowAll();
> +
> + if (SourceManager.ActiveSource is LibrarySource)
> + {
> + bool showCheck = false;
> + bool showUncheck = false;
> + foreach(TreePath path in
> playlistView.Selection.GetSelectedRows()) {
> + LibraryTrackInfo track =
> (LibraryTrackInfo)playlistModel.PathTrackInfo(path);
> + if (track.ToSync == true) showUncheck = true;
> + if (track.ToSync == false) showCheck = true;
> + }
> +
> + Globals.ActionManager["CheckSongsAction"].Visible =
> showCheck;
> + Globals.ActionManager["UncheckSongsAction"].Visible
> = showUncheck;
> + }
> } else {
> Globals.ActionManager["AddToPlaylistAction"].Visible =
> false;
> Globals.ActionManager["RatingAction"].Visible = false;
> @@ -2041,7 +2059,7 @@
>
> switch(md.Run()) {
> case (int)ResponseType.Ok:
> -
> dapSource.Device.Save(Globals.Library.Tracks.Values);
> +
> dapSource.Device.Save(Globals.Library.GetSyncTracks());
> break;
> case (int)ResponseType.Apply:
> dapSource.Device.Save();
> @@ -2313,6 +2331,34 @@
> suspendSearch = false;
>
> playlistView.HasFocus = true;
> + }
> +
> + private void OnCheckSongsAction(object o, EventArgs args)
> + {
> + int selCount = playlistView.Selection.CountSelectedRows();
> +
> + if(selCount <= 0) {
> + return;
> + }
> +
> + foreach(TreePath path in
> playlistView.Selection.GetSelectedRows()) {
> + LibraryTrackInfo track =
> (LibraryTrackInfo)playlistModel.PathTrackInfo(path);
> + track.ToSync = true;
> + }
> + }
> +
> + private void OnUncheckSongsAction(object o, EventArgs args)
> + {
> + int selCount = playlistView.Selection.CountSelectedRows();
> +
> + if(selCount <= 0) {
> + return;
> + }
> +
> + foreach(TreePath path in
> playlistView.Selection.GetSelectedRows()) {
> + LibraryTrackInfo track =
> (LibraryTrackInfo)playlistModel.PathTrackInfo(path);
> + track.ToSync = false;
> + }
> }
>
> // --- Help Menu ---
> Index: src/PlaylistView.cs
> ===================================================================
> RCS file: /cvs/gnome/banshee/src/PlaylistView.cs,v
> retrieving revision 1.54
> diff -u -r1.54 PlaylistView.cs
> --- src/PlaylistView.cs 5 Aug 2006 20:51:12 -0000 1.54
> +++ src/PlaylistView.cs 6 Sep 2006 00:02:36 -0000
> @@ -74,6 +74,7 @@
> Pixbuf ripColumnPixbuf;
>
> public TreeViewColumn RipColumn;
> + public TreeViewColumn SyncColumn;
> public PlaylistColumn RatingColumn;
> public PlaylistColumn PlaysColumn;
> public PlaylistColumn LastPlayedColumn;
> @@ -177,7 +178,22 @@
> RipColumn.PackStart(ripRenderer, true);
> RipColumn.SetCellDataFunc(ripRenderer, new
> TreeCellDataFunc(RipCellInd));
> InsertColumn(RipColumn, 1);
> -
> +
> + // Add sync column
> + SyncColumn = new TreeViewColumn();
> + SyncColumn.Expand = false;
> + SyncColumn.Resizable = false;
> + SyncColumn.Clickable = false;
> + SyncColumn.Reorderable = false;
> + SyncColumn.Visible = true;
> +
> + CellRendererToggle syncRenderer = new CellRendererToggle();
> + syncRenderer.Activatable = true;
> + syncRenderer.Toggled += OnSyncToggled;
> + SyncColumn.PackStart(syncRenderer, true);
> + SyncColumn.SetCellDataFunc(syncRenderer, new
> TreeCellDataFunc(SyncCellInd));
> + InsertColumn(SyncColumn, 1);
> +
> ColumnDragFunction = new
> TreeViewColumnDropFunc(CheckColumnDrop);
>
> Model = this.model = model;
> @@ -222,6 +238,18 @@
>
> }
> }
> +
> + private void OnSyncToggled(object o, ToggledArgs args)
> + {
> + try {
> + LibraryTrackInfo ti =
> (LibraryTrackInfo)model.PathTrackInfo(new TreePath(args.Path));
> + CellRendererToggle renderer = (CellRendererToggle)o;
> + ti.ToSync = !ti.ToSync;
> + renderer.Active = ti.ToSync;
> + } catch(Exception) {
> +
> + }
> + }
>
> private bool CheckColumnDrop(TreeView tree, TreeViewColumn col,
> TreeViewColumn prev,
> TreeViewColumn next)
> @@ -426,6 +454,19 @@
> toggle.Sensitive = ti.CanPlay && !ti.IsRipped;
> toggle.Activatable = toggle.Sensitive;
> toggle.Active = ti.CanRip && !ti.IsRipped;
> + } else {
> + toggle.Active = false;
> + }
> + }
> +
> + protected void SyncCellInd(TreeViewColumn tree_column,
> CellRenderer cell,
> + TreeModel tree_model, TreeIter iter)
> + {
> + CellRendererToggle toggle = (CellRendererToggle)cell;
> + LibraryTrackInfo ti = model.IterTrackInfo(iter) as
> LibraryTrackInfo;
> +
> + if(ti != null) {
> + toggle.Active = ti.ToSync;
> } else {
> toggle.Active = false;
> }
> Index: src/Banshee.Base/ActionManager.cs
> ===================================================================
> RCS file: /cvs/gnome/banshee/src/Banshee.Base/ActionManager.cs,v
> retrieving revision 1.22
> diff -u -r1.22 ActionManager.cs
> --- src/Banshee.Base/ActionManager.cs 4 Sep 2006 00:22:29 -0000 1.22
> +++ src/Banshee.Base/ActionManager.cs 6 Sep 2006 00:02:36 -0000
> @@ -236,7 +236,15 @@
>
> new ActionEntry("RatingAction", null,
> Catalog.GetString("Rating"), null,
> - Catalog.GetString("Set rating for selected songs"),
> null)
> + Catalog.GetString("Set rating for selected songs"),
> null),
> +
> + new ActionEntry("CheckSongsAction", null,
> + Catalog.GetString("Check Song(s)"), null,
> + Catalog.GetString("Mark songs to be synced with
> audio player"), null),
> +
> + new ActionEntry("UncheckSongsAction", null,
> + Catalog.GetString("Uncheck Song(s)"), null,
> + Catalog.GetString("Unmark songs to be synced with
> audio player"), null)
> });
>
> ui.InsertActionGroup(song_actions, 0);
> Index: src/Banshee.Base/Database.cs
> ===================================================================
> RCS file: /cvs/gnome/banshee/src/Banshee.Base/Database.cs,v
> retrieving revision 1.7
> diff -u -r1.7 Database.cs
> --- src/Banshee.Base/Database.cs 22 May 2006 17:01:49 -0000 1.7
> +++ src/Banshee.Base/Database.cs 6 Sep 2006 00:02:36 -0000
> @@ -74,7 +74,9 @@
> LastPlayedStamp INTEGER,
> DateAddedStamp INTEGER,
>
> - RemoteLookupStatus INTEGER
> + RemoteLookupStatus INTEGER,
> +
> + ToSync INTEGER NOT NULL DEFAULT 1
> )");
> }
>
> @@ -120,7 +122,14 @@
> } catch(ApplicationException) {
> LogCore.Instance.PushDebug("Adding new database
> column", "RemoteLookupStatus INTEGER");
> Execute("ALTER TABLE Tracks ADD RemoteLookupStatus
> INTEGER");
> - }
> + }
> +
> + try {
> + QuerySingle("SELECT ToSync FROM Tracks LIMIT 1");
> + } catch(ApplicationException) {
> + LogCore.Instance.PushDebug("Adding new database
> column", "ToSync INTEGER");
> + Execute("ALTER TABLE Tracks ADD ToSync INTEGER NOT NULL
> DEFAULT 1");
> + }
>
> try {
> QuerySingle("SELECT ViewOrder FROM PlaylistEntries
> LIMIT 1");
> Index: src/Banshee.Base/Library.cs
> ===================================================================
> RCS file: /cvs/gnome/banshee/src/Banshee.Base/Library.cs,v
> retrieving revision 1.12
> diff -u -r1.12 Library.cs
> --- src/Banshee.Base/Library.cs 28 Jul 2006 17:49:47 -0000 1.12
> +++ src/Banshee.Base/Library.cs 6 Sep 2006 00:02:37 -0000
> @@ -301,5 +301,19 @@
> {
> return PathUtil.MakeFileNameKey(uri);
> }
> +
> + public ICollection<TrackInfo> GetSyncTracks()
> + {
> + List<TrackInfo> syncTracks = new List<TrackInfo>();
> + foreach (LibraryTrackInfo track in Tracks.Values)
> + {
> + if (track.ToSync == true)
> + {
> + syncTracks.Add(track);
> + }
> + }
> +
> + return syncTracks;
> + }
> }
> }
> Index: src/Banshee.Base/LibraryTrackInfo.cs
> ===================================================================
> RCS file: /cvs/gnome/banshee/src/Banshee.Base/LibraryTrackInfo.cs,v
> retrieving revision 1.14
> diff -u -r1.14 LibraryTrackInfo.cs
> --- src/Banshee.Base/LibraryTrackInfo.cs 24 Aug 2006 16:35:50 -0000 1.14
> +++ src/Banshee.Base/LibraryTrackInfo.cs 6 Sep 2006 00:02:37 -0000
> @@ -39,6 +39,8 @@
> {
> public class LibraryTrackInfo : TrackInfo
> {
> + protected bool to_sync;
> +
> public static int GetId(SafeUri lookup)
> {
> string query = String.Format(@"
> @@ -174,7 +176,8 @@
> this.duration = duration;
> this.asin = asin;
> this.remote_lookup_status = remote_lookup_status;
> -
> + this.to_sync = true;
> +
> this.date_added = DateTime.Now;
>
> CheckIfExists(uri);
> @@ -200,7 +203,8 @@
> LoadFromFile(filename);
> string new_filename = MoveToPlace(filename, true);
> uri = new SafeUri(new_filename != null ? new_filename :
> filename);
> - CheckIfExists(uri);
> + CheckIfExists(uri);
> + this.to_sync = true;
> SaveToDatabase(true);
> }
>
> @@ -313,7 +317,8 @@
> "Rating", rating,
> "NumberOfPlays", play_count,
> "LastPlayedStamp",
> DateTimeUtil.FromDateTime(last_played),
> - "RemoteLookupStatus", (int)remote_lookup_status);
> + "RemoteLookupStatus", (int)remote_lookup_status,
> + "ToSync", Convert.ToInt32(to_sync));
> } else {
> tracksQuery = new Update("Tracks",
> "Uri", uri.AbsoluteUri,
> @@ -337,7 +342,8 @@
> "Rating", rating,
> "NumberOfPlays", play_count,
> "LastPlayedStamp",
> DateTimeUtil.FromDateTime(last_played),
> - "RemoteLookupStatus", (int)remote_lookup_status) +
> + "RemoteLookupStatus", (int)remote_lookup_status,
> + "ToSync", Convert.ToInt32(to_sync)) +
> new Where(new Compare("TrackID", Op.EqualTo,
> track_id));// +
> // new Limit(1);
> }
> @@ -420,6 +426,8 @@
> if(temp_stamp > 0) {
> date_added = DateTimeUtil.ToDateTime(temp_stamp);
> }
> +
> + to_sync = Convert.ToBoolean(reader["ToSync"]);
> }
>
> private void LoadFromFile(string filename)
> @@ -467,6 +475,16 @@
> new Where(new Compare("TrackID", Op.EqualTo,
> track_id));
> Core.Library.Db.Execute(query);*/
> Save();
> + }
> +
> + public bool ToSync {
> + get {
> + return to_sync;
> + }
> + set {
> + to_sync = value;
> + Save();
> + }
> }
> }
> }
>
> _______________________________________________
> Banshee-list mailing list
> Banshee-list gnome org
> http://mail.gnome.org/mailman/listinfo/banshee-list
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]