Re: [Banshee-List] banshee r3647 - in trunk/banshee: . src/Core/Banshee.ThickClient/Banshee.Gui.Widgets src/Core/Banshee.ThickClient/Banshee.Sources.Gui src/Libraries/Hyena.Gui src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics src/Libraries/Hyena.Gui/Hyena.Widgets
- From: "Gabriel Burt" <gabriel burt gmail com>
- To: banshee-list gnome org
- Subject: Re: [Banshee-List] banshee r3647 - in trunk/banshee: . src/Core/Banshee.ThickClient/Banshee.Gui.Widgets src/Core/Banshee.ThickClient/Banshee.Sources.Gui src/Libraries/Hyena.Gui src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics src/Libraries/Hyena.Gui/Hyena.Widgets
- Date: Thu, 3 Apr 2008 20:33:57 -0500
Hey Scott,
This is really neat. Note to everybody, you can run this on trunk
uninstalled with this:
BANSHEE_DEV_OPTIONS="--smooth-scroll" make run
Scott, I think the acelleration is way slower than it should be (but
the deceleration is good). I expect to start scrolling at full speed
almost immediately.
Good work!
Gabriel
On Wed, Apr 2, 2008 at 12:44 PM, <scottp svn gnome org> wrote:
> Author: scottp
> Date: Wed Apr 2 18:44:44 2008
> New Revision: 3647
> URL: http://svn.gnome.org/viewvc/banshee?rev=3647&view=rev
>
> Log:
> This adds experimental smooth scrolling. The behavior still needs to be
> tweaked, and comments/opinions are welcome. To enable smooth
> scrolling, run banshee with the command line argument --smooth-scroll.
>
> * src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTileHost.cs:
> * src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs:
> * src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedVBox.cs:
> * src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedHBox.cs:
> * src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs:
> * src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Choreographer.cs: Fixed
> some namespace stuff.
>
> * src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs:
> Use smooth scrolling if --smooth-scroll command argument is passed.
>
> * src/Libraries/Hyena.Gui/Hyena.Widgets/SmoothScrolledWindow.cs: A
> first-pass smooth scrolling widget.
>
> Added:
> trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/SmoothScrolledWindow.cs
> Modified:
> trunk/banshee/ChangeLog
> trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTileHost.cs
> trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs
> trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Choreographer.cs
> trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.mdp
> trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs
> trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedHBox.cs
> trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedVBox.cs
> trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs
> trunk/banshee/src/Libraries/Hyena.Gui/Makefile.am
>
> Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTileHost.cs
> ==============================================================================
> --- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTileHost.cs (original)
> +++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTileHost.cs Wed Apr 2 18:44:44 2008
> @@ -31,7 +31,7 @@
>
> using Gtk;
>
> -using Hyena.Gui;
> +using Hyena.Widgets;
> using Banshee.Base;
> using Banshee.ServiceStack;
>
>
> Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs
> ==============================================================================
> --- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs (original)
> +++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs Wed Apr 2 18:44:44 2008
> @@ -36,6 +36,7 @@
>
> using Hyena.Data;
> using Hyena.Data.Gui;
> +using Hyena.Widgets;
>
> using Banshee.Sources;
> using Banshee.ServiceStack;
> @@ -58,9 +59,9 @@
>
> private Dictionary<object, double> model_positions = new Dictionary<object, double> ();
>
> - private ScrolledWindow artist_scrolled_window;
> - private ScrolledWindow album_scrolled_window;
> - private ScrolledWindow track_scrolled_window;
> + private Gtk.ScrolledWindow artist_scrolled_window;
> + private Gtk.ScrolledWindow album_scrolled_window;
> + private Gtk.ScrolledWindow track_scrolled_window;
> private bool view_is_built = false;
>
> private Paned container;
> @@ -140,17 +141,24 @@
> artist_view.HeaderVisible = false;
> album_view.HeaderVisible = false;
>
> - artist_scrolled_window = new ScrolledWindow ();
> + if (Banshee.Base.ApplicationContext.CommandLine.Contains ("smooth-scroll")) {
> + artist_scrolled_window = new SmoothScrolledWindow ();
> + album_scrolled_window = new SmoothScrolledWindow ();
> + track_scrolled_window = new SmoothScrolledWindow ();
> + } else {
> + artist_scrolled_window = new Gtk.ScrolledWindow ();
> + album_scrolled_window = new Gtk.ScrolledWindow ();
> + track_scrolled_window = new Gtk.ScrolledWindow ();
> + }
> +
> artist_scrolled_window.Add (artist_view);
> artist_scrolled_window.HscrollbarPolicy = PolicyType.Automatic;
> artist_scrolled_window.VscrollbarPolicy = PolicyType.Automatic;
>
> - album_scrolled_window = new ScrolledWindow ();
> album_scrolled_window.Add (album_view);
> album_scrolled_window.HscrollbarPolicy = PolicyType.Automatic;
> album_scrolled_window.VscrollbarPolicy = PolicyType.Automatic;
>
> - track_scrolled_window = new ScrolledWindow ();
> track_scrolled_window.Add (track_view);
> track_scrolled_window.HscrollbarPolicy = PolicyType.Automatic;
> track_scrolled_window.VscrollbarPolicy = PolicyType.Automatic;
>
> Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Choreographer.cs
> ==============================================================================
> --- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Choreographer.cs (original)
> +++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Choreographer.cs Wed Apr 2 18:44:44 2008
> @@ -27,8 +27,9 @@
> //
>
> using System;
> +using Hyena.Widgets;
>
> -namespace Hyena.Gui
> +namespace Hyena.Widgets
> {
> public enum Blocking
> {
> @@ -46,7 +47,10 @@
> ExponentialOut,
> ExponentialInOut
> }
> -
> +}
> +
> +namespace Hyena.Gui.Theatrics
> +{
> public static class Choreographer
> {
> public static int Compose (double percent, int size, Easing easing)
>
> Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.mdp
> ==============================================================================
> --- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.mdp (original)
> +++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.mdp Wed Apr 2 18:44:44 2008
> @@ -1,4 +1,4 @@
> -<Project name="Hyena.Gui" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
> +<Project name="Hyena.Gui" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
> <Configurations active="Debug">
> <Configuration name="Debug" ctype="DotNetProjectConfiguration">
> <Output directory="../../../bin" assembly="Hyena.Gui" />
> @@ -64,6 +64,7 @@
> <File name="Hyena.Query.Gui/RelativeTimeSpanQueryValueEntry.cs" subtype="Code" buildaction="Compile" />
> <File name="Hyena.Query.Gui/TimeSpanQueryValueEntry.cs" subtype="Code" buildaction="Compile" />
> <File name="Hyena.Data.Gui/IListView.cs" subtype="Code" buildaction="Compile" />
> + <File name="Hyena.Widgets/SmoothScrolledWindow.cs" subtype="Code" buildaction="Compile" />
> </Contents>
> <References>
> <ProjectReference type="Gac" localcopy="True" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
>
> Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs
> ==============================================================================
> --- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs (original)
> +++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs Wed Apr 2 18:44:44 2008
> @@ -34,7 +34,7 @@
>
> using Hyena.Gui.Theatrics;
>
> -namespace Hyena.Gui
> +namespace Hyena.Widgets
> {
> public abstract class AnimatedBox : Container
> {
>
> Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedHBox.cs
> ==============================================================================
> --- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedHBox.cs (original)
> +++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedHBox.cs Wed Apr 2 18:44:44 2008
> @@ -30,7 +30,7 @@
> using Gdk;
> using Gtk;
>
> -namespace Hyena.Gui
> +namespace Hyena.Widgets
> {
> public class AnimatedHBox : AnimatedBox
> {
>
> Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedVBox.cs
> ==============================================================================
> --- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedVBox.cs (original)
> +++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedVBox.cs Wed Apr 2 18:44:44 2008
> @@ -30,7 +30,7 @@
> using Gdk;
> using Gtk;
>
> -namespace Hyena.Gui
> +namespace Hyena.Widgets
> {
> public class AnimatedVBox : AnimatedBox
> {
>
> Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs
> ==============================================================================
> --- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs (original)
> +++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs Wed Apr 2 18:44:44 2008
> @@ -31,7 +31,9 @@
> using Gdk;
> using Gtk;
>
> -namespace Hyena.Gui
> +using Hyena.Gui.Theatrics;
> +
> +namespace Hyena.Widgets
> {
> internal enum AnimationState
> {
>
> Added: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/SmoothScrolledWindow.cs
> ==============================================================================
> --- (empty file)
> +++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/SmoothScrolledWindow.cs Wed Apr 2 18:44:44 2008
> @@ -0,0 +1,145 @@
> +// SmoothScrolledWindow.cs
> +//
> +// Copyright (c) 2008 Scott Peterson <lunchtimemama gmail com>
> +//
> +// 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 Gdk;
> +using Gtk;
> +
> +using Hyena.Gui.Theatrics;
> +
> +namespace Hyena.Widgets
> +{
> + public class SmoothScrolledWindow : Gtk.ScrolledWindow
> + {
> + private bool ignore_value_changed;
> + private uint timeout;
> + private double value;
> + private double target_value;
> + private double velocity = 0;
> +
> + protected virtual double MaxVelocity {
> + get { return Vadjustment.StepIncrement * 4; }
> + }
> +
> + private double Accelerate (double velocity)
> + {
> + return Math.Min (AccelerateCore (velocity), MaxVelocity);
> + }
> +
> + private double Decelerate (double velocity)
> + {
> + return Math.Max (DecelerateCore (velocity), 0);
> + }
> +
> + protected virtual double AccelerateCore (double velocity)
> + {
> + return velocity + 2;
> + }
> +
> + protected virtual double DecelerateCore (double velocity)
> + {
> + return velocity - 1;
> + }
> +
> + private double TargetValue {
> + get { return target_value; }
> + set {
> + if (value == target_value) {
> + return;
> + }
> +
> + target_value = value;
> + if (timeout == 0) {
> + timeout = GLib.Timeout.Add (20, OnTimeout);
> + }
> + }
> + }
> +
> + private bool OnTimeout ()
> + {
> + double delta = target_value - value;
> + if (delta == 0) {
> + velocity = 0;
> + timeout = 0;
> + return false;
> + }
> +
> + int sign = Math.Sign (delta);
> + delta = Math.Abs (delta);
> +
> + velocity = TimeToAccelerate (delta) ? Accelerate (velocity) : Decelerate (velocity);
> +
> + value += Math.Max (velocity, 0.5) * sign;
> + ignore_value_changed = true;
> + Vadjustment.Value = Math.Round (value);
> + ignore_value_changed = false;
> +
> + return true;
> + }
> +
> + private bool TimeToAccelerate (double delta)
> + {
> + double hypothetical = delta;
> + double v = Accelerate (velocity);
> + while (v > 0) {
> + hypothetical -= v;
> + v = Decelerate (v);
> + }
> + return hypothetical > 0;
> + }
> +
> + protected override bool OnScrollEvent (Gdk.EventScroll evnt)
> + {
> + switch (evnt.Direction) {
> + case ScrollDirection.Up:
> + TargetValue = Math.Max (TargetValue - Vadjustment.StepIncrement, 0);
> + break;
> + case ScrollDirection.Down:
> + TargetValue = Math.Min (TargetValue + Vadjustment.StepIncrement, Vadjustment.Upper - Vadjustment.PageSize);
> + break;
> + default:
> + return base.OnScrollEvent (evnt);
> + }
> + return true;
> + }
> +
> + protected override void OnRealized ()
> + {
> + base.OnRealized ();
> + Vadjustment.ValueChanged += OnValueChanged;
> + }
> +
> + protected override void OnUnrealized ()
> + {
> + Vadjustment.ValueChanged -= OnValueChanged;
> + base.OnUnrealized ();
> + }
> +
> + private void OnValueChanged (object o, EventArgs args)
> + {
> + if (!ignore_value_changed) {
> + value = target_value = Vadjustment.Value;
> + }
> + }
> + }
> +}
>
> Modified: trunk/banshee/src/Libraries/Hyena.Gui/Makefile.am
> ==============================================================================
> --- trunk/banshee/src/Libraries/Hyena.Gui/Makefile.am (original)
> +++ trunk/banshee/src/Libraries/Hyena.Gui/Makefile.am Wed Apr 2 18:44:44 2008
> @@ -57,7 +57,8 @@
> Hyena.Widgets/AnimatedWidget.cs \
> Hyena.Widgets/MessageBar.cs \
> Hyena.Widgets/RoundedFrame.cs \
> - Hyena.Widgets/ScrolledWindow.cs
> + Hyena.Widgets/ScrolledWindow.cs \
> + Hyena.Widgets/SmoothScrolledWindow.cs
>
> include $(top_srcdir)/build/build.mk
>
> _______________________________________________
> SVN-commits-list mailing list (read only)
> http://mail.gnome.org/mailman/listinfo/svn-commits-list
>
> Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.
> Module maintainer? It is possible to set the reply-to to your development mailing list. Email svnmaster gnome org if interested.
>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]